SharePoint 2010. Aprovechando las funcionalidades de Internet Explorer 9 Site Pinning

Acaba de llegar la primera beta pública de Internet Explorer 9 y nos trae muchas novedades, tanto para los usuarios como para los desarrolladores (Aceleración de Hardware de los gráficos y el texto, una nueva interfaz de usuario más limpia, soporte para HTML5, un nuevo y mejorado motor de JavaScript, etc.)

Una de las nuevas funcionalidades que más me ha llamado la atención es la de los Site Pinning (Anclado de Sitios). Esto nos permite integrar cualquier sitio web en la barra de tareas o en el menú de inicio de nuestro Windows 7.

Intentando cambiar el concepto de sitio web hacia el de aplicación, nos permite tener nuestros sitios favoritos anclados en nuestro Windows 7 e identificados con su favicon. Arrastrando la pestaña podemos ver como hemos integrado el portal de mi empresa y el sitio web de Twitter.

sharepoint2010-ie9pinnedsites1

Una vez que nuestro sitio web es anclado, Internet Explorer 9 nos provee de un API para añadir funcionalidades y añadir enlaces a la Jump List de nuestra aplicación web. Por ejemplo, Twitter incluye las opciones de New Tweet, Direct Mentions, etc.

sharepoint2010-ie9pinnedsites2

Para personalizar la Jump List de nuestro sitio podemos utilizar una serie de etiquetas meta o unas funciones del navegador en JavaScript. Estas últimas nos permiten añadir dinámicamente los enlaces.

<META name="msapplication-task" content="name=Task 1;action-uri=http://host/Page1.html;icon-uri=http://host/icon1.ico"/>

// Creamos la Categoría

window.external.msSiteModeCreateJumplist('List1');

// Añadimos elementos a la Categoría

window.external.msSiteModeAddJumpListItem('Item 1', 'http://host/Item1.html', 'http://host/images/item1.ico');

window.external.msSiteModeAddJumpListItem('Item 2', 'http://host/Item2.html', 'http://host/images/item2.ico');

window.external.msSiteModeAddJumpListItem('Item 3', 'Item3.html', 'images/item3.ico');

// Mostramos la Categoría con sus elementos

window.external.msSiteModeShowJumplist();

Integrándolo con SharePoint 2010

Vamos a aprovechas las nuevas funcionalidades sociales de SharePoint 2010 para crearnos una Jump List de nuestro portal con enlaces a elementos relevantes para los usuarios dentro del mismo.

Estas capacidades sociales permiten al usuario etiquetar el contenido o decidir si un elemento es de su agrado o no, con la acción Me gusta. Esta acción, realmente, etiqueta el contenido seleccionado con una etiqueta del sistema llamada Me gusta.

sharepoint2010-ie9pinnedsites3

Para consultar los elementos que has etiquetado existen una serie de Web Parts y un sitio, Mi Perfil, que nos muestra la información:

sharepoint2010-ie9pinnedsites4

Ahora con los Pinned Sites y el Jump List de Internet Explorer 9 podemos extender nuestro SharePoint y convertirlo en una aplicación con algunas funcionalidades interesantes que vamos a poder programar.

Descartemos, por el momento, la posibilidad de utilizar etiquetas meta ya que no nos permite añadir enlaces personalizados para el usuario y centrémonos en el API de JavaScript. Sería interesante que a nuestros usuarios le integremos los últimos elementos (documentos, páginas, artículos de blog, etc) que les han gustado en la Jump List.

Para hacer esto necesitamos utilizar el API de Perfiles de Usuarios y el de Taxonomía para obtener los elementos que le gustan a un usuarios.

SPWeb web = SPContext.Current.Web;

using (SPSite site = web.Site)

{

    SPServiceContext context = SPServiceContext.GetContext(site); //Obtenemos el contexto del servicio

    UserProfileManager myUserProfileManager = new UserProfileManager(context); //Obtenemos el Manager de User Profile

    UserProfile myUserProfile = myUserProfileManager.GetUserProfile(this.Context.User.Identity.Name); //Obtenemos el Pérfil del usuario actual

    SocialTagManager mySocialTagManager = new SocialTagManager(context); //Obtenemos el Manager de las Social Tag

    List<SocialTag> tags = new List<SocialTag>();

    tags.AddRange(mySocialTagManager.GetTags(myUserProfile)); //Obtenemos las etiquetas del usuario

 

    foreach (SocialTag tag in tags.FindAll(p => p.Term.GetDefaultLabel(3082).Equals("Me gusta")))    

    {

    }

}

