Mejorando el $log de AngularJS con decorators

La idea de este artículo es contar con un servicio de logging que nos permita contextualizar fácilmente la información que aparece en la consola del navegador.

A continuación pongo unos ejemplos para ilustrar su uso:

Uso básico:

$log.debug( 'línea debug' );
$log.info( 'línea info' );

Salida:

[0] -- 12/3/2016 15:43:38 línea debug
[1] -- 12/3/2016 15:43:38 línea info

Uso con contextos:

var logger = $log.getLogger( 'MainController' );
logger.debug( 'línea 1' );
logger.debug( 'línea 2' );
logger.debug( 'línea 3' );
 
var logger2 = $log.getLogger( 'App' );
logger2.debug( 'otra línea' );
logger2.debug( 'una línea más' );

Salida:

[0] -- 12/3/2016 15:58:05 -- [MainController]:0>  línea 1
[1] -- 12/3/2016 15:58:05 -- [MainController]:1>  línea 2
[2] -- 12/3/2016 15:58:05 -- [MainController]:2>  línea 3
[3] -- 12/3/2016 15:58:05 -- [App]:0>  otra línea
[4] -- 12/3/2016 15:58:05 -- [App]:1>  una línea más

Con desactivación de contextos:

var logger = $log.getLogger( 'MainController' );
logger.enable( false );
logger.debug( 'línea 1' );
logger.debug( 'línea 2' );
logger.enable( true );
logger.debug( 'línea 3' );
 
var logger2 = $log.getLogger( 'App' );
logger2.debug( 'otra línea' );
logger2.debug( 'una línea más' );

Salida:

[0] -- 12/3/2016 16:02:00 -- [MainController]:0>  línea 3
[1] -- 12/3/2016 16:02:00 -- [App]:0>  otra línea
[2] -- 12/3/2016 16:02:00 -- [App]:1>  una línea más

Los servicios en AngularJS se pueden mejorar de dos maneras: Usando decorators o providers.

La ventaja de usar un decorator es que sólo necesitas declararlo dentro del módulo de tu aplicación o incluir el módulo dónde está declarado como dependencia, para que entonces se decore el servicio deseado.

El código presentado a continuación utiliza un decorator:

( function() {
  'use strict';
 
  // Asume que el módulo de tu aplicación es llamado "myApp"
  // En este módulo se define el decorador
  angular.module( 'myApp' ).decorator( '$log', logDecorator );
 
  // La función "logDecorator" recibirá el servicio a decorar como
  // el parámetro $delegate, en este caso $delegate == $log
  function logDecorator( $delegate ) {
 
    // Contador general
    var n = 0;
 
    // El nuevo logger que imprime información básica
    var basicLogger = {
      log: basicDecoration( $delegate.log ),
      debug: basicDecoration( $delegate.debug ),
      info: basicDecoration( $delegate.info ),
      warn:basicDecoration( $delegate.warn ),
      error: basicDecoration( $delegate.error ),
      getLogger: getLogger,
      enabledContexts: {},
      counter: {}
    };
 
    // Esta función regresa el servicio de log básico mejorado
    return basicLogger;
 
 
    // La decoración básica incluye un contador, fecha y hora al inicio
    function basicDecoration( loggingFunction ) {
      return function() {
        var date = new Date();
        var args = Array.prototype.slice.call( arguments );
        args.unshift( '[' + n++ + '] -- ' + date.toLocaleString() );
        loggingFunction.apply( null, args );
      }
    }
 
    // La decoración contextual incluye info del contexto y un contador
    function contextDecoration( loggingFunction, context ) {
      return function() {
        var enabled = basicLogger.enabledContexts[context];
        if( enabled || enabled === undefined ) {
          var args = Array.prototype.slice.call( arguments );
          var contextInfo = '-- [' + context + ':';
          var counterInfo = basicLogger.counter[context]++ + '] >> ';
          args.unshift( contextInfo + counterInfo );
          loggingFunction.apply( null, args );
        }
      }
    }
 
    // Activa o desactiva el logging en un contexto determinado
    function enable( context ) {
      return function( enable ) {
        basicLogger.enabledContexts[context] = enable;
      }
    }
 
    // Regresa un logger para un contexto determinado
    function getLogger( context ) {
 
      // Contador contextual
      basicLogger.counter[context] = 0;
 
      // La nueva instancia de logger con información del contexto
      var contextLogger = {
        log: contextDecoration( basicLogger.log, context ),
        debug: contextDecoration( basicLogger.debug, context ),
        info: contextDecoration( basicLogger.info, context ),
        warn: contextDecoration( basicLogger.warn, context ),
        error: contextDecoration( basicLogger.error, context ),
        enable: enable( context )
      };
 
      // Esta función regresa el servicio de log contextualizado
      return contextLogger;
    }
  }
} )();

