Screencast sobre Alfresco Mobile, aplicación para iPad/iPhone

He grabado este breve screencast mostrando las funcionalidades principales de la nueva aplicación de Alfresco, Alfresco Mobile, que está disponible en la Apple Store de forma gratuita para iPad e iPhone. No olvides leer el white paper, visitar la sección de Alfresco Mobile en nuestra web y si quieres pedir alguna nueva funcionalidad o detectas algún fallo puedes reportarlo en la sección apropiada en nuestro Jira, aquí.

Próximos eventos de Alfresco: septiembre – diciembre 2011

Aunque para este tipo de anuncios suelo utilizar mi cuenta Twitter, en este caso voy a hacer una excepción ya que creo que merece la pena por la cantidad de temas que se avecinan. Quiero comentaros los eventos de Alfresco que tenemos planificados celebrar próximamente, que son muchos, muy interesantes y accesibles a todos. Estoy hablando principalmente de la Alfresco DevCon, Talleres Expertos, Webinars y por supuesto la fiesta de lanzamiento de Alfresco 4.0 Community.
  • Alfresco DevCon, conferencia anual de desarrolladores:
Empezamos por el más importante de todos por su repercusión y asistencia, y ya un clásico anual para los desarrolladores de Alfresco, la Alfresco DevCon se celebrará este año en Londres y será durante los días 9 y 10 de noviembre (también en San Diego un par de semanas antes). Si tienes pensado asistir, recuerda que el día 8 hay una jornada formación, donde te puedes aprovechar para tomar una introducción bastante amplia sobre Alfresco, llamada “Alfresco JumpStart“, o un curso orientado a expertos y desarrolladores, “Advanced Alfresco Training“. Las conferencias de la DevCon serán presentadas ingenieros de Alfresco y por importantes gurús de la comunidad. Sin duda es una oportunidad para conocerlos a todos ellos en persona y compartir inquietudes, dudas y ver casos de éxito. Más información en los siguientes enlaces: http://blogs.alfresco.com/wp/devcon/2011/08/19/registration-now-open/ y
No te pierdas el video de presentación: http://www.youtube.com/watch?v=RZtv9NBI6uU
  • Talleres Expertos:
Siguiendo con la dinámica de las “Master Class” que realizábamos por España y Potugal, hemos rebautizado estas sesiones gratuitas con el nombre de “Taller Experto“. Está orientado a clientes, partners y organizaciones interesadas en implementar Alfresco Enterprise, y que tengan un conocimiento amplio de la plataforma ya que se tratarán temas avanzados de diferente índole a elegir por los asistentes, es decir, “Talleres Expertos” a la carta. En estas sesiones que constan de dos charlas hablaremos de temas diversos como Arquitectura, Introducción a desarrollo, Escalabilidad, Clustering, CMIS, Subsistemas, Autenticación y Single Sign On, Almacenamiento, Web Quick Start, Conectores – Interfaces, etc. En algunos casos contaremos con invitados de lujo como Mike Farman (Product Manager de Alfresco) y Rui Monteiro (Solutions Engineer para EMEA de Alfresco). Para asistir a estos Talleres hay que registrarse aquí y posteriormente confirmaremos asistencia por correo electrónico, las plazas son muy limitadas.
  • Webinars:
Estos seminarios virtuales de una hora de duración aproximadamente donde damos a conocer funcionalidades o nuevas características de Alfresco y podéis participar haciendo preguntas. Los próximos webinars son “Alfresco y Activiti”, “Alfresco integrado en un ecosistema con Windows, MS Office y Outlook”, “Alfresco en una hora” y “Soluciones de escaneo y digitalización con Alfresco”. Puedes registrarte a cada uno de ellos aquí. Y puedes acceder a los demás webinar grabados en la sección OnDemand o en nuestro canal de Vimeo.
  • Fiesta publicación de Alfresco 4.0 Community:
Coincidiendo con la liberación de la versión de Alfresco 4.0 Community, celebraremos un encuentro de usuarios, desarrolladores y entusiastas de esta tecnología en Madrid, el día 11 de Octubre. Hablaremos de las novedades y compartiremos experiencias. Para más información sobre esta “fiesta” os recomiendo seguir este hilo del foro, ya que aún quedan temas por confirmar.

Cómo configurar Alfresco para usar Open Office remotamente, como servidor

Cuando vamos a tener un sistema con gran cantidad de usuarios (miles) y con necesidades importantes de transformación de formatos o incluso para lanzar una reindexación completa de ficheros, metadatos y contenido de los ficheros, puede ser útil escalar, ampliar nuestra infraestructura de Alfresco para usar recursos que tengamos disponibles en otras máquinas.

En este artículo voy a enseñar como configurar Alfresco Enterprise para usar un Open Office corriendo como servidor en un servidor remoto.

  • En el servidor dedicado donde ejecutaremos Open Office, que tiene la IP 192.168.0.30 ejecutamos el siguiente comando, poniendo la IP que será en la que “escuche” el proceso:

[bash]
/usr/bin/soffice -headless -nofirststartwizard -accept="socket,host=192.168.0.30,port=8100;urp;StarOffice.ServiceManager" &
[/bash]

  • En el servidor Alfresco, en el fichero alfresco-global.properties:

[bash]
### External executable locations ###
ooo.exe=/backup/alfresco/alfresco-enterprise-3.4.3/openoffice/program/soffice.bin
ooo.enabled=false
ooo.port=8100
ooo.server=192.168.0.30
img.root=/backup/alfresco/alfresco-enterprise-3.4.3/common
img.dyn=${img.root}/lib
img.exe=${img.root}/bin/convert
swf.exe=/backup/alfresco/alfresco-enterprise-3.4.3/common/bin/pdf2swf
jodconverter.enabled=true
jodconverter.officeHome=/backup/alfresco/alfresco-enterprise-3.4.3/openoffice
jodconverter.portNumbers=8100
[/bash]

Recuerda, en el archivo anterior, activar “jodconverter.enabled=true” y añadir el valor “ooo.server” con la IP donde estará el servidor dedicado con Open Office.

  • También creamos el siguiente fichero tomcat/shared/classes/alfresco/extension/remote-openoffice-context.xml con el contenido:

[xml]
<?xml version=’1.0′ encoding=’UTF-8′ ?>
<!DOCTYPE beans PUBLIC ‘-//SPRING//DTD BEAN//EN’ ‘http://www.springframework.org/dtd/spring-beans.dtd’>

<beans>

<bean id="openOfficeConnection" class="net.sf.jooreports.openoffice.connection.SocketOpenOfficeConnection">
<constructor-arg type="java.lang.String" value="${ooo.server}"/>
<constructor-arg type="int" value="${ooo.port}"/>
</bean>

<bean id="transformer.OpenOffice" class="org.alfresco.repo.content.transform.RemoteOpenOfficeContentTransformer" parent="baseContentTransformer" >
<property name="connection">
<ref bean="openOfficeConnection" />
</property>
<property name="documentFormatsConfiguration">
<value>classpath:alfresco/mimetype/openoffice-document-formats.xml</value>
</property>
</bean>

<bean id="openOfficeConnectionTester" class="org.alfresco.util.OpenOfficeConnectionTester">
<property name="connection">
<ref bean="openOfficeConnection"/>
</property>
<property name="strict">
<value>false</value>
</property>
</bean>

</beans>
[/xml]

Hechos esos cambios debemos reiniciar el servidor de aplicaciones y listo. Asegúrate que desde el servidor de Alfresco se llega al puerto de OpenOffice remoto por ejemplo haciendo “telnet 192.168.0.30 8100”, también puedes ver el tráfico que se genera entre los servidores lanzando el comando “tcpdump -nni eth0|grep 8100” en el servidor de OpenOffice.

