April 2012 - Artículos - Jorge Serrano - MVP Visual Developer - Visual Basic

April 2012 - Artículos

Microsoft ha liberado recientemente el documento en versión 0.95 de la Especificación del formato VHDX.

Recordemos que el formato VHDX (Virtual Hard Disk Format) corresponde con la virtualización de discos por parte de Microsoft.

El documento escrito en inglés y en formato Microsoft Word tiene un peso de poco más de 450 Kb y puede ser descargado desde este enlace.

Esta nueva versión es posible que esté apareciendo debido a que Microsoft según algunos rumores, estaría trabajando ultimando su Hyper-V v3.0 así como mejoras en los discos duros virtuales (VHDX) que para la próxima versión de Windows, Windows 8, llegarían a soportar hasta 16 Tb.

El documento que indico en esta entrada tiene que ver con la última revisión del formato, y siendo una revisión muy cercana a la versión 1.0, dudo que su contenido varíe extraordinariamente de la futura y definitiva versión 1.0 del documento.

Espero que le sea útil a alguien en el caso de necesitar abrir, conocer o interpretar los discos duros virtuales de Microsoft.

Publicado por Jorge Serrano | con no comments
Archivado en:

Microsoft ha publicado un documento en formato Microsoft Word de apenas 300 Kb y en inglés, que contiene unas recomendaciones para trabajar de forma inteligente cuando los empleados de una empresa (y usuarios no corporativos) empiezan a utilizar terminales dotados de Windows Phone.

En este documento de apenas 5 páginas, se realizan algunas recomendaciones que debemos seguir.

Entre estas recomendaciones (algunas de ellas realmente básicas), están las de establecer una contraseña de 4 dígitos, la configuración de Microsoft Outlook Mobile para sincronizar el mail, calendario y contactos con Microsoft Exchange, algunas recomendaciones respecto al bloqueo de la pantalla inicial, lo que debemos hacer para localizar un teléfono móvil perdido, lo que debemos hacer para reportar que hemos perdido o nos han robado un terminal, etc.

Podrás acceder a la descarga de este documento en este enlace.

Publicado por Jorge Serrano | con no comments
Archivado en:

Introducción

A la hora de ver ficheros RAW con nuestro sistema operativo Windows, es posible que nos encontremos con que el sistema no es capaz de mostrar correctamente la imagen en pantalla.

Indudablemente hay productos en el mercado (sobre todo los de retoque fotográfico como Adobe Photoshop) que sí nos permite llevar a cabo esta tarea, pero existen otros que no.

Microsoft ha creado este pack de codificación precisamente para que podamos combinarlo con Windows Live Photo Gallery y podamos acceder a los ficheros RAW de nuestras cámaras fotográficas.

 

¿Sólo con Windows Live Photo Gallery?

Realmente este paquete no es sólo para Windows Live Photo Gallery, sino también para los paquetes Software basados en WIC (Windows Imaging Codecs).

Es por eso que resulta interesante instalarlo.

 

¿Qué versiones de Microsoft Camera Codec Pack hay?

Existen dos versiones diferentes de Microsoft Camera Codec Pack, la de 64 bits y la de 32 bits.

Y dentro de estas versiones, soporte para diferentes lenguajes o idiomas.

 

¿Qué formatos RAW soporta?

Esta actualización permite visualizar infinidad de formatos RAW.

A continuación indico una tabla/resumen del soporte:

  • Canon:
    Digital Rebel XT, Digital Rebel XTi, EOS 10D, EOS 20D, EOS 30D, EOS 40D, EOS 50D Digital, EOS 300D, EOS 350D, EOS 400D, EOS 450D, EOS 500D, EOS 550D, EOS 1000D, EOS 5D, EOS 5D Mark II, EOS 7D Digital, EOS D30, EOS D60, EOS Digital Rebel, EOS Kiss Digital, EOS Kiss Digital N, EOS Kiss Digital X, EOS Kiss F, EOS Kiss X2, EOS Kiss X3, EOS Kiss X4, EOS Rebel T1i, EOS Rebel T2i, EOS Rebel XS, EOS Rebel XSi, EOS-1D, EOS-1D Mark II, EOS-1D Mark II N, EOS-1D Mark III, EOS-1D Mark IV, EOS-1Ds, EOS-1Ds Mark II, EOS-1Ds Mark III, PowerShot G2, PowerShot G3, PowerShot G5, PowerShot G6, PowerShot G9, PowerShot G10, PowerShot G11, PowerShot Pro1, PowerShot S90, PowerShot S95, PowerShot SX1 IS
  • Nikon:
    Coolpix P6000, D1H, D2H, D2Hs, D2X, D2Xs, D3, D3s, D3X, D40, D40x, D50, D60, D70, D70s, D80, D90, D100, D200, D300, D300s, D700, D3000, D3100, D5000, D7000
  • Sony:
    DSLR-A100, DSLR-A200, DSLR-A230, DSLR-A300, DSLR-A330, DSLR-A350, DSLR-A380, DSLR-A500, DSLR-A550, DSLR-A560, DSLR-A580, DSLR-A700, DSLR-A850, DSLR-A900, Alpha NEX-3, Alpha NEX-5, Alpha NEX-5N, Alpha SLT-A55/A55V, Cyber-shot DSC-R1
  • Olympus:
    C-7070 Wide Zoom, C-8080 Wide Zoom, E-1, E-3, E-10, E-20, E-30, E-420, E-450, E-520, E-620, EVOLT E-300, EVOLT E-330, EVOLT E-400, EVOLT E-410, EVOLT E-500, EVOLT E-510, PEN E-P1
  • Pentax (PEF formats only):
    *ist D, *ist DL, *ist DS, K10D, K20D, K100D, K100D Super, K110D, K200D, K-7, K-x
  • Leica:
    DIGILUX 3, D-LUX 4, M8, M8.2, M9
  • Konica Minolta:
    ALPHA-7 DIGITAL, DiMAGE A1, DiMAGE A2, DYNAX 7D, Maxxum 7D
  • Epson:
    RD1
  • Panasonic:
    Lumix DMC-G1, Lumix DMC-GH1, Lumix DMC-GF1, Lumix DMC-LX3, Lumix DMC-LX5

