Hablando sobre Alfresco y SAP en la WhyFLOSS 2010

El próximo jueves 18 de Marzo estaré en Madrid para hablar sobre la integración de Alfresco con SAP como caso de éxito en un proyecto reciente, será en la conferencia WhyFLOSS que organizan los amigos de Neurowork. WhyFLOSS es un evento muy interesante que se celebra anualmente en Madrid, este año en la EOI. En esta conferencia se mezcla negocio y Open Source, donde se dan cita profesionales de diferentes empresas y organismos para hablar de casos de éxito, presente y futuro de tecnologías relacionadas con el Software Libre.

En leer más puedes ver la agenda de actividades.

Read More

Lecturas recomendadas si quieres estar al día con Alfresco

A veces me preguntan cómo me entero de esto o aquello en relación con la parte técnica de Alfresco. Es fácil, leyendo todo lo posible en relación a la tecnología de turno, y procurando leerlo de los que más saben de la misma. Hoy en día, teniendo las fuentes de información correctas podemos tener datos casi en tiempo real de cualquier cosa que nos interese. Bien, aquí os dejo una colección de enlaces que leo a diario desde mi Universo de Netvibes.

Blyx Universe en Netvibes

Seguro que se me escapan muchos más que también son interesantes, así que cualquier comentario es bienvenido.

El Software Libre no es sólo un puñado de licencias, libertades y ficheros, también es una actitud.

Acceder al todo el repositorio desde Alfresco Share (3.2r Enterprise)

access-to-repositoryUna nueva funcionalidad en Alfresco 3.2r Enterprise, es la capacidad de poder acceder al repositorio completo desde Alfresco Share y también a la navegación por categorías o etiquetas. Esto va reafirmando algo ya comentado por Alfresco en algun webinar, es decir, lo que conocemos como Alfresco Explorer o Web Client desaparecerá en futuras versiones (posiblemente en la 4.0) y en la versión 3.3 de Alfresco ya podremos hacer todo tipo de tareas directamente con Share.

Para activar esa característica (gracias Paul), simplemente hay que editar el fichero shared\classes\alfresco\web-extension\share-config-custom.xml

Busca la siguiente sección y cambia <visible>false</visible> por <visible>true</visible>:

<config evaluator="string-compare" condition="RepositoryLibrary" replace="true">
     <!--
        Whether the link to the Repository Library appears in the header component or not.
     -->
     <visible>true</visible>

Reinicia Alfresco y ya deberás tener acceso al repositorio a través del enlace como el que se ve en la captura de pantalla.

Archiving en Alfresco 3.2

image_archivingActualización 25/Feb/2010: ver demo-config-files para configuración más cómoda incluso desde Share, reglas y demás (doc calentito que me han enviado desde Alfresco, Gracias Paul!!).

¿Que es el archiving/archivado? Un archivo en gestión documental es una colección de documentos históricos, así como el lugar donde se encuentran. Pues bien, vamos a ver como se configura Alfresco para poder almacenar los contenidos en diferentes sistemas de ficheros, particiones o filesystem (como quieras llamarlo). Cada filesystem puede ser de diferente naturaleza, es decir, los contenidos que se trabajan actualmente deberán estar en los discos más rápidos (discos locales o en una SAN) y los contenidos históricos o de acceso poco frecuente pero debemos mantener, podemos almacenarlos en discos más lentos/baratos o por ejemplo en una NAS.

Todo esto se consigue en Alfresco gracias al Content Store Selector. El Content Store Selector ofrece un mecanismo de control que relaciona el contenido lógico con un fichero físico y su ubicación. Usando el aspecto cm:storeSelector y asignándole una propiedad cm:storeName podemos mover el contenido de un Store a otro de forma totalmente transparente tanto para el usuario como para la aplicación a la hora de mostrar los contenidos, claro que previamente tenemos que definirlos. Esto nos permitirá declarar políticas para controlar la capa de almacenamiento y el uso que de ella hace Alfresco en base a regales de negocio.

