Liferay Symposium 2014 en dos palabras: User Experience

Estas son las dos palabras que podrían resumir el contenido del Symposium de Liferay de este año y es que desde la presentación de Bryan Cheung, CEO de Liferay, hasta el cierre a cargo de Jorge Ferrer, Vicepresidente de Ingeniería, gran parte de las ponencias han girado en torno a la experiencia de usuario, su continuidad multi-canal y multi-dispositivo y los aspectos técnicos detrás de todo ello mediante aplicaciones como Audience Targeting o la creación de aplicaciones nativas integradas con el portal, creadas en tiempo récord con Liferay Screens.
 
Liferay Symposium 2014
 
Bryan Cheung comenzó poniéndonos en situación de cómo los procesos habituales han ido transformándose para integrarse en sistemas digitales, de la enorme cantidad de información que esto mismo ha generado en consecuencia y de cómo se debe gestionar de forma eficaz la atención del usuario, implementado sistemas que garanticen dicha atención al ofrecer sólo información relevante para éste. Tenemos demasiadas aplicaciones, canales, interfaces y audiencias por lo que se hace necesario tener capacidad de segmentación para captar ésta atención.
 
Al hilo de esta introducción, Jorge Ferrer continuó desarrollando los conceptos de content targeting y de continuidad de la experiencia de usuario y nos habló de cuáles eran los dos pilares fundamentales para sacar el máximo partido a Liferay: 
  • Servicios y componentes reutilizables para todo tipo de aplicaciones empresariales y dispositivos (PCs, Tablets/Móviles o Smartwatches) que facilitan la integración. Gracias a la modularidad de Liferay es posible desarrollar extensiones para alimentar estas aplicaciones y cubrir las necesidades de continuidad de experiencia multi-dispositivo.
  • El ‘Desarrollo de experiencias en lugar de aplicaciones’. Con esta frase nos indicaba la importancia de poner el foco en el usuario usando como ejemplo un clásico: la petición de soporte/asistencia por parte de un cliente, donde habitualmente se pasa por varios canales (web, teléfono, ubicación física) e interlocutores que solicitan reiteradamente información por no disponer de un sistema con datos centralizados. La experiencia influye directamente en la conversión (en un 97% de los casos según Gartner) por lo que es imprescindible tratar de garantizar que sea satisfactoria.
Es en esta ponencia en la que empezamos a tener las primeras vistas y los primeros datos sobre el plugin Audience Targeting como base para construir esta experiencia de usuario, fluida y continuada, junto al potencial de integración de servicios que ofrece Liferay.
 
Sobre la integración de servicios en aplicaciones móviles continuaron más adelante Zeno Rocha, Juan Fernández y José Manuel Navarro en las ponencias “Mobile Apps” y “Liferay Screens”, dónde de una manera práctica (y con slides “starwarseros” muy divertidos) vimos el potencial del Mobile SDK y el desarrollo de Screenlets. Todas estas librerías nos permitirán consumir recursos de Liferay directamente en nuestras aplicaciones eliminando complejidad a las llamadas remotas, gestión de errores etc. desarrollando así aplicaciones nativas totalmente integradas. Los Screenlets además de contar con un origen de datos tienen una vista, que podemos personalizar con un theme, aspecto que particularmente me resultó interesante por la parte que me toca en desarrollos de front-end.
 
Julio Camarero y Eduardo García nos presentaron posteriormente la modularidad basada en OSGi para crear plugins extensibles y sus beneficios al reducir la inversión en mantenimiento y en la gestión del ciclo de releases, ofreciendo además la posibilidad a desarrolladores de ofrecer estos servicios modulares en el marketplace. Todo se iba orquestando magníficamente ya que, como veríamos en su siguiente ponencia y en la del día siguiente, dicha metodología es en la que está basado el desarrollo de Audience Targeting.
 
Dos ponencias más sobre aspectos técnicos tuvimos seguidamente, “Nuevos componentes de Liferay Faces basados en AlloyUI” a cargo de Juan González (no podía ser de otro modo ;) ) dónde vimos de nuevo su potencial y su capacidad responsive y “Single Page Applications in Alloy 3.0 and Liferay 7.0” a cargo del génio del Javascript Iliyan Peychev, enseñandonos aplicaciones de una sola página al más puro estilo Twitter/Facebook, más rápidas que la vista (como comento Manuel de la Peña), ‘cacheables’, optimizadas para SEO & “Boorkmarkability”, historial de navegación etc.
 
