Archive for the 'FLOSS' Category

Integración Alfresco con Drupal (o viceversa) con CMIS

Toni Julio 22nd, 2010

La integración entre diferentes aplicaciones es, hoy en día, el caballo de batalla de los productos, clientes e integradores. Cuando hablamos de Open Source, esto se convierte casi en una obligación.

Gracias al estándar CMIS adoptado por Alfresco, las tareas de integración, independientemente del lenguaje de programación utilizado, son mucho más sencillas.

Sobre la integración de Alfresco y Drupal se ha hablado mucho, Jeff Potts ha hecho algunos screencasts, Roger Carhuatocto hizo una presentación sobre el tema en la Drupal Camp 2010, Optaros hizo el conector CMIS para Drupal y mucho antes, Manuel Recena hizo un conector vía WebServices. Es decir, el tema trae cola y sólo basta con hacer una búsqueda en Google para dar cuenta de ello.

¿Qué nos puede aportar una integración de este tipo? (extraído de la presentación de Roger)

  • Flexibilidad:
    • Incorporar nuevas funcionalidades, Web 2.0.
    • Cambiar el Look&Feel.
  • Escalabilidad:
    • Búsqueda de ficheros PDF, SWF, Doc, PPT, etc.
    • Tengo muchos usuarios simultáneos.
  • Interoperabilidad:
    • Tengo MS Sharepoint, Documentum y tengo mis ficheros en el HD, …cómo los centralizo?
  • User Experience:
    • El usuario necesita productividad: Espacio colaborativo, gestión de conocimiento, repositorio documental corporativo, workflows/gestión de expedientes, etc.

En este artículo quiero mostrar un ejemplo sobre la configuración de Drupal para conseguir la integración con Alfresco vía CMIS y poder mostrar contenido que está en el repositorio dentro de un contenido en Drupal. En mi caso Alfresco 3.3 y Drupal 6.17. No voy a hablar de la sincronización entre ambos entornos, que permitirá que los contenidos creados en Drupal o Alfresco sean contenidos del primero. No obstante, el conector CMIS si soporta esa opción (cmis_sync).

Debemos tener instalado, configurado y funcionando Drupal y Alfresco. El conector CMIS puedes descargarlo de aquí; en mi caso ha sido la versión cmis-6.x-3.01. En Alfresco no hay que instalar ningún tipo de módulo, para eso soporta CMIS ;)

  1. Descomprime el fichero “cmis-6.x-3.01.tar.gz” y copia la carpeta “cmis” en el directorio “modules” de Drupal.
  2. En Drupal, vamos a “Admin -> Administer -> Site building -> Modules” y activamos los módulos “cmis“, “cmis_common“, “cmis_browser” y “cmis_query“.
  3. En Alfresco creamos un usuario llamado “cmisuser” con permisos de administrador (lo incluimos en el grupo ALFRESCO_ADMINISTRATORS).
  4. Configuramos un repositorio CMIS, en este caso, nuestro Alfresco añadiendo las siguientes líneas en el fichero “sites/default/settings.php“:
$conf['cmis_repositories'] = array(
'default' => array(
'user' => 'cmisuser',
'password' => 'contraseña',
'url' => 'http://servidor:8080/alfresco/s/cmis'
)
);

Hecho esto, podemos probar la integración. En la sección Admin veremos tres nuevas opciones:

  • CMIS Information” que nos mostrará la información CMIS del repositorio.
  • CMIS Query” donde podemos ejecutar consultas, por ejemplo, prueba la siguiente sentencia para ver los contenidos del repositorio: select * from cmis:document
  • CMIS Repository” donde veremos el contenido del repositorio de Alfresco y podremos navegar por él. En la opción “Actions” podemos crear carpetas, contenidos y actualizar documentos.

No conozco muy bien Drupal, así que no he podido hacer más de lo aquí descrito, pero he visto que se puede usar un Block con contenido CMIS y muchas cosas más que podéis ver en el screencast de Jeff Potts mencionado anteriormente.

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Control total de los elementos eliminados en Alfresco

Toni Julio 14th, 2010

Con el siguiente diagrama, me gustaría mostrar cómo funciona la gestión de elementos eliminados y la papelera en Alfresco:

sg_alfresco_file_retention_diagram1

