Archivo de la etiqueta: Tutorial

Scala: selftypes

Tal y como comentamos en entradas anteriores, hoy toca hablar de selftypes (¿cómo?¿lo qué?¿mande?).

Se ilustra muy bien su utilidad con el siguiente ejemplo.
Suponed que estamos definiendo nuestro objeto singleton que representa un mostrador de facturación de un aeropuerto:

object Facturacion{
  type Identificador = String
  var idMaletas: List[Identificador] = List()
}

hasta aquí sin problemas, ¿no? Ahora pongamos que queremos añadir un método para procesar un registro de facturación: Un señor que quiere volar quiere facturar sus maletas.

object Facturacion{
  type Identificador = String
  var idMaletas: List[Identificador] = List()

  def facturar(nombre: String, idMaletas: List[Idenntificador) = {
    println(s"Registrando maletas del señor $nombre")
    idMaletas ++= idMaletas //WTF
  }
}

Exacto. Ocurre que tenemos el mismo nombre para designar tanto a la variable como al parámetro de la función.
La primera lógica es cambiarle el nombre a uno de los dos.

…pero ocurre que no queremos XD Porque nos guste el nombre tal y como está, porque no tenga sentido que sea otro, porque si digo 3 veces ‘selftype’ frente al espejo aparece Odersky y me saca los ojos…Elegid vuestro motivo favorito

¿La otra opción? Hacer referencia a la enclosing class (enclosing object en este caso) de la siguiente forma:

object Facturacion{
  esteMostrador =>
  //...
}

de manera que ahora podemos efectuar la asignación que antes no podíamos:

object Facturacion{
  esteMostrador =>

  type Identificador = String
  var idMaletas: List[Identificador] = List()

  def facturar(nombre: String, idMaletas: List[Idenntificador) = {
    println(s"Registrando maletas del señor $nombre")
    esteMostrador.idMaletas ++= idMaletas //YOLO!
  }
}

Los motivos que normalmente aconsejan el uso de una anotación selftype suelen ser:

  • Reforzar una cierta clase/trait base para asegurarse de que tu inner clase solo puede ser heredada o usada en mixin dentro de ese tipo.
  • Referenciar una clase exterior cuando se implementa una inner class.

Este último es el caso que nos atañe y, tenéis que reconocer, que como poco os acabo de arrancar una sonrisa con esta ventaja de Scala.

Hasta la próxima 🙂

Deja un comentario

Archivado bajo Tutoriales

Mostrar datos de una BBDD en un gráfico dinámico de Google Analytics (II)

Esta es la continuación del tutorial de la semana pasada, como  lo prometido es deuda, se va a explicar la vista y como queda el resultado final.

Vista

La vista es la encargada de la parte visual, es decir, todo lo que verá el usuario debería ir en ella, por tanto aquí es donde situamos el gráfico de Analytics. Es necesario referenciar la librería de jQuery porque se va a usar una de sus funciones , para ello basta con añadir esta linea dentro del encabezado (entre las etiquetas <head></head>).

<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.js"></script>

Una vez más he aprovechado la vista predefinida ya que es perfectamente válida, su nombre es welcome_message.php. En el encabezado, además de la librería anterior, también se incluye el código JavaScript necesario para el gráfico de Analytics. Lo primero que hay que hacer es indicar donde está situada la librería de dicho gráfico, así que se referencia directamente a la URL, tenemos la opción de bajarla y ponerla en nuestro propio servidor, pero en mi opinión es mas engorroso tener que actualizarla manualmente si queremos aprovechar nuevas funcionalidades que vayan añadiendo.

<script type="text/javascript" src="http://www.google.com/jsapi"></script>

Después se indica el componente a cargar, existen muchos controles disponibles, en este caso yo me he decantado por el gráfico de áreas que me parece muy útil para representar las visitas de los usuarios, por lo que hace falta cargar el paquete Corechart.

google.load('visualization', '1', {packages: ['corechart']});

Una vez cargada la página (incluyendo la API de google) indicamos con esta línea que llame a la función que rellena y muestra el gráfico.

google.setOnLoadCallback(drawVisualization);

Esto es lo que contiene dicha función.

function drawVisualization() {
     $.post( "/RepresentacionAnalytics/index.php/welcome/showAppStats", {numDiaPasado: 9}
         ,function(data){
             var dataG = google.visualization.arrayToDataTable(data.visitas);
             var ac = new google.visualization.AreaChart(document.getElementById('containerAppVisits'));
             var options = {
                  title : "Visitas los 9 dias anteriores",
                  hAxis: {title: 'dias'},
                  vAxis: {title: 'visitas'},
                  height : 400
             };
             ac.draw(dataG,options);
        },"json");
     }

Como se puede ver utiliza la función post de jQuery, la cual nos permite obtener los datos necesarios del servidor y rellenar con ellos el gráfico si tiene éxito. El primer argumento apunta a la ruta a la que hacer la petición, el encargado de obtener los datos es la función ShowStats incluida dentro del controlador Welcome como se explicaba en la primera parte de este tutorial. En el segundo argumento se indica cuantos dias se pretenden mostrar, podría haber escogido cualquier otro número natural.

El último argumento es la función que se ejecutará en caso de que la petición haya funcionado correctamente, recordemos que los datos devueltos por el servidor están en la variable data. Para rellenar los gráficos los datos deben estar en formato DataTable, por lo que se transforman a dicho formato con la función que proporciona la librería de Google. En la siguiente linea se indica el tipo de gráfico y donde se dibujará, basta un simple div con identidad (para poder recuperarlo dentro del script) en el cuerpo de la página.

<body>
        <div>
          <div id="containerAppVisits"></div>
        </div>
<body>

Por último llamamos a la función draw del objeto que acabamos de crear, el cual pinta el gráfico donde se ha indicado, pasandole el DataTable anterior y las opciones que queramos, yo he escogido las que me parecen básicas (título, nombre del eje de ordenadas, nombre del eje de abscisas y tamaño). El resultado final está a continuación (derivados de una BBDD propia), gracias a las herramientas para  desarrolladores de Chrome es posible ver el JSON recibido del servidor.

Conclusiones

En este tutorial hemos visto cómo visualizar datos contenidos en una BBDD usando uno de los múltiples gráficos disponibles en Analytics. Se ha implementado una solución muy básica que tiene mucho margen de mejora, por ejemplo que el usuario pueda elegir el intervalo, el gráfico que prefiere, mostrar más de un tipo de dato a la vez, etc.

Espero que te haya servido para aprender algo nuevo estimado lector, en caso de que sólo hayas leído este post en busca de material para el postureo no tienes más que utilizar alguna de estas webs y quedaras como un señor delante del jefe sin molestarte en leer todo lo anterior (aunque si tu jefe ha leído por casualidad la entrada previa sobre Codility y Project Euler lo llevas claro).

http://programadordefp.es/

http://hackertyper.com/

La primera de ellas te convierte en un programador con un nivel asombrosamente parecido al de este chico (ojo al segundo 17).

Si el MECD ha considerado que representa el mejor ejemplo de alguien que ha finalizado ese plan de estudios por algo será.

La segunda te convierte en un hacker como los que te puedes encontrar en las pelis de Wargames, Matrix o Los becarios.

Cualquier duda la podéis postear en los comentarios. See you.

Deja un comentario

Archivado bajo Tutoriales

Mostrar datos de una BBDD en un gráfico dinámico de Google Analytics (I)

Google Analytics es un producto de Google muy popular que nos permite reunir, procesar y mostrar de forma simple y afable una gran variedad de datos sobre cómo navegan los usuarios en nuestra web. Es posible medir de donde proceden los visitantes (buscadores,redes sociales,anuncios,etc), cuánto tiempo han estado logueados, donde han pulsado, etc. Incluirlo en una página web es bastante sencillo y proporciona varios controles predefinidos en los que se muestra una información suficiente para la mayoría de propietarios de sitios webs.

Image

En Internet hay tutoriales de todos los colores para aprender a utilizarlo, en este se pretende enseñar cómo es posible mostrar información en alguno de los gráficos de Analytics usando información de una BBDD, esto puede ser interesante si tenemos datos almacenados y queremos visualizarlos y comprenderlos más fácilmente. Para conseguirlo se realizarán peticiones asíncronas utilizando JSON y AJAX (con ello conseguimos mejorar la experiencia de usuario al no necesitar recargar la página para consultarlos) y posteriormente se mostrará el gráfico utilizando la API de Analytics.

El patrón de diseño elegido para el desarrollo es el MVC (Modelo-Vista-Controlador), dado que su facilidad para el mantenimiento y extensibilidad del código lo hace ideal para que esta prueba de concepto pueda añadirse fácilmente en cualquier proyecto existente que use un entorno compatible.

Entorno

- PC core i3(3ªGen), 4 GB RAM
- Sistema operativo : Windows 8.1
- IDE: Aptana Studio 3
- Entorno de desarrollo web : WAMP
- Framework: CodeIgniter

Preparación del entorno

En primer lugar debemos configurar CodeIgniter, para ello nos lo bajamos de su página web y pegamos los contenidos del RAR en el directorio raíz del servidor. Ahora tenemos que configurar el SGBD que se va a utilizar, en este ejemplo se ha utilizado MySQL incluido en WAMP. Se ha escogido por su potencia, facilidad de configuración y rapidez de instalación, pero existen muchas más opciones válidas y no necesariamente debe seguir un modelo relacional.

Dado que hay partes del código propias de CodeIgniter, este proyecto solo funcionará utilizando este framework. Es posible utilizar un framework distinto o incluso no utilizar ninguno, pero hay que modificar las lineas propias de CodeIgniter por otras equivalentes que funcionen en el que escojamos.

Modelo

El modelo del patrón MVC es el encargado de gestionar la información contenida en la BBDD, en este ejemplo se pretende crear una BBDD con una tabla en la que está contenida la información que se representará gráficamente en la vista.

Utilizando PhpMyAdmin (o en la consola de MySQL) creamos la BBDD  (la he llamado estadisticas), después creamos la tabla que contendrá la información a la que he llamado estadísticas_visitas con los campos id_visita (como clave primaria), id_usuario de tipo numérico y fecha de tipo Timestamp.

Ahora que esta lista la BBDD ponemos los parámetros de configuración en el fichero de configuración de la BBDD (application/config/database.php) de CodeIgniter.

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '';
$db['default']['database'] = 'estadisticas';
$db['default']['dbdriver'] = 'mysql';

Además es necesario abrir el fichero autoload.php e indicarle que cargue la bbdd.

$autoload['libraries'] = array('database','form_validation');

Con esto ya estaría conectada la BBDD, el siguiente paso es crear el modelo dentro de la carpeta models, creamos un nuevo fichero php dentro de la carpeta application/models y le damos el nombre que queramos, yo lo he llamado visitas_modelo.php.

<?php
  class visitas_modelo extends CI_Model{
       function NumVisitantes(diasPasados){
            $sql = "select count(distinct(idUsuario)) as views from peticionServidor
                     where DATE_SUB(CURDATE(),INTERVAL ? DAY) <= currentTime AND
                     DATE_SUB(CURDATE(),INTERVAL ? DAY) > currentTime;";

            $query = $this->db->query($sql,array($diasPasados,$diasPasados-1));
            $row = $query->row();
            return $row->views;
       }
  }
?>

Esta función lo que hace es consultar en la BBDD el número de usuarios que han hecho peticiones al servidor. Recibe como argumento un número que indica cuantos días hay que retroceder desde la fecha actual para obtener qué día concreto recuperar y devuelve el número de usuarios únicos.

Controlador

El siguiente paso es crear el controlador, el cual se encarga de gestionar los eventos que se producen tanto por el usuario como por el servidor.Esta capa se encargará primero de servir la página cuando se haga la petición a la ruta definida (/RepresentacionAnalytics) y posteriormente atender a la petición de los datos con los que rellenar el gráfico de Analytics.

CodeIgniter tiene por defecto el controlador welcome.php situado en la carpeta /controllers, lo suyo sería crear un controlador nuevo para esta funcionalidad, pero me  permito esta bajeza por ser el primer tutorial y tener la excusa de estar ensayando. El controlador contiene lo siguiente:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
   class Welcome extends CI_Controller {
      public function index() {
        $this->load->view('welcome_message');
      }
      function mostrarResultado($contadorDia){
           $datos['numDiaPasado'] = $_REQUEST['numDiaPasado'];
           $datosJSON['visitas'][0] = array('dia','visitantes');
           $this->load->model('visitas_model');
           for ($i = $datos['numDiaPasado']; $i >= 1 ; $i--){
               $contadorDia = $i-1;
               $fechaActual = "2013-11-10 06:00:00";
               $fecha = date('j M',(strtotime ( "- $contadorDia day" , strtotime ( $fechaActual) ) ));
               $indice=$datos['numDiaPasado']-$i+1;
               $datosJSON['visitas'][$indice] =array($fecha,(int)$this->visitas_model->NumVisitantes($i));
      }
      echo json_encode($datosJSON);
   }
?>

En este caso tenemos dos funciones, la primera de ellas se encarga de cargar la vista inicial al acceder a la página, esta viene por defecto con el controlador welcome, así que no tiene mucho mérito que digamos. La segunda es la encargada de recolectar los datos, para ello primero se los pide al modelo y después se los inyecta a la vista en formato JSON. Como se puede ver se obtiene el argumento numDiaPasado que contiene el número de días que se van a mostrar en el gráfico posterior.

La variable $fechaActual debería llamar a la función date() para recuperar la fecha actual real y así poder ver las visitas cada día partiendo del actual, pero como no tenía disponible una BBDD reciente la he fijado a una fecha adecuada para los valores que tenia, si no lo hiciera asi mas adelante obtendría una linea plana al no tener valores.

En la siguiente entrega se implementará la vista y se mostrará el resultado final. Stay tuned!

Enlaces útiles

· http://ellislab.com/codeigniter

· http://www.wampserver.com/en/‎

Deja un comentario

Archivado bajo Tutoriales