Audience Targeting PluginLlegado este punto ya teníamos todas las piezas para presentar uno de los platos fuertes del Symposium, llegó el momento de (redoble mental) la ponencia de Audience Targeting a cargo de nuevo de Julio Camarero.
 
Comenzó hablándonos de cómo ha ido evolucionando la maquetación de contenido y de como la experiencia usando una web a acabado convirtiéndose en algo bidireccional.

“es un diálogo, escucho lo que quiere el usuario y se lo ofrezco”

A medida que nos iba mostrando las capacidades de este plugin me iba quedando más ojiplático con su potencial y es que tiene unas posibilidades tremendas!
 
En la gestión interna del plugin tenemos un gestor de reglas en el que podemos ir agregando patrones para ir segmentando comportamiento y características de los usuarios, desde la ubicación que tiene definida en el portal hasta las redes sociales que sigue. Dentro de esta gestión existen cuatro bloques principales para definir estas reglas
  • Social: para aspectos relacionados con redes sociales como por ejemplo identificar páginas de Facebook a las que esté siguiendo el usuario.
  • Behavior: Para definir comportamientos del usuario en el portal y crear reglas en base a éstos
  • User attributes: Para segmentar en base a datos que pueda tener el usuario en su perfil del portal
  • Session Attributes: Para definir parámetros en base a la sesión en la que se encuentra el usuario como su localización, navegador o dispositivo utilizado.
La gran ventaja es que no solo podemos crear segmentos para los usuarios del portal de los que tenemos mucha más información sino que también podemos segmentar contenido para usuarios no identificados.
 
Para probar todas las reglas que vamos creando contamos con un simulador que nos permite adoptar un tipo de usuario que cumpla determinadas características y observar así si el contenido que se le muestra es el que procede.
 
Acompañando a todo esto, el plugin Audience Targeting cuenta con un sistema de estadísticas que nos permite crear campañas, en las que podemos definir prioridad si tenemos más de una funcionando, y monitorizar sus resultados. El reporte inicial es muy básico pero otra gran ventaja es que es posible ampliar estos informes de modo que podamos obtener datos muy precisos tremendamente valiosos para el departamento de marketing.
 
Además, como vimos al día siguiente, al estar basado en OSGi podemos extender sus funcionalidades. Nos mostró un ejemplo muy ilustrativo en el que, integrándolo contra un API de un proveedor de servicios meteorológicos podíamos mostrar un contenido u otro en función de si el día era soleado o estaba nublado, algo que según nos indicaba Julio estaban haciendo algunas grandes compañías (no haré publi :P) para ofrecer unos productos u otros en sus websites.
 
Para estas ampliaciones contamos con un SDK en la Developer Network, de la que os hablaré más adelante, y en las próximas semanas añadirán tutoriales para hacer estas cosas paso a paso, incluyendo por ejemplo la personalización de la vista mediante Freemarker (de nuevo frontend yeah!!). 
 
Os dejo el enlace : Audience Targeting SDK
 
La guinda a todo este mundo del UX o experiencia de usuario la puso el segundo día Juan Hidalgo con su ponencia “Buenas prácticas para proporcionar una gran experiencia de usuario en tu portal” pero lamentablemente este año me la perdí ya que asistí al workshop sobre Temas de apariencia (themes) que daba Marcos Castro, del que salí con algunas ideas para próximos Themes. 
 
Me ha quedado un post tremendo así que ahí va mi “disclaimer” :P
Esto no es todo el symposium de liferay ni muchísimo menos, he tratado de dar un enfoque centrado en uno de los temas que captó previamente e in situ toda mi atención.
 
