Windows Azure SDK 1.7 y Microsoft.WindowsAzure.Diagnostics

Si habéis migrado una aplicación de Windows Azure SDK 1.* al nuevo Windows Azure SDK 1.7 y hacéis uso del tracing en el Windows Azure Table Storage habréis observado un comportamiento errático, incluso habréis obtenido este mensaje a la hora de hacer tracing:


Could not load file or assembly ‘Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IO.FileLoadException: Could not load file or assembly ‘Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.IO.FileLoadException: Could not load file or assembly ‘Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Bien, esto es debido a que hay que actualizar la referencia al ensamblado Microsoft.WindowsAzure.Diagnostics de vuestro fichero de configuración. Hay que pasar de esto:

<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener,

Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral,

PublicKeyToken=31bf3856ad364e35" name="MyDiagnostics">


a esto:

<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener,

Microsoft.WindowsAzure.Diagnostics, Version=1.7.0.0, Culture=neutral,

PublicKeyToken=31bf3856ad364e35" name="MyDiagnostics">



Era demasiado largo para un tweet Smile with tongue out

Talentous

Me gustaría compartir con vosotros la aventura profesional en la que me encuentro inmerso en el mundo de las startups.

Hemos creado Talentous la red profesional del talento. En Talentous podrás dibujar tu perfil de talento a través de tests psicométricos diseñados por la Facultad de Psicología de la Universidad Complutense de Madrid. Además, podrás valorar de manera anónima a todo profesional con el que hayas tenido una relación laboral, así contribuirás a dibujar un retrato de talento que ayudará a las personas a encajar mejor en ofertas de trabajo.

image

Así podréis tener un perfil público como este:

https://www.talentous.com/talentprofile/vicente-garcia-diez

 

image

 

También puedes compartir tus principales fortalezas en tus redes sociales, ya que dentro de la plataforma contarás con una versión mucho más detallada de tu perfil, con un Informe de Talento con los resultados de los tests y de las valoraciones que tus compañeros, jefes, clientes, colaboradores, alumnos, etc.

 

 

Además, estamos participando en un concurso de startups en TodoStartups.com en el que agradeceré tu colaboración, solo tienes que hacer click en la estrellita que hay encima de la imagen para darnos un UP!

Y por último y no menos importante, y debido a la buena acogida de la primera versión que en un mes ha conseguido 3000 visitas y 1000 registrados, estamos buscando el ampliar nuestro equipo técnico.

 

Descripción del puesto:

Dependiendo del CTO, serás responsable de desarrollo de la plataforma social Talentous.

Queda mucho por hacer, por lo que podrás especializarte y aportar en lo que más te guste. ;-D

Tus labores tendrán parte de arquitecto, parte de desarrollador y parte de jefe de equipo.

Va a ser una gran aventura.

 

Experiencia deseada:

La plataforma Talentous está desarrollada con tecnologías Microsoft y alojada en Windows Azure y SQL Azure, por lo que el perfil deseable sería unos tres años de experiencia en lo siguiente:

Altos conocimientos en orientación a objetos.

Conocimientos de Visual C# y Microsoft .NET

Conocimientos en desarrollo web: ASP.NET MVC + Razor HTML5 + CSS + JavaScript

Conocimiento de Entity Framework y SQL Server.

Manejo de Microsoft Visual Studio 2010

Manejo de Microsoft Team Foundation Server (TFS online)

Creer que los tests de unidad pueden salvarte la vida 🙂

Deseables conocimientos de Windows Azure Platform y SQL Azure.

Deseables conocimientos de metodología ágil SCRUM.

 

Competencias buscadas:

Haz nuestro test de talento y déjate valorar por otros profesionales para mostrarnos tu marca personal. Eso dirá mucho a tu favor 😉

Algunas de las competencias que encajan con el puesto:

Trabajo en equipo, Liderazgo, Entusiasmo, Persistencia, Adaptabilidad al cambio, Flexibilidad.

Remuneración:

Pregúntanos. ¡Tienes más que ganar que qué perder!

 

Si crees que puedes encajar y tienes un espíritu emprendedor, apasionado e involucrado, envíame un correo a vicente.garcia@talentous.com con la dirección de tu perfil de talento Smile

Muchas gracias por tu tiempo y tu apoyo Smile

ASP.NET MVC, SEO y diferentes idiomas