Veamos como se configura en base al siguiente escenario:

El repositorio y los ficheros de uso diario, los más usados, los tenemos en /opt/alfresco/alf_data/contentstore, supongamos que ese filesystem corresponde a los discos más rápidos. También tenemos un disco local más lento montado en /opt/alfresco/alf_data/storeA, e incluso podemos tener un filesystem de tipo NAS para los datos que ya no usamos pero necesitamos almacenar montado en /opt/alfresco/alf_data/storeB.

¿Cómo lo configuramos?

Creamos un fichero llamado “sample-content-store-selector-context.xml” en shared/classes/alfresco/extension con el siguiente contenido, lee los comentarios para entender la configuración:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http:// www.springframework.org/dtd/spring-beans.dtd'>
<!-- Define the new file stores -->
<beans>
        <bean id="firstSharedFileContentStore" class="org.alfresco.repo.content.filestore.FileContentStore">
                <constructor-arg>
                        <value>${dir.root}/storeA</value>
                </constructor-arg>
        </bean>
        <bean id="secondSharedFileContentStore" class="org.alfresco.repo.content.filestore.FileContentStore">
                <constructor-arg>
                        <value>${dir.root}/storeB</value>
                </constructor-arg>
        </bean>
<!-- Declare the mapping between store names and store instances -->
        <bean id="storeSelectorContentStore" parent="storeSelectorContentStoreBase">
                <property name="defaultStoreName">
                        <value>default</value>
                </property>
                <property name="storesByName">
                        <map>
                                <entry key="default">
                                        <ref bean="fileContentStore" />
                                </entry>
                                <entry key="storeA">
                                        <ref bean="firstSharedFileContentStore" />
                                </entry>
                                <entry key="storeB">
                                        <ref bean="secondSharedFileContentStore" />
                                </entry>
                        </map>
                </property>
        </bean>
<!-- Point the ContentService to the 'selector' store -->
        <bean id="contentService" parent="baseContentService">
                <property name="store">
                        <ref bean="storeSelectorContentStore" />
                </property>
        </bean>
<!-- Add the other stores to the list of stores for cleaning -->
        <bean id="eagerContentStoreCleaner" class="org.alfresco.repo.content.cleanup.EagerContentStoreCleaner" init-method="init">
                <property name="eagerOrphanCleanup" >
                        <value>${system.content.eagerOrphanCleanup}</value>
                </property>
                <property name="stores" >
                        <list>
                                <ref bean="fileContentStore" />
                                <ref bean="firstSharedFileContentStore" />
                                <ref bean="secondSharedFileContentStore" />
                        </list>
                </property>
                <property name="listeners" >
                        <ref bean="deletedContentBackupListeners" />
                </property>
        </bean>
</beans>

Si te fijas en los dos primeros beans, los valores que se especifican están relacionados con la ubicación de los dos Stores adicionales que estamos creando, en esta caso, relativos a ${dir.root} que es un atributo declarado en alfresco-global.properties. Si nuestros nuevos filesystems no están dentro de dir.root podemos poner la ruta absoluta, por ejemplo <value>/mnt/storeA</value>.

Para poder usar los nuevos contentStores debemos configurar el web-client (Alfresco Explorer) y declararlo como aspecto. Editamos web-client-config-custom.xml y añadimos las siguientes lineas:

<!-- Configuring in the cm:storeSelector aspect -->
        <config evaluator="aspect-name" condition="cm:storeSelector">
                <property-sheet>
                        <show-property name="cm:storeName" />
                </property-sheet>
        </config>
        <config evaluator="string-compare" condition="Action Wizards">
                <aspects>
                        <aspect name="cm:storeSelector"/>
                </aspects>
        </config>

Hecho lo anterior ya podemos reiniciar el servidor de aplicaciones para que los cambios surtan efecto.