Recuerda que esta es una funcionalidad de escalabilidad adicional que está disponible en Alfresco Enterprise. Yo la he probado con la versión 3.4.3.

Más sobre digitalización y escaneo en Alfresco: tabla con opciones existentes

Durante mi visita a algunos partners en LATAM he estado hablando de características y nuevas funcionalidades de Alfresco, aparte de todo eso, la mayoría de ellos me preguntaron qué opciones ofrece Alfresco para resolver el problema de escaneo o el paradigma “paperless”. Dibujé en varias ocasiones un diagrama con las opciones existentes y he querido ponerlo en digital para compartirlo con vosotros. Este diagrama será la base para el webinar que haremos en dentro de unos meses sobre “Soluciones de escaneo con Alfresco”, al que puedes registrarte desde aquí. En los comentarios podéis compartir vuestra opinión o añadir otras opciones que no haya tenido en cuenta. Espero que os sea útil y con vuestras dudas o comentarios hacer un webinar más completo y atractivo.

Pincha en la imagen para verlo a tamaño completo

Video del webinar “Alfresco Share para usuarios: teoría y práctica”

En este webinar repasamos las características más destacadas de Alfresco Share y una hacemos una parte práctica a nivel de usuario para comenzar a usar Alfresco y poder aprovechar todo su potencial. Configuración del panel de inicio, Creación de sitios, uso de reglas, metadatos, transformaciones, etc. Gracias a Jose Pereira que me ayudó tanto a la preparación de la presentación como la parte de la demo. Te recomiendo mirar su web ya que ha publicado documentos muy buenos sobre Alfresco en español.

Alfresco Share para usuarios: teoria y práctica from Alfresco Spain Portugal on Vimeo.

Alfresco scheduled jobs, tareas automáticas de mantenimiento