Un valor muy importante de nuestras webs públicas es su posicionamiento en los motores de búsqueda. Si a ello le añadimos que debemos de soportar múltiples idiomas y que queremos aparecer bien posicionados en las búsquedas en diferentes lenguajes de los buscadores, el tema se puede poner bastante divertido.

Hay que tener en cuenta que los buscadores van a realizar su indexación sin especificar una culture en su petición, por lo que las técnicas de obtener la culture del usuario a través de la petición o de una cookie o similar no van a funcionar.

Otro aspecto a tener en cuenta es que los buscadores solo indexarán un idioma por url. ¿Esto qué quiere decir? Si, por ejemplo, tenemos la url http://myshop.com y dependiendo de la culture de la petición vamos a mostrar la página en un idioma u otro, el bot del buscador solo indexará la url para un idioma, que será el que tengamos configurado por defecto, para esa url.

Si queremos tener nuestra web correctamente indexada para inglés, español y alemán debemos tener algo similar a esto:

http://myshop.com/es

http://myshop.com/de

http://myshop.com/en

Así incluso podremos facilitarle al buscador un sitemap.xml con estas url para su indexación en varios idiomas.

¿Dónde entra ASP.NET MVC en todo esto? Pues si hemos desarrollado nuestra web con esta tecnología, podemos contar con la ventaja del sistema de enrutamiento. Registrando la siguiente ruta:

routes.MapRoute("Default",
                "{culture}/{controller}/{action}/{id}",
                 new { 
                      controller = "Home", 
                      action = "Index", 
                      id = UrlParameter.Optional, 
                      culture = "en" }  
                 );
Y teniendo un controlador base similar a este:
public class BaseController : Controller
{        
   public string CurrentLanguage { get; set; }         
   protected override void OnActionExecuting(ActionExecutingContext filterContext)
   {
             if (filterContext.RouteData.Values["culture"] != null)
             {                 
                 string culture = filterContext.RouteData.Values["culture"].ToString().ToLower();
                 if (culture == "es" || culture == "en" || culture == "de")
                 {                     
                     CurrentLanguage = culture;                     
                     Thread.CurrentThread.CurrentCulture 
                                                = CultureInfo.CreateSpecificCulture(CurrentLanguage);
                     Thread.CurrentThread.CurrentUICulture 
                                                = CultureInfo.CreateSpecificCulture(CurrentLanguage);
                 }             
              }             
     base.OnActionExecuting(filterContext);         
    }     
}
Podremos redigir automáticamente a nuestras vistas con la cultura adecuada.
Para cargar una u otra vista, dependiendo de su idioma hay múltiples técnicas, hay programadores que prefieren utilizar las mismas 
vistas y cargar diferentes ficheros de recursos y hay otros que prefieren tener diferentes vistas en cada uno de los idiomas. 
Yo prefiero una mezcla de las dos soluciones:
- Me gusta tener las cadenas en un fichero de recursos porque se pueden localizar y traducir más facilmente. Además, se pueden especificar las etiquetas lang, meta description y meta keywords para una mejor indexación por parte del bot del buscador.
- Y me gusta tener diferentes vistas por idioma porque, dependiendo del idioma utilizado, las cadenas de texto pueden ocupar una u otra longitud, por lo que, por cuestiones de diseño,
esta opción puede ser interesante.

Seguridad en .NET 4

Uno de los aspectos del framework que ha cambiado de manera más radical es su modelo de seguridad. En la versión .NET 4 se ha dejado obsoleto al CAS policy.

CAS policy es una tecnología potente que permitía la aplicación de permisos de una manera muy detallada, pero demasiado engorrosa, ya que ni siquiera se pueden aplicar políticas para varias versiones del framework, etc.

Con la salida de .NET 4, Microsoft decidió cambiar la manera de hacer las cosas y trasladó la responsabilidad de la seguridad del runtime al sistema operativo, sustituyendo así las políticas a nivel de máquina y trantando de igual manera a ensamblados manejados y ensamblados nativos.

Muchos de nosotros nos habremos encontrado con la necesidad de migrar código de versiones anteriores a la nueva versión del framework y hemos tenido que hacer uso de:

<NetFx40_LegacySecurityPolicy enabled=”true” />

para habilitar la compatibilidad con CAS policy de nuestros nuevos ensamblados.

 