Para conseguir controlar totalmente el estado del repositorio es interesante el uso del módulo Alfresco Trashcan Cleaner que está disponible en la forja de Alfresco. Su instalación es muy simple:

  1. Paramos Alfresco
  2. aplicamos el módulo a alfresco.war con la herramienta mmt:  java -jar alfresco-mmt-X.X.jar /path/to/amp/trashcanCleaner.amp $TOMCAT_HOME/webapps/alfresco.war
  3. borramos el directorio donde se desplegó Alfresco $TOMCAT_HOME/webapps/alfresco/
  4. Arrancamos Alfresco.

Si queremos configurar las opciones del Trashcan Cleaner, antes de arrancar, copiamos trashcan-cleaner-context.xml al directorio extension y lo adaptamos a nuestro gusto. Por defecto borrará los elementos enviados a la papelera a los 7 días y se ejecuta diariamente a las 4AM.

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Alfresco Hack: Las consolas “escondidas” de Alfresco

Toni Junio 4th, 2010

Los que conocéis Alfresco en profundidad sabéis que éste guarda algunas sorpresas interesantes. Entre ellas se encuentran las consolas. Básicamente son herramientas que nos permiten acceder a información o hacer tareas de bajo nivel con Alfresco vía web, destinado principalmente a programadores o administradores.

Vamos a ver que consolas tenemos disponibles y en qué nos pueden ayudar cada una de ellas.