Lo siguiente que tenemos que hacer es recorrer esta lista de etiquetas y ejecutar las funciones JavaScript que añadan estos enlaces a la Jump List. En SharePoint, tenemos varias opciones para insertar código a nuestros sitios. Podríamos utilizar un Web Part pero estos nos limitarían al ámbito de ejecución del mismo, o sea, la página en la que el Web Part estuviera instanciado.

La otra opción sería crearnos un Custom Delegate, que es un control que reside en el AdditionalPageHead de la Master Page de nuestro site y nos permite registrar código JavaScript en esta sección.

Bien, pues añadimos al código anterior la capacidad de registrar el código JavaScript necesario para crearnos un grupo y los elementos del Jump List.

//Creamos el grupo

callbackScript.AppendLine("window.external.msSiteModeCreateJumplist('Me gusta');");

foreach (SocialTag tag in tags.FindAll(p => p.Term.GetDefaultLabel(3082).Equals("Me gusta")))

{

    //Creamos cada uno de los elementos que se encuentran etiquetados con 'Me gusta'

    callbackScript.Append("window.external.msSiteModeAddJumpListItem('");

    callbackScript.Append(tag.Title);

    callbackScript.Append("', '");

    callbackScript.Append(tag.Url);

    callbackScript.Append("', '");

    callbackScript.Append("/_layouts/images/favicon.ico');");

    callbackScript.AppendLine("");

}

//Mostramos la lista

callbackScript.AppendLine("window.external.msSiteModeShowJumplist();");

}

Sólo nos queda registrar el script con nuestro control delegado.

// Registramos el callbacks del cliente para que se ejecute el JavaScript que generamos anteriormente

ClientScriptManager cm = this.Page.ClientScript;

cm.RegisterClientScriptBlock(this.GetType(), "CreateJumpList", callbackScript.ToString(), true);

Con lo que obtenemos un grupo llamado ‘Me gusta’ en la Jump List de nuestro Pinned Site con los elementos que el usuario ha etiquetado en el SharePoint.

sharepoint2010-ie9pinnedsites5

Con este simple control le ofrecemos a los usuarios una gran funcionalidad que le facilitará la vida a la hora de acceder a su contenido. Pensemos en crear otros grupos como Mis Enlaces, Mi Sitio, etc., que permitan al usuario tener a mano sus contenidos.

 

Saludos a todos…

SharePoint 2010. Gestión Documental

SharePoint 2007 tenía muchas capacidades dentro de la gestión de documentos. Las bibliotecas de documentos permitían a los usuarios hacer check-in/check-out, control de versiones, permisos a nivel de elemento de lista, procesos empresariales con flujos de trabajos, papelera de reciclaje, etc. Con SharePoint 2010 se han ampliado estas funcionalidades consiguiendo mejorar sustancialmente el producto. Vamos a hacer un recorrido por alguna de ellas.

Document ID

Todos los elementos de lista tienen una columna ID que es un autonumérico. Este ID es único a nivel de lista y no a nivel de colección de sitios. Document ID nos permite activar a nivel de colección de sitios la capacidad de identificar nuestros documentos con un ID único para esta colección. Con esta funcionalidad, se nos activa un servicio que nos permite obtener cualquier documento utilizando su ID, mediante la url (/DocIdRedir.aspx?ID=uniquedocid).

Cuando activamos la característica podemos configurar el identificador común para cada documento (esto nos permitirá tener ids de documentos únicos por cada colección de sitios) y el ámbito de búsqueda de los mismos.

sharepoint2010-docsId

Ahora, cada vez que creemos o subamos un documento a una biblioteca de esta colección de sitios, automáticamente se le asigna un identificador único y es accesible a través de la página DocIdRedir.aspx.

sharepoint2010-docsId-2

Document Sets

Los Document Sets, o conjuntos de documentos, son una característica que nos permite tener un tipo de contenido especial con la capacidad de agrupar diversos tipos de documentos en un conjunto.

Por ejemplo, para elaborar una oferta en una empresa se necesitan varios documentos, el word con la oferta, el excel con la hoja de costes, el project con la planificación, etc. Document Sets nos permite tener un tipo de contenido que cree estos documentos a partir de una plantilla específica y los mantenga agrupados y asociados mediante información común. Al permanecer agrupados, podemos aplicar flujos de trabajo al conjunto de documentos, control de versiones, etc.

Vamos a crearnos un nuevo tipo de contenido utilizando Document Sets. Lo primero que tenemos que hacer es activar la característica Conjunto de Documentos a nivel de colección de sitio.