Una recomendación es que siempre utilices el servicio de AngularJS $log en vez del console.log, de esta manera siempre podrás desactivar todo el logging desde el bloque de configuración de tu aplicación con algo como esto:

angular.module( 'myApp', [] ).config( config );
 
function config( $logProvider ) {
  $logProvider.debugEnabled( false );
}

Con este nuevo logger también puedes mandar a consola toda actividad en tus controladores, directivas, servicios, etc., y si la información que aparece es demasiada, puedes desactivar los contextos que gustes desde el bloque de ejecución de tu aplicación.

Digamos que tienes un controlador llamado MainController, y en él inicializas un logger con contexto “MainController”. Para desactivar toda la salida a consola generada por ese controlador, puedes hacer algo así:

angular.module( 'myApp', [] ).config( config ).run( run );
 
function config( $logProvider ) {
  $logProvider.debugEnabled( true );
}
 
function run( $log ) {
  var logger = $log.getLogger( 'MainController' );
  logger.enable( false );
}

La idea es que en cada componente de tu aplicación tengas un logger y el contexto sea el nombre del componente.

Referencias

Enhancing AngularJS Logging using Decorators
Enhancing $log in AngularJs the simple way

XMind — Hacer mapas mentales nunca fue tan fácil

[singlepic=712,120,,,left]

Lluvia de ideas, proyecto nuevo, resolución de problemas; estas y otras actividades creativas provocan un gran flujo de ideas en nuestra cabeza.

¿Cómo podemos tener control y darle seguimiento a nuestras incesantes ideas?
¡Con un mapa mental, por supuesto! (también conocido como mind map)

Después de echarle el ojo a un par aplicaciones para crear mapas mentales (de las que aparecen en el repositorio de Ubuntu), decidí probar el XMind y quiero comentarles que he quedado gratamente sorprendido.

La interfaz es limpia, intuitiva y hermosa. ¿Lo mejor? ¡Es software libre!
Así que no pierdas más tiempo y dirígete a su sitio para descargarlo:
XMind Collaborative Minds

Hay versiones para Linux, Mac y Windows.
Puede exportar a varios formatos de imagen, HTML, PDF y más.

Existe una versión Pro con un costo de $49 USD al año que te habilita para compartir tus mapas en internet, realizar manejo de tareas (con gráficas de Gantt) y crear presentaciones.

Ninite — El mejor software gratuito reunido en un sólo lugar

[singlepic=710,120,,,left]

Si, uso Ubuntu, pero a veces no falta el amigo o familiar que te pide le formatees la máquina, le pongas Windows y le instales el software básico para funcionar.

Para esos casos existe una solución muy buena, se llama Ninite.

Lo único que debes hacer es ir al sitio de Ninite, seleccionar de la lista el software que desees y se te generará un instalador que podrás usar en tu máquina con Windows. No más vueltas por toda la red para conseguir lo mejor de lo mejor.

Todo en un mismo lugar.

Ubuntu Studio

[singlepic=683,220,,,left]

Normalmente las licencias para productos como el Photoshop, Illustrator, Premiere, 3DStudio, etc., salen en un ojo de la cara… y a veces tenemos la necesidad de jugar con algún software que nos permita desarrollar nuestra creatividad, o simplemente expresarnos.

¿Qué podemos hacer si no queremos infringir la ley y no tenemos varo?

Pues de entrada, bienvenido al mundo del open source, donde abundan las aplicaciones de software libre y lo económico no es una barrera más para el aprendizaje y desarrollo personal.

¿Así que quieres un estudio multimedia en tu Ubuntu?

Ubuntu Studio

Deja que tu creatividad vuele…

Ubuntu Studio. Un sabor de Ubuntu para crear multimedia.

Ubuntu Studio está dirigido a los entusiastas y profesionales del audio, video y gráficos en GNU/Linux.

Provee una suite con las mejores aplicaciones open source disponibles para la creación de multimedia. Completamente libre para usarse, modificarse y redistribuirse. Tu única limitación es tu imaginación.

Audio

Nuestro objetivo es ensamblar suites de aplicaciones dirigidas a gente creativa. Suites que incluyen las mejores aplicaciones open source disponibles.

Por ejemplo, Ardour 2 — Un grabador/editor para las personas familiares con Pro-Tools.

Gráficos

Aplicaciones para diseño gráfico y modelado que incluyen The GIMP, Inkscape y Blender. Junto con plugins como dcraw que ayudan con archivos RAW de cámaras digitales y wacom-tools para personas con tabletas de dibujo Wacom.

Video

PiTiVi, Kino, Cinepaint son incluidos para la creación de video. Esperamos proveer un ambiente creativo para las personas así como exponer algunas de las aplicaciones open source más asombrosas.

Deja que la creatividad vuele…