Ahora vamos a ver como empezar a usarlo. Recuerda que el aspecto, aunque pueden aplicarlo todos los usuarios, sólo el usuario administrador podrá especificar el store correspondiente y sólo es aplicable a contenidos (no a espacios). En este ejemplo veremos como hacerlo de forma manual, para sistemas en producción deberíamos hacer un script que modifique dicho metadato automáticamente en base a las necesidades que tengamos, por ejemplo los que estén dentro de un espacio concreto, los que tengan más de N años en el repositorio, etc. El procedimiento sería el siguiente:

  • Localizamos el fichero con el que queremos probar (lo moveremos al storeA).
  • Vamos a “Ver detalles” de dicho fichero y pinchamos en “Ejecutar una acción”
  • Seleccionamos “Agregar aspecto al contenido” -> “ContentStore Selector” -> Aceptar -> Finalizar
  • En las propiedades del fichero ya veremos un nuevo metadato llamado “Store Name”.
    propiedades
    Editamos las propiedades y en Store Name especificamos: storeA
    storea
    Cuando pinchemos en Aceptar, automáticamente el contenido se moverá de forma transparente al filesystem alf_data/storeA/2010/2/17/22/50/4365380f-daf1-494c-b79d-db11480cb171.bin correspondiente, en mi ejemplo, a un fichero pdf.

¿Interesante no?

ACTUALIZACIÓN: para automatizar la clasificación por “Stores” podemos hacer un script en Java Script llamado, por ejemplo, action_storeA.js o B según el sitio donde queramos colocar los ficheros, con el contenido:

document.properties["cm:storeName"]="storeA";
document.save();

Lo guardamos y subimos a Diccionario de datos -> Scripts. Hecho esto podemos ejecutar una acción sobre el fichero de turno y seleccionamos “Ejecutar un script” -> Seleccionamos nuestro script “action_storeA.js” y listo. También podemos incluirlo en una regla y hacer el proceso de forma automática, cuando entren los ficheros a un espacio concreto, o incluso clasificar si son vídeos, imágenes, pdf, cad, etc.

Creación de gráficas completas de monitorización de Alfresco

Como hablamos en el artículo anterior, gracias a la característica “peformance data” que soporta el Nagios Plugin for Alfresco y a pnp4nagios, podemos conseguir gráficas de estado e históricas de todo lo que acontece en Alfresco, de esa forma podemos preveer y anticiparnos a incidencias o detectar picos y anomalías, algo que es imprescindible en herramientas de uso intensivo en un ámbito empresarial como es el caso de Alfresco.

En este artículo os cuento como instalar y configurar pnp4nagios para conseguir estadísticas extraídas con el plugin recién liberado. Aquí vemos una captura de algunas gráficas y también puedes descargar este PDF para ver un ejemplo de informe extraido de pnp4nagios.

pnp4nagios-captura

Empecemos con la instalación de requisitos, todos los pasos son para Centos 5.4 y con Icinga, pero es aplicable a otras distribuciones con soporte Yum y por supuesto funciona con Nagios.

Read More

Nagios plugin for Alfresco released!!

I’ve just released the version 1.0 of the new Nagios Plugin for Alfresco, which can be used with Icinga too. I have employed Enterprise JMX capabilities to extract and check information from Alfresco. It has been tested in Alfresco Enterprise 3.2.

Nagios is an Open Source network monitoring tool that can be configured to monitor services on a network. Icinga is a new fork of Nagios. They are both used extensively in enterprise environments.

You can download it here http://forge.alfresco.com/projects/nagios4alfresco/

nagios_plugin_for_alfresco_screenshot

UPDATED! Version 1.1 released. Added “performance data” support. Now you can graph all checks with pnp4nagios.