A continuación, nos creamos una biblioteca de documentos y activamos la opción de administración de los tipos de contenido. Una vez que podemos administrar los tipos de contenido, agregamos el tipo de contenido Conjunto de documentos.

sharepoint2010-documentsets1

Ahora tenemos en nuestra biblioteca un tipo de contenido de Document Sets, si vamos a la configuración del tipo de contenido, podemos seleccionar los documentos que van a formar parte del conjunto, las columnas compartidas, la página de bienvenida, etc.

sharepoint2010-documentsets2

Rating, Tag/Notes

Sin necesidad de hacer un check-out de un documento, podemos clasificarlo, etiquetarlo o agregarle anotaciones. Para clasificarlo tenemos que activar la configuración en las opciones de la lista. Esto nos incluirá una nueva columna que, utilizando las estrellitas, nos permite clasificar el documento.

sharepoint2010-rating

Etiquetar y anotar añade una nueva funcionalidad de colaboración en nuestros documentos.

sharepoint2010-tagnotes

Content Organizer

La organización de contenidos nos permite definir reglas basadas en los metadatos de los documentos. Cuando activamos la característica, se crea una biblioteca de documentos, llamada Biblioteca Temporal, que es la que se encarga de recibir los documentos y moverlos en función de las reglas definidas.

sharepoint2010-contentorganizer1

En las Reglas del organizador de contenido podemos definir los filtros que se tienen que aplicar y la biblioteca de documentos de destino para los documentos que se suban a esta biblioteca. Estos filtros se basan en los tipos de contenido de los documentos y las propiedades que este tiene.

sharepoint2010-contentorganizer2

Cuando cargamos un documento, nos advierte que, en función de las reglas definidas, será movido a otra biblioteca una vez que sean recopiladas todas las propiedades necesarias.

sharepoint2010-contentorganizer3

Estas son algunas de las nuevas posibilidades que vienen para la gestión de documentos en SharePoint 2010. Junto con estas podemos incluir la nueva capacidad de gestión de metadatos, las Office Web Apps, la rediseñada funcionalidad de gestión de registros, etc.

Si ya con SharePoint 2007 las empresas podían mantener una muy buena gestión documental, con esta nueva versión se amplían las capacidades y seguimos teniendo uno de los mejores productos con muchas funcionalidades y capacidades.

 

Saludos a todos…

Microsoft Dynamics CRM 2011 Beta

El equipo de producto de CRM acaba de llegar a la primera release en Beta de la nueva versión del producto de CRM de Microsoft. Esta beta está disponible para descarga desde la web de download de Microsoft en múltiples idiomas.

Otra noticia importante es la posibilidad de probar Online, previo registro, y que estará disponible para un número mayor de mercados (por ejemplo, en la actualidad no tenemos disponible CRM Online para España).

crm2011

Para los desarrolladores también tenemos muchas y nuevas novedades, entre las que destacamos el desarrollo con Visual Studio y Silverlight.

También, y no menos importante, se deja ver (que estamos pendientes de probar) una integración con SharePoint (versión 2010 o 2007). Está integración nos va a permitir ver los datos del CRM en la gestión documental de nuestro SharePoint.

 

Saludos a todos…

SharePoint 2010. Actualización desde SharePoint 2007

Ya hace unos meses que tenemos disponible SharePoint 2010 y es un buen momento de empezar a plantearse la actualización de nuestro viejo SharePoint 2007 a esta nueva y mejorada versión SharePoint 2010.

Para la actualización, tenemos que tener en cuentas ciertos aspectos:

Plataforma de 64-bit y Windows Server 2008

SharePoint 2010 sólo se puede instalar en servidores x64, incluyendo al servidor SQL Server. Desde que salió el SP2 de SharePoint 2007, ya se comentó este requisito y para los que no hayan cambiado de plataforma, es una necesidad para pasarse a la versión 2010.

Windows Server 2008 o Windows Server 2008 R2 es otro requisito imprescindible para SharePoint 2010.

Pueden consultar el documento de Planning.

Métodos de actualización

Se plantean dos procesos para la actualización:

  • In-place upgrade. Este proceso nos permite realizar la actualización en nuestra actual plataforma de SharePoint 2007. Este proceso nos permitiría mantener las personalizaciones y configuraciones de nuestra granja, sin embargo, los servidores permanecen offline durante el proceso.
  • Database attach upgrade. No se actualiza la granja, se realiza la instalación en una nueva plataforma y se adjunta y actualiza las bases de datos de contenido. El principal problema de este proceso es que primero hay que instalar todas las personalizaciones, características y demás en el nuevo servidor.