Tuvimos muchísimas otras charlas interesantes como la de Jorge Ferrer sobre la Liferay Developer Network, en la que se ha centralizado toda la documentación y se va a ofrecer la posibilidad de que sea ampliada y traducida por la comunidad o en la que nos contó 4 caracteristicas emocionantes para desarrollo que vendrán con Liferay 7. También me resultó muy interesante la de Zeno Rocha y Chema Balsas sobre el concepto “Mobile First”, de cómo aplicar el Progressive Enhancement (de móvil a desktop) en lugar de Graceful Degradation (de desktop a móvil). Por supuesto no podía faltar una mención a la de nuestro miembro honorífico del LSUG James Falkner, Community Manager de Liferay, sobre como contribuir a la comunidad con pequeñas acciones como crear una idea de una nueva funcionalidad, participar en los user-groups, blogs y foros o contribuir con aplicaciones, traducciones y documentación. 
 
Y con esto tocó despedirse hasta el año siguiente dónde los miembros del LSUG, como viene siendo tradición al finalizar el primer día, volveremos a contarnos entre cañas nuestra experiencia con todas estas tecnologías que tanto nos apasionan.
 

Liferay Spain Symposium 2014, calentando motores

Tan solo quedan 3 meses exactos hasta la cita anual con el Symposium de Liferay y ya conocemos los que serán puntos fuertes de esta edición, así como una agenda provisional de las ponencias que tendremos divididas, como viene siendo habitual en los últimos años,  en un track técnico y otro de negocio.
 
Liferay Spain Symposium 2014
 
Como bloques principales este año nos encontraremos con el desarrollo de aplicaciones móviles nativas conectadas a los servicios de nuestros portales, el uso multi-dispositivo, la gestión y monitorización en la nube gracias a Liferay Cloud Services o una introducción al Audience Targeting de Liferay. 
 
Completando las dos jornadas tendremos sesiones muy ilustrativas con casos de éxito, buenas prácticas, ejemplos de integración con otras aplicaciones, mesas redondas y, como novedad este año dos workshops, uno de desarrollo de aplicaciones móviles y otro de temas de apariencia basados en Bootstrap. Tampoco nos podemos olvidar del bloque de charlas de 7 minutos o Lightning Talks de las que también podemos sacar información jugosa. En el pasado symposium tuve la oportunidad de estrenarme en este formato con la Implementación de Google Authorship en Liferay y también de quedarme "ojiplático" en varias de estas charlas realizadas por otros compañeros, muy interesante! [Nota: Lástima que los señores de Google decidieran hace unas semanas suprimir las imágenes de autor en los rich snippets ¬_¬ ]. Como véis, hacer una hoja de ruta para todas las ponencias puede ser complicado ya que uno optaría por clonarse y asistir a todo pero lamentablemente por ahora... hay que escoger. 
 
El año pasado tuvimos una magnífica ponencia de Ed Chung sobre Segmentación de usuarios y personalización de contenidos (Audience Engagement) que me resultó de lo más interesante. También tuvimos otra de Jorge Ferrer sobre las tendencias futuras de Liferay en productos y servicios, en la que abordó este tema y nos habló de los plugins de Content Targeting que tendríamos en el marketplace. Es por esto que la que previsiblemente cerrará el primer día es una de las que me ha generado más expectación. Os dejo la ponencia de Ed Chung y el enlace a todas las demás:
 
 
 
Como broche de oro a la jornada del 22 supongo que, para no perder las buenas costumbres, tendremos reunión del Liferay Spain User Group o LSUG, momento perfecto para tomarte algo fresquito y conocer a personas con las que probablemente has intercambiado ayuda en los foros, contar tu experiencia con Liferay, descubrir cómo puedes aportar a la comunidad, etc. un rato entre geeks de lo más entretenido! 
 
El registro para el Symposium suele tener importantes descuentos meses antes, para ser más precisos la inscripción más económica es hasta el 24 de Septiembre, así que no lo dejes para mañana!!
 

Universal Analytics en Liferay Portal: nuevo código de seguimiento

Cómo pudimos leer a principio de este mes en el blog Central de Conversiones, Universal Analytics ha dejado de ser Beta y ya es posible actualizar el código de seguimiento para cualquier cuenta. El uso de este nuevo script para la medición del tráfico nos promete mejores mediciones considerando el uso de múltiples pantallas y dispositivos, así como obtener los informes de Remarketing y Público (datos demográficos).

Para empezar a usar este código de seguimiento tendremos que hacer un “pequeño cambio” en los archivos desde los que Liferay genera el script para cada página cuando hemos configurado el ID de Google Analytics.
Como contaba en la entrada en la que hablaba de cómo configurar analytics en Liferay hay que tener en cuenta la versión de Liferay que estamos usando para saber qué ficheros son los que hay que modificar.