Con el objetivo de ampliar el conocimiento en Alfresco y enseñar algunos aspectos que no se suelen tratar a menudo, en esta ocasión quiero explicar unos procesos que intervienen cada día en el mantenimiento de Alfresco y que generalmente desconocemos o no los tenemos en cuenta. Se trata de los “scheduled jobs”.
En Alfresco se ejecutan una serie de procesos automáticos de mantenimiento, algunos de ellos son nocturnos y otras se lanzan automáticamente cada cierto tiempo. Estas tareas son ajenas al usuario final pero no deberían serlo para los administradores de la plataforma. En docs.alfresco.com podréis encontrar información que os voy a resumir en este artículo.
Todos esas tareas están definidas en <configRoot>/scheduled-jobs-context.xml (cuando hablo de <configroot> me estoy refiriendo a la configuración dentro del fichero alfresco.war, ahí no debes tocarla, más abajo cuento como modificarlo, si fuese necesario). Algunas de las expresiones cron de estas tareas están definidas en <configRoot>/repository.properties. Recuerda que la sintaxis de este cron es diferente a la de UNIX, es Quartz y puedes ver ejemplos para entenderlo mejor aquí. si quieres cambiar algunas puedes hacerlo en alfresco-global.properties. Estas son las tareas de las que hablo:
  • contentStoreCleanerTrigger: Lanza el bean contentStoreCleaner, que identifica, borra o purga contenidos huérfanos del contentstore. Un contenido es huérfano cuando todas las referencias en la base de datos al binario se han eliminado. En un entorno en cluster este proceso se puede activar en un sólo nodo, con lo que se mejora el rendimiento durante el proceso. Por defecto se ejecuta a las 4:00 AM cada día (0 0 4 * * ?). El parámetro “ProtectDays” establece el número mínimo de días que el contenido debe ser huérfano antes de poder eliminarlo, el valor predeterminado es de 14 días.
  • nodeServiceCleanupTrigger: Realiza operaciones de limpieza en los nodos del DM, incluyendo transacciones antiguas y nodos antiguos eliminados. En un entorno en cluster este proceso se puede activar en un sólo nodo, con lo que se mejora el rendimiento durante el proceso. Se ejecuta a las 21:00h de cada día (0 0 21 * * ?).
  • openOfficeConnectionTesterTrigger: Monitoriza y mantiene la conexión con OpenOffice. Se ejecuta cada minuto (0 * * * * ?).
  • indexBackupTrigger: Hace un backup seguro de los directorios de Lucene. Crea el directorio “backup-lucene-indexes” y copia de forma segura la información de Lucene. Para conocer mejor como restaurarlo de forma incremental y evitar “FULL indexes” mira aquí. En un entorno en cluster este proceso se debe ejecutar en todos los nodos. Se ejecuta todos los días a las 3:00 AM (0 0 3 * * ?).
  • tempFileCleanerTrigger: Limpia todos los ficheros temporales de Alfresco cada cierto tiempo. También se vacían directorios temporales y sus subdirectorios. Existe un parámetro llamado “protectHours” que permite indicar el tiempo de conservación de un fichero temporal desde su última modificación. Por ejemplo, ficheros resultantes de transformaciones, extractores, temporales de OpenOffice, etc., generalmente almacenado en <tomcat>/temp/Alfresco. Se ejecuta cada hora en el minuto 30 (0 30 * * * ?).
  • avmOrphanReaperJob y avmExpiredContentTrigger: la primera tarea se ejecuta cada minuto para eliminar nodos huérfanos en el repositorio AVM y la segunda tarea sirve buscar contenido caducado en cada Web Project de WCM, se ejecuta cada día a las 3:30 AM. Si no has instalado AVM no te debes preocupar de esto, ya no se instala por defecto. Es el repositorio que usaba la implementación anterior de WCM.
  • ehCacheTracerJob: Recoge las estadísticas detalladas de uso de la caché y las salidas por consola, dependiendo de la configuración de logs del servidor. Por defecto, no está activado. Para activarlo hay que eliminar el comentario correspondiente en el xml de configuración. Si se activa, se ejecuta en intervalos de 60 minutos.
  • ftsIndexerTrigger: Esta tarea, aunque está en el fichero anterior, no es una tarea planificada en un momento concreto como tal, es para mantener los índices continuamente, se ejecuta cada minuto.
  • Cuando Alfresco está configurado en cluster hay un proceso llamado “index.tracking” que se lanza cada 5 segundos y se encarga de mantener los índices de todos los nodos del cluster sincronizados.
  • Sincronización de usuarios con LDAP: No es una tarea que que se gestione desde este fichero, pero es algo a tener en cuenta dentro de los trabajos planificados ya que dependiendo de la cantidad de usuarios que se sincronicen y la periodicidad de la sincronización, podría afectar al rendimiento de la plataforma. Una o dos veces al día, serían suficientes.
Recuerda que todos los detalles a bajo nivel de estas tareas específicas están descritas en el Java Doc de Alfresco en http://dev.alfresco.com/resource/docs/java/.
Estos trabajos planificados se pueden monitorizar mediante JXM en el bean Alfresco:Name=Schedule,Group=*,Type=*,Trigger=*
¿Cómo puedo cambiar el horario o configuración de estas tareas existentes? Hay dos formas de acceder a dicha información pero sólo una para modificarlos que es mediante archivos de configuración xml. Aunque si accedemos por JMX con la utilidad, por ejemplo, jconsole, podremos lanzar bajo demanda los procesos que necesitemos en cada momento o forzar la ejecución algún proceso concreto. Para cambiarlo modificando ficheros de configuración deberás copiar el fichero <configRoot>/alfresco/scheduled-jobs-context.xml a <extension>/custom-scheduled-jobs-context.xml y editarlo a tu gusto o necesidad.
Para ver los valores de las tareas y forzar su ejecución mediante JMX accede a tu servidor Alfresco con jconsole, aquí ves dos capturas, la primera es la vista general del bean:
y en la segunda vemos el ejemplo de la tarea que hace backup de los índices cada noche a las 3AM:
En la sección “Operations” de cada “Trigger” encontrarás un botón llamado “executeNow“, adivina para que sirve 😉 Cada tarea o trigger tiene una serie de propiedades que se explican por si solas, aunque me gustaría destacar la propiedad “Priority” que permite ejecutar una tarea sobre otra en caso de coincidir.
¿Cómo puedo hacer mi propia tarea planificada? Es algo que igual podría cubrir en un próximo artículo, de cualquier forma, puedes ver como hacerlo en esta página de la wiki. Y también puedes echar un vistazo al fichero <extension>/scheduled-action-services-context.xml.sample que es bastante ilustrativo.

Video del webinar “Gestión del almacenamiento en Alfresco”

En este webinar sobre “Gestión de almacenamiento en Alfresco” veremos cómo configurar y usar Content Store Selector para implementar ILM (Information Lifecycle Management), XAM-CAS connector para poder conectar Alfresco en sistemas de almacenamiento específicos como Centera, Hitachi, HP u otros con soporte XAM y por último veremos qué es y cómo funciona Transfer y Replication Services para poder transferir contenidos entre repositorios de Alfresco.

Consejos sobre los logs en Alfresco

Como muchos ya sabréis, Alfresco utiliza Log4j para los logs. Log4j es una herramienta Open Source para gestionar logs y permite a programadores y administradores controlar lo que ocurre en la aplicación de forma granular y a diferentes niveles de detalle.

Controlar cómo funcionan los logs en Alfresco es la mejor forma de conocer como funciona el sistema tanto para administradores como programadores y poder detectar/solucionar problemas en una instalación.

Se configura mediante un fichero de texto llamado log4j.properties que se encuentra dentro de alfresco.war concretamente en el caso de Tomcat en ${TOMCAT_HOME}/webapps/alfresco/WEB-INF/classes. En este fichero se especifica qué queremos que registre el log y cómo queremos que lo muestre (mayor o menor detalle). También es donde se establece el nombre del fichero de log (alfresco.log) y los ficheros de log anteriores a los que le añade fecha (alfresco.log.YYYY-MM-DD). Estos ficheros de logs generados los encontraremos en la raíz del directorio donde hemos instalado Alfresco también conocido como ${ALFRESCO_HOME}, ojo, ni esta variable ni ${TOMCAT_HOME} existen salvo que se declaren, se usa para indicar el directorio raíz de instalación de Alfresco y de Tomcat respectivamente.

Vamos a ver como cambiar la ubicación del fichero de log de Alfresco. Copiamos el fichero log4j.properties al directorio extension con otro nombre, por ejemplo custom-log4j.properties:

[bash]
# cp ${TOMCAT_HOME}/webapps/alfresco/WEB-INF/classes/log4j.properties ${TOMCAT_HOME}/tomcat/shared/classes/alfresco/extension/custom-log4j.properties
[/bash]

Este cambio nos permitirá tener siempre la misma configuración de logs independientemente de que actualicemos Alfresco y despleguemos un nuevo alfresco.war donde se sobreescribiría la configuración personalizada si la hacemos dentro del war desplegado.

Editamos el fichero custom-log4j.properties y localizamos la línea:

[bash]
log4j.appender.File.File=alfresco.log
[/bash]

para especificar la siguiente:

[bash]
log4j.appender.File.File=/var/log/alfresco/alfresco.log
[/bash]

Como veis, este ejemplo está orientado a un sistema Linux o Unix, hay que tener en cuenta que si queréis poner los logs como he indicado hay que crear el directorio /var/log/alfresco y darle los permisos necesarios para que el usuario con el que se ejecuta Alfresco pueda escribir. También podríais poner los logs en alf_data/logs y así tener todo más centralizado. Para Windows habría que cambiar la ruta absoluta en el siguiente formato, por ejemplo “D:\logs\alfresco\alfresco.log”. Una recomendación de índole general para cualquier aplicativo y sus logs es disponer de una partición independiente encargado de almacenar estos ficheros (generalmente /var/log), de forma que si nos quedamos sin espacio en disco tanto en la aplicación como en los logs, no afecte al funcionamiento y podamos detectarlo de forma anticipada ya sea chequeando manualmente o con un sistema de monitorización, evidentemente también podemos poner una partición dedicada a los logs de Alfresco. Recuerda hacer backup de los logs regularmente.

Para entender mejor la sintaxis y opciones que encontramos en el fichero de configuración os recomiendo leer esta entrada en la Wikipedia. Destacaría el parámetro log4j.appender.File que especifica la rotación diaria del fichero de log y log4j.appender.File.File que permite indicar el nombre y path del fichero de log.

En cuanto a los niveles de detalle es importante conocer que existen los siguientes (de menos a mas detalle): OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE y ALL. Así que hay que tener cuidado con tener DEBUG, TRACE o ALL en un sistema en producción, salvo que sea necesario para solucionar un problema. Aquí puedes ver más información al respecto.

Si usáis un servidor de aplicaciones Tomcat, también es recomendable cambiar la ubicación del fichero de logs de Tomcat (o cualquier otro servidor de aplicaciones soportado), aquí vemos como cambiar el sitio donde se almacena el fichero catalina.out:

Editamos el fichero ${TOMCAT_HOME}/bin/catalina.sh, localizamos las líneas:

[bash]
if [ -z "$CATALINA_OUT" ] ; then
CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
fi
[/bash]

Y cambiamos la ruta de CATALINA_OUT por la ruta deseada:

[bash]
if [ -z "$CATALINA_OUT" ] ; then
CATALINA_OUT="/var/log/alfresco/catalina.out"
fi
[/bash]

Para que los cambios anteriores surtan efecto hay que reiniciar el servidor de aplicaciones. Una vez reiniciado ya veremos los ficheros creados en el directorio correspondiente.

Todo lo que hemos visto anteriormente se puede hacer de una forma más sencilla accediendo al servidor con jconsole mediante RMI y sin tener que reiniciar el servidor. En Alfresco Enterprise 3.4 ya está activado el acceso remoto. Aquí expliqué como acceder por jconsole a Alfresco.

Como vemos en la siguiente captura de pantalla, en la sección MBeans podemos encontrar un grupo llamado “log4j” y desplegado podemos ver todas sus opciones.

Concretamente en la captura anterior vemos los “Attributes” del bean “File“, y ahí podemos cambiar las opciones como por ejemplo “file”, el fichero y ruta de log. Una vez cambiado a nuestro gusto, para que tenga efecto vamos a “Operations“, hacemos clic en “activateOptions” y listo.

Por ejemplo, los logs de Webdav por defecto están configurados como detalle tipo “ERROR”, si queremos hacer un análisis más exhaustivo podríamos localizar el bean “org.alfresco.webdav.protocol” y desplegamos el menú “Attributes” y hacemos clic en “priority“, doble clic en “ERROR” para editarlo y lo cambiamos por “DEBUG” (sin comillas), a continuación guardamos simplemente pulsando la tecla “Enter” y ya tendríamos configurado el nivel de log del componente de turno. Fácil ¿no?

Para terminar quiero mencionar este pequeño desarrollo que ha realizado Tjarda Peelen – @tpeelen que permite ver los logs en la propia interfaz de la aplicación. Puede ser útil.

También se podría usar Log4mongo u otras aplicaciones para presentar logs vía web, pero eso ya es otra historia.

¿Algún consejo más? ¡Cualquier comentario es bienvenido!

Video del webinar “Personalizando Alfresco Share”

Aquí está a vuestra disposición el video del webinar celebrado sobre “Personalización de Alfresco Share”. Os recuerdo el abstract: “Webinar donde aprenderemos a personalizar Alfresco Share con dashlets de diferentes tipos, integrarlo con aplicaciones externas como Flickr, Twitter, Google News y otros recursos externos o cómo personalizar tu propio tema (diseño) y sacar el máximo partido a la plataforma.”