Nota 1: para acceder a estas consolas previamente hay que estar logueado como usuario “admin” en Alfresco Explorer (http://localhost:8080/alfresco).
Nota 2: para ejecutar comandos en estas consolas hay que escribir el comando y pinchar en “Submit”, si escribimos el comando y pulsamos “Enter” no ejecutará el comando.

La “Consola del Repositorio” es una alternativa al cliente web (Alfresco Explorer) y nos permite desplegar, recargar, activar y desactivar modelos en caliente. Podemos hacer lo mismo con ficheros .properties relacionados con idiomas. Un comando de ejemplo podría ser “deploy model alfresco/extension/exampleModel.xml“.

Permite cargar los cambios realizados en el fichero “web-client-config-custom.xml” sin necesidad de reiniciar el servidor. Relmente recarga toda la información modificada que contenga el bean webClientConfigSource en el archivo “alfresco/web-client-application-context.xml” de ahí que digamos que recarga los cambios en “web-client-config-custom.xml“. Más información aquí. Hacer esa tarea es tan fácil como escribir “reload” y hacer clic en “Submit“. Veremos algo como lo siguiente:

<Built-in evaluators> ---> OK
classpath:alfresco/web-client-config.xml ---> OK
classpath:alfresco/web-client-config-dialogs.xml ---> OK
classpath:alfresco/web-client-config-wizards.xml ---> OK
classpath:alfresco/web-client-config-properties.xml ---> OK
classpath:alfresco/web-client-config-navigation.xml ---> OK
classpath:alfresco/web-client-config-wcm.xml ---> OK
classpath:alfresco/web-client-config-actions.xml ---> OK
classpath:alfresco/web-client-config-forum-actions.xml ---> OK
classpath:alfresco/web-client-config-wcm-actions.xml ---> OK
classpath:alfresco/web-client-config-workflow-actions.xml ---> OK
classpath:alfresco/extension/web-client-config-custom.xml ---> Skipped - not available
workspace://SpacesStore/app:company_home/app:dictionary/app:webclient_extension/cm:web-client-config-custom.xml ---> OK

Esta consola nos permite hacer tareas de bajo nivel sobre la AVM (Advanced Versioning Manager), sistema usado por Alfresco WCM, posiblemente la consola más desconocida y compleja de utilizar. AVM Console cuenta con una ayuda (http://localhost:8080/alfresco/faces/jsp/admin/avm-console-help.txt) aunque tenemos más información aquí y aquí.

Este es el más conocido ya que es accesible desde la “Consola de Administración”. Es una herramienta muy útil para desarrolladores y administradores. Permite hacer búsquedas y localizar información extendida sobre los contenidos del repositorio. Soporta búsquedas de varios tipos:

  1. noderef, por ejemplo workspace://SpacesStore/3d9b49aa-54b5-41b7-8842-eecde41a9b73
  2. xpath
  3. lucene
  4. fts-alfresco (full text search)
  5. cmis-strict
  6. cmis-alfresco
  7. selectnodes.

Posiblemente el mejor amigo de un programador de workflows. Esta consola es una caja de herramientas completa para depurar nuestros workflows. Más info y sintaxis aquí.

Consola para gestión, creación y borrado, activación/desactivación, exportación e importación de tenants. Recuerda que para activar el multitenant en Alfresco hay que renombrar sin .sample los ficheros en tomcat/shared/classes/alfresco/extension/mt y reiniciar el servidor.
Otras URLs interesantes dentro de nuestro sistema:

Aquí no voy a explicar nada, ejecútala espera unos segundos y mira. ¿Interesante verdad?

Esta nos sirve para ver todos los WebScripts disponibles, información de uso de cada uno de ellos y además podremos desplegar nuevos WebScripts.

¡Que curioso! Cuando he terminado de escribir el artículo he hecho una búsqueda en Google y me encuentro esto, un post del gran Jeff Potts sobre esto mismo…

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Arquitecturas en Alfresco

Toni Mayo 16th, 2010

alfresco_repository_architecture_diagram1_coloredCon este post me gustaría hacer una pequeña introducción a los diferentes diseños de arquitecturas que podemos llevar a cabo con Alfresco dependiendo del uso, usuarios, rendimiento, concurrencia y almacenamiento requerido.

Alfresco es un producto que acaba de cumplir 5 años, tras pasar por varias etapas con versiones más o menos estables, podemos decir, que desde hace un tiempo contamos con un producto confiable, robusto, estable y escalable. Preparado para pequeños proyectos con decenas de usuarios y unos cuantos miles de contenidos y para entornos con miles de usuarios y millones de contenidos. Y cada vez nos encontramos más y más instalaciones consolidadas.

Algo muy común que veo en las implantaciones de Alfresco, salvo casos muy concretos, es que muchas veces se instala la aplicación, base de datos y content store en la misma máquina, tanto para un piloto, desarrollo, test o producción. Para un piloto y desarrollo o incluso test es válido, o para producción si los requisitos no son demasiado exigentes. Teniendo todas las capas de la aplicación en la misma máquina (física o virtual), cuando el entorno pasa a producción y empieza a crecer considerablemente en número de usuarios y contenidos se suele experimentar un problema de rendimiento. Tiempos de respuesta elevados en el acceso, reglas, workflows, etc.

Vamos a ver, de forma resumida, algunos conceptos a tener en cuenta a la hora de hacer despliegues de Alfresco que nos permita crecer tanto horizontal como verticalmente.

Antes de seguir, para entender bien todo esto, veamos los componentes de la infraestructura que debemos conocer y diferenciar para diseñar una correcta arquitectura:

  • Repositorio Alfresco: hablamos de la aplicación principal de Alfresco (alfresco.war) que gestiona todo el repositorio (contenidos) y el core, así como las diferentes interfaces de acceso como CIFS, FTP, WebServices, Alfresco Explorer y muchas otras más.
  • Alfresco Share: aplicación (share.war) que es y será la cara web de Alfresco y nos permite acceder al repositorio mediante Share Point Protocol (vti-server.war) y sitios favoritos mediante IMAP. Este componente puede estar en una capa diferente al repositorio.
  • Aplicaciones de terceros: nos referimos a las aplicaciones que necesita Alfresco para funcionar al 100% como OpenOffice, ImageMagik y Pdftools. Recuerda que desde la versión 3.2, OpenOffice funciona como un subsistema y podemos instalarlo en una máquina diferente al repositorio.
  • Base de datos: será el motor de base de datos a usar por el software, como ya sabemos, pueden ser de varios tipos y “sabores” como MySQL, MS SQL Server, PostgreSQL, Oracle, etc. Alfresco almacena en la base de datos toda la información (metadatos, reglas, permisos… todo) excepto los índices y los ficheros físicos. Dicho esto, podemos adivinar que el uso de base de datos que hace Alfresco es importante.
  • Almacén de contenido o content store: será el sistema de ficheros, directorio o directorios del sistema operativo donde Alfresco deposita los ficheros que maneja, los ordena por diferentes niveles de directorios (año/mes/dia/hora/minuto). Por defecto se almacena dentro de alf_data/contentstore. En contentstore.deleted tendremos los ficheros borrados, tras 15 días de ser eliminados, y audit.contentstore que será la información extra que genera la aplicación si activamos las auditorías.
  • Índices: hablamos de la información que genera el motor de indexación y búsqueda que incorpora Alfresco, Lucene. Esta información se almacena en un directorio del sistema operativo llamado lucene-indexes dentro de alf_data por defecto. Diariamente a las 3 AM se genera un backup automático de los índices en el directorio alf_data/lucene-indexes.backup. Como decía, ahí se almacenan todos los índices de los contenidos del repositorio y tendrá un puntero a los mismos desde la base de datos. Podemos imaginar que cuanto más rápido sea el disco o discos donde residan los índices, más rápido funcionará nuestro sistema a nivel general.

Dicho lo anterior y conociendo el funcionamiento de Alfresco, podemos averiguar donde tenemos los cuellos de botella en las implantaciones.

Por ejemplo, tener el content store y la base de datos en la misma máquina sobre el mismo disco duro supone que cada vez que subimos un fichero o realizamos alguna acción con el mismo se escribe simultáneamente en base de datos y content store; moraleja: el disco duro debe escribir al mismo tiempo en varios sitios diferentes = sistema lento. Claro está, esto nos pasará si estamos haciendo un uso intensivo del sistema.

Todos esos componentes los podemos implementar de diferentes formas, dependiendo de la ubicación de cada componente hablaremos de diferentes capas o niveles.

  • Una capa única: es el despliegue por defecto que podemos realizar con los instaladores bundle de Alfresco. Todos los elementos de la infraestructura los tendríamos en la misma máquina. ¿Para qué es válido este tipo de despliegue? Para pruebas piloto, desarrollos o incluso pequeñas instalaciones orientadas a departamentos. Por supuesto, este tipo de despliegues no se recomiendan para sistemas críticos o con grandes expectativas por razones obvias de escalabilidad y rendimiento.
  • Dos capas: en este despliegue podemos empezar a usar una arquitectura realmente empresarial y escalable. Aquí separaremos en capas independientes:

Capa de contenidos: repositorio, Share, índices y aplicaciones de terceros que necesita Alfresco.
Capa de almacenamiento: Base de datos en una máquina dedicada a la que accede la aplicación vía JDBC y content store en una SAN o NAS.

Esta arquitectura permite más escalabilidad y rendimiento, configuración simple y la gestión del crecimiento del contenido es transparente para la aplicación. Si añadimos que en este caso los índices estarán en la capa de contenidos tendremos como resultado un entorno que imprima un rendimiento considerable para entornos de tipo medio que incluso pueden ponerse en alta disponibilidad, pero ojo, si crecen mucho los contenidos también crecerán los índices y en ese casos podríamos necesitar hacer cambios en la infraestructura o en la configuración de los servidores (asignar más almacenamiento, etc.).

  • Tres capas distribuidas: en versiones 3.X podemos separar en varias capas componentes de la capa web de Alfresco, es decir, separar Alfresco Share del repositorio. Este caso será el más escalable y nos permitirá implementar entornos con una gran carga y altas exigencias en cuanto a rendimiento. Esta arquitectura añade a la de dos capas la distribución de la capa web. Las capas serían las siguientes:

Capa web: donde tendríamos Alfresco Share o/y otras aplicaciones frontales que podamos tener para trabajar con Alfresco (Liferay, Joomla, Drupal, etc.) u otras hechas desde cero y opcionalmente un servidor web que proteja al servidor de aplicaciones vía mod_proxy, Varnish o similares.

Capa de contenidos: repositorio, índices y aplicaciones de terceros que necesita Alfresco.

Capa de almacenamiento: Base de datos en una máquina dedicada a la que accede la aplicación vía JDBC y content store en una SAN o NAS.

Podríamos añadir una capa extra entre la capa web y capa de contenidos que nos permita hacer caché, control de acceso o balanceo de carga. Como vemos, esta es la mejor forma de ofrecer el máximo rendimiento tanto de lectura como de escritura, que además podemos configurar en alta disponibilidad en todas las capas. Este tipo de arquitectura no es recomendada para pequeños despliegues departamentales y necesita un alto grado de conocimiento de Alfresco, sistemas y redes en general. Salvo uso de software específico, no se recomienda separar cada una de las capas de forma geográfica ya que una alta latencia entre capas puede influir negativamente en el rendimiento.

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Integración de Alfresco con Google Docs

Toni Abril 21st, 2010

En la próxima versión evolutiva de Alfresco 3.3 Community, que será etiquetada como 3.3g, tendremos disponible la integración con Google Docs. Con dicha integración podremos hacer Check Out desde Alfresco Share a Google Docs y así poder compartir documentos para, por ejemplo, trabajo concurrente con otras personas ajenas a nuestro entorno colaborativo y con nuestra cuenta de Google. Posteriormente, desde el propio Share podremos hacer Check In y generar una nueva versión en Alfresco.

Interesante ¿verdad? Lo podemos ver en este video (calentito, calentito).

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Transfer Service: la respuesta de Alfresco a la federación de repositorios

Toni Marzo 29th, 2010

Algo que se venía demandando desde hace tiempo a Alfresco es la posibilidad de federar repositorios o espacios. Si analizamos el roadmap del 2010 podemos ver esa opción en la versión 3.3, prevista para el Q2 (tanto Community como Enterprise).

Haciendo una traducción libre de la entrada sobre este tema en la Wiki de Alfresco, vamos a ver qué es y para qué sirve el Transfer Service.

A través del Transfer Service podremos enviar información desde un repositorio de Alfresco a uno o varios targets definidos, siendo estos targets otros Alfrescos (por ahora).

Como en otros casos, lo podremos hacer a través de la configuración de unos beans que encontraremos en el fichero transfer-service-context.xml. También incorporará una API que permitirá las siguientes características:

  • Registrar un nuevo target.
  • Enviar un nodo nuevo por primera vez (sin que exista en el target).
  • Enviar un nodo que ya exista en la misma ruta del target.
  • Enviar una actualización a un nodo existente en un target.
  • Enviar múltiples nodos.
  • Enviar un nodo borrado o restaurado.
  • Especificar que tipos de asociaciones hay que tener en cuenta para una transferencia.
  • Localizar targets disponibles.
  • Configurar los targets para usar HTTP o HTTPS.
  • Cancelar una transferencia.
  • Verificar los detalles de un target.
  • Ver un registro de los intentos de transferencias.
  • Ver registros de transferencias de un target determinado.
  • Posibilidad de hacer transferencias asíncronas bajo demanda.
  • Editar los atributos de un target.
  • Ver el estado de una transferencia.
  • Restringir una transferencia por clase de contenido.
  • Eliminar targets configurados.

En resumen, el Transfer Service nos permitirá transferir nodos (contenidos) de un repositorio a otro. Alfresco deja las puertas abiertas a nuevas características en este sentido ya que se podrían soportar en el futuro otros elementos e incluso otros tipos de targets como por ejemplo un filesystem cualquiera, etc. Esta nueva característica permitirá a Alfresco dar un salto importante en cuanto a nivel de implantación en entornos con grandes necesidades de replicación y geograficamente distribuidos.

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Presentación de la charla sobre integración de Alfresco y SAP

Toni Marzo 23rd, 2010

Aquí dejo a vuestra disposición la presentación que utilicé el pasado 18 de Marzo en WhyFLOSS Madrid, de la charla sobre “Integración y caso de éxito con Alfresco y SAP“.

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Hablando sobre Alfresco y SAP en la WhyFLOSS 2010

Toni Marzo 15th, 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.

Continue Reading »

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Lecturas recomendadas si quieres estar al día con Alfresco

Toni Marzo 13th, 2010

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.

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Alfresco Hack: cómo sacar un informe rápido de los contenidos del repositorio

Toni Marzo 10th, 2010

Ya lo vi hace tiempo en Think Alfresco y sabía que algún día lo iba a necesitar, ahora quiero compartirlo con vosotros. Sabemos lo que ocupa el repositorio, sería tan fácil como hacer un du -sh contentstore, pero ¿qué tipo de archivos almacena ese repositorio y cuantos de cada tipo? Saber ese dato es importante al hacer migraciones, optimizar Lucene, etc. Es tan fácil como ejecutar el siguiente comando desde el directorio superior al contentstore de turno:

$ find ./contentstore -type f -exec file -inb {} \;| sort |uniq -c|sort -nr

Este comando nos dará como resultado algo parecido a lo siguiente:

    378 application/msword
    147 application/pdf
     72 text/plain; charset=us-ascii
     58 text/x-c++; charset=iso-8859-1
     12 text/plain; charset=utf-8
      8 text/html
      2 application/x-zip
      2 text/plain; charset=iso-8859-1
      2 image/jpeg
      2 application/x-empty
      2 text/x-c; charset=utf-8
      1 text/x-c++; charset=utf-8
      1 image/png

Fácil ¿no? Claro que también se puede hacer con un JavaScript y ejecutarlo como acción pero pienso que así es más rápido, además es el “Sys Admin way”.

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Next »