Hasta 6.0
El script se genera entre </body> y </html>. Este contenido suele generarse a través de la llamada $theme.include($bottom_include) en el Tema de Apariencia. El contenido que se incluirá entre estas dos etiquetas HTML lo encontramos bajo /ROOT/html/common/themes/bottom.jsp y éste archivo sería el que deberíamos modificar en caso de tener el portal todavía en estas versiones. (Nota: en este caso quizá convendría prescindir de script generado automáticamente por Liferay y colocarlo por ejemplo en el theme entre <head> y </head>)

A partir de 6.1
El script se genera entre <head> y </head>. Este contenido suele generarse a través de la llamada $theme.include($top_head_include) en el Theme. El archivo que nos interesa lo hallamos en /ROOT/html/common/themes/top_js.jspf y éste jspf será el que debamos modificar.

Es importante que antes de hacer ningún cambio comprobemos el estado de la transferencia a Universal Analytics en la cuenta para la que se va a actualizar el script. Si no se nos muestra el mensaje “Transferencia no iniciada” como el que se aprecia en la captura, o un aviso sobre la Actualización a Universal Analytics en la sección “Información de seguimiento” del panel de administración probablemente ya se haya realizado esta transferencia, de manera que el script deberíamos actualizarlo cuanto antes.

Implementación del código de seguimiento

Antes de nada debo indicar que debido a que el nuevo código de seguimiento incluye el nombre de dominio se hace imprescindible el uso de una variable capaz de devolvernos el valor para cada instancia y/o sitio web con virtual hosting y hasta la fecha no he encontrado ningún método que haga esto de forma válida para el 100% de los casos (dominios con http,https,www,sin www o subdominios). La solución que ofrezco en este post es válida para portales con "http://www.” o “https://www.” o subdominios editando de forma específica en este caso. Si doy con una mejor dad por hecho que actualizaré la entrada o haré una nueva.

La modificación de estos ficheros podemos hacerla con un sencillo hook. Si tenemos el SDK configurado en Eclipse el propio asistente nos dejará seleccionar el bottom.jsp o el top_js.jspf que vayamos a modificar según el caso y desde el propio IDE podemos hacer el cambio.

El código del script ha ido cambiando con el tiempo y obviamente en las versiones de Liferay también ha ido sufriendo modificaciones. Por el momento el uso del nuevo código de seguimiento es opcional pero en el momento que se alcance la fase 4 de la actualización (la salida de Beta era la fase 3) y Universal Analytics sea el estándar operativo, dejará de ser válido el uso de ga.js y urchin.js. Esta es la versión actual para Universal Analytics:

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXXXX-N', 'NOMBRE-DE-DOMINIO');
  ga('send', 'pageview');

</script>

Aquí es dónde debemos llevar especial cuidado ya que no deberán introducirse valores únicos para el ID y el nombre de dominio sino las variables <%= googleAnalyticsId %> y la que os comentaba para el nombre de dominio.

Para ello a continuación del comentario <%-- Google Analytics --%> o <%-- Analytics --%> (según versión) dentro de top_js.jspf y aprovechando el sitio dónde se define googleAnalyticsId añadimos lo siguiente:

String PortalFullURL = HttpUtil.getDomain(themeDisplay.getPortalURL());
String PortalDomainName = PortalFullURL.replace("www.","");

En caso de tener subdominios en el portal se podría usar replaceAll en lugar de replace y separar las cadenas con |, por ejemplo:

String PortalDomainName = PortalFullURL.replaceAll("www.|blog.","");

El código de seguimiento quedaría de este modo

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', '<%= googleAnalyticsId %>', '<%= PortalDomainName %>');
  ga('send', 'pageview');

</script>

Espero que os sea de utilidad.
Más información sobre el proceso de actualización a Universal Analytics aquí

Parche para solventar el bug del meta-description en Liferay 6.2

Esta es una "micro-entrada" de blog básicamente para ofreceros un hook muy sencillo que solventa el problema de almacenar el contenido de la meta etiqueta Description en Liferay 6.2. El buen funcionamiento de esta etiqueta es imprescindible para cualquier acción SEO que se quiera desarrollar con el portal de manera que subsanarlo es obligatorio.