Podemos descargar el documento con los procesos.

Antes de la actualización

Antes de realizar la actualización, debemos de realizar una serie de comprobaciones y copias de seguridad para asegurarnos que el proceso de realizará de forma segura y satisfactoria.

  • Pre-Upgrade checker. Con el SP2 de SharePoint 2007 tenemos un comando administrativo que nos permite realizar una serie de comprobaciones para conocer si podemos realizar una migración sin problemas a SharePoint 2010. Muy importante identificar las personalizaciones que no serán soportadas en SharePoint 2010.
  • Elegir un método de actualización. Habrá que elegir entre uno de los métodos de actualización disponibles o realizar un proceso híbrido que nos permita utilizar los mejores pasos que se adapten a nuestra granja. Por ejemplo, en una de las actualizaciones que estamos realizando, vamos a clonar las máquinas virtuales para realizar una actualización In-place y así conseguir actualizar las bases de datos de contenido al nuevo esquema de SharePoint 2010. Una vez que tenemos esta actualización, realizar exportaciones del contenido para importarlo en la nueva estructura que se ha definido en el nuevo servidor de SharePoint 2010.
  • Identificar las personalizaciones. Este punto es importante, ya que tenemos que volver a instalarlas o comprobar que la actualización se ha realizado correctamente, una vez finalizado el proceso de actualización.
  • Backup. Creo que este punto lo dice todo, cualquier proceso de actualización es candidato a fallar, aunque lo hayamos comprobado todo dos veces.

Durante la actualización

Después de realizar el pre-upgrade y comprobar que todo el proceso se realizará satisfactoriamente, debemos empezar con el proceso seleccionado.

  • Configurar todos los servidores de la granja
  • Instalar los paquetes de idiomas necesarios
  • Decidir si vamos a realizar el Visual Upgrade a la nueva versión o vamos a mantener la imagen anterior de SharePoint 2007.

Después de la actualización

Este paso es muy importante. Tenemos que comprobar y asegurarnos que la actualización se ha realizado correctamente.

  • Revisa los logs, tanto de SharePoint (ahora están en la 14) como de Windows.
  • Comprueba los sitios, contenidos y seguridad.
  • Reestructura el contenido de la granja. Este es el momento ideal, los usuarios están esperando a que terminemos con la migración y podemos aprovechar para mejorar la estructura y hacer limpieza.

Todos estos pasos están muy bien, pero siempre va a fallar algo. Tengamos en cuenta que los procesos de actualización que funcionan correctamente son sobre aquellas granjas en las que no se hayan realizado muchas personalizaciones o se hayan utilizado características compatibles o no se hayan jugado al límite implementando formularios no soportados o ensamblados en el gac.

Sonrisa

Yo soy partidario de realizar las actualizaciones manuales, aprovechando para reestructurar la granja, los sitios y asegurándonos que todas las personalizaciones se migran a Visual Studio 2010 y se mejora el código de SharePoint 2010.

 

Saludos a todos…

Visual Studio LightSwitch. Aplicaciones orientadas a datos y SharePoint 2010

Hace unos días teníamos disponible la Beta 1 de Visual Studio LightSwitch. ¿Pero qué es esto de LightSwitch?

Microsoft define LightSwitch como una forma sencilla de crear aplicaciones de negocio para la nube y el escritorio. Provee una gran variedad de plantillas y herramientas para construir aplicaciones de negocio cuyo destino es Windows Desktop o Windows Azure, utilizando más código o menos código, según se desee o sea necesario.

Nos permite crear aplicaciones comenzando con una única decisión, Visual Basic o C#.

LightSwitch1

Una vez que se crea el proyecto de Visual Studio, nos permite crear formularios desde plantillas existentes y enlazarlos con los datos, que incluye como origen SQL Server, SQL Azure, SharePoint y otros. En unos minutos, podemos tener una aplicación básica lista para desplegar y utilizar por el usuario.

Al final de todo el proceso, lo que obtenemos es una aplicación Silverlight que puede ser ejecutada en un navegador, desde fuera del navegador o en la nube.

LightSwitch4

La gran ventaja que tiene este tipo de proyectos es que cuando nuestra aplicación crezca y necesitemos de implementación de negocio o formularios más personalizados, vamos a tener la capacidad de extender el código creado usando el proyecto desde Visual Studio Professional, Premium o Ultimate.