Para facilitar la creación de entornos sandbox, hemos pasado de la farragosa vía que CAS policy ofrecía a una manera simple y directa, con dos niveles: Partial Trust y Full Trust. Ahorrándonos la evaluación de evidencias, utilizadas ahora como meros contenedores de información.

 

El mecanismo que garantiza este comportamiento ya fue introducido en el framework .NET 2.0 y se llama Security Transparency, solo que esta primera versión era principalmente utilizada como herramienta de autidoría. En esta segunda versión incluida en .NET 4 es la herramienta que separa el código seguro de ejecutar del que no lo es.

Separa al código en tres categorías: Transparent, Safe Critical y Critical. Robando una imagen de la MSDN, sería algo así:

securitytransparencymodel

Donde las fechas verdes representan llamadas válidas y las rojas llamadas inválidas.

 

Un atributo que hemos visto en la nueva versión del framework y que puede decorar nuestros ensamblados es AllowPartiallyTrustedCallers, informando de que ese ensamblado expone cierta funcionalidad sensible en terminos de seguridad a ensamblados Partial Trust.

Para evitar que cualquier ensamblado Partial Trust pueda llamar a esa funcionalidad, se ha introducido un condicionante que, a través de una lista de hosts, hace visible esa funcionalidad solo para los nombres de esa lista.

Windows Azure AppFabric SDK V1.5

En estos días que corren, no todo va a ser Windows 8.

Se ha publicado la versión 1.5 del SDK de Windows Azure AppFabric que trae novedades principalmente en la parte de Service Bus, incluyendo mensajería brokered como topics, colas y subscripciones.

Junto a la descarga del SDK, tenéis ejemplos de las nuevas funcionalidades en Visual C# y Visual Basic.NET

Próximamente se incluirán más detalles sobre este nuevo sdk en su sección correspondiente de la MSDN.

Un saludo.

EDITO:

Hoy también se anuncia Windows Azure SDK 1.5 y hay más detalles sobre las nuevas features en el Service Bus:

Service Bus September Release

This new release introduces enhancements to the Service Bus that improve pub/sub messaging by introducing features such as Queues, Topics and Subscriptions, and Rules. It also enables new scenarios on the Windows Azure platform, such as:

  • Asynchronous Cloud Eventing – Distribute event notifications to occasionally connected clients (for example, phones, remote workers, kiosks, and so on)
  • Event-driven Service Oriented Architecture (SOA) – Building loosely coupled systems that can easily evolve over time
  • Advanced Intra-App Messaging – Load leveling and load balancing for building highly scalable and resilient applications

Raona

Ha llegado la hora del cambio y ahora trabajo en Raona. Después de casi tres años en Plain Concepts puedo decir que no conservo a ningún compañero, lo que conservo son amigos 🙂

En Septiembre del 2010 he comenzado una nueva andadura, con interesantes retos para este 2011 como consultor para Raona. Andadura que ha comenzado con muy buen pie 🙂

Un saludo 🙂

Streaming de libros Parte 2 – Indexación con Full Text Search

Full Text Search nos da la capacidad de indexar campos basados en caracteres (aunque su almacenamiento sea en binario) y hacer búsquedas complejas sobre esos textos.

Esta capacidad viene dada por los siguientes elementos:

  • SQL Full-text Filter Daemon Launcher: Se encarga de mantener actualizados los índices Full Text Search de cada tabla, asociado a cada instancia de Sql Server, pero corriendo en un proceso separado. Si no lo necesitamos, podremos poner su estado a Stop.
  • Full-text index : Índice full-text que indexa el contenido de la tabla. Solo puede haber uno por tabla y lenguaje. Por lo que, si nuestra aplicación maneja documentos en distintos idiomas, será necesario separarlos en tablas distintas.
  • iFilters: El motor de indexado debe de reconocer el tipo de fichero que contiene el campo varbinary(max), de ahí que la extensión de ese fichero se almacene en la columnda DocumentType. Para ver los tipos de ficheros que el motor es capaz de indexar, ejecutaremos la siguiente sentencia:
    •  
      •  
        •  
          •  

Si alguna extensión no aparece, es necesario instalar su iFilter específico. Por ejemplo, es el caso de los ficheros PDF de Adobe. En máquinas de 32 bit, el iFilter para ficheros PDF se instala con el propio Adobe Acrobat Reader, pero para máquinas de 64 bit es necesario instalar el componente Adobe PDF iFilter 9 for 64-bit platforms y seguir las instrucciones.

  • Consultas específicas para consultar campos indexados con Full-text Search, como CONTAINS o FREETEXT.

Comenzaremos con la creación del índice Full-Text search en nuestra tabla Book. Para ello, utilizaremos el Sql Management Studio.

  • Haciendo click con el botón derecho sobre nuestra tabla, desplegaremos el siguiente menú:

image

  • Seleccionar el índice único sobre la columna que anteriormente hemos creado:

image

  • Seleccionar la columna que contiene los datos varbinary a indexar, la columna que contiene el DocumentType y el lenguaje en que los libros están escritos:

image

  • Seleccionar el modo en que los cambios sobre el campo Data van a ser registrados.Salvo escenarios excepcionales, el modo más común y recomendando es Automatically:

image

  •  
    •  
      • Automático: Los cambios sobre el campo Data se registrarán en una tabla y el índice será actualizado automáticamente.
      • Manual: Los cambios sobre el campo Data se registrarán en una tabla, pero la actualización del índice conforme a esas modificaciones tendrá que ser explícito (llamado a mano).
      • No registrar cambios: Los cambios sobre el campo Data no se registrarán, por lo que el índice tendrá que ser rehecho para mantenerlo actualizado.
  • Seleccionar el catalog en el que se creará el índice ful-text y más opciones de búsqueda:

image

  •  
    • Es necesario seleccionar un catalog de tipo full-text para crear el índice. También en esa sección podemos establecer si se consideran las tildes para las búsquedas.
    • En la opción “Select full-text stoplist” se elige la lista de palabras stop (palabras que son, por ejemplo, nexos entre otras palabras, etc). Si se selecciona “system” se utilizarán las palabras stop del lenguaje del sistema. Otros valores son “off”, para que también sean indexadas, o la selección de una lista personalizada de este tipo de palabras especiales, ya sea porque queremos elegir una lista en un lenguaje distinto al del sistema o una específica. Con esta opción se pretende no crear confusión en la búsquedas y aliviar la carga del índice al no tener que indexar este tipo de palabras, que suelen ser numerosas.
  • En esta pantalla se seleccióna la planificación de la populación de la tabla y del full-text catalog.
  • Finalizando este wizard, se comenzará a popular el índice, ya que el tipo de registro de cambios se ha establecido en automático.

Ahora ya está indexado el campo Data con un índice full-text que, según está configurado, se actualizará automáticamente ante modificaciones en la tabla.

Podemos ver cómo queda el menú Full-text index de nuestra tabla:

image

 

 

 

 

 

La única opción que cabe comentar es Start Incremental Population, que realiza la populación del índice de manere incremental, con la restricción de que la tabla tiene que tener un campo timestamp para controlar ese proceso incremental.

Para posteriores post, utilizaremos las consultas CONTAINS y FREETEXT para consultar el campo indexado.

Streaming de libros Parte 1 – Almacenamiento en FileStream

Voy a intentar ilustrar a lo largo de una serie de post la gestión de un almacén de libros. Para ello, vamos a utilizar la tecnología File Stream para su almacenamiento en nuestra base de datos Sql Server 2008 R2 Express, la tecnología Full-Text Search para su posterior indexación y consulta de contenidos y WCF + MTOM para hacer posible el streaming (tanto upload como downdload) de nuestros libros.

File Stream es una manera de guardar información no estructurada, como videos, imágenes, etc, fuera de nuestro almacenaje estructurado, por lo que esa información estarán directamente almacenada en el sistema de ficheros, eliminando las penalizaciones, tanto de rendimiento como de tamaño, que supondría tenerla directamente albergada en nuestras tablas. Otra ventaja de File Stream es que nos permite aprovechar mejor los límites de tamaño que las versiones Express nos ofrecen, ya que esta información almacenada en File Stream no se tiene en cuenta para esas restricciones 🙂

El primer paso que daremos es activar el soporte para File Stream en nuestro motor de base de datos, para ello abriremos el Sql Server Configuration Manager para acceder a las propiedades de nuestra instancia y ahí activar el soporter para File Stream:

image

image

Otra forma de activar el File Stream es en la instalación de nuestro Sql Server.

El siguiente paso es crear una base de datos con un filegroup File Stream para almacenar nuestros libros, después le indicaremos a la base de datos que ese va a ser el lugar seleccionado para tal propósito. Esta tarea podemos llevarla a cabo bien con el Sql Management Studio o bien a través de la ejecución de un script.

Utilizando el Sql Management Studio seguiríamos los siguientes pasos:

  • Creación de FileGroup de tipo File Stream, lo llamaremos BooksFileStream.

image

  • En la sección General, indicamos a la base de datos en qué File Group de tipo File Stream va a almacenar los libros y cuál va a ser su ruta física en el sistema de ficheros en la propiedad Path. La llamaremos Books_Data.

image

 

Si hubieramos optado por la ejecución de un script para la creación de nuestra base de datos, tendríamos que haber generado algo parecido a lo siguiente:

CREATE DATABASE [Books] ON  PRIMARY
( NAME = N’Books’, FILENAME = N’C:Program FilesMicrosoft SQL ServerMSSQL10_50.SQLR2EXPRESS64MSSQLDATABooks.mdf’ , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
FILEGROUP [BooksFileStream] CONTAINS FILESTREAM  DEFAULT
( NAME = N’Books_data’, FILENAME = N’C:Program FilesMicrosoft SQL ServerMSSQL10_50.SQLR2EXPRESS64MSSQLDATABooks_data’ )
LOG ON
( NAME = N’Books_log’, FILENAME = N’C:Program FilesMicrosoft SQL ServerMSSQL10_50.SQLR2EXPRESS64MSSQLDATABooks_log.ldf’ , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [Books] SET COMPATIBILITY_LEVEL = 100
GO

IF (1 = FULLTEXTSERVICEPROPERTY(‘IsFullTextInstalled’))
begin
EXEC [Books].[dbo].[sp_fulltext_database] @action = ‘enable’
end
GO

En el que, además de las tareas típicas de la creación de la base de datos, se crea el File Group de tipo File Stream y se indica la ruta para el almacenamiento. También se comprueba si la base de datos tiene soporte para Full Text Search activado, y en caso negativo, lo activa.

Y ya hemos creado nuestra base de datos con soporte de File Stream. Ahora crearemos la tabla Book, en la que almacenaremos nuestros libros, con su título, el tipo de fichero y su fichero propiamente dicho.

En esta tarea no tendremos opción de elegir entre realizarla con el Sql Server Management Studio o ejecutar un script, ya que no hay manera de indicar, a través del Sql Server Management Studio, que un campo de una base de datos es File Stream. El script sería el siguiente:

CREATE TABLE [dbo].[Book] (
    [IdBook]       UNIQUEIDENTIFIER           ROWGUIDCOL NOT NULL,
    [Title]        NVARCHAR (MAX)             NULL,
    [DocumentType] NVARCHAR (10)              NULL,
    [Data]         VARBINARY (MAX) FILESTREAM NULL DEFAULT(0x),
    UNIQUE NONCLUSTERED ([IdBook] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF) ON [PRIMARY]
);

Me gustaría aclarar que File Stream en sí no es un tipo, si no la manera en que ese campo de la base de datos va a almacenarse. El tipo en sí es varbinary(max).

Adelantandonos a capítulos posteriores, hay que decir que, para la posterior creación de un índice Full Text Search es necesario contar en la tabla con un campo único no nulo decorado con la propiedad ROWGUIDCOL, que indica que la nueva columna es una columna de GUID de filas. Además, será necesario la creación de una columna NVARCHAR o tipo similar que almacenará la extensión del fichero en que hayamos guardado el libro (.docx, .pdf, etc), esta última columna es necesaria porque los datos indexados están en una columna de tipo varbinary y el motor de indexación Full Text Search necesita conocer el tipo de fichero sobre el que va a operar.

En el siguiente post hablaremos de la generación del índice Full Text Search y cómo útilizarlo para nuestras consultas.

Psscor2 : Extensión de debug de .Net en WinDbg

Las personas que estén acostumbradas a utilizar el debugger WinDbg para depurar sus aplicaciónes .Net conocerán de sobra la extensión SOS.

Pues bien, quería hablaros de la liberación de la nueva versión de Psscor2, con más funcionalidades añadidas que la extensión SOS, sobre todo para aplicaciónes ASP.Net.

Para más información, dos blogs esenciales:

ASP.NET Debugging

If broken it is, fix it you should

Espero que las disfrutéis.