It checks the following services:

  • PING
  • SSH
  • Alfresco Application Server
  • Alfresco Web Server – proxy
  • Alfresco VTI Share Point – Jetty
  • Alfresco FTP Server
  • Alfresco CIFS Server – NetBIOS
  • Alfresco CIFS Server – SMB
  • Alfresco RMI – JMX
  • Alfresco IMAP Server
  • Alfresco SMTP Server – incoming
  • Alfresco – Heap Memory Usage –
  • Alfresco – System Load Average
  • Alfresco – Thread Count
  • Alfresco – Number of Total Users
  • Alfresco – Number of Total Groups
  • Alfresco – Connection Pool
  • Alfresco – ContentStore Size
  • Alfresco – ContentStore Deleted Size
  • Alfresco – Audit Store Size
  • Alfresco – Hibernate Connect Count
  • Alfresco – Lucene Indexes SpacesStore Used
  • Alfresco – Lucene Indexes SpacesStore Num
  • Alfresco – Repo Sessions
  • Alfresco – Repo Users Connected
  • Alfresco – Total Memory Used
  • Alfresco – Free Memory
  • Alfresco – Max Memory
  • Alfresco – Cache Size

You can find it at Nagios Exchange or Monitoring Exchange

Integración de Alfresco y Liferay

liferay-alfrescoMucho se ha hablado, se habla y se hablará de esta integración. Os recomiendo este post escrito por Vara: http://rvara.wordpress.com/2009/07/14/liferay-integrating-with-alfresco/ es de los más completos que he leido últimamente y despeja muchas dudas sobre qué y cómo se puede hacer la integración.

ACTUALIZACIÓN I: Gracias a ZYLK aquí tenemos otra forma de integrar muy fácilmente mediante CMIS, Liferay con Alfresco.

ACTUALIZACIÓN II: más info aquí, aquí y aquí.

Monitoring Alfresco: Nagios/Icinga, Hyperic, AuditSurf… JMX rocks!

Si tenemos Alfresco en producción (versión Enterprise), posiblemente queramos tener la aplicación controlada de la mejor forma posible y sobre todo que ese control nos aporte una visión real de lo que está pasando en el servidor y en la aplicación. Una monitorización efectiva nos permite controlar los problemas con el servicio, atisbar problemas futuros de rendimiento, detectar cuellos de botella, anomalías, etc.

Basic RGBnagios hypericauditsurf

La necesidad estaba ahí, necesitamos una solución de monitorización potente para Alfresco. Las versiones 3.X de Alfresco Enterprise permite ver y modificar muchos propiedades de la aplicación en tiempo real, por ejemplo:

  • Cambiar el nivel de log
  • Activar o desactivar FTP, CIFS o NFS
  • Poner el repositorio en solo lectura.
  • Poner el servidor en mono-usuario.
  • Limitar el número máximo de usurios o evitar accesos adicionales.
  • Ver número de sesiones y tickets de usuarios.
  • Ver número de sesiones y tickets no válidos.
  • Y muchos parámetros más.

Todo esto es gracias al soporte de JSR-160 vía JMX.

Vamos a ver qué opciones existen y cómo podemos implementarlas. Haremos un repaso a Hyperic, AuditSurf, cómo conectar a Alfresco con Jconsole y por último cómo implementar este tipo de monitorización con Nagios o Icinga (nuevo fork de Nagios).

ACTUALIZACION: No olvides ver este y este post. A partir de este artículo hice el módulo de Nagios para Alfresco.

Read More

Digitalización, scanning y OCR con Alfresco

alfresco-logoEn el paradigma “oficina sin papeles”, intervienen muchos actores, siendo los principales las personas, que deben ajustarse a una serie de procedimientos y metodologías, y los sistemas de información, que deben proveer soluciones al paradigma.

En cuanto a complejidad, un proyecto de “Paperless Office” es tan difícil y en ocasiones frustrante como un proyecto de “Single Sign” o “Identity Management” en grandes organizaciones consolidadas ya sean públicas o privadas. El problema principal son, por un lado las soluciones Open Source de calidad, que no son muchas, los requerimientos técnicos del cliente dados muchas veces por aplicaciones obsoletas y heredadas.