Descarga

Accederás a este paquete de codificación en este enlace.

Recuerda que el paquete de codificación es gratuito.

Igualmente, podrás descargar Window Live Photo Gallery de este otro enlace.

Publicado por Jorge Serrano | 2 comment(s)
Archivado en:

Introducción

Como pasa en muchos casos, el otro día me encontraba haciendo pruebecillas e implementando diferentes procesos de validación en Dtos y entidades.

Al finalizar mis pruebas, el resultado de todo es un conjunto de clases que hacía justo lo que quería respecto a las validaciones.

Decoraba mis clases y/o miembros como deseaba, y en base a esa decoración, ejecutaba el proceso de validación que me permitía obtener qué miembros no habían cumplido esa validación y porqué.

Sin embargo, mientras estaba desarrollando todo esto, me venía a la mente que existía “algo” para hacer si no esto mismo, sí algo muy muy similar. No obstante y ya que estaba metido en el fregado, decidí avanzar por aquello de refrescar/aprender cosas. Cuando acabé me puse a pensar más profundamente y caí en la cuenta de algo que llamaba DataAnnotations o similar.

El caso es que DataAnnotations me habría ahorrado mucho tiempo, así que aquí lo pongo para aquellos que se encuentren en una tesitura parecida y no pierdan el tiempo rehaciendo la rueda como hice yo (si bien nunca viene mal para refrescar/aprender cosas).

En esta entrada, voy a comentaros en qué consiste y como utilizar DataAnnotations en vuestros desarrollos de .NET.

 

¿En qué consiste DataAnnotations?

Básicamente, DataAnnotations nos permite llevar a cabo validaciones de datos de acuerdo a nuestras necesidades. Esas necesidades son decoraciones que indicaremos a los miembros de nuestras entidades y Dtos. Una decoración corresponderá a una validación.

 

¿Qué ensamblado es el que entra en juego con las clases de DataAnnotations?

Para "jugar" con DataAnnotations, deberemos agregar un ensamblado a las referencias de nuestro proyecto. Este ensamblado es System.ComponentModel.DataAnnotations.

 

¿Cómo marcamos el tipo de validación de un miembro?

Para marcar el tipo de validación de un miembro, utilizaremos diferentes atributos.

Estos atributos pueden anidarse de manera que un campo pueda tener más de una validación.

Entre estos atributos encontramos los siguientes:

  • Required: perteneciente a System.ComponentModel.DataAnnotations.RequiredAttribute, marca que el miembro debe tener un campo obligatorio. Esta decoración puede ser utilizada junto a ErrorMessage para indicar un mensaje personalizado de error en el caso de que no se cumpla esta validación.
  • Range: perteneciente a System.ComponentModel.DataAnnotations.RangeAttribute, marca un rango de valores entre los que debe estar comprendido el valor pasado al miembro.
  • StringLength: perteneciente a System.ComponentModel.DataAnnotations.StringLengthAttribute, indica un tamaño del campo string. Esta decoración puede ir en conjunción con MinimunLength para indicar incluso un tamaño mínimo del campo string.
  • RegularExpression: perteneciente a System.ComponentModel.DataAnnotations.RegularExpressionAttribute, indica una expresión regulada que debe ser utilizada para validar el miembro.
  • DataType: perteneciente a System.ComponentModel.DataAnnotations.DataTypeAttribute, indica un nombre de un tipo adicional que debe asociarse a un campo de datos.
  • CustomValidation: perteneciente a System.ComponentModel.DataAnnotations.CustomValidationAttribute, nos permite validar a través de validaciones personalizadas.

 

Vamos con un ejemplo

Y como siempre, la mejor forma de ver esto en funcionamiento es practicar con un ejemplo.

Imaginemos la siguiente situación. Debemos crear un objeto Persona que contendrá diferentes miembros:

  • Id: identificador de la entidad. Campo no requerido.
  • Nombre: nombre de la persona. Campo requerido. Campo de 25 caracteres máximo.
  • Apellido: apellido de la persona. Campo requerido. Campo de 50 caracteres máximo.
  • Dni: número del documento nacional de identidad de la persona. Campo requerido. Campo de más de 1 carácter y de hasta 8 caracteres.
  • Teléfono: número telefónico de la persona. Campo no requerido. Campo de 9 a 13 cifras (aunque vamos a omitir la validación en este ejemplo).
  • Mail: correo electrónico de la persona. Campo no requerido. Validable a través de una expresión regulada que verifica la validez de una cuenta de correo electrónico.

De acuerdo a los datos que tenemos, hemos preparado el código de nuestro objeto Persona de la siguiente manera:

   1: using System.ComponentModel.DataAnnotations;
   2:  
   3:  
   4: public sealed class Persona
   5: {
   6:  
   7:     public int Id { get; set; }
   8:  
   9:     [Required]
  10:     [StringLength(25)]
  11:     public string Nombre { get; set; }
  12:  
  13:     [Required(ErrorMessage = "No te olvides del apellido")]
  14:     [StringLength(50)]
  15:     public string Apellido { get; set; }
  16:  
  17:     [Required]
  18:     [StringLength(8, MinimumLength = 1)]
  19:     public string Dni { get; set; }
  20:  
  21:     public long Telefono { get; set; }
  22:  
  23:     [RegularExpres*ion("expression")]
  24:     public string Mail { get; set; }
  25:  
  26: } // Persona

Nota: "expression" dentro de RegularExpression debe ser reemplazada por la expresión regulada correspondiente. Por alguna razón que desconozco, el sitio me está bloqueando la expresión regulada. La indicaré en los comentarios a esta entrada.

 

Una vez hecho esto, bastará con ejecutar una porción de código que se encargará de realizar las siguientes tareas:

  • Crear la entidad Persona.
  • Llevar a cabo el proceso de validación.
  • En el caso de que existan errores de validación, recorrerlos para procesarlos como deseemos.

