Double-Checking Locking,volatile y demás ‘cool’ codes

Hoy por la tarde comiendo con mi compañero Rodrigo, estuvimos hablando, como no, de diversos trozos de código que vemos implementados y diversas recomendaciones que podemos ver y releer por todo esta gran enciclopedia que son los buscadores de internet. Una de las cosillas graciosas de las que hablamos es de los códigos ‘cool’ que se suelen ver en implementaciones y en las citadas enciclopedias. Para muestra un ejemplo:

 

using System;

 

public sealed class Singleton

{

private static volatile Singleton instance;

private static object syncRoot = new Object();

 

private Singleton() {}

 

public static Singleton Instance

{

get

{

if (instance == null)

{

lock (syncRoot)

{

if (instance == null)

instance = new Singleton();

}

}

return instance;

}

}

}

 

Cool ¿verdad? Así de primeras diríamos, esto lo ha hecho un ‘programador serio serio’, más si cabe si este código lo podemos ver como ejemplo en ‘Patterns and Practices’ para patrones singleton seguros en multiproceso. Vemos además un ‘keyword’ de estos que son desconocidos por la gran mayoría, en concreto ‘volatile’ ¿Cuántos conocéis para qué sirve?. El caso es que este patrón implementa lo que se conoce como ‘Double-Checked Locking Tecnique’ y que efectivamente resuelve los propósitos de esta implementación en otros lenguajes como C++ o Java… pero….. ¿realmente necesitamos esto o como parece más ‘cool’ lo implementamos?

Veamos otra alternativa:

 

public sealed class Singleton

{

private static readonly Singleton instance = new Singleton();

 

private Singleton(){}

 

public static Singleton Instance

{

get

{

return instance;

}

}

}

En la mayoría de los casos esta implementación ofrece la misma funcionalidad y es mejor en cuanto a rendimiento ya que evita que se tenga que programar un bloqueo . Si, es menos ‘cool’ pero funciona igual de bien en escenarios de multiproceso puesto que el CLR siempre te asegura que las llamadas al constructor de tu singleton estático son ‘thread safe’. El ‘Double Checked Locking’ tiene sentido cuando la inicialización del miembro estático requiera además iniciar algunos de los miembros de la misma y por lo tanto no podamos recurrir a la simple llamada al constructor del miembro estático y deberíamos evitarlo excepto en estos casos.

Saludos

Unai Zorrilla Castro

.NET Compact Framework 3.5

El equipo de desarrollo de .NET Compact Framework acaba de publicar un post dónde anuncia las novedades que vendrán incorporadas en Orcas en cuanto a la plataforma de desarrollo para dispositivos móviles. Parece que tienen un buen trabajo a realizar ya que entre sus intenciones está la implementación de un subset de las características de LINQ, la incorporación de un subconjunto de WCF que permitirá resolver o atenuar los problemas actuales en cuanto a direccionamiento de los dispositivos móviles. En el mismo post puedes encontrar los enlaces para descargarte una máquina virtual para realizar las pruebas de .NET Compact Framework 3.5

 

Saludos

Unai Zorrilla Castro

WF y WCF trabajando juntos

Se acaba de publicar un ejemplo en MSDN dónde se pone de manifiesto como juntar tecnologías como WF y WCF, este ejemplo es básicamente una refactorización de un ejemplo que se mostró con la llegada de .NET para mostrar cómo realizar aplicaciones distribuidas usando .NET Remoting, ¡esos viejos tiempos!!. En esta refactorización tenéis toda la parte de servicios expuesta con Windows Communication Foundation y la lógica del mismo incluida dentro de un Workflow usando los servicios de intercambio de datos para la comunicación con el servicio.

 

Integrating Windows Communication Foundation y Windows Workflow Foundation

 

 

Espero que os guste

Unai Zorrilla Castro

Liberado Sql Compact Edition

En unos de mis post anteriores expuse las novedades de Sql Compact Edition, no sé porque razón, pero la liberación de la versión no era la final sino una RC… hicieron una especie de marcha atrás, seguramente porque detectaron algún error. Ahora por fin está liberada junto a una serie de herramientas:

Microsoft Sql Server 2005 Compact Edition Server Tools

Microsoft Sql Server 2005 Compact Edition Tools Of VS 2005 SP1

Microsoft Sql Server 2005 Compact Edition Developper SDK

 

Podeis descargarlo todo desde aqui

Saludos

Unai

 

 

El motor de reglas de Workflow Foundation (II)

En el anterior post se introdujo un poco acerca del motor de reglas y como se podía hacer uso de los plugin para incorporar este motor de reglas dentro de nuestras aplicaciones, sin duda algo bastante ‘cool’ como diría el amigo David Salgado. En esta ocasión me gustaría mostrar como se manejan las dependencias entre las reglas y los mecanismos que nos proporciona Windows Workflow Foundation para manejar estas dependencias.


Dentro de un mismo RuleSet, o conjunto de reglas, podemos tener dependencias de tal forma que la evaluación de una determinada regla dependa de la evalución de una regla con anterioridad. Por ejemplo, imagínese que tiene un nuevo RuleSet con las siguientes reglas:


Regla 1


IF this.edad > 18 THEN this.MayorDeEdad = true


Regla 2


IF this.MayorDeEdad = false THEN this.CarnetConducir = false


En este caso es evidente que la evaluación de la regla 2 depende de la regla 1 puesto que en esta regla se establece un valor para ‘MayorDeEdad’ lo cual podría provocar que el campo ‘CarnetConducir’ se evaluara de forma incorrecta. En Workflow Foundation las dependencias entre reglas pueden identificarse o declararse de entre algunas de las siguientes formas:



  • Implícita

  • Basada en atributos

  • Explícita

A continuación pasaremos a explicar y analizar cada una de las tres formas:


Implícita


De forma implícita delega al motor de reglas de Workflow Foundation la evaluación de las dependencias. Cuando un conjunto de reglas es ejecutado cada regla determina que campos son leídos en la condición y que campos son establecidos en la acción, de esta forma sabría que la Regla 2 de nuestro ejemplo debería de ser evaluada siempre que la regla 1 ejecutara la acción ‘Then’. Realmente delegando las dependencias de las reglas al motor de reglas de Workflow Foundation resolveríamos la mayoría de nuestros problemas, no obstante para reglas más complejas o bien cuando deseamos ser nosotros quienes manejemos las dependencias deberemos de recurrir a los siguientes modelos de resolución de dependencias.


Basada en Atributos


Cuando una de nuestras reglas llama a algún método, el motor de reglas de WF no puede, como en el caso anterior, determinar que campos son leídos o establecidos. Para resolver estos problemas WF nos proporciona tres atributos con los que podemos decorar nuestros métodos con el fin de informas que campos se leen o establecen, estos atributos son:



  • RuleRead

  • RuleWrite

  • RuleInvoke

Para verlo modificaremos las reglas de nuestro ResultSet que quedarán de la siguiente forma:


Regla 1


IF this.edad > 18 THEN SetMayorDeEdad(true)


Regla 2


IF this.MayorDeEdad = false THEN SetCarnetConducir(false)


En esta situación, tal y como hemos dicho, el motor de reglas no puede determinar de forma implícita que campos se leen y/o escriben para calcular cuando debe reevaluar una regla. Para resolverlo decoraremos el método SetMayorDeEdad con el atributo RuleWrite y RuleRead puesto que en este método se establece un valor de campo.


Código


[RuleWrite(«MayorDeEdad»)]


private void SetMayorDeEdad(bool valor)


{


this.MayorDeEdad = valor;


}


RuleRead nos permite especificar que en un determinado método se lee algún valor a usar en otras reglas del ResultSet y RuleInvoke nos permite decir que dentro de un método se hace una llamada a algún otro método que lee o establece el valor de algún campo implicado dentro de una regla de nuestro ResultSet.


Explícita


Para terminar tenemos un último mecanismo para especificar las dependencias dentro de las reglas, en este caso es un mecanismo explícito ya que somos nosotros mismo quienes dentro de la declaración de la regla decimos que valores estamos leyendo o modificando con el fin de provocar las reevaluaciones de las mismas si es necesario. Para realizarlo utilizaremos la sentencia Update indicándole la ruta del campo tal y como podemos ver en el siguiente Ejemplo:


Regla 1


IF this.edad > 18 THEN this.MayorDeEdad = true;Update(«this/MayorDeEdad/»)


Todo lo que hemos visto hasta ahora está relacionado con la propiedad ‘Chaining’ que podemos establecer en el editor de nuestros RuleSet, esta propiedad puede tomar tres valores:





  • Full Chaining

  • Explicit Chaining

  • Sequential

Full Chaining es la opción por defecto y describe el comportamiento visto hasta ahora, la opción de Explicit Chaining no realiza la validación Implícita ni basada en atributos, solamente toma en cuenta las sentencias Update. Realmente esta opción tiene sentido cuando la reevaluación de las reglas podría resultar costosa o entrar en un proceso cíclico. Para terminar la opción ‘Sequential’ únicamente establece la evaluación de las reglas dado el orden que tengan.


Esto no es todo lo que dan de si las reglas dentro de Workflow Foundation, pero como otra aproximación estoy seguro que es suficiente. Para los que deseen profundizar más, pueden seguir invesetigando acerca de la sentencia Halt, la ejecución de reglas basadas en prioridades y el procesamiento de las colecciones de reglas.


Espero que os haya gustado.. un saludo


Unai Zorrilla Castro


 

Las reglas en Workflow Foundation

Supongo que mucho ya lo habréis notado pero en este blog no solamente escribo de Windows Mobile y Compact Framework, últimamente vengo también escribiendo de Windows Workflow Foundation, la verdad es que desde que probé las primeras betas de WF me he ‘enamorado’, no solamente por todo lo que nos ofrece de nuevo sino por lo bien que está construido el model, esto claro está es una opinión personal. Ya son varios los cursos que he impartido sobre WF y alguna que otra charla en Eventos de Microsoft como en el Code Camp hablando del modelo de extensibilidad de los diseñadores de Workflow o en Open Day 2006 sobre ‘internals’ del servicio de persistencia en Workflow Foundation.


Otro de los servicios ofrecidos por la capa de Runtime es el servicio o motor de ‘reglas’, en un principio parece algo sencillo de ver… pero como en casi todo lo que trae Workflow Foundation es una verdadera gozada meterse dentro. Son varios los modelos de cambio y validación que tenemos, delegándolos en el motor, basando la validación y revaluación en atributos… de forma explícita con Update y Halt…. Bueno esto daría para muchos y muchos Post pero no se cuanto de interesados estáis en estos temas o sea que me voy a hacer de rogar y dejar que me pidáis más info… J.


Como ejemplo de lo que nos ofrecen las reglas de WF os adjunto una pequeñita aplicación que usa las regas de WF para validar objetos, que no tienen que ser precisamente Workflows, sí, habéis oído bien, las reglas no solamente sirven para workflows. En este ejemplo se usa el editor de reglas de Windows Worflow, este editor al igual que muchas otras partes de WF es un PlugIn que podemos usar en nuestras aplicaciones. Como veréis es un ejemplo sencillo lo único que se pretende es ver como poder validar y ejecutar una regla para un objeto Persona, el cual dispone de una propiedad booleana MayorDeEdad y una propiedad Edad, podremos crear por lo tanto una regla tipo SI Edad > 18 Entonces MayorEdad=verdadero SINO MayorEdad=falso y proceder a validarla y ejecutarla y ver como dependiendo de la edad la propiedad MayorEdad ser establece de forma correcta.


La aplicación guarda automáticamente las reglas en un archivo .rules para poder cargarlas posteriormente y ejecutarlas sobre el objeto Persona….


Un par de imágenes para verlo mejor





Espero que os guste y si queréis saber más, preguntar J ¡!!!!


Unai Zorrilla Castro

Sql Server Compact Edition

Como anunciaba nuestro amigo Alejandro Mezcua en un post suyo, ya tenemos a nuestra disposición Sql Server Compact Edition, como muchos sabréis esto no representa en si un cambio en el motor de la edición móvil pero si en la forma en la que podemos usar y distribuir el motor de bases de datos. Anteriormente, con Sql Ce Mobile 3.0 podíamos hacer uso de las bases de datos en aplicaciones escritorio siempre que tuviéramos instalado en el equipo Visual Studio 2005 y Sql Server 2005, sin embargo ahora ya podremos hacer uso de las bases de datos de Sql Server Compact Edition sin necesidad de que los usuarios tengan en sus equipos de escritorio VS y Sql Server. Otra de las ventajas que se nos presentan es que es un paquete redistribuible mediante ClickOnce con lo que se nos facilitará mucho el desplegado de las aplicaciones que usen este tipo de paquetes.

Para las personas que ya tenían instalado, como yo, Sql Mobile 3.0 es necesario tener en cuenta una sería de comportamientos:

  • Los cuadros de diálogo de Visual Studio 2005 siguen poniendo Sql Mobile 3.0 related
  • Puesto que la instación de Sql Mobile Compact Edition instala en la GAC los componentes necesarios Visual Studio 2005 utiliza estos en tiempo de ejecución ya que la GAC prevalece sobre el directorio de instalación de Visual Studio 2005.
  • En VS2005 con SP1 la interfaz de usuario ya muestra Sql Compact Edition
  • En Sql Server 2005 la interfaz de usuario muestra Sql Mobile 3.0 related
  • En tiempo de ejecución usa Sql Mobile Compact Edition
  • En Sql Server 2005 SP2 los elementos de la interfaz de usuario mostrarán Sql Mobile Compact Edition

Me gustaría destacar además alguna serie de características nuevas que tenemos con Sql Compact Edition:

  • |DataDirectory| para obtener la ruta del ejecutable. Anteriormente siempre usábamos el método GetExecutingAssembly de la clase Assemby para obtener la ruta del ejecutable y poder crear la ruta a la base de datos de una forma sencilla, sin preocuparnos realmente donde se instalaba. Ahora con DataDirectory ya tenemos este trabajo hecho.
  • Compatibilidad con ClickOnce, para obtener el paquete redistribuible de Sql Compact Edition solamente tenemos que dirigirnos al enlace y descargar el archivo SqlEv31ClickOnce_EN.zip, si tienes algún problema con la integración con ClickOnce te recomiendo el siguiente enlace.

Un saludo

Unai Zorrilla Castro

Programancia101 está en el aire

Hace ya tiempo que venimos planeando nuevas aventuras en Geeks, una de ellas es Programancia101 el blog del crack y buen amigo Ricardo Varela, que nos deleitará con retos sobre programación, sin duda, os animo desde aquí a seguir las aventuras de este «Chico Maravilla».

Bienvenido Ricardo, y para los demás estar atentos porque se aproxima un concurso precisamente en Programancia101 donde pondremos vuestra mente a jugar….

 

Saludos

Unai Zorrilla Castro

El servicio de persistencia de Windows Workflow Foundation

Hace ya bastante tiempo que llevo jugando con WF, puesto que lo necesitaba por exigencias de trabajo, incluso con herramientas ya realizadas sobre versiones beta, tengo que decir que es un tema que me encanta ya que me parece chulísimo todo lo que podemos hacer y como está montado el marco de trabajo, de hecho prepararé un fabuloso curso de WF para CampusMVP que seguro que para los que os apuntéis, os animo desde aquí, os gustará. El caso es que voy a tratar de dar una charlita un poco avanzada sobre WF en un evento de Microsoft para MVP dentro de poco y quería hablar de algo que me parece muy importante como es el servicio de persistencia de WF. Revisando notas propias y alguna información me encontré con un post un poco ‘chungo’ afirmando que el servicio de persistencia era un jueguete, el post es este. La verdad es que se pasó un poco haciendo esta afirmación, de hecho no constató sus palabras y este tipo de cosas suelen tener su respuesta, como la de Paul Andrew, del equipo de WF, que no tardó mucho en darle un pequeño tirón de orejas, no se cuanto de pequeño o de grande J y que relata el porqué del servicio de persistencia… sin duda muy interesante leerlo….


Saludos


Unai Zorrilla Castro