Vamos a ver un ejemplo de cómo podemos conectar datos de una base de datos SQL Server con documentos almacenados en SharePoint.

El siguiente paso que nos ofrece LightSwitch, al crear el proyecto, es crear una tabla o conectar con una base de datos externa.

LightSwitch2

Vamos a crear una nueva tabla con los campos necesarios para almacenar clientes.

image

Como vemos, al definir los campos tenemos diversas opciones para configurar si es un campo por el que se va a realizar búsquedas, si es un campo requerido, la longitud máxima del campo e incluso poder escribir código para realizar una validación personalizada del campo.

El siguiente paso sería crear una pantalla para esta tabla que nos permite ver y editar la información de la misma. Para esto sólo tenemos que pulsar en el botón +Screen en la ventana de edición de la tabla.

LightSwitch3

El asistente de creación de pantallas nos preguntará por el tipo de pantalla que queremos crear en función de las plantillas que estén disponibles. Vamos a crear una pantalla de búsqueda (Search Data Screen) y una de creación (New Data Screen).

image

Y ya podemos ejecutar la aplicación (pulsando F5) y vamos a poder buscar clientes y darlos de alta.

image

image

Tenemos una serie de opciones que nos permite personalizar estas pantallas, añadir acciones y botones, renombrar los nombres de los campos, etc. Incluso hay una opción que nos permite, en modo depuración, editar online la apariencia del formulario (ese botón Customize Screen que tenemos arriba a la derecha de nuestra aplicación).

image

Otras de las capacidades de LightSwitch es que nos permite añadir múltiples orígenes de datos, para esto vamos a añadir como origen de datos una biblioteca de documentos de SharePoint que tiene un campo que se relaciona con el email del cliente.

imageimage

Ahora que tenemos un origen de datos enlazado con la biblioteca de documentos de clientes en SharePoint, tenemos que crear la relación entre la tabla de clientes y sus documentos.

image

Nos creamos una nueva pantalla, del tipo List and Details Screen para poder visualizar los clientes junto con los documentos que estén relacionados y lo probamos para ver el resultado.

imageimage

Reconozco que la primera vez que leí sobre este producto, no me gustó la idea. Me imaginaba una aplicación tipo Access, orientada al usuario que le permitiría crearse sus propias aplicaciones. El problema nos lo íbamos a encontrar cuando esta aplicación creciera, se quedara pequeña y nos pidan a nosotros, los desarrolladores, que le hagamos algunas mejoras y cambios.

Aunque todavía no he podido probar todas las funcionalidades, reconozco que la capacidad que ofrece para extender el código y ampliar las funcionalidades usando Visual Studio es, de momento, una buena noticia. Tengo algún que otro proyectito en el que me voy a plantear seriamente utilizar LightSwitch a ver qué pasa.

Ya contaré más según vaya probando el producto.

 

Saludos a todos…

SharePoint 2010. Aquellas maravillosas 40 plantillas

Cuando planificamos una migración de SharePoint 2007 a SharePoint 2010, hay que tener en cuenta, entre otras muchas cosas, las aplicaciones y plantillas de sitio que estén instaladas y en uso en la versión actual. Es necesario instalar estas plantillas o aplicaciones en el nuevo SharePoint 2010.

Para aquellas instalaciones en las que se ha usado las Fantastic 40 Templates de Microsoft, nos encontramos con el problema que no todas las aplicaciones de esta colección son compatibles con la versión de SharePoint 2010. Esto nos impide realizar la actualización de aquellos sitios que las utilicen.

wsstemplates

Esta compatibilidad de basa en el tipo de plantilla, Site admin (fichero .stp o plantilla de sitio) o Server admin (fichero .wsp o paquete de solución).

Tenemos un artículo en el blog de Technet SharePoint que nos explica las posibilidades que tenemos con estas plantillas.

Por su puesto, es muy recomendable realizar los pre-upgrade check para identificar las necesidades (plantillas de sitios, webparts y demás) y poder instalarlas en el nuevo servidor de SharePoint 2010.

 

Saludos a todos…

SharePoint 2010. Configurando Kerberos

Desde SharePoint 2007 Service Pack 2 se puede configurar Kerberos como modo de autenticación.

Kerberos es un protocolo de autenticación basado en Tickets. Un usuario que se autentica en un servidor se le genera un ticket si las credenciales son aceptadas, este ticket es usado por el resto de servidores para acceder a otros recursos. Para poder usar este método, el cliente y el servidor deben tener una conexión de confianza con el servidor de dominio que mantiene el Key Distribution Center (KDC) y ambos deben de estar conectados a un servicio de Active Directory.