La incidencia está documentada aquí https://issues.liferay.com/browse/LPS-43975 y como indica Riccardo Martini, la solución es tan sencilla como añadir un ID en la línea 40, dónde se encuentra <aui:input name="description"/>. En mi caso he optado por usar el ID meta-description, quedando esta línea de la siguiente manera:

<aui:input name="description" id="meta-description"/>

Una vez desplegado, cualquier contenido que se introduzca desde Administrar Páginas en este campo será almacenado de forma correcta.

Podéis descargar este parchecillo aquí "meta-description-fix-hook"

Introducción a Liferay User Live Session Monitoring

En Liferay Portal tenemos una opción de monitorización en el panel de control quizá poco explotada o poco conocida debido a que viene desactivada por defecto por cuestiones de rendimiento. Me estoy refiriendo a la que da título a esta entrada: Monitoring.

Veamos lo que ofrece a simple vista y rasquemos un poquito más para ver lo que tenemos debajo.

Liferay User Live Sessions Monitoring

Activación

Para tener operativa esta funcionalidad del panel de control debemos añadir a nuestro portal-ext.properties esta línea:

live.users.enabled=true

Una vez activada esta opción nos aportará información en tiempo real de las sesiones que los usuarios tienen iniciadas en el momento que accedemos a la consulta.

La operativa es muy sencilla, accedemos, visualizamos la relación de ID’s de usuario que tienen iniciada la sesión junto con algunos datos y si queremos más información sobre uno de los usuarios hacemos clic sobre este.

La información (de interés) que podemos obtener de cada sesión de usuario es la siguiente:

  • Identificador de Sesión

  • Última petición: Fecha y hora de la última petición realizada (URL visitada)

  • Número de accesos: Número total de URL visitadas en el portal / intranet / extranet

  • Datos de usuario (nombre y dirección de correo electrónico)

  • Tipo de Navegador/S.O: Información sobre el sistema operativo y navegador utilizado

  • IP del servidor remoto: IP remota desde la que se ha conectado el usuario

  • URLs accedidas: Relación de todas las URLs visitadas

Pero ¿Qué ocurre con esta información si el usuario cierra sesión? Pues que al tratarse de información de Sesiones Activas obviamente desaparecerá. Por suerte, contamos con otras opciones de configuración para el portal-ext.properties con las que crear persistencia de toda esta información en base de datos:

session.tracker.memory.enabled=true

session.tracker.persistence.enabled=true

session.tracker.friendly.paths.enabled=true

Con estas 3 líneas conseguiremos que se almacene la información entre las tablas usertrackerPath y usertracker, de manera que podamos consultar los datos antes mencionados tanto si la sesión está activa como si es de fechas anteriores.

Ni que decir tiene que esta información, dependiendo del número de usuarios que tenga el portal, puede crecer de forma desorbitada.

Como acceder mediante la administración de BBDD a visualizar esta información no es nada usable he optado por hacer un pilotillo de dashboard o cuadro de mando con QlikView en su versión Personal Edition.

En este piloto también he añadido la tablat user_ para poder tener otros datos relacionados con los usuarios:

  • Fecha del último login

  • Relación de IPs de conexión

  • Última IP de conexión

  • Total de usuarios

  • Carga total de usuarios

Liferay Monitoring Dashboard - Cuadro de mando

La idoneidad de esta “mini-auditoría” es bastante discutible por lo que he comentado anteriormente del rendimiento, el incremento de la información almacenada y por acceder a la información con una conexión directa a la base de datos, no obstante, creo que se trata de una funcionalidad interesante, no solo para Community Edition dónde no disponemos de Auditoría, sino en general para tener un sistema de trazabilidad que nos permita procesar la información y conocer con cierto detalle cuál es comportamiento de los usuarios en áreas privadas del portal (intranets / extranets).

Imagen “3D Social Networking” CC de Chris Potter (Stockmonkeys.com Flickr)

Mostrando el intervalo 1 - 5 de 17 resultados.
Resultados por página 5
de 4

Twitter @miguelpauLiferay Social ProfileLinkedin ProfileGoogle+ RSS Blog MiguelPau

Proyectos en los que colaboro

XML Portlet Factory: CRUD portlet development

Portlet.es: Liferay Portlets