Tutoriales

Por ahí me topé con este mini tutorial de Hydrogen (audio):
Making Music(Beats) on Linux/Ubuntu with Hydrogen

Unos de The GIMP (imagen):
Gtuts — Quality GIMP tutorials
30+ Exceptional GIMP Tutorials and Resources
GIMP Plus — High Quality GIMP Tutorials
GIMP TUTORIALS — Biggest Collection of GIMP Tutorials and useful snippets.

Y un buen de Blender (3d):
Blender Tutorial Archive

Los mapas del metro de la Ciudad de México en tu móvil

Y no sólo del metro de la Ciudad de México, sino de otras 400 ciudades.

Métro es tu guía gratuita a los sistemas de transporte público de todo el mundo en tu PDA (Palm, PocketPC, Smartphone…).

Pero no es realmente un mapa. Es una aplicación a la cual le puedes ingresar tu origen y destino y como respuesta te dice cuál es la ruta más corta para llegar ahí, con todo y tiempo estimado de viaje y dónde debes hacer transbordes y en qué dirección.

Aquí les dejo el enlace:
Métro — The ultimate public transport guide for your PDA or Smartphone

Plataformas soportadas

  • iPhone
  • BlackBerry
  • Bada
  • Android
  • Symbian^3 & S60v5
  • Symbian S60
  • Symbian S80
  • Symbian S90
  • Symbian UIQ
  • Palm
  • PocketPC
  • MS Smartphone
  • Otros
A la hora de seleccionar la red de México tengan cuidado, ya que también está la red de pumabuses de la UNAM (se llama Mexico UNAM). La red del metro de la Ciudad de México viene más abajo, su nombre trae acento y dice sólo México.

Sourceforge Community Choice Awards 2009

[singlepic=618,120,,,left]

Vaya, vaya… me encanta cada que sale un concurso de estos en Sourceforge.

Es la oportunidad perfecta para conocer nuevas propuestas y reafirmar las existentes.

¿Estás interesado en ver que hay de nuevo en el mundo del Open Source?
Sourceforge Community Choice Awards 2009

Categorías

  • Mejor proyecto
  • Mejor proyecto nuevo
  • Mejor proyecto open source comercial
  • Mejor diseño visual
  • Mejor proyecto para lo académico
  • Mejor herramienta o utilería para SysAdmins
  • Mejor herramienta o utilería para desarrolladores
  • Mejor proyecto para empresas
  • Mejor proyecto para jugadores
  • Mejor proyecto multimedia
  • Mejor proyecto para el gobierno
  • Seguramente cambiará tu forma de hacer todo lo que haces

Dense una vuelta, igual y encuentran algo útil para probar, como yo. 🙂

97 joyas de la ingeniería de software

97 cosas que todo arquitecto de software debería saber

No se porque se me había pasado publicar acerca de esto, pero el otro día navegando por la red me encontré con este sitio:
97 Things Every Software Architect Should Know

Cada uno de los axiomas ahí presentados es una joya en si mismo.

Si realmente te interesa convertirte en un buen arquitecto de software (con todo lo que eso implica) no puedes perdértelos.

Y dado que es un material algo amplio, puedes leer un puñado de ellos al día. La idea es que los entienda uno a conciencia. Fue tan bueno que incluso ya O’Reilly publicó un libro con las aportaciones.

WordPress 2.7 ya está aquí

[singlepic=546,120,,,left]

Así es, este blog ya está corriendo sobre WordPress 2.7 y puedo dar testimonio de la efectividad de su nueva interfaz.

¿Qué esperas? descárgalo de una vez.
Y si usas el K2 para tus temas, también ya liberaron su K2 for WordPress 2.7.

Lástima que hayan decidido dejar de soportar el Sidebar Manager, pero tienen razón, es doble esfuerzo. Ojalá los de WordPress se pongan las pilas y desarrollen un sistema similar para el manejo de los widgets.

Microsoft libera Photosynth

[singlepic=570,120,,,left]

¿Recuerdan el artículo sobre Photosynth?

Resulta que Photosynth a pasado de un simple tech preview a un servicio completo.

Ahora puedes subir tus fotos y transformarlas en un synth: un paseo reconstruido en 3D de tu hogar, tus vacaciones, o de cualquier otra cosa a la que le tomes fotos. Aprende más acerca de Photosynth leyendo su blog oficial, lee lo que Walt Mossberg tiene que decir al respecto, o simplemente ve y pruébalo ahorita mismo.

De acuerdo a Mossberg, Photosynth trabaja en PCs que tengan IE o Firefox, pero no en Macs aún.

El futuro de Photosynth

El equipo que nos trajo Photosynth nos enseña qué trae entre manos.


Uni. Washington and Microsoft Research collaborates on (yet another) mindblowing 3D photo viewer.