En la mayoría de los despliegues de SharePoint no es necesario el uso de Kerberos, los casos en los que es necesario este método de autenticación nos llevan a entornos de BI (mayoritariamente), en los que es necesaria la autenticación de los usuarios con servidores SQL Server (OLAP y Analysis) que no residen en el servidor web de la granja de SharePoint.

Microsoft ha publicado un guía, de obligada lectura, para la configuración de nuestra granja de SharePoint con Kerberos.

Esta guía contiene un paso a paso para configurar Kerberos para los siguientes escenarios:

  • Granja SharePoint
  • SQL OLTP
  • SQL Analysis Services
  • SQL Reporting Services
  • Delegación de Identidades para Excel Services
  • Delegación de Identidades para PowerPivot para SharePoint 2010
  • Delegación de Identidades para Visio Services
  • Delegación de Identidades para Performance Point Services
  • Delegación de Identidades para Business Connectivity Services

Como podemos ver, configurar Kerberos en SharePoint no es una tarea trivial y si nos saltamos algún paso o lo configuramos mal, nos va a dar muchos dolores de cabeza para averiguar dónde está el problema y cómo solucionarlo. Para evitar problemas, es recomendable documentar los pasos a realizar (con los nombres de usuarios, servidores y servicios), revisar la documentación y seguirla al pie de la letra sin saltarse ningún paso.

 

Saludos a todos…

Presentación Windows Phone 7 – Tenerife Lan Party

Este viernes 24 de julio finalizamos con la representación de Microsoft en TLP+Innova 2k10 en Tenerife. Estuvimos hablando de Windows Phone 7 y del desarrollo con Silverlight, os dejo un breve resumen:

  • Un teléfono diferente pensado para la vida digital y para el usuario de consumo
  • Nuevo lenguaje de diseño de aplicaciones METRO, moderno, limpio y auténtico.
  • Los 6 hubs que permiten la integración con Personas, Redes Sociales o incluso con Xbox Live
  • Requerimientos específicos de Hardware, que evitarán los problemas de Windows Mobile
  • Para desarrollar tenemos Silverlight y XNA, con lo que podemos aprovechar los conocimientos y el código de nuestros desarrollos actuales.
  • Herramientas de desarrollo Gratuitas.

Con todo esto, vamos a poder desarrollar experiencias integradas para nuestros usuarios.

Gracias a todos por asistir, os dejo el link a la presentación.

 

Saludos a todos…

Tenerife Lan Party–Horarios charlas de Azure y de Windows Phone 7

Como comenté hace unos post, la semana del 20 al 25 de Julio se celebra la Tenerife Lan Party y junto con esta, una serie de conferencias orientadas a las empresas y a los desarrolladores.

tlp

El miércoles 21 de julio a las 17.00 hablaremos de Cloud Computing con Microsoft: Windows Azure y el viernes 23 de julio a las 13.30 nos lanzamos con El nuevo Windows Phone 7.

Esperamos encontraros a todos por allí bien en nuestras sesiones o bien por las zonas comunes o en otras sesiones del evento o en twitter.

Podéis consultar los horarios de las conferencias en la web de la Lan Party.

 

Saludos a todos…

Visualizando datos con Silverlight PivotViewer

Microsoft ha liberado un control de usuario para la visualización de colecciones de datos con Pivot. Este control, similar a la aplicación PivotViewer nos permite crear aplicaciones silverlight, utilizando nuestras colecciones. Lo podemos descargar desde la web de Silverlight.

pivotviewer_1

Una colección es un conjunto de datos con características similares, que se pueden visualizar en web. La idea es parecida a las Pivot Tables de Excel, pero obteniendo la información visualmente.

Estas colecciones están compuestas de:

  • XML. Los elementos de la colección se definen en XML en un fichero cxml.
  • Imágenes. Las imágenes de la colección deben de estar en formato Deep Zoom.

Existen varias herramientas para crear las colecciones sin necesidad de código:

Estas herramientas nos permiten definir nuestras colecciones y generar los ficheros necesarios (cxml, deep zoom) para publicar la colección en un servidor web y poder enlazarla control Silverlight.

Otra opción sería utilizar el código de ejemplo que nos permite crear las colecciones en memoria, o incluso podríamos generar estas colecciones para almacenarlas en disco. Vamos a ver como se podría utilizar este código para crear una colección de los Twitter de un usuario.

Creando la colección

Para este ejemplo, vamos a crearnos una solución con los siguientes proyectos:

  • PivotServerTools. Este proyecto contiene las clases necesarias para la generación de la colección. Utilizaremos el mismo proyecto que viene en el ejemplo.
  • CollectionFactories. Este proyecto contendrá la factoría de colecciones. Aquí crearemos una clase que obtenga los datos de Twitter y genere la colección en memoria.
  • Aplicación web. Esta aplicación alojará la aplicación Silverlight y los HttpHandlers para generación dinámica de la colección.
  • Cliente Silverlight. Aquí tendremos el control PivotViewer enlazado a la colección dinámica.

La factoría de Twitter debe de implementar la clase PivotServerTools.CollectionFactoryBase, junto con el siguiente método:

   1:          public override Collection MakeCollection(CollectionRequestContext context)
   2:          {
   3:              string user = context.Query["user"];
   4:              string fileUrl = context.Query["url"];
   5:              if (string.IsNullOrEmpty(user) && string.IsNullOrEmpty(fileUrl))
   6:              {
   7:                  throw new ArgumentNullException("user", "Tiene que incluir un nombre de usuario Twitter en la URL ?user=<name>");
   8:              }
   9:   
  10:              string url;
  11:              if (!string.IsNullOrEmpty(user))
  12:              {
  13:                  url = string.Format("http://api.twitter.com/1/statuses/user_timeline.atom?screen_name={0}&count=200",
  14:                      HttpUtility.UrlPathEncode(user));
  15:              }
  16:              else
  17:              {
  18:                  url = fileUrl;
  19:              }
  20:   
  21:              string atom;
  22:              try
  23:              {
  24:                  using (WebClient web = new WebClient())
  25:                  {
  26:                      web.UseDefaultCredentials = true;
  27:   
  28:                      atom = web.DownloadString(url);
  29:                  }
  30:              }
  31:              catch (Exception ex)
  32:              {
  33:                  return ErrorCollection.FromException(ex);
  34:              }
  35:   
  36:              Collection collection = CollectionFromAtom(atom);
  37:              return collection;
  38:          }

En este método realizamos nuestra implementación que genera la colección obteniendo los datos de Twitter.

   1:  collection.AddItem(title, alternateUrl, null,
   2:                    new ItemImage(new Uri(imageUrl))
   3:                  , new Facet("Topics", TopicsInTweet(title))
   4:                  , new Facet("Users", UsersInTweet(title))
   5:                  , new Facet("Published", published)
   6:                  , new Facet("Links", HyperlinksInTweet(title))
   7:                  );

Se insertan cada uno de los mensajes del usuario en la colección creando las Facet, que serán utilizadas por el control PivotViewer para la ordenación y filtrado de los elementos.


La aplicación Silverlight con el control PivotViewer

Una vez que tenemos nuestro generador de colecciones, nos ponemos con nuestra aplicación Silverlight, que tiene que hospedar el control PivotViewer, utilizando un parámetro de inicialización que identifica la url de la colección que queremos visualizar. Definimos el control de usuario PivoViewer, añadiendo su namespace (xmlns:pivot) y la referencia a su ensamblado System.Windows.Pivot.

   1:  <UserControl x:Class="GSC.Twitter.Pivot.Silverlight.MainPage"
   2:      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   5:      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   6:      xmlns:pivot="clr-namespace:System.Windows.Pivot;assembly=System.Windows.Pivot"
   7:      mc:Ignorable="d"
   8:      d:DesignHeight="300" d:DesignWidth="400">
   9:      <Grid x:Name="LayoutRoot" Background="White">
  10:          <pivot:PivotViewer x:Name="PivotViewer"
  11:                             Loaded="PivotViewer_Loaded"
  12:                             LinkClicked="PivotViewer_LinkClicked"
  13:                             ItemDoubleClicked="PivotViewer_ItemDoubleClicked" />
  14:      </Grid>
  15:  </UserControl>

Enlazamos la carga del control con el siguiente código, para que obtenga los datos de la colección utilizando el parámetro de inicio del control Silverlight.

   1:          private void PivotViewer_Loaded(object sender, RoutedEventArgs e)
   2:          {
   3:              App app = (App)App.Current;
   4:              string cxmlName = app.InitParamsCxml;
   5:              if (!string.IsNullOrWhiteSpace(cxmlName))
   6:              {
   7:                  LoadCollection(cxmlName);
   8:              }
   9:          }
  10:   
  11:          [ScriptableMember]
  12:          public void LoadCollection(string cxmlName)
  13:          {
  14:              string pageUrl = HtmlPage.Document.DocumentUri.AbsoluteUri;
  15:              string rootUrl = pageUrl.Substring(0, pageUrl.LastIndexOf('/') + 1);
  16:   
  17:              string collectionUrl = rootUrl + cxmlName;
  18:   
  19:              PivotViewer.LoadCollection(collectionUrl, string.Empty);
  20:          }

