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)

Implementando Google Authorship en Liferay para multiples autores

(Lightning Talk en el Liferay Spain Symposium 2013)
 
Desde su aparición en verano de 2011 la implementación de Google Authorship ha ido extendiéndose de forma progresiva sobre todo en este último año. 
 
Qué es y cuales son sus beneficios
Primero os hablaré de lo que no es: Como indicó John Mueller, analista de Google Webmaster Tools, en el Google Webmaster Central Hangout broadcast de 27 de septiembre 2013 “We don’t use Authorship for ranking at the moment,” . No es todavía un factor de ranking, no obstante es muy recomendable su implementación.
Básicamente consiste en dar de alta en el programa Authorship al autor del contenido, cruzando links con su perfil de Google+ para obtener un fragmento enriquecido con la foto y enlaces relacionados con contenido publicado por dicho autor. 
 
Pero el rich snnipet no es el único beneficio:
  • Al aparecer la foto del autor se genera una mayor confianza en ese contenido
  • El rich snnipet altera el patrón típico de eye tracking desapareciendo el tradicional “triángulo de oro” de las SERPs.
  • Conseguimos distinción frente a la competencia
  • Aumento del CTR (Click Through Rate) o tasa de clics, más tráfico para nuestro portal.
 
Proceso de alta
Disponéis de dos opciones:
  1. Mediante una dirección de correo electrónica válida: Si genero artículos en el portal www.dominio.com y tengo una dirección de correo electrónico xxxx@dominio.com sigo el proceso que me indica Google en https://plus.google.com/authorship
  2. Implementación: Google nos ofrece una segunda opción se disponga o no de una dirección de correo electrónico del portal en el que escriben estos autores. Para ello es necesario:
 Añadir, a cada entrada de blog o contenido con autoría, un enlace hacia el perfil del Google+ del autor donde el href debe terminar en ?rel=author. Ejemplo: 
 
<a href="https://plus.google.com/107700311423087074311?rel=author">Miguel</a>
 
Añadir el link recíproco hacia www.dominio.com en la sección “Enlaces > Otros perfiles” dentro del perfil de Google+ del autor.
Perfil de Google+ con foto
 
Consideraciones: Número de autores y visualización de contenido
Vamos a lo que importa, cómo hacer esto en Liferay.
 
Si tenéis un portal con un solo autor es muy sencillo, podéis optar por
añadir el enlace de forma manual a cada contenido (opción menos recomendada)
añadir el enlace con el ?rel=author en el tema de apariencia, footer, etc..
añadir el enlace en un contenido que permanezca visible tanto en cualquier vista de resumen como visualizando el contenido completo, por ejemplo con una disposición de página de 70%-30%.
 
Si en el portal hay más de un autor estas opciones ya no son válidas y es cuando toca remangarse la camisa para programar.
 
La opción que sugiero precisa de lo siguiente:
Crear un campo personalizado (expando) para los usuarios: En este campo el usuario podrá poner en su cuenta la URL de su perfil de Google+ o bien un link a una página interna del portal dónde haya una “bio” del autor que contenga el enlace a su perfil si así hemos hecho la arquitectura del portal. La opción más sencilla sería la primera.
Modificar los ficheros view_entry_content.jsp y asset_metadata.jspf de los portlets Blog y Publicador de contenidos respectivamente para renderizar el link en caso de que el campo personalizado contenga datos.
 
Opciones para esta implementación

Desarrollar un plugin que 

  • Contenga un evento para crear el campo personalizado de usuario en el momento del despliegue (deploy
  • Contenga las modificaciones del jsp y jspf
  • Compruebe si el campo personalizado contiene datos o no para añadir entonces el enlace con el ?rel=author
O más sencillo…. descargar del Liferay Market place el plugin Author Plus disponible desde el pasado martes día 15 :)
 
Para verificar que todo está correcto podéis usar esta herramienta de Google Webmaster Tools http://www.google.com/webmasters/tools/richsnippets 
 
Si queréis información mucho más completa sobre el proceso de desarrollo de Author Plus, especialmente para la creación del expando en el deploy, podéis visitar esta entrada del blog de Moisés Belda donde explica el proceso con gran detalle:
 
El plugin es open source, tenéis disponible el fuente en GitHub
 
Mostrando el intervalo 1 - 5 de 16 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