El código de ejecución y demostración del funcionamiento de la validación con DataAnnotations quedaría de la siguiente manera:

   1: // Creamos un objeto Persona y le agregamos valores
   2: Persona persona = new Persona();
   3: persona.Nombre = "José";
   4: //persona.Apellido = "López";
   5: persona.Dni = "1112233";
   6: persona.Mail = "joselopez@dominio.com";            
   7: // Proceso de validación.
   8: ValidationContext validationContext = new ValidationContext(persona, null, null);
   9: List<ValidationResult> errors = new List<ValidationResult>();
  10: Validator.TryValidateObject(persona, validationContext, errors, true);
  11: // Si hay errores, los recorremos y los mostramos (versión demo).            
  12: if (errors.Count() > 0)
  13: {
  14:     string errorMessages = string.Empty;
  15:     foreach (var error in errors)
  16:     {
  17:         errorMessages += error.ErrorMessage + Environment.NewLine;
  18:     }
  19:     MessageBox.Show(errorMessages);
  20: }
  21: else
  22: {
  23:     MessageBox.Show("Entidad correcta");
  24: }

En este ejemplo, he querido dejar comentado intencionadamente la asignación de Apellido.

De esta manera, la validación devolverá un mensaje por pantalla parecido a este:

El mensaje corresponde con la validación del campo Apellido y cuyo mensaje en el caso de no pasar la validación, hemos querido personalizar con el texto “No te olvides del apellido”.

Evidentemente, en las otras validaciones tendríamos resultados parecidos.

De hecho, si por ejemplo quitara del correo electrónico el carácter @ tendría el siguiente resultado:

Como podemos observar, las validaciones se producen con muy poco esfuerzo.

 

Extensibilidad a la hora de hacer nuestras propias validaciones

Si quisiéramos extender las validaciones que ofrece .NET y que recoge casi todas las casuísticas, no tendríamos problemas.

Bastaría con crear nuestros propios atributos y heredar de ValidationAtttribute.

 

Como podemos ver, trabajar con DataAnnotations en nuestros desarrollos, puede resultarnos de utilidad y ahorrarnos mucho trabajo, además de aportarnos flexibilidad a la hora de desarrollar nuestras propias validaciones personalizadas.

Información

Microsoft ha publicado la versión 5.0.1 de esta extensión para Microsoft Enterprise Library 5.0 que puede ser utilizada con Windows Azure.

Entre otras características, este paquete incluye el Autoscaling Application Block (Wasabi), el Transient Fault Handling Application Block (Topaz), un proveedor de configuración y un configurador de archivos Blob.

Enlaces

Podrás acceder a la Web de descarga en este enlace.

Para más información sobre Microsoft Enterprise Library 5.0 Integration Pack para Windows Azure, haz clic en este enlace.

Blog con información adicional en este enlace.

Introducción

Si hace unas horas conocíamos que SkyDrive se renovaba y permitía usar entre 7 Gb y 25 Gb de datos en la nube sincronizándolos con nuestro PC, hoy conocemos que Google ha sacado a la luz su sistema de datos en la nube, Google Drive.

¿En qué consiste Google Drive?

Al igual que en el caso de Microsoft SkyDrive, Google ha decidido crear diferentes planes de almacenamiento en la nube con sincronización en Google Docs.

Por defecto, un usuario con cuenta GMail tendrá 5 Gb de almacenamiento gratuito.

Adicionalmente, Google indica que la cuenta de GMail ha pasado de 7 Gb a 10 Gb, y el de Picasa posee un tamaño de 1 Gb (al menos en mi caso).

10 Gb de GMail.
5 Gb de Drive (almacenamiento en la nube).
1 Gb de Picasa.

Actualizaciones

Pasar a tener 25 Gb Drive y Picasa viene a costar unos 2.49$ al mes. Como bonificación, la cuenta de correo GMail pasará a tener 25 Gb de espacio.

Si lo que queremos es tener 100 Gb Drive y Picasa, entonces deberemos pagar 4.99 $ al mes, pasando nuestra cuenta de GMail a 25 Gb.

Y así van subiendo las cuotas.

Aquí os dejo una tabla resumen de estos baremos extraídos de la Web de Google.

Suponiendo que los datos de la tabla anterior sean correctos, vemos alguna diferencia con respecto a otros servicios como Dropbox, Microsoft SkyDrive o iCloud de Apple.

Nota: comento lo de que los datos de la tabla sean correctos ya que en la Web de explicación de los servicios, Google no deja claro del todo si GMail posee 10 Gb ó 7 Gb, ya que comenta las dos cosas al hablar de lo mismo. Quiero pensar que es una errata y pasa de 7 Gb a 10 Gb.

Lo que está claro es que la guerra de servicios de almacenamiento en la nube está siendo bastante frenética, lo que posibilita que se ofrezcan mejores servicios y precios a los usuarios que somos al fin y al cabo los que saldremos beneficiados de esta situación.

Cómo trabajar con Google Drive

Lo primero de todo es poner en funcionamiento Google Drive.

Para ello, bastará con pulsar el botón de activación en Google Drive.

No obstante, a la hora de escribir esta entrada, el servicio ha dejado de funcionar tal y como era de esperar. Según se indica en algunos sitios en Internet, los fallos de activación de las cuentas y la demanda de activaciones ha hecho que Google active las cuentas progresivamente.

Es por eso, que tendremos que fijarnos en el botón que aparece en la parte superior de nuestra página Web. Este botón puede indicar "Empieza con 5 GB gratis" o bien, "Notificarme".

Si aparece el segundo botón, deberemos pulsarlo para pasar a una lista de espera en la que Google nos avisará cuando el servicio esté preparado para ser activado. En caso contrario, estaremos de suerte.

Sincronización

Google Drive podrá sincronizar documentos y archivos desde Windows, Mac OS y Android, si bien, es posible que en breve se pueda sincronizar también para iOS, aunque de momento habrá que esperar, algo en lo que otras empresas como Microsoft sí le llevan a Google la delantera.

En Android, podemos localizar la aplicación Google Drive.

Para Windows no he podido localizar aún esta aplicación. Quiero pensar que cuando active el almacenamiento en la nube tendré posibilidad de instalar la aplicación que me permitirá sincronizar los datos en la nube.

