Codepoint

by Trentia Consulting

Ya llegó SharePoint y Office 2013!

El día 17/07/2012 Microsoft lanzó la Preview de SharePoint y Office 2013. Nosotros ya lo hemos instalado y lo estamos probando!

Aquí os dejo algunos links interesantes por si queréis ir viendo las novedades:

  • Visión general de SharePoint 2013: enlace
  • Visión general de Office 2013: enlace
  • Libro de instalación y configuración de SharePoint Server 2013 y SharePoint Foundation  2013: enlace
  • PowerPoints de SharePoint 2013: enlace
  • Descarga de SharePoint Foundation 2013 Preview: enlace
  • Descarga de SharePoint Server 2013 Preview: enlace
  • Vídeo: “¿Qué hay de nuevo en SharePoint Server 2013 para desarrolladores?”: enlace

Pruebas de carga y de rendimiento web con JMeter

Recientemente en un proyecto de intranet nos ha surgido la necesidad de tomar medidas de rendimiento y realizar pruebas de carga para validar el correcto funcionamiento del sistema y mejorar algunos puntos concretos. De las herramientas disponibles en el mercado para estos menesteres nos hemos decantado por JMeter, una herramienta open source que forma parte de la Apache Software Foundation y que nos ha sorprendido muy agradablemente por sus capacidades y su funcionamiento intuitivo.

Evidentemente se trata de un software 100% Java, por lo que debemos disponer de la máquina virtual de Java instalada para ejecutar esta aplicación desktop. Una vez instalada podemos crear nuevos proyectos de medición y estrés. Disponemos de características como:

  • Posibilidad de realizar mediciones sobre distintos tipos de servidores:
    • Web (HTTP / HTTPS)
    • SOAP
    • Base de datos vía JDBC
    • LDAP
    • JMS
    • Mail (SMTP(S) / POP3(S) / IMAP(S))
  • Comandos nativos o shell scripts
  • Framework multithread, que nos permite la toma de medidas concurrentes en distintos grupos de threads
  • Una GUI muy cuidada y completa
  • Caching y posibilidad de análisis off-line
  • Gran extensibilidad vía plugins

image_2

Uno de los aspectos que nos ha parecido especialmente interesante es la gran variedad de salida de datos que disponemos para analizar las medidas. Existen numerosos Receptores, como se denominan en JMeter, que nos permiten ver los datos en distintos formatos o enviarlos hacia algún destino en fichero. En la imagen anterior, por ejemplo, podemos ver un Receptor de tipo Gráfico, mostrando la medida media, mínima y máxima de un total de 10 llamadas concurrentes a distintas páginas de una web.

image_6

Bug en SharePoint 2010: Los iconos de documento no abren el documento seleccionado en vistas de bibliotecas de documentos

Seguramente os habéis encontrado que al definir una vista de una biblioteca de documentos el icono del tipo de documento, no abre el documento en cuestión como si lo hacía SharePoint 2007.

Esto es un bug reconocido por Microsoft y que tiene su origen en el XSLT que se encarga de renderizar la vista de documentos. Afortunadamente para nosotros, tiene una fácil solución.

Vamos a explicaros los pasos que debéis seguir para modificar el comportamiento

1) Nos dirigimos hacía la ruta de configuración donde se definen los XSLT, ubicada normalmente en C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\template\layouts\XSL

2) Por seguridad realizamos una copia del fichero fldtypes_docicon.xsl

3) Editamos el fichero fldtypes_docicon.xsl con notepad y substituimos el código XML por el que figura más abajo

4) Forzamos un IISRESET  de nuestro servidor

Fuente: enlace

  
    
  
  
    
    
    
      
        
          
            
              : 
            
            
              : 
            
          
        
        
        
          
            
          
        
        
        
          
            {$alttext}
            
              
                
              
            
          
          
            
              RootFolder=&FolderCTID=&View=
            
            
              {$alttext}
              
                
                  
                
              
            
          
        
      
      
        
          
            
              
                
                    
                        
                            {$thisNode/@FileLeafRef}
                        
                        
                            
: 
                            {$alttext}
                            {$alttext}                            
                        
                                      
                
                
                    {$thisNode/@FileLeafRef}
                  
                
              
            
          
          
            
              
                
              
              
                
              
            
          
        
      
    
  
  


Enviar información entre métodos de acción (MVC)

Hay veces en las que necesitamos enviar información de un método de acción (ActionMethod) a otro, por ejemplo si queremos realizar una acción determinada y luego volver al método anterior.

Podemos almacenar la información necesaria en el objeto TempDataDictionary del controlador, antes de llamar al método RedirectToAction que nos redirigirá a la próxima acción. El valor de la propiedad TempData se almacena en el estado de la sesión, y cualquier método llamado después de guardarlo podrá leerlo y procesarlo. El valor del objeto TempData se conservará hasta la expiración de la sesión o hasta que sea leído.

Ejemplo:

- Guardar información en el objeto TempData:

public ActionResult AddUsuario(Usuario model)
{
    if (ModelState.IsValid)
    {
	//guardar usuario en la base de datos        

        TempData["message"] = "Usuario creado correctamente.";
        return RedirectToAction("DetailsUsuario ", new { USU_Id = model.USU_Id } );
    }

    return View(model);
 }
public ActionResult DetailsUsuario(Guid USU_Id)
{
    //Consultar usuario de la base de datos
    if(TempData["message"] != null)
    {
        ViewBag.message = TempData["message"];
    }
 return View(usuario);
}

Primeros pasos con NuGet

NuGet es una herramienta OpenSource que viene instalada y configurada por defecto en Visual Studio 2010.

Su funcionamiento es muy simple, pero es en su simplicidad donde está escondida su grandeza. NuGet es un administrador de paquetes o librerías .NET que se integra en todos los proyectos de Visual Studio 2010.

NuGet nos permite tener referenciados proyectos VS 2010 a versiones específicas de librerías .NET. ¿Esto que significa? Pues significa que en el caso que estemos trabajando en algún proyecto de equipo de varias personas y alguien añada alguna referencia de alguna librería externa, el resto de personas del equipo se verán obligadas de buscar,descargar y actualizar todas las referencias necesarias si quieren compilar la solución.
NuGet puede liberarnos de esta duras tarea descargando, actualizando y configurando  todas las referencias necesarias al proyecto por el mero hecho de obtener la última versión del proyecto y compilar la solución.

Vamos a ver un ejemplo práctico de como funciona.

La manera más cómoda de trabajar con NuGet es a través de su consola de administración de paquetes que la podemos encontrar dentro de nuestro menú de VS.

image_2_3EC7C6EC

En el caso que queramos instalar alguna referencia o alguna utilidad introduciremos el siguiente comando Install-Package y el nombre del paquete en la consola.

En nuestro caso, instalaremos elmah que es un utilidad que nos permite capturar excepciones no controladas de nuestras aplicaciónes ASP.NET. Al ser un HTTP Handler requiere de ciertas configuraciones que deben de realizarse sobre el archivo web.config

Para descargar, instalar y configurar nuestra utilidad, escribiremos la siguiente instrucción en nuestra consola de paquetes Install-Package elmah

image_4_3EC7C6EC

NuGet se encargará de descargar, referenciar y configurar todas las referencias o dependencias que sean necesarias para el correcto funcionamiento de la aplicación.

Fijaros como con una única instrucción se configura nuestro proyecto ASP.NET

image_6_3EC7C6EC

En nuestro caso, ha añadido la referencia a nuestro proyecto y configurado todos los parámetros necesarios de nuestro web.config para que este funciona correctamente sin intervención por parte nuestra.

Cada vez que instalemos algún paquete a nuestra solución, NuGet descargará en el directoriopackages, ubicado físicamente en la raíz de nuestra solución, todos los archivos necesarios para su ejecución (recordar que esta carpeta no se actualiza en nuestro repositorio de código fuente).

Ahora imaginaros, que desde otra máquina descargamos el proyecto de VS donde no tenemos descargado elmah (siguiendo con el ejemplo). Al abrir y compilar el proyecto VS nos dará un error de que no encuentra dicha referencia.

Para evitar estos problemas, habilitaremos la restauración de paquetes NuGet

image_8_3EC7C6EC

Al habilitar la restauración cuando vayamos a compilar nuestra solución, si NuGet detecta que existe alguna referencia no cargada correctamente, intentará descargarla del repositorio de paquetes y configurará todos los parámetros que sean necesarios para la correcta compilación de nuestra solución.

Si queréis conocer con más profundidad NuGet visitar los siguientes enlaces:

SharePoint 2010: Informes y métricas

SharePoint 2010 ofrece conjunto de características para recopilar, informar y analizar el uso y la eficacia de la implementación del mismo. Estas características forman parte de la funcionalidad de Web Analytics de SharePoint 2010.

Existen tres categorías de informes de Web Analytics de SharePoint: tráfico, búsqueda e inventario. Los informes se agregan a varias entidades de SharePoint, como sitio, colección de sitios y aplicaciones web para cada conjunto o granja de servidores. Los informes también se agregan por aplicación de servicio de búsqueda, por defecto los informes muestran los datos en períodos de 30 días, pero se puede cambiar el período de tiempo para ver los datos de hasta 25 meses, desde la ficha "Analizar" de la cinta de opciones de la interfaz de usuario.

A continuación encontraréis unas referencias a las tres categorías existentes:

Informes de tráfico: estos informes ofrecen métricas, como:

  1. Cantidad de tráfico que tiene el sitio (número de vistas de páginas);
  2. Quién visita los sitios (visitantes principales);
  3. Cómo llegan los visitantes al sitio (remitentes principales);
  4. Visitantes únicos diarios, destinos principales, exploradores principales, etc.;

Informes de búsqueda: proporcionan información acerca de qué buscan los usuarios:

  1. Cuántas búsquedas realizaron los usuarios (número de consultas);
  2. Cuáles fueron los términos de búsqueda más usados (consultas principales);
  3. Qué consultas tienen tasas de error altas (consultas erróneas);
  4. Uso de opciones más probables, palabras clave de búsqueda, etc.;

Informes de inventario: muestran métricas clave sobre el inventario de sus sitios:

  1. Cuál es el uso total de espacio en disco (uso de almacenamiento);
  2. Cuántos sitios existen (número de sitios);
  3. Versiones de producto principales del sitio, idiomas principales del sitio, etc.;

Novedades de Entity Framework 5.0

Entre las nuevas funcionalidades que encontramos en la nueva versión, todavía en Release Candidate, de Entity Framework, podríamos destacar:

  1. Nuevos tipos de datos.
    • Tipos enumerados (Enum)
    • Tipos de datos espaciales, expuestos mediante los tipos DBGeography y DbGeometry.
  2. Posibilidad de trabajar con funciones que devuelven datos tabulares. El resultado es similar a la llamada a un procedimiento almacenado, con la diferencia de que podemos utilizar estas funciones en consultas LINQ
  3. Todas las consultas LINQ se compilan y cachean de forma automática. Con ello se obtiene un mejor rendimiento en llamadas recurrentes a las consultas
  4. Soporte a múltiples diagramas para un mismo modelo de datos. Se podrán visualizar partes del modelo completo en diagramas más pequeños, con lo que se mejora la lectura y exploración del modelo
  5. Mejoras generales en el rendimiento de EF respecto a versiones anteriores
  6. Posibilidad de utilizar procedimientos almacenados que devuelven múltiples conjuntos de resultados. Cada conjunto de resultados del procedimiento será mapeando un tipo complejo propio

Está previsto que EF 5.0 sea liberado a través de paquetes de NuGet, siguiendo un calendario distinto al de .NET Framework 5.0, lo cual no sabemos si es mejor o peor. Lo que está claro es que cada versión de EF nos trae importantes y esperadas novedades, tanto funcionales como de rendimiento y la versión 5.0 no es una excepción.

Convertir segundos en "hora:minutos:segundos"

Si alguna vez os encontráis con que tenéis un campo numérico en formato segundos y lo queréis pasar en formato "hora:minutos:segundos" en Reporting Services podéis utilizar la estructura TmeSpan en la expresión del campo de la siguiente forma:

= TimeValue(new TimeSpan(0, 0, Fields!Browse_Time.Value).Hours & ":" & new TimeSpan(0, 0, Fields!Browse_Time.Value).Minutes & ":" & new TimeSpan(0, 0, Fields!Browse_Time.Value).Seconds)

Umbraco v5 ha muerto… ¡Viva Umbraco v4!

Pues sí, desde el blog de Umbraco, este maravillo gestor de contenidos web, nos llega la noticia de que la versión 5 de Umbraco se abandona para volver a evolucionar desde su antecesor. Esta decisión se ha tomado debido al poco soporte de la comunidad a la nueva versión.

La complejidad del sistema, la arquitectura desarrollada para la nueva versión, han provocado el rechazo generalizado. A eso se le deben sumar los problemas relacionados a la dificultad de uso, los problemas de rendimiento y numerosos bugs, además del hecho que no supone un especial avance a nivel funcional respecto a Umbraco v4.

umbraco

Todo ello ha llevado a abandonar esta versión basada en MVC y volver a Umbraco v4, incorporando las novedades implantadas en v5. Umbraco v5 se evolucionará únicamente para solucionar los problemas más importantes que arrastra en su versión 5.2, por lo que no se recomienda su uso en proyectos nuevos.

Es una muy mala noticia para la comunidad, sin duda alguna, que la reingeniería de un producto tan importante como Umbraco hacía MVC haya sido el detonante de una vuelta atrás.

Nadie duda que MVC sea el futuro (y presente) del desarrollo en plataformas ASP.NET de Microsoft, por lo que todos queremos entender que no ha sido un problema en la tecnología lo que ha provocado esta situación sino un mal planteamiento de la arquitectura.

Modificar MasterPage de SharePoint 2010 a través de módulos con Visual Studio 2010

El siguiente artículo vamos a tratar de encapsular a través de una característica de SharePoint, la actualización de la MasterPage por defecto de una colección de sitios.

Aunque es sencillo de implementar, más de una vez hemos tenido algún dolor de cabeza cuando hemos ido a implementar nuestra solución a nuestro cliente y más teniendo en cuenta que la actualización la realizamos con Designer.

A través de los MODULE de SharePoint 2010 y un EventReceiver tendremos todo lo suficiente.

En primer lugar, a nuestras solución de SharePoint 2010 para Visual Studio, crearemos un nuevo MODULE tal como se muestra en la imagen de a continuación

image_4_18EFB085

Una vez creado el MODULE, renombramos el fichero Sample.txt a Custom.Master. El siguiente paso es actualizar el fichero Elements.xml. En nuestro caso, deseamos que nuestro fichero se ubica en la galería de páginas maestras de la colección de sitios, por tanto seguiremos la siguiente sintaxis.

  
  

El siguiente paso, es crear un EventReceiver de nuestra característica (botón derecho sobre la Feature – Add Event Receiver)

A continuación, escribiremos el siguiénte código para actualizar las páginas Master de todos los sitios de nuestro portal

string customMasterPageName = "/_catalogs/masterpage/Custom.Master";
      string previousMasterUrl = "/_catalogs/masterpage/v4.master";

      public override void FeatureActivated(SPFeatureReceiverProperties properties)
      {


          SPSite site = properties.Feature.Parent as SPSite;

          Uri masterPageUri = new Uri(site.RootWeb.Url + customMasterPageName);
          if (site.RootWeb.GetFile(masterPageUri.AbsoluteUri).Exists)
          {


              foreach (SPWeb web in site.AllWebs)
              {
                  web.MasterUrl = masterPageUri.AbsolutePath;
                  web.CustomMasterUrl = masterPageUri.AbsolutePath;
                  
                  web.Update();
              }
          }
      }

      public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
      {
          SPSite site = properties.Feature.Parent as SPSite;

          Uri uriMaster = new Uri(site.RootWeb.Url + previousMasterUrl);

          foreach (SPWeb web in site.AllWebs)
          {
              web.MasterUrl = uriMaster.AbsolutePath;
              web.CustomMasterUrl = uriMaster.AbsolutePath;
              web.OverwriteTranslationsOnChange = true;

              web.Update();
          }

      }