[Evento Online] La importancia de la accesibilidad en el desarrollo

Show-02-WFIntroducción

La accesibilidad es un factor de vital importancia que por suerte, es tenida en cuenta cada vez con mayor frecuencia y peso en desarrollos web, móviles, etc.

La importancia de la accesibilidad
La importancia de la accesibilidad

Hemos tratado en ocasiones aspectos relacionados con el desarrollo en eventos como por ejemplo, la sintetización de textos en voz, comandos de voz o el uso de Cortana pero…y las herramientas de desarrollo, ¿cómo programa una persona ciega?, ¿cómo diseña una interfaz?, ¿hay vida después del ratón?.

El evento

En esta ocasión, me acompañaran en un Hangout Josué Yeray y Santiago Porras, y podremos disfutar de la compañia de Juanjo Montiel.

Juanjo es un apasionado de la tecnología y de la música. Es desarrollador de software y consultor de accesibilidad en una empresa de Barcelona, conjuga su trabajo con el desarrollo como hobbie de herramientas accesibles para mejorar el día a día de las personas con discapacidad. Ciego de nacimiento, considera que su discapacidad es un reto a superar. Le encantan los retos, y afirma que su ceguera, a pesar de ser un problema, también le ha hecho mejor, al tener que espabilarse y buscar los trucos necesarios para trabajar en igualdad de condiciones con el resto de sus compañeros.

En este evento de CartujaDotNet analizaremos de primera mano, las herramientas, trucos y necesidades relacionadas con la accesibilidad en el desarrollo.

El evento será el próximo Jueves, 28 de Julio.

  • 19:00 en España
  • 13:00 en Colombia
  • 12:00 en México Centro
  • 13:30 en Venezuela
  • 15:00 en Chile continental

¿Te apuntas?

Más información

Microsoft Tech Summit

Introducción

El pasado mes de Febrero, se repetía la .NET Conference Spain con más de 1700 asistentes y otras 5000 personas por streaming, sumado a grandes sesiones, stands o la presencia de Satya Nadella, un rotundo éxito.

dotNet Spain Conference 2016
dotNet Spain Conference 2016

Microsoft Tech Summit

Ante tal éxito, este año se plantea un nuevo evento para el próximo 6 de octubre en el Palacio Municipal de Congresos de Madrid, llega el Microsoft Tech Summit. Será un evento con más de 40 sesiones de más de una hora destinado a desarrolladores y profesionales de infraestructura (Xamarin, DevOps, Bots o Windows Server 2016 por poner ejemplos).

Call 4 Papers

Además de poder asistir al evento, ya esta abierto el Call 4 Papers pudiendo enviar propuesta antes del 7 de septiembre a esmsdn@microsoft.com con el asunto «Call4Papers: Microsoft Tech Summit».

  • Windows Server 2016: Hyper-V, Containers, Identity, Nano Server, OMS, Azure Stack, etc.
  • DevOps: CHEF, Docker, Puppet, CloudBees, ARM Templates, Visual Studio Team Services, etc
  • Big Data & Analytics: Cortana Intelligence Suite, SQL Data Warehouse, Machine Learning, R, etc.
  • Cognitive Services & Conversations as a Platform: Bot Framework SDK, Cortana Proactive Actions, etc.
  • Mobile Apps & Cross-Platform: Xamarin, Apache Cordova, Windows Centennial, etc.
  • Cloud Dev: Azure App Services, Azure Functions, Service Fabric, Microservices, etc.
  • IoT: Azure IoT Hub, Azure IoT Suite, etc.
  • OSS: Linux Apps on Azure, Azure Container Services, .NET Core, etc.
  • Productivity: Office 365, Sharepoint Dev, etc.
  • Business Intelligence: PowerBI Embedded, etc.
  • Coding 4 Fun: Juegos, etc.
  • Others: Cualquier otro tema relacionado con tecnologías Microsoft.

No te lo puedes perder!

Más información

[Xamarin] Xamarin UITest y Test Recorder desde Visual Studio

Bug - 02La calidad en movilidad cuesta

La calidad en el software es algo innegociable. Un buen proceso en el desarrollo y gestión del proceso es fundamental para conseguir ese objetivo. Debemos entregar Apps móviles perfectamente adaptadas a cada plataforma, ofreciendo la mejor experiencia de usuario posible pero sobretodo, funcional. Una App funcional debe cubrir y cumplir unos mínimos exigentes de calidad.

Como desarrolladores, somo humanos y el código no estara libre de errores. Sin embargo, el proceso que apliquemos para la detección y corrección a los mismos, es vital.

Podemos crear dos tipos de pruebas diferenciadas:

  • Pruebas unitarias: Pruebas de pequeñas unidades funcionales de nuestra App. Utilizaremos NUnit para realizar estas pruebas unitarias generalmente de ViewModels, Helpers y Servicios.
  • Pruebas de interfaz de usuario: Pruebas sobre la interfaz de usuario, escritura en cajas de texto, pulsaciones de botones, etc. Utilizaremos Xamarin UITest para estas pruebas.

Xamarin UITest

Xamarin.UITest es un framework de testing que permite realizar pruebas de comportamiento de la aplicación automatizando interacciones con la misma.

Integrado con Xamarin.iOS y Xamarin.Android, aunque puede usarse con proyectos iOS y Android escritos con Objective-C y Java, permite automatizar la gestión con la interfaz con pulsación de botones, introducir textos, gestos, tomar capturas, etc.

Cada UITest es un método escrito en C# que sigue el patrón Arrange-Act-Assert:

  • Arrange: El test inicializa todo lo necesario para que pueda ser lanzado.
  • Act: La interacción automatizada con la aplicación, introducir textos, pulsar botones, etc.
  • Assert: El test verifica resultados de las acciones realizadas en Act. Por ejemplo, verifica que tras introducir un valor incorrecto en una caja de texto, aparece un mensaje de error.

Nuestra aplicación:

Calculadora
Calculadora

Para poder analizar y profundizar en las pruebas, vamos a utilizar una aplicación realmente sencilla, una calculadora. Vamos a ver y analizar el proyecto de tipo Xamarin UITest de nuestra aplicación.

Todas las interacciones automatizadas con la aplicación ocurren mediante una instancia de Xamarin.UITest.IApp. Esta interfaz define los métodos utilizados para realizar la interacción. Cuenta con dos implementaciones:

  • Xamarin.UITest.iOS.iOSApp: Automatiza en aplicaciones iOS.
  • Xamarin.UITest.Android.AndroidApp: Automatiza en aplicaciones Android.

Ambos objetos, iOSApp y AndroidApp, se instancian utilizando la clase ConfigureApp. Esta clase se asegura de instanciar correctamente la aplicación en cada caso.

Tras instanciar la aplicación, la interacción con la aplicación se realiza utilizando querys. Los métodos de Xamarin.UITest esperan en la mayoría de casos un parámetro de tipo Func<AppQuery, AppQuery> para localizar los elementos visuales.

En nuestra aplicación, queremos realizar una prueba sencilla de suma, donde accederemos al botón numérico dos, al operador de suma y al símbolo igual. Esto nos permitirá verificar que el comportamiento de sumar dos más dos es el esperado.

Utilizando querys accedemos a cada elemento visual:

static readonly Func<AppQuery, AppQuery> TwoButton = c => c.Marked("Digit2");
static readonly Func<AppQuery, AppQuery> PlusButton = c => c.Marked("Operator+");
static readonly Func<AppQuery, AppQuery> EqualsButton = c => c.Marked("OperatorEquals");

Por supuesto, antes de lanzar el test, debemos realizar el proceso de inicialización de IApp. Normalmente, en una clase de tests tendremos agrupados múltiples tests. Cada uno de ellos debe correr en una condiciones limpias, es decir, se debe realizar la inicialización de IApp en cada caso. Este proceso se suele realizar en el método SetUp.

private IApp _app;

[SetUp]
public void SetUp()
{
     switch (TestEnvironment.Platform)
     {
          case TestPlatform.Local:
               var appFile =
                    new DirectoryInfo(Path.Combine("..", "..", "testapps"))
                        .GetFileSystemInfos()
                        .OrderByDescending(file => file.LastWriteTimeUtc)
                        .First(file => file.Name.EndsWith(".app") || file.Name.EndsWith(".apk"));

                _app = appFile.Name.EndsWith(".app")
                        ? ConfigureApp.iOS.AppBundle(appFile.FullName).StartApp() as IApp
                        : ConfigureApp.Android.ApkFile(appFile.FullName).StartApp();
                break;
           case TestPlatform.TestCloudiOS:
                _app = ConfigureApp.iOS.StartApp();
                break;
           case TestPlatform.TestCloudAndroid:
                _app = ConfigureApp.Android.StartApp();
                break;
     }
}

Por último, tras tener la inicialización (creada automáticamente al crear nuevo proyecto de tipo Xamarin UITest) y las querys, nuestro test de suma de dos más dos será:

[Test]
public void TheTwoPlusTwoIsFourTest()
{
     _app.WaitForElement(c => c.Marked("OperatorEquals"));

     _app.Tap(TwoButton);
     _app.Tap(PlusButton);
     _app.Tap(TwoButton);
     _app.Tap(EqualsButton);
     _app.Screenshot("When I get the result value");

     AppResult[] results = _app.WaitForElement(c => c.Marked("DisplayValue").Text("4"));

     Assert.IsTrue(results.Any());
}

Pulsamos en cada botón, tomamos captura del resultado y finalmente verificamos el resultado.

Corriendo Xamarin UITests desde Visual Studio

Para lanzar pruebas unitarias y Xamarin.UITests desde Visual Studio, utilizaremos el explorador de pruebas disponible desde el menu Test.

Explorador de pruebas
Explorador de pruebas

En nuestro proyecto con la calculadora realizada en Xamarin.Forms con pruebas con Xamarin.UITests vemos lo siguiente…

¿Por qué no aparecen los tests?
¿Por qué no aparecen los tests?

No aparecen, ¿qué ocurre?. El explorador de pruebas solo muestra por defecto tests realizados con MSTests. En nuestro proyecto Xamarin utilizamos NUnit para las pruebas unitarias y además XAmarin UITests, hace uso de NUnit también.

Vamos a solucionar el problema añadiendo la posibilidad de lanzar tests realizados con NUnit. Desde el menu de Herramientas->Extensiones y actualizaciones…

Extensions
Extensiones y actualizaciones

Dentro del conjunto Online buscamos por NUnit Test Adapter. Debemos instalar el adaptador correspondiente a NUnit 2 a pesar de estar disponible la versión correspondiente a NUnit 3. Esto es así ya que Xamarin UITest hace uso de la versión 2 de NUnit.

NUnit Test Adapter
NUnit Test Adapter

Tras instalar la extensión, al compilar el proyecto:

Aparecen los tests!
Aparecen los tests!

Ahora podemos lanzar o depurar cualquiera de las pruebas (o todas) sencillamente haciendo clic derecho sobre las mismas.

Xamarin Test Recorder

Podemos crear Xamarin UITests a mano y haciendo uso del REPL, sin embargo, es mucho más sencillo hacer uso de Xamarin Test Recorder.

Xamarin Test Recorder es una herramienta que nos permite, seleccionar un paquete de aplicación, lanzar la aplicación, interaccionar con la interfaz de usuario capturando los movimientos necesarios y la herramienta generará automáticamente el test en base a la interacción realizada.

Para poder utilizar la herramienta desde Visual Studio debemos instalar la extensión Xamarin Test Recorder 2015.

NOTA: Existe una versión de la extensión preparada para usar desde Visual Studio 2013.

Xamarin Test Recorder Extension
Xamarin Test Recorder Extension

Tras instalar la extensión, para poder utilizarla debemos cumplir unos requisitos básicos:

  1. Tener abierto un proyecto de tipo Xamarin UITest. En caso de no contar con ninguno en el proyecto, crear uno.
  2. Tener abierto un emulador o bien conectado por USB un dispositivo.

Tras cumplir los requisitos, podemos ver el siguiente indicador visual:

Indicador visual
Indicador visual

Pulsando sobre el indicador visual, nos aparecerá una opción para grabar un nuevo test.

Grabar nuevo test
Grabar nuevo test

En este punto, podremos elegir el paquete de la aplicación que deseamos probar.

Seleccionar paquete
Seleccionar paquete

Tras seleccionar el paquete de la aplicación, se lanzará la misma en el emulador o dispositivo conectado además de crear un nuevo método de Test vacío en el editor.

Con la aplicación en ejecución, y la grabación del test, cualquier interacción realizada quedará reflejada en un nuevo paso del nuevo método de test creado por la herramienta.

Una vez completada la interacción, vamos a detener la grabación. Pulsamos sobre el icono de grabación y nos aparecerá un menu como el siguiente:

Detener grabación
Detener grabación

Bastará con elegir la primera de las opciones para detener la grabación. Tendremos el código C# resultante de las interacciones realizadas en un nuevo método creado por la herramienta.

En el proceso de grabación del test, podemos tomar capturas de pantalla en cualquier momento pulsando sobre el icono de grabación y utilizando la opción Take Screenshot.

Sencillo, ¿cierto?. Las pruebas creadas las podemos lanzar directamente en local en nuestros emuladores o dispositivos físicos o hacer uso de Xamarin Test Cloud.

Tenéis el código fuente del ejemplo utilizado disponible en GitHub:

Ver GitHub

Recordad que podéis dejar cualquier comentario, sugerencia o duda en los comentarios.

Más información

[Xamarin.Forms] Utilizando DataPages

Forms-01-WFIntroducción a DataPages

En no pocas ocasiones nos planteamos realizar una aplicación sencilla para consultar información existente desde un servidor o infraestructura cloud.

En el marco del pasado Evolve 2016, Xamarin anunciaba la disponibilidad e la preview de Xamarin.Forms DataPages.

Los DataPages llegan para facilitar la creación de aplicaciones de tipo maestro-detalle con acceso a una fuente de información de la forma más rápida y sencilla posible. Se renderizarán listados y detalles automáticamente en base a los datos pudiendo personalizar con el uso de diferentes controles y el uso de temas.

DataPages se puede utilizar consumiendo el paquete NuGet Xamarin.Forms.Pages.

Permite acceder a diferentes fuentes de información con data sources prefabricados:

  • JsonDataSource: Una URL que contiene un JSON.
  • AzureDataSource (paquete NuGet separado): Azure Mobile Services.
  • AzureEasyTableDataSource (paquete NuGet separado).

Para mostrar la información correspondiente a la fuente de información contamos con una serie de páginas y controles.

Las páginas disponibles son:

  • ListDataPage: Muestra un listado de elementos.
  • DirectoryPage: Listado de elementos agrupados.
  • PersonDetailPage: Página de detalles que muestra la información correspondiente a un tipo de objeto.

En cuanto a controles:

  • ListItem: Vista prefabricada destinado a mostrar un elemento de un listado. Puede mostrar título, detalles e imagen.
ListItem
ListItem
  • CardView: Este control es similar al CardView nativo de Android. Permite mostrar un texto principal, uno secundario y una imagen.
CardView
CardView
  • HeroImage: Control que permite mostrar título, detalles e imagen, dándole peso a esta última. Tambien cuenta con una propiedad para modificar el aspecto.
HeroImage
HeroImage

Preparando la solución

Comenzamos creando una aplicación Xamarin.Forms utilizando una librería portable (PCL):

Nueva aplicación Xamarin.Forms
Añadir paquetes utilizando NuGet

Nueva aplicación Xamarin.Forms

Tras crear el proyecto debemos añadir la referencia a DataPages y Themes. Para ello, utilizaremos NuGet para añadir:

  • Xamarin.Forms.Pages
  • Xamarin.Forms.Theme.Base
  • Xamarin.Forms.Themes.Light o Xamarin.Forms.Themes.Dark
Añadir paquetes utilizando NuGet
Añadir paquetes utilizando NuGet

NOTA: Debemos añadir los paquetes NuGet tanto en la libería portable como en el proyecto específico de cada plataforma, tanto en iOS como en Android.

DataPages requiere el uso de temas para poder renderizar correctamente. Para ello, en App.xaml debemos añadir el namespace detema y añadirlo en los recursos de la aplicación.

Dependiendo del tema elegido, los espacios de nombre a utilizar son:

xmlns:light="clr-namespace:Xamarin.Forms.Themes;assembly=Xamarin.Forms.Theme.Light"    
xmlns:dark="clr-namespace:Xamarin.Forms.Themes;assembly=Xamarin.Forms.Theme.Dark"

Y para añadir el tema a utilizar dentro del conjunto de recursos de la aplicación:

<ResourceDictionary MergedWith="dark:DarkThemeResources" />        
<ResourceDictionary MergedWith="light:LightThemeResources" />

Por ahora, para completar el proceso de uso del tema, debemos añadir algo de código específico por cada plataforma para cargar las librerías correspondientes.

var x = typeof(Xamarin.Forms.Themes.DarkThemeResources);    
x = typeof(Xamarin.Forms.Themes.LightThemeResources);    
x = typeof(Xamarin.Forms.Themes.Android.UnderlineEffect);

En el caso de iOS código a ejecutar en el AppDelegate, en el de Android, en la actividad principal MainActivity.

Ejemplo básico

Añadimos la vista XAML principal de la aplicación. Incluimos el espacio de nombres correspondiente a DataPages para acceder y utilizar las páginas, controles y data sources incluidos.

xmlns:p="clr-namespace:Xamarin.Forms.Pages;assembly=Xamarin.Forms.Pages"

Añadimos:

<?xml version="1.0" encoding="UTF-8"?>
<p:ListDataPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:p="clr-namespace:Xamarin.Forms.Pages;assembly=Xamarin.Forms.Pages"
             x:Class="DataPagesDemo.SessionDataPage"
             Title="Sessions" StyleClass="Events">
    <p:ListDataPage.DataSource>
        <p:JsonDataSource Source="http://demo3143189.mockable.io/sessions" />
    </p:ListDataPage.DataSource>
</p:ListDataPage>

El resultado:

El resultado
El resultado

Increíble, ¿cierto?. Vamos a analizar el código  (escaso) añadido.

Hemos modificado el tipo de página de una ContentPage, página básica para añadir contenido en Xamarin.Forms por una ListDataPage. Xamarin.Forms DataPages nos ofrece este tipo de página que nos permite crear un maestro-detalle con suma facilidad en base una fuente de información.

Utilizando la propiedad DataSource de la página, creamos un JsonDataSource que se encargará de acceder a la información realizando la petición HTTP necesaria y parseando la información para permitir mostrarla en la UI realizando bindings.

¿Dónde realizamos el enlace de la UI con la información?. La propiedad StyleClass de la página permite acceder a un estilo. En este caso se utiliza «Events», estilo prefabricado que ya define lo necesario para enlazar correctamente con la fuente de información («title», «image», «presenter»).

Tenéis el código fuente del ejemplo básico disponible en GitHub:

Ver GitHub

Añadiendo personalización

Vamos a crear un segundo ejemplo donde personalizar aspectos como la fuente de información, el aspecto visual modificando controles utilizados y por supuesto, también los enlaces a la información.

Vamos a generar una fuente de información de pruebas utilizando Json generator. Reemplazamos la fuente utilizando el datasource de tipo JsonDataSource:

<p:ListDataPage.DataSource>
     <p:JsonDataSource Source="http://www.json-generator.com/api/json/get/clOPFoTImW?indent=2" />
</p:ListDataPage.DataSource>

A continuación, vamos a modificar la propiedad DefaultItemTemplate que permite especificar la apariencia de cada elemento dentro del listado. En lugar de utilizar el control CardView utilizado por defecto en el ejemplo anterior, vamos a utilizar un ListItem.

<p:ListDataPage.DefaultItemTemplate>
     <DataTemplate>
          <ViewCell>
               <p:ListItemControl
                    Title="{p:DataSourceBinding name}" 
                    Detail="{p:DataSourceBinding email}" 
                    ImageSource="{p:DataSourceBinding picture}"
                      DataSource="{Binding Value}">
               </p:ListItemControl>
          </ViewCell>
     </DataTemplate>
</p:ListDataPage.DefaultItemTemplate>

ListItem cuenta con propiedades Title, Detail e ImageSource para especificar sus valores, utilizando la palabra reservada DataSourceBinding enlazaremos con los campos deseados del archivo JSON.

Nuestra página quedaría finalmente:

<p:ListDataPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:p="clr-namespace:Xamarin.Forms.Pages;assembly=Xamarin.Forms.Pages"
             x:Class="DataPages.MainView"
                   StyleClass="Events" 
                   Title="Users">   
    <p:ListDataPage.DataSource>
        <p:JsonDataSource Source="http://www.json-generator.com/api/json/get/clOPFoTImW?indent=2" />
    </p:ListDataPage.DataSource>
    <p:ListDataPage.DefaultItemTemplate>
        <DataTemplate>
            <ViewCell>
            <p:ListItemControl
                Title="{p:DataSourceBinding name}" 
                Detail="{p:DataSourceBinding email}" 
                ImageSource="{p:DataSourceBinding picture}"
                  DataSource="{Binding Value}">
                </p:ListItemControl>
            </ViewCell>
        </DataTemplate>
    </p:ListDataPage.DefaultItemTemplate>
</p:ListDataPage>

Tras ejecutar:

Personalización
Personalización

Además de contar con el listado, tenemos también disponible la vista de detalles mostrando más información a partir de los diferentes datos del JSON.

Y hasta aquí el repaso a las posibilidades de Xamarin.Forms DataPages. Una forma bastante rápida y sencilla para crear aplicaciones sencillas o prototipos con posibilidades interesantes en personalización y extensión. Siempre repitiendo cuatro sencillos pasos:

  1. Instalar paquetes NuGet.
  2. Seleccionar tema.
  3. Añadir DataPage.
  4. Configurar data source y personalización.

Tenéis el código fuente disponible e GitHub:

Ver GitHub

Recordad que podéis dejar cualquier comentario, sugerencia o duda en los comentarios.

¿Y próximamente?

DataPages continuará evolucionando y madurando con varios objetivos en mente. Xamarin ya ha confirmado que:

  • En próximas versiones no necesitaremos añadir código específico de plataforma para realizar la carga de las librerías correspondientes a temas.
  • Se incluirá la posibilidad de CRUD (create-read-update-delete).

Más información

[VideoBlog] Un vistazo a XenForms

XenFormsIntroducción

Xamarin.Forms es un framework que añade una capa de abstracción sobre la parte de UI permitiendo crear aplicaciones multiplataforma nativas compartiendo tanto la lógica de negocio como la interfaz de usuario. En los últimos tiempos hemos ido recibiendo tanto por parte de Xamarin como por parte de la comunidad gran cantidad de mejoras para aumentar el rendimiento en el desarrollo como el editor visual, Xamarin.Forms Previewer o Gorilla Player.

XenForms

La comunidad sigue creciendo a un ritmo imparable ofreciendo cada vez más y mejores opciones. Hoy estamos ante XenForms, herramienta creada por Michael Davis destinada a editar interfaces en Xamarin.Forms. Permite crear interfaces partiendo desde cero añadiendo Layouts y Views.

Construyendo la UI desde cero
Construyendo la UI desde cero

Además de poder editar cada propiedad de cada elemento, o los eventos.

Modificación de propiedades
Modificación de propiedades

También podemos cargar un proyecto ya existente para previsualizar la interfaz, hacer cambios al vuelo con el editor visual editando propiedades, hacer cambios a nivel de XAML, etc.

Carga de proyectos existentes
Carga de proyectos existentes

Suena interesante, ¿cierto?. Si te lo parece, no te pierdas el siguiente recorrido por la herramienta en video.

También se puede trabajar con Apps utilizando MVVM realizando pruebas de enlaces a datos (interactuar con la aplicación a la par que se edita), uso de propiedades avanzadas y adjuntas, etc.

Una herramienta interesante y sin duda con mucho potencial, ¿y a ti, qué te parece?.

Más información

Renovado como Microsoft MVP!

MVP_BlueMicrosoft MVP 2016

Parece que fue ayer, pero fue hace un año cuando recibí un correo que comenzaba por…

Estimado/a Javier Suarez,

Enhorabuena. Nos complace presentarle el Premio MVP de Microsoft…

Van tres y tras otro año, volver a recibirlo hace la misma e incluso más ilusión!. Más aún si cabe si, además de pertener a la categoría Windows Development se incluye el área Visual Studio and Development Technologies. Un gran honor formar parte de un grupo de desarrolladores tan talentosos y apasionados además de grandes personas.

Agradecimientos

Llegados a este punto, siempre quieres agradecer a muchas partes que han ayudado en el camino. Comienzo por vosotros, si, si hablo de ti querido lector. Gracias por leer estos artículos técnicos y ayudarme a aprender intercambiando opiniones día a día, gracias a mis compañeros MVPs, en especial a los de desarrollo Windows y Visual Studio con quienes comparto la inmensa mayoría de eventos, proyectos personales y grandes momentos (soís grandes), a los grupos de usuario WPSUG, SVQXDG y CartujaDotNet donde colaboro y me permiten aprender más y más cada día con fantásticos compañeros y a Cristina González, MVP lead, por su increíble labor siempre pendiente de todos nosotros además de a los chicos de Microsoft España. Podría continuar nombrando a muchos amigos y compañeros, pero me temo que me extendería en exceso y al final y al cabo sabéis quienes sois?.

Por último, no quisiera terminar sin agradecer a mi familia y sobretodo a mi pareja que siempre me apoya y me cede tiempo para que pruebe esa última versión de algun remoto SDK que acaba de salir o de participar en X evento, en definitiva,  probar, jugar con la tecnología y divertirme.

Y ahora que?

Ahora, a continuar aprendiendo y disfrutando compartiendo todo lo posible en blogs, comunidades técnicas y otras vías (y llegarán!) con más ganas y más ilusión si cabe.

Felicidades

También me gustaría felicitar a todos los MVPs veteranos que han sido renovados asi como aquellos que entran a formar parte desde este momento. Enhorabuena!