Con Alfresco, gracias a características como el soporte CIFS, Webdav, reglas, transformación de formatos, workflow o indexación, conseguimos aproximarnos a nuestro objetivo, aunque en una oficina sin papeles necesitaríamos integrarnos con otras soluciones como firma digital, etc, que ya contemplaré algún día por estos lares.

En este caso me gustaría contar qué puede hacer Alfresco por nosotros en cuanto a digitalización de documentos, escaneo masivo (bulk scan) y OCR:

a) Ad-hoc scanning: usando CIFS o Webdav con la extracción de metadatos automática (por defecto). La mayoría de las impresoras/escaner multifunción modernas de oficina y de cierta envergadura soporta montar volúmenes remotos (conectarse a carpetas de red) para colocar la documentación escaneada. También podríamos hacerlo desde un escaner conectado a nuestra estación de trabajo. De esta forma se almacenarían los documentos directamente en Alfresco y posteriormente se pueden lanzar workflows, transformaciones, reglas, etc. Por ejemplo, una hoja de gastos, hoja de reclamaciones, actas, pedidos de clientes, documentos de identificación en puestos de control, etc.

En el caso anterior, que hemos llamado Ad-hoc scanning, no se contempla indexación del contenido de los documentos ya que estas grandes impresoras por defecto no hacen reconocimiento de texto (OCR), por lo que el documento escaneado, aun conteniendo texto, sería como una imagen. Para salvar este escollo se puede integrar con Alfresco una solución gratuita llamada Intelliant, basada en la SDK de Tiger OCR. Esta solución, que sólo funciona si el servidor Alfresco está instalado en un sistema operativo MS Windows, nos permitirá, a través de reglas y transformaciones, extraer todo el texto de un documento escaneado de forma que se pueda indexar y podamos hacer búsquedas por el contenido, algo realmente cómodo.

b) Batch scanning: Cuando necesitamos escanear cientos de documentos tipo plantilla, por ejemplo hojas de matrícula, facturas, exámenes, etc, y de éstos documentos queremos extraer la información y poder vincularla a metadatos de Alfresco, ya sea del modelo de datos por defecto o de un modelo personalizado, necesitaremos una solución que permita mapear la información existente en la plantilla/documento escaneado de turno, con un tipo de contenido de Alfresco, campo del documento con un metadato en Alfresco, etc. Esta solución se llama Kofax Ascent Capture, Alfresco dispone de un plugin gratuito y disponible en la forja de Alfresco [http://forge.alfresco.com]. Este software utiliza la API de WebServices de Alfresco para realizar su trabajo. El plugin sólo funciona en MS Windows.

Kofax Ascent Capture tiene las siguientes características (fuente):

  • Corrección y mejora automática de imágenes.
  • Separado automático de documentos e identificación automática de formularios.
  • OCR, ICR y OMR para reconocimiento de texto impreso o escrito a mano en cientos de idiomas, códigos de barras y otros tipos de códigos.
  • Certificado para funcionar con la mayoría de scanners, ver listado.
  • Integración con Alfresco y gestión de procesos de negocio.

La opción a) es completamente gratuita y la opción b) depende del propio software Kofax Ascent Capture, que no es gratuito.

Hay otras soluciones como usar un escaner con soporte eCopy, cuyo conector con Alfresco ha sido desarrollado por SIRA Systems. Este conector permite a un usuario escanear un documento y ponerlo directamente en Alfresco. Este software se instala en el escaner y hace de interfaz entre el escaner y Alfresco. Sería una solución del tipo a) ya que no contempla selección ni mapeo de datos de los documentos escaneados, aunque si permite la indexación del contenido ya que incorpora un OCR, esta solución cuesta 2.495USD. Más información sobre el conector de SIRA Systems aquí.