Sólo nos queda configurar los HttpHandlers en nuestra aplicación web para que cuando se realice una petición http sobre la colección, se ejecute nuestra Factory de Twitter y genere dinámicamente los datos de la colección a mostrar.

Nos creamos los siguientes HttpHandlers, para cada uno de los ficheros que vamos a generar desde el Factory de Twitter:

CXML

   1:      public class CxmlHandler : IHttpHandler
   2:      {
   3:          public void ProcessRequest(HttpContext context)
   4:          {
   5:              PivotHttpHandlers.ServeCxml(context);
   6:          }
   7:   
   8:          public bool IsReusable
   9:          {
  10:              get { return true; }
  11:          }
  12:      }

DZC

   1:      public class DzcHandler : IHttpHandler
   2:      {
   3:          public void ProcessRequest(HttpContext context)
   4:          {
   5:              PivotHttpHandlers.ServeDzc(context);
   6:          }
   7:   
   8:          public bool IsReusable
   9:          {
  10:              get { return true; }
  11:          }
  12:      }

DZI

   1:      public class DziHandler : IHttpHandler
   2:      {
   3:          public void ProcessRequest(HttpContext context)
   4:          {
   5:              PivotHttpHandlers.ServeDzi(context);
   6:          }
   7:   
   8:          public bool IsReusable
   9:          {
  10:              get { return true; }
  11:          }
  12:      }

ImageTile

   1:      public class ImageTileHandler : IHttpHandler
   2:      {
   3:          public void ProcessRequest(HttpContext context)
   4:          {
   5:              PivotHttpHandlers.ServeImageTile(context);
   6:          }
   7:   
   8:          public bool IsReusable
   9:          {
  10:              get { return true; }
  11:          }
  12:      }

DeepZoomImage

   1:      public class DeepZoomImageHandler : IHttpHandler
   2:      {
   3:          public void ProcessRequest(HttpContext context)
   4:          {
   5:              PivotHttpHandlers.ServeDeepZoomImage(context);
   6:          }
   7:   
   8:          public bool IsReusable
   9:          {
  10:              get { return true; }
  11:          }
  12:      }

y su correspondiente en el web.config que enlaza el código con las extensiones a controlar:

   1:        <httpHandlers>
   2:          <add path="*.cxml" verb="GET" type="GSC.Twitter.Pivot.Silverlight.Web.CxmlHandler"/>
   3:          <add path="*.dzc" verb="GET" type="GSC.Twitter.Pivot.Silverlight.Web.DzcHandler"/>
   4:          <add path="*.dzi" verb="GET" type="GSC.Twitter.Pivot.Silverlight.Web.DziHandler"/>
   5:          <add path="*/dzi/*_files/*/*_*.jpg" verb="GET" type="GSC.Twitter.Pivot.Silverlight.Web.DeepZoomImageHandler"/>
   6:          <add path="*_files/*/*_*.jpg" verb="GET" type="GSC.Twitter.Pivot.Silverlight.Web.ImageTileHandler"/>
   7:        </httpHandlers>

Sólo nos queda añadir el parámetro de inicio en el object de Silverlight:

   1:          <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
   2:            <param name="source" value="ClientBin/GSC.Twitter.Pivot.Silverlight.xap"/>
   3:            <param name="onError" value="onSilverlightError" />
   4:            <param name="background" value="white" />
   5:            <param name="minRuntimeVersion" value="4.0.50401.0" />
   6:            <param name="autoUpgrade" value="true" />
   7:            <param name="initParams" value="cxml=Twitter.cxml?user=adiazcan" />
   8:            <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50401.0" style="text-decoration:none">
   9:                <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
  10:            </a>
  11:          </object>

y ya podemos visualizar las publicaciones de un usuario utilizando PivotViewer, por ejemplo, ordenando por Fecha de Publicación y visualizando en gráfico, como podemos ver en la siguiente imagen.

pivotviewer_2

Lo siguiente que veremos con PivotViewer es como generar un Factory para SharePoint 2010 y así poder visualizar, de una forma más dinámica, los perfiles de los usuarios.

 

Saludos a todos…