Referencias

Para acceder a Google Drive, deberemos hacer clic en el siguiente enlace (recuerda tener una cuenta de GMail).

Publicado por Jorge Serrano | 2 comment(s)

Introducción

Quizás no os pase nunca, pero a mí me ha ocurrido y por si os pasa lo mismo y os entra el momento histeria... que quede por aquí escrito por si le sirve a alguien.

Escuchando música MP3 en mi Nokia Lumia 800 mientras trabajaba, de repente el terminal se ha quedado congelado. La pantalla bloqueada con la fecha en la que se quedó frito y sin responder a ninguna de las teclas.

Momento histeria On. ¿Qué hacer?.

Haciendo un Hard Reset (no recomendado inicialmente)

Lo primero en lo que he pensado es en que a lo mejor no quedaba otra que hacer un Hard Reset de mi terminal.

Siempre que he hecho un Hard Reset lo he hecho desde el menú del terminal, pero nunca a través de las teclas.

En teoría existe un método para hacer el Hard Reset a través de una combinación de teclas, pero eso borraría toda la configuración, datos, etc., del terminal, así que si puedo evitarlo mejor.

No obstante y si por necesitas hacer un Hard Reset, lo que debes hacer es lo siguiente (no probado, y si lo pruebas, que sepas que te deja el terminal con los datos de fábrica perdiendo todos los datos guardados en el terminal):

- Presionamos al mismo tiempo el botón de reducir volumen de audio, el botón de la cámara y el botón de encendido/apagado.
- Esperamos a que vibre el terminal, y en ese momento quitamos el dedo del botón de encendido/apagado dejando el resto de dedos pulsados durante unos 10 segundos y finalmente los quitamos.
- El terminal se deberá reiniciar solo.

Reiniciando sin Hard Reset

Ahora bien, hacer el Hard Reset hace que el terminal aparezca vacío, con todos los datos, imágenes, música, configuraciones, etc borrados.

Si no queremos que esto ocurra pero queremos únicamente reiniciar el terminal, bastará con dejar el dedo pulsado en el botón de encendido/apagado durante unos 10 segundos.

El terminal vibrará y se reiniciará sin que perdamos nada.


Si os pasa algo parecido, ya sabéis como actuar.

Publicado por Jorge Serrano | 7 comment(s)
Archivado en:

Introducción

Levantarse por la mañana y saber que tu cuenta de SkyDrive ha pasado de 25 Gb a 7 Gb no es del gusto de nadie.

Sin embargo, saber que Microsoft ha establecido cambios para que una cuenta que antes tenía 25 Gb y que ahora pasará a 7 Gb no pierda esos 18 Gb de más permitiéndonos recuperarlos, es un alivio.

Tampoco es menos el comprobar que una cuenta que tiene 7 Gb, puede pasar a 25 Gb sin que perdamos dinero... dicho de otro modo, un usuario nuevo que se cree una cuenta sólo podrá tener 7 Gb, y si quiere más, tendrá que pagar.

Actualizando nuestra cuenta de SkyDrive para usar 25 Gb

Siempre y cuando la cuenta de passport con uso de SkyDrive ya estuviera activa con anterioridad, la actualización para usar los 25 Gb que inicialmente teníamos es gratuita y siempre y cuando no se nos pase el tiempo de actualización.

Bastará con acceder a https://skydrive.live.com/ y a través de esta dirección, acceder con nuestra cuenta passport.

Una vez dentro, en la parte superior debería aparecer un hipervínculo que nos invita a hacer clic en él para actualizar nuestra cuenta que ahora tiene 7 Gb, a 25 Gb de forma grauita.

Los nuevos costes de SkyDrive

A modo resumen, los nuevos costes de SkyDrive para Europa son los siguientes:

Para una cuenta creada nueva:

  • SkyDrive gratuito hasta 7 Gb de almacenamiento.
  • SkyDrive + 20 hasta 27 Gb de almacenamiento a 8 €/año.
  • SkyDrive + 50 hasta 57 Gb de almacenamiento a 19 €/año.
  • SkyDrive + 100 hasta 107 Gb de almacenamiento a 37 €/año.

Para una cuenta creada anteriormente y actualizada a 25 Gb:

  • SkyDrive gratuito hasta 25 Gb de almacenamiento.
  • SkyDrive + 20 hasta 45 Gb de almacenamiento a 8 €/año.
  • SkyDrive + 50 hasta 75 Gb de almacenamiento a 19 €/año.
  • SkyDrive + 100 hasta 125 Gb de almacenamiento a 37 €/año.

¿Cómo sincronizar datos entre nuestro PC y SkyDrive?

Microsoft ha hecho pública una herramienta que nos permitirá sincronizar los datos de nuestro ordenador con la nube (SkyDrive).

Esta herramienta podrá ser descargada e instalada en este enlace.

Si has trabajado por ejemplo con Dropbox, te resultará especialmente familiar la nueva forma de trabajar con SkyDrive. De hecho, es la forma normal y natural de trabajo con el escritorio de trabajo, arrastrando y soltando archivos, creando carpetas, etc, con la productividad de un PC.

El único “pero” que algunos ya han comentado en las redes sociales es el hecho de que no podemos hacer clic con el botón derecho del ratón sobre un archivo y obtener la ruta de acceso tal y como ocurre con Dropbox por ejemplo. Es decir, a SkyDrive aún le faltan algunos detalles pero es desde luego un gran paso comparándolo con como debíamos trabajar con SkyDrive antes.

¿Google?, ¿Dropbox?, ¿iCloud?

Microsoft ha dado un importante paso hacia adelante, no sólo igualando las prestaciones de sus competidores, sino incluso mejorando estas.

Si eres de los que les gusta comparar un producto con otro, te invito a visitar el siguiente enlace con la información comparativa entre estos cuatro productos. Podrás acceder a esta información en este enlace.

 

En resumen, los nuevos cambios de SkyDrive son cambios muy notables que beneficiarán a los usuarios. En mi caso he sincronizado a modo de prueba unos 5 Gb de información y no he tenido ningún problema. Te invito y recomiendo a que lo uses.

 

Referencias

Página Web oficial de SkyDrive

Publicado por Jorge Serrano | 3 comment(s)
Archivado en:

Introducción

En la entrada anterior, vimos en qué consistía el Patrón Interfaz Marcadora y cómo usarlo a través de interfaces.

En esta entrada vamos a ver cómo implementar el Patrón Interfaz Marcadora a través de atributos.

 

Implementación del Patrón Interfaz Marcadora con atributos

Lo primero que debemos hacer es crear una clase que actúe como atributo con el cuál decorar una clase con el fin de hacerla del tipo que deseemos.

Por ejemplo:

   1: public class MarcadoraAttribute : System.Attribute
   2: {
   3: } // MarcadoraAttribute

Una vez creado este atributo, crearemos la clase que decoraremos con el atributo que hemos creado para hacerla del tipo que queremos.

   1: [Marcadora]
   2: public class Foo
   3: {
   4: } // Foo

Finalmente tendremos la posibilidad de verificar que una determinada clase, está marcada con el atributo que indica que es de un tipo concreto.

En nuestro caso y para el ejemplo que hemos preparado, quedará de la siguiente manera:

   1: Foo foo = new Foo();
   2: if (foo.GetType().IsDefined(typeof(MarcadoraAttribute), false))
   3: {
   4:     MessageBox.Show("Es marcadora");
   5: }
   6: else
   7: {
   8:     MessageBox.Show("No es marcadora");
   9: }

Espero que esto le sirva a más de uno para conocer cómo funciona y como utilizar este patrón.

Publicado por Jorge Serrano | 4 comment(s)
Archivado en: ,

Segunda parte de esta entrada: Patrón Interfaz Marcadora (II)

 

Introducción

Uno de los patrones más desconocidos en general y no por ello infrautilizado, es el Patrón de Interfaz Marcadora o Marker Interface Pattern.

En .NET tenemos dos formas de implementar este patrón. En esta primera entrada sobre este patrón veremos una de estas formas.

 

¿Qué es el Patrón Interfaz Marcadora?

Lo primero de todo es entender bien qué es o en qué consiste el Patrón Interfaz Marcadora.

Se trata de un patrón de diseño que puede ser utilizado para proporcionar información marcadora sobre un objeto concreto.

El objetivo de este patrón es el de indicar el comportamiento de la clase que la implementa.

Sin embargo, debe quedar claro para evitar dudas, que una interfaz marcadora es aquella que carece de miembros, es decir, que sirve para marcar. Además de esto, al carecer de miembros, no define ningún contrato que pueda ser implementado.

 

Clases y subclases

Hablando de herencia, debemos tener claro un aspecto que seguramente dominaremos todos a estas alturas. Si tenemos una clase que implementa una interfaz marcadora y una subclase que hereda de esa clase, ésta también arrastrará consigo esa interfaz marcadora. Es algo obvio, pero debemos tenerlo en cuenta.

 

¿Cómo funciona?

Comprenderemos mejor el funcionamiento de este patrón con un ejemplo en código C#.

Para ello, crearemos inicialmente una interfaz vacía como por ejemplo:

   1: public interface IMarcadoraFoo
   2: {
   3: } // IMarcadoraFoo

Luego, tendremos una clase que implementará esta interfaz marcadora, como por ejemplo la clase Foo:

   1: public class Foo : IMarcadoraFoo
   2: {
   3: } // Foo

Si dispongo de un método o función que interactúe de alguna manera con una clase Foo, podré preguntarle si implementa esta interfaz marcadora.

Un ejemplo sencillo de como preguntar si una clase implementa la interfaz marcadora es hacerlo de la siguiente manera:

   1: Foo foo = new Foo();
   2: if (foo is IMarcadoraFoo)
   3: {
   4:     MessageBox.Show("Es marcadora");
   5: }
   6: else
   7: {
   8:     MessageBox.Show("No es marcadora");
   9: }

Como podemos apreciar en el código anterior, hemos verificado que la clase Foo con la que queremos trabajar es una clase que implementa la interfaz marcadora IMarcadoraFoo.

No obstante, existe otra forma más recomendable en .NET de implementar al Patrón Interfaz Marcadora, y es hacerlo con atributos. Esto lo veremos en la próxima entrega.

 

Referencias

Marker Interface Pattern (Wikipedia)

 

Segunda parte de esta entrada: Patrón Interfaz Marcadora (II)

 

Publicado por Jorge Serrano | 7 comment(s)
Archivado en: ,

Introducción

Cuando adquirí mi Windows Phone, una de las primeras cosas que hice fue bloquear la pantalla de inicio con contraseña. Una manía que he adquirido con el paso de los años y que he seguido haciendo con todos los terminales móviles que he tenido.

No obstante, un día me pregunté qué pasaría si teniendo la pantalla de inicio bloqueada, me dejara el móvil o si tuviera un accidente o percance.

Con esa idea desarrollé una aplicación que denominé AA (Avisa A), pero el inconveniente de esta aplicación es que me impide poner los datos principales de contacto, personales o que yo desee en la pantalla de inicio.

En la Web de peticiones para Windows Phone 7 encontré posteriormente una iniciativa que solicitaba a Microsoft que agregaran la posibilidad de agregar en la pantalla de inicio aquellos datos que consideramos de relevancia o importancia cuando bloqueamos la pantalla de inicio de nuestros Windows Phone. Lógicamente y siendo coherente con lo que pensaba apoyé la idea.

Más adelante sin embargo, me encontré con una Web en la que AJ Troxell mostraba una pantalla de inicio personalizada para Windows Phone en el caso de que bloqueáramos la pantalla. ¡Genial!... fácil y sencillo sino hay otra opción de momento.

Lock Screen de AJ Troxell

AJ Troxell explica más o menos como ha hecho esta pantalla y ha agregado incluso algunas plantillas al respecto. Podéis encontrar esta información en este enlace.

La idea está resumida en esta captura de pantalla:

Lock Screen de Jorge Serrano

Y con esta misma idea, me creé una pantalla de bloqueo para mi Windows Phone, similar a la idea inicial de AJ Troxell pero con particularidades que considero de importancia y que en la plantilla de AJ Troxell no se incluían.

Algunos MVPs y otras personas han visto ya esta pantalla y además de que “lógicamente” les recuerde a la plantilla de AJ Troxell, me han preguntado si iba a publicar las plantillas que he utilizado, y aunque en un principio no lo pensaba hacer por la similitud de la idea de AJ Troxell, he creído oportuno hacerlo, y como lo prometido es deuda, aquí van a ir.

Lo primero de todo y antes de nada, explicar porqué he creado mis plantillas.

En la pantalla de bloqueo de AJ Troxell, éste ha agregado su nombre en grande, su foto, su correo electrónico, su Web, su cuenta de facebook, de Twitter y su teléfono.

Mi idea es similar pero dándole una vuelta a esto. Mi nombre me gusta que aparezca pero no destacado, la importancia que busco si alguien encuentra mi móvil es la de facilitarle la vida localizando a su propietario y en en caso de emergencia, los datos más relevantes, así que el nombre es importante pero más aún otra información.

En mi caso por lo tanto, esta pantalla de bloqueo debe tener para mí datos que considero importantes por si tuviera algún problema, ya sea porque he perdido mi teléfono o porque he tenido un percance. Con esta filosofía, yo he querido hacer esta pantalla algo más simple y limpia y he querido poner mi nombre, mi correo electrónico, mi cuenta de Twitter, mi teléfono, mi grupo sanguíneo, mis posibles alergias y a quien avisar en caso de emergencia.

Hay que tener en cuenta, que si pierdo mi teléfono y está bloqueado, la mejor manera de permitir que alguien me lo devuelva es o bien llamar a mi número de teléfono desde otro teléfono y tener la suerte de que alguien coja la llamada, o bien indicar un teléfono de contacto para que llamen a ese número. Y lo mismo ocurre si tengo un percance.

Las plantillas que he preparado para este propósito son las siguientes:

Las plantillas

Obviamente, muchos de los datos utilizados en la imagen anterior son falsos.

Que cada uno se decargue la plantilla y la modifique como considere oportuno.

La plantilla que pongo a vuestro alcance tiene 12 aspectos diferentes.

Crear el vuestro propio no es tampoco costoso, así como un fondo tipo paisaje o lo que consideréis oportuno.

El fichero de descarga tiene un tamaño de 2.4 Mb y dentro de él, encontraréis la plantilla en formato psd (Adobe Photoshop) y con un tamaño de casi 8.5 Mb.

Podréis acceder a la plantilla en este enlace.

Ahora bien, sino tenéis Adobe Photoshop, podréis utilizar un plugin para Paint .NET que permite abrir ficheros en formato psd.

Paint .NET es gratuito como sabréis todos y podréis acceder a él en este enlace.

El plugin para abrir ficheros psd con Paint .NET lo podréis encontrar en este otro enlace.

¡Que lo disfrutéis!

Publicado por Jorge Serrano | con no comments
Archivado en:

Me gustaría aprovechar mi blog para "promocionar" algunas de las aplicaciones que para Windows Phone he publicado recientemente y que espero le sea de utilidad a alguien (con ese propósito se hacen digo yo).

El hecho de escribir esta entrada es principalmente para dar a conocer estas aplicaciones, sin embargo, en realidad me he animado a ello después de encontrarme con un comentario positivo acerca de una de mis aplicaciones de una persona que conozco, a la que después de enviarle un correo electrónico dándole mis agradecimientos me ha indicado que no tenía ni idea que yo había sido el autor de esa aplicación... así que en ese momento es cuando me he puesto a pensar que seguramente lo que pase aquí es que no estoy promocionando adecuadamente mis aplicaciones (que por cierto, son gratuitas).

De mis 20 aplicaciones para Windows Phone publicadas hasta la fecha en el Marketplace de Microsoft, me gustaría destacar 6 de ellas, no por ser o representar algo especial o ser extraordinarias en cuanto a su diseño, funcionalidad, etc, sino por la cantidad de descargas que han tenido hasta la fecha (hay alguna aplicación más sobre la que le he puesto una gran cariño y trabajo y tienen unas cifras de descargas de reirse).

Quiero pensar que esa cantidad de descargas debe deberse a algo positivo (espero). No obstante, siguen siendo muy pocas descargas comparado con otras aplicaciones del Marketplace, pero puesto que sólo dedico un pequeño espacio de tiempo libre a escribir estas aplicaciones, no considero esta modesta cantidad despreciable.

 

Mi pequeño ranking de aplicaciones publicadas es el siguiente:


Pictionary Draw, con 3566 descargas.
Lo utilizo únicamente para ahorrarme pintar en hojas de papel permitiendo ser un poco más "verdes" y evitar que se talen tanto árboles.
Entre las críticas recibidas, se me pide hacer de él un auténtico Pictionary.
Le estoy dando alguna vuelta al tema, pero creo que me pego de lleno con temas legales, aunque ya estoy analizando la posibilidad de evitar estos problemas.

 


Chiquitron Sound, con 3099 descargas.
Se me ocurrió hacer esta aplicación partiendo de la base de que allá por el 2003 aproximadamente, me creé una aplicación en Visual Basic 6 que hacía prácticamente esto mismo y que utilizaba en las reuniones de trabajo (siempre y cuando fuera adecuado).
Con el mismo propósito, pensé llevar esto en el bolsillo para echarse unas risas.
Pensé que iba a ser la aplicación menos descargada y me equivoqué...

 


Plano Metro Madrid, con 1697 descargas.
Cuando adquirí mi primer Windows Phone, una de las primeras aplicaciones que me descargué fue el Plano de Metro de Madrid que programó José Ángel Fernández.
Cuando pasado el tiempo reseteé mi terminal, fuí a por la misma aplicación pero ya no existía.
Pasé un tiempo sin ella pero la echaba en falta, así que me puse en contacto con José Ángel y me enteré que decidió eliminarla del Marketplace, por lo que le pedí que la publicara nuevamente, pero me indicó que no encontraba el código de la misma, así que me puse a hacer mi versión de lo que consideraba que debía ser una aplicación de este tipo.
En breve preveo hacer lo propio con otras ciudades.

 


Night Exposure, con 1050 descargas.
Como amante y aficionado a la fotografía, decidí migrar esta aplicación que hice en su día para Windows y Windows SmartPhone a Windows Phone.
Muchas veces, cuando queremos fotografíar con bajas condiciones de luz o con filtros de densidad neutra, se echa en falta el tener algún mecanismo de contabilización que nos ayude a ajustar los parámetros de nuestra cámara fotográfica de manera rápida y exacta.
Esta herramienta permite facilitarnos esta tarea.

 


A cuanto toca, con 560 descargas.
Pequeña utilidad para calcular el dinero (con o sin propina) que debemos pagar cuando salimos a tomar algo en grupo.
Existe por supuesto la calculadora de toda la vida, pero esta herramienta realiza los cálculos de forma mucho más rápida y flexible.

 


Dilbert Today!, con 514 descargas.
Creo que el nombre lo dice todo.
Nos permite ver la viñeta del día de Dilbert e incluso guardarla en nuestra biblioteca de imágenes de Windows Phone por si quisiéramos reenviarla, o lo que deseáramos hacer.

 

Espero haber dado a conocer a alguien alguna de estas aplicaciones, y que ante todo le sea de utilidad a alguien.

Saludos.

Publicado por Jorge Serrano | 5 comment(s)
Archivado en:

Introducción

Cuando desarrollamos una aplicación de Windows Phone 7 normalmente utilizaremos las fuentes de letra habituales instaladas en nuestro sistema y que serán utilizadas por Windows Phone en tiempo de ejecución.

Si Windows Phone no tiene o no encuentra esa fuente de letra, utilizará la Segoe WP, pero imaginémonos que queremos utilizar una fuente de letra personalizar en nuestra aplicación, ¿cómo podemos hacerlo?.

Iniciando el proyecto

Lo primero de todo es contar con una fuente de letra.

En mi caso he elegido una fuente de letra de nombre "SketchFlow Print" (modo demo).

Preparando el proyecto en Visual Studio 2010

Lógicamente, lo primero que tenemos que hacer una vez tengamos la fuente de letra que queremos utilizar, es crear nuestro proyecto en Visual Studio 2010.

Una vez hecho esto y en mi caso, he cambiado el modo de depuración a Windows Phone Device.

Al ejecutar nuestra aplicación, ésta se mostrará por defecto de la siguiente manera en nuestro Windows Phone 7:

Agregando una fuente de letra personalizada al proyecto

Como podemos ver en la imagen anterior, la fuente de letra es la que Windows Phone utiliza por defecto.

Ahora bien, para agregar una fuente de letra personalizada, vamos a crear un directorio denominado Fonts y vamos a agregar dentro la fuente de letra (con extensión ttf) en este directorio.

Una vez hecho esto, seleccionaremos la fuente de letra y modificaremos en la ventana de propiedades la propiedad Acción de compilación para ponerla como Contenido.

Lo último que tenemos por delante es indicar al control de usuario que queramos la fuente de letra a utilizar.

Por ejemplo, para el título de la aplicación y en su control TextBlock:

   1: <TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0" 
   2: FontFamily="Fonts/SketchFlow Print.ttf#SketchFlow Print" FontSize="60" />

Aquí lo importante es observar la propiedad FontFamily.

Aquí indico la ruta en la que se encuentra nuestra fuente personalizada (Fonts), el fichero de nuestra fuente de letra (SketchFlow Print.tff), y el nombre de la fuente de letra (SketchFlow Print) y que podemos ver fácilmente en la primera captura de pantalla, que se consigue en Windows haciendo doble clic sobre la fuente de letra.

Probando el proyecto

Finalmente, nuestra aplicación tendrá ahora un aspecto similar al siguiente:

Utilizando la fuente de letra en toda la aplicación

Ahora bien, este truco sirve para utilizar una fuente de letra personalizada con un control de usuario concreto, pero imaginemos que queremos utilizar la fuente de letra a lo largo de todo el proyecto o aplicación.

¿Cómo resolver esto de forma fácil para que no tengamos que indicar siempre el nombre de la fuente de letra y su nombre?.

Imaginemos incluso los beneficios/perjuicios a la hora de mantener nuestra aplicación y la cantidad de modificaciones que tendríamos que hacer (aunque en este caso lo resolvamos fácilmente con un reemplazar).

Para resolver este dilema, lo que podemos hacer es abrir el archivo App.xaml.

Dentro de este archivo, nos situaremos en la sección Application.Resources.

Aquí indicaremos la fuente de letra a utilizar tal y como se indica a continuación:

   1: <Application.Resources>
   2:     <FontFamily x:Key="SketchFlowPrintFont">Fonts/SketchFlow Print.ttf#SketchFlow Print</FontFamily>
   3: </Application.Resources>

A continuación, nos iremos al código de nuestra aplicación y modificaremos la propiedad FontFamily del control de usuario de esta forma:

   1: <TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0" 
   2: FontFamily="{StaticResource SketchFlowPrintFont}" FontSize="60" />

Como podemos apreciar, lo único que hemos hecho aquí es simplificar el uso de la fuente de letra acudiendo a los recursos de la aplicación.

 

Espero que te resulte útil.

Leo un artículo de título "Los CIO consideran mal formada a la nueva generación de ingenieros informáticos" en Computer World que me ha hecho pegar un pequeño salto en mi silla.

La rápida respuesta de quien quiere sobrevivir en un mundo tecnológico como el actual, es pensar que uno mismo no se considera mal formado, y que el hecho de que haya gente mal formada en el mercado, lejos de perjudicarle en realidad le beneficia (punto de vista egoísta).

Sin embargo, no es esperanzador, pensar que los CIO de las empresas (según expresa Computer World), piensan en un 90%, que los recién licenciados no tienen unos conocimientos suficientes dentro del ámbito de la gestión.

Según el mismo artículo, las carencias que hacen pensar a los CIO de esta forma, están centradas en el dominio de herramientas informáticas básicas (programación, gestión de ERP, gestión de entornos de productividad y herramientas de BI). Además de esto, los CIO reconocen que están necesitados de que los candidatos perfeccionen el dominio a otros idiomas.

El final del artículo, culmina con una conclusión que más me suena a excusa barata que a otra cosa: "... estas carencias explican que las empresas prefieran a personal con experiencia en lugar de contratar a candidatos recién titulados. Las exigencias de las empresas hacen que los procesos de contratación prime la productividad antes que la formación que se pueda realizar sobre un empleado.".

Voy por partes...

En primer lugar, empezaré por la exigencia de que los candidatos conozcan principalmente el inglés.
Teniendo en cuenta que los últimos Presidentes del Gobierno de España no sabían inglés o francés y que siempre han necesitado un traductor a su lado, ¿cómo exigir que los recién licenciados sepan más inglés que el Presidente del Gobierno?.
Estoy de acuerdo con que todos (me incluyo) debemos dominar la lengua de Shakespeare, pero exigir el dominio de un idioma a un recién titulado, me hace pensar que los CIO lo que están pensando realmente es en pagar poco por un candidato recién titulado y que además sepa inglés... es decir, que el candidato tenga más de lo que pienso pagar por él.

En segundo lugar, voy a comentar aspectos relativos a las carencias técnicas que denuncian el 90% de los CIO que hay en el mercado.
Además de que el estudio se centra en la rama de gestión únicamente, aquí podemos decir eso de "la pescadilla que se muerde la cola".
¿Hay algún CIO que crea realmente que un recién titulado sale dominando un paquete de gestión de ERP, un entorno de productividad, una herramienta de BI o simplemente sabe realmente programar?.
Porque si hay algún CIO que piensa así y está leyendo esto, le diré con mucho cariño que se baje del guindo.
Al igual que ningún recién titulado puede ser CIO en una empresa, ningún recién titulado puede tener de salida todos esos conocimientos, más que nada porque es necesario tener algo que un recién titulado no tiene... EXPERIENCIA.

Pero además de la EXPERIENCIA, también hay otro aspecto muy importante a tener en cuenta... RECURSOS (y no confundamos recursos con personas, algo que odio mentar cuando se habla de recursos).

¿Tiene acaso un recién titulado la posibilidad de probar, trastear, tocar, etc un entorno real o virtual ERP, de gestión de productividad, de herramientas BI o de programación?. En el 99% NO.
Pero es que aunque lo tuviera, ¿hay gente cerca que le diga a ese recién titulado que está haciendo las cosas mal?. En el 99% de ese 1% restante, NO.

¿Qué significa esto entonces?.
QUE LA FORMACIÓN ES IMPORTANTE.

Bien, pero la formación, ¿se hace en la empresa o en casa?.

Y es aquí donde tocamos otro aspecto sensible que las empersas obvian y que los CIO aquí omiten, en mi opinión, interesadamente.

El empleado, no sólo los recién titulados, también los de mayor rango dentro del organigrama empresarial, NECESITAN SER FORMADOS CONTINUAMENTE.

Y es que la autoformación está muy bien porque a la empresa le hace olvidarse de esas necesidades, y los gastos corren a cargo de los empleados que utilizan su tiempo libre en adquirir conocimientos que luego aplicará a su trabajo tarde o temprano, por lo que la empresa cubre unas necesidades resueltas por el empleado de forma altruísta.

Sin embargo, yo del artículo que he leído en Computer World saco una conclusión bastante triste, y es que los CIO que han rellenado esa encuesta y forman parte de ese 90%, piensan como excusa de la no contratación a jóvenes recién titulados, que la pelota  está en el tejado de los informáticos de nueva generación, cuando en realidad, ellos deben pensar que realmente NADIE HA NACIDO APRENDIDO, y que PEDIR PERAS AL OLMO es una utopía.

¿Alguien cree realmente que los recién titulados sale con los mismos o mayores conocimientos que un informático con no sé cuantos años de experiencia?.

Que se hagan la pregunta a la inversa y piensen si una persona recién titulada de Empresariales por ejemplo podría ser CIO de una empresa. ¿A qué no?. Pues exactamente lo mismo aquí pero para los informáticos. ;)

Enlaces

Artículo de Computer World

La misma noticia en ITCIO.es

Publicado por Jorge Serrano | 3 comment(s)
Archivado en:

Ayer tuve un día fantástico, no lo voy a negar.

Celebré mi cumpleaños en familia y para colmo, Microsoft me comunicó la renovación como MVP en VB un año más.

Si considero difícil la renovación como MVP, más aún en estos momentos de crisis y problemas varios que todos de forma directa o indirecta estamos sufriendo.
A eso, hay que unirle la fabulosa presencia de cada vez mejores profesionales en el campo, que hacen que la renovación sea cada año que pasa, más difícil.
Lo bueno de esa fantástica competencia es que le hace a uno seguir apretando para no perder comba con la tecnología.

Esa competencia que a algunos les preocupa, a otros nos encanta porque lo único a lo que nos invita es a tratar de ser todos cada vez mejores en nuestros campos.

Así que reconozco que 11 años seguidos como MVP son muchos años, y aunque uno se acostumbra gratamente a ello, no sería completamente sincero con vosotros si dijera que esto seguirá siendo siempre así. Sé que algún día esto parará, así que como dice la frase, un año más... Carpe Diem. :)

Para este año, y después de algún que otro sobresalto lógico de la situación en la que vivimos, espero poder dar más y mejor de mí mismo. Con eso me conformo ampliamente.

Muchas gracias a todos los que me habéis felicitado por teléfono, mensajes, etc. ¡Os lo agradezco mucho!. :)

¡Seguimos en la brecha!

P.D.: Un recuerdo especial a los que no han podido ser nominados como MVPs, ya sea porque no han sido renovados, o porque pensaban que les iban a nominar pero no les han nominado… a todos ellos… NO DESESPERÉIS, PORQUE ¡EL QUE SIEMBRA SIEMPRE RECOGE!. ;)

Publicado por Jorge Serrano | 4 comment(s)
Archivado en: