Quantcast
Channel: Microsoft DX España
Viewing all 464 articles
Browse latest View live

Novedades de Visual Studio 2013 Update 3

0
0

Recientemente se ha puesto a nuestra disposición el Update 3 de Visual Studio 2013 en su versión Release Candidate (RC), y ya puede ser descargado de nuestra web: Descarga Visual Studio 2013 Update 3 RC.

A continuación te contamos algunas de las novedades que incluye.

 

CodeLens

Gracias a CodeLens podemos ver información de nuestro código: dónde se referencia, quién lo ha creado/cambiado, ítems de TFS relacionados y tests unitarios, y todo sin quitar la vista de nuestro código. Con el Update 3, ahora CodeLens es capaz de mostrar esta información para repositorios Git.

View the author and the date with Git repositories

Más información:

 

Code Map

Code Map nos ayuda a no perdernos en grandes proyectos de código, código que posiblemente no conozcamos o sea antiguo. Con él podemos navegar por el código y ver las relaciones entre sus diferentes partes. Con el Update 3 ahora podemos ver los enlaces entre el código con diferentes colores para ayudarnos a entender el mapa.

Code map showing colors on links now

Además nos trae otras mejoras como un zoom mejorado, que nos permitirá controlar el nivel de zoom, y ver por ejemplo de un vistazo el call stack actual.

También podremos ahora arrastrar y soltar binarios en uno de estos mapas para explorarlos, y ver por ejemplo los ensamblados que referencia.

Más información:

 

Application Insights

Con Application Insights de Visual Studio Online podemos monitorizar nuestras aplicaciones web y nuestras apps de Windows y Windows Phone. Podremos ver lo que los usuarios hacen con nuestra app y ver estadísticas de dicho uso, diagnosticar problemas de rendimiento o excepciones, etc. Ahora con el Update 3 vienen incluidas las herramientas de Application Insights para que podamos añadir esta monitorización a nuestros proyectos.

Más información:

 

Testing

Con el Update 3 ahora podemos personalizar nuestros Test Plans y Test Suites añadiendo campos personalizados (p.ej. tipo de test, nombre del revisor, etc.) y workflows, y cambiando los valores por defecto de los campos de estado para adaptarse a nuestros procesos. Estos cambios podremos verlos y modificarlos en Microsoft Test Manager o Team Web Access.

Right-click the test suite and choose Open Test Suite from the context menu

Además podremos verificar quién ha hecho cambios en los Test Plans y Test Suites, y controlar quién tiene permisos para hacerlo.

From the History section, choose the ALL CHANGES tab 

Cuando ejecutamos nuestros tests de carga en la nube usando Visual Studio Online, nos ahorramos disponer de nuestros propios recursos y configurar máquinas para probar nuestras webs simulando el acceso de muchos usuarios. Además, podemos utilizar Application Insights para obtener también información de rendimiento que podemos relacionar con la de la carga. Ahora con el Update 3 ya no estaremos limitados a los contadores de rendimiento por defecto, ya que podremos seleccionar cualquier contador de rendimiento que queramos ver.

Más información:

 

Release Management

Con el Update 3 ahora podemos desplegar aplicaciones a nuestros entornos on-premises o en Microsoft Azure sin tener que instalar un Microsoft Deployment Agent en cada máquina, utilizando Windows PowerShellWindows PowerShell Desired State Configuration (DSC). Incluso podemos desplegar en servidores que no ejecuten Windows gracias a Chef.

También podremos ver un resumen de los cambios en las historias de usuario y bugs que se han completado desde la release anterior, para saber qué probar y poner en nuestras notas de release.

From the Release Definitions tab, choose Change Summary

Más información:

 

Rendimiento y Diagnostico

El hub de Performance and Diagnostics ahora puede abrir sesiones de profiling (ficheros .diagsession) exportados con las herramientas F12 de la última Preview para desarrolladores de Internet Explorer 11.

Con la herramienta de uso de CPU (CPU Usage) del hub de Performance and Diagnostics podemos ver qué funciones están utilizando la CPU para ayudarnos a optimizar nuestro código. Gracias al Update 3 podremos utilizarla con WPF, aplicaciones de Consola, y apps de Windows Store 8.1 y Windows Phone Store 8.1 escritas en C++, C#, Visual Basic o JavaScript. Además, podremos navegar desde un nombre de función en el árbol de llamadas al código fuente donde está definida.

CPU Usage Tool

La herramienta de uso de memoria (Memory Usage) ha mejorado y ahora podemos utilizarla también con aplicaciones WPF y Win32, y no sólo con apps de Windows Store o Windows Phone Store hechas con C++, C# o Visual Basic. Además podremos forzar recolecciones de basura (GC) para quitarnos de en medio todos los objetos que puedan ser eliminados antes de tomar una captura, podremos copiar y pegar el contenido de varias filas simultáneamente, etc.

Más información:

 

Debugger

Ahora con el Update 3 cuando trabajemos con múltiples monitores, si movemos una Windows Store app a un monitor diferente al depurar, la app reaparecerá en ese monitor la próxima vez que la depures.

Además, mientras depuremos un volcado de memoria de una aplicación .NET (una “foto” de la memoria de un proceso en el momento en que se tomó dicho volcado), podremos seleccionar un tipo y navegar a su definición o sus referencias.

Managed Memory

También podremos depurar aplicaciones .NET Native x86, así como sus volcados de memoria.

Más información:

 

 

Y aquí no acaba la cosa. El Update 3 también ha traído nuevas opciones de configuración para cambiar por ejemplo el aspecto de la barra de menús, mejoras en el despliegue de aplicaciones con ClickOnce, mejoras en IntelliTrace, mejoras en el compilador de C++, nuevas herramientas de diagnóstico de gráficos (Visual Studio Graphics Analyzer IDE), o cambios en las Autohosted Apps de SharePoint. Si necesitas saber más sobre todas estas novedades, puedes consultar estos recursos:

 

En el video de Channel9 Visual Studio 2013 Update 3 RC episode of Visual Studio Toolbox podrás ver ejemplos del soporte a Git y otras mejoras de CodeLens (cambio del estilo de los enlaces, uso de colores para distinguir tipos de dependencias, etc.), de la extensión de Application Insights, de personalización de los planes de Tests, de personalización del aspecto de la barra de menús del IDE, de despliegue de apps con DSC (Desired State Configuration), y del soporte de la herramienta de uso de memoria (Memory Usage Tool) del Performance and Diagnostics Hub para aplicaciones WPF y Win32.

 

Un saludo,

 

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.


Code Smells: Cosas que creías que hacías bien... pero no.

0
0

Las cosas cotidianas se hacen de forma casi automática, sin pensar. Esto no sólo ocurre cuando necesitamos cambiar de marcha o abrir nuestro portátil, no. También nos ocurre programando… y a veces no es muy buena idea.

NSA Counting

Nos ha pasado a todos. Tenemos que llamar a un método que nos devuelve un IEnumerable, pero sólo queremos hacer algo si contiene algún elemento. ¿Os suena este código?

var enumerable = ThisReturnsAnEnumerable(); if (enumerable.Count() >0) {// Do something}

Lo malo de este tipo de código, es que a nosotros solo nos interesa saber si existe al menos un elemento, lo que debería ser una operación O(1). Sin embargo, estamos preguntando la cantidad total de elementos, lo que implica una complejidad O(n).

Algunas veces la estructura de datos tendrá una propiedad Count que hará que Count() tenga complejidad O(1), pero eso ya depende de la estructura en concreto y de cómo la hayan implementado…

Podemos reemplazar el código anterior por este con complejidad O(1):

var enumerable = ThisReturnsAnEnumerable();if (enumerable.Any()) {// Do something}

Cualquier elemento satisface la condición vacía, por lo que de existir algún elemento, la condición resuelve cierto al primer elemento, eliminando la necesidad de continuar la operación .Any

Pokemon Exception Handling

Este término en realidad se usa para varios casos, cada cual más hiriente que el anterior. El más común es este:

try {// Do something}catch {// Catch 'em all!}

En general, hacer un manejo silencioso de una excepción es una mala idea que en ocasiones puede ser muy mala idea. Ahora bien, hacer un manejo silencioso de TODAS las excepciones es una práctica prohibida bajo pena de catapulta. El fix es sencillo… no captures excepciones que no manejas.

Otra variante del Pokemon Excepcion Handling es el retrowing:

privatevoid SomeoneElsesMethod() { MethodPokemonExceptionHandling(); }privatevoid MethodPokemonExceptionHandling() {try { MethodThatFails(); }catch (NullReferenceException) { thrownew NullReferenceException(); } }privatevoid MethodThatFails() { thrownew NullReferenceException(); }

El método “MethodThatFails” quiere lanzar una excepción. El programador del método “MethodPokemonExceptionHandling”, sabe que “MethodThatFails” puede dar una excepción, así que la captura. El único problema es que no tiene ni idea de cómo solucionar la excepción, así que decide relanzarla. Cuando “SomeoneElsesMethod” llama al “MethodPokemonExceptionHandling” obtiene un NullReferenceException… todo parece correcto ¿o no?

El problema aquí es que el método pokemon, al relanzar la excepción está cercenando la pila de llamadas, haciendo que cuando depuremos veamos esto:

image

Ni rastro de “MethodThadFails” en el call stack. Teniendo en cuenta que tenemos el código y que son cuatro líneas de código, no nos costará encontrar el error. Ahora bien, imaginad que esto es una librería de la que no tenemos el código, pensaríamos que el método pokemon es el causante y se complicaría la depuración. Sin embargo, si eliminamos la captura pokemon:

privatevoid SomeoneElsesMethod() { MethodPokemonExceptionHandling(); }privatevoid MethodPokemonExceptionHandling() { MethodThatFails(); }privatevoid MethodThatFails() { thrownew NullReferenceException(); }

Ahora podríamos ver en el call stack al verdadero causante del problema:

image

If I can’t see it, it ain’t that bad

C# soporta regiones de código. Esta característica fue introducida, principalmente, para poder introducir bloques de código generado automáticamente y que estos pudieran ocultarse evitando distraer al programador. C# 2.0 introdujo las clases parciales, que solucionan de forma mucho más elegante ese problema. Sin embargo, muchos programadores insisten en seguir usando regiones de código esgrimiendo dos argumentos:

El código queda más organizado

La organización del código debe dejarse a herramientas como StyleCop, que compilación tras compilación, verificarán que efectivamente todo esté en orden. Una región de código con nombre “Private methods” nunca va a ser verificada.

Puedo ocultar métodos largos

Un método lo suficientemente largo como para querer ser ocultado no debería existir en primer lugar. Si esto ocurre, hay que refactorizar. Al margen de eso, Visual Studio permite colapsar métodos ;)

Exception Flow

Este uso de las excepciones no tiene nada que ver con el Pokemon, pero también debemos tener mucho cuidado con él, ya que el impacto en el rendimiento es enorme y podemos causar un infarto de miocardio al siguiente programador que lea el código.

Supongamos que tenemos una lista de ficheros y queremos mostrar su contenido al usuario. Si el fichero no existiera, también queremos informar al usuario. Alguien podría escribir un código tal que así:

foreach (var name in Enumerable.Range(0, 10).Select(x =>"File"+ x +".txt")) {try { Console.WriteLine(File.ReadAllText(name)); }catch (FileNotFoundException e) { Console.WriteLine("File "+ e.FileName +" doesn't exist!"); } }

Efectivamente el código funciona como se espera, el problema es que estamos usando las excepciones como flujo de control. Esto es, siempre, una mala idea. El manejo de excepciones es una te las tareas más costosas en términos computacionales debido a la cantidad de comprobaciones y cambios de contexto que deben realizarse.

Este código resolvería el problema:

foreach (var name in Enumerable.Range(0, 10).Select(x =>"File"+ x +".txt")) {if (File.Exists(name)) { Console.WriteLine(File.ReadAllText(name)); }else { Console.WriteLine("File "+ name +" doesn't exist!"); } }

As Is

Otro de los errores más comunes es no tener muy claro el uso de las palabras reservadas as e is. Cuando queremos realizar una casting explícito, podemos usar el operador “is” para saber si el cast podrá realizarse sin producir excepciones. Así pues, este código es correcto y llamará al método SayHello, sólo cuando obj no sea nulo y además pueda castear a MyType:

privatevoid InterestingMethod(Object obj) {if (obj is MyType) { ((MyType)obj).SayHello(); } }

Ahora bien, este no es el uso apropiado, ya que el código MSIL generado realizará el cast dos veces, pues is generará el opcode isinst y el casting generará un castclass. Este proceso puede optimizarse con el uso de “as”.

El operador “as” se usa para relizar castings a tipos sin generar excepciones, ya que si la conversión no es posible, retornará null. En este caso podemos relizar la conversión de forma mucho más rápida con el siguiente código:

privatevoid InterestingMethod(Object obj) { var myType = obj as MyType;if (myType !=null) { myType.SayHello(); } }

A veces menos código no significa más eficiente Smile

 

¿Haces código con alguno de los code smells que menciono? ¿Cuáles añadirías a la lista? ¡Cuéntanos!

Happy hacking!

Pablo Carballude (@carballude_es)

Becas Microsoft DPE 2014-2015

0
0

Como todos los veranos iniciamos el proceso de selección de las becas técnicas para trabajar en el departamento de Development & Platform Evangelism (DPE) de Microsoft España.

En DPE trabajamos dando a conocer las últimas novedades en tecnología Microsoft para que desarrolladores y administradores de sistemas de toda España puedan sacarle el máximo provecho. Para conseguirlo organizamos y participamos en eventos, creamos formaciones, retransmitimos webcasts y ayudamos a solucionar las dudas que puedan surgir en el uso de tecnología Microsoft.

Este año voy a seleccionar a dos becarios técnicos de desarrollo que nos ayuden con nuestro objetivo de transmitir pasión por la tecnología, las becas son de 8 horas.

¿Cuáles serán tus funciones?

  • Ayudarás en el área de soporte técnico a aquellos desarrolladores que tengan dudas sobre cómo crear Apps para Windows y Windows Phone, así como en el uso de Microsoft Azure.
  • Tendrás que evaluar las novedades que surjan sobre Internet Explorer, Microsoft Azure, .NET, Windows, Windows Phone y Visual Studio entre otros para crear posts en este blog, código de ejemplo, tutoriales, videos cortos, etc.
  • Tendrás que probar los nuevos dispositivos que lleguen al departamento, así como instalarlos y actualizarlos.
  • Participarás en hackathons y otros eventos ayudando a organizarlos y como “mentor” para resolver dudas técnicas a los asistentes.
  • Programarás webs para gestión interna del departamento, así como Apps para Windows 8 y Windows Phone.

Nosotros te formaremos y te asesoraremos, te daremos acceso a todo el software de Microsoft que necesites, tanto el actual como las betas no públicas, así como horas de computación en nuestra plataforma cloud Microsoft Azure para que tengas todas las herramientas que necesitas para desempeñar tus funciones adecuadamente.

¿Cómo saber si encajas en el puesto?

  • Estás en los últimos años de carrera en una universidad española.
  • Has completado al menos el 50% de tus créditos.
  • Una de las primeras cosas que instalas en tu PC es Visual Studio junto con otros entornos de desarrollo.
  • Has participado en hackathons, concursos y/o otros eventos de desarrollo.
  • Tienes inciativa y capacidad de aprendizaje.
  • Vives en Madrid o no tienes problemas para trasladarte.

Recuerda que si eres MSP, participas habitualmente en los dotNetClubs de tu universidad o en alguna Microsoft Technical Community tienes preferencia para acceder a la beca.

¿Por qué una beca en el departamento de DPE de Microsoft?

Como ya he comentado muchas veces, porque en DPE un becario no es el que trae los cafés o el que hace las fotocopias, sino un miembro más del equipo que trabajará igual que el resto. Porque nuestras becas son remuneradas. Porque aunque trabajes mucho, lo más importante es siempre que apruebes, así que te dejaremos tiempo para que estudies para tus exámenes y te ayudaremos en todo lo que podamos para que acabes tu carrera. Porque trabajarás con profesionales excelentes con los que aprender. Porque recibirás formación y adquirirás una experiencia muy buena para cuando tengas que buscar trabajo. Porque prácticamente todos nuestros becarios acaban trabajando en Microsoft u otros partners geniales. Porque trabajarás en las nuevas oficinas que tenemos en Madrid. Porque tenemos refrescos gratis, Xbox One, AR.Drone, placas Gadgeteer, horarios flexibles, porque nos lo pasamos genial con nuestro trabajo y eso se nota en el ambiente…

¿No me crees?

Pregunta que les pareció la beca a la última generación de becarios de DPE para que tengas información de primera mano:

  • Carlos Carrillo (@3lcarry), actual desarrollador de XBox One en PlainConcepts
  • Sergio Gallardo (@maktub82), actual desarrollador de XBox One en PlainConcepts

¿Como opto a la beca?

Mándanos un correo, antes del 15 de Agosto, con tu CV actualizado y un enlace a Codeplex o Github con la solución que escribas para la codekata Bowling Game. La solución tendrá que contener el código en C#, así como los tests unitarios asociados.

Si tienes Apps publicadas en la Windows Store no te olvides de incluir los enlaces en tu CV.

¿Tienes más dudas?

¡Pregúntame!

Jose Boninn – Technical Evangelist Manager

@wasat

¡Demuestra tu valía con los #retosMSDN!

0
0

Se acabaron las vacaciones para muchos de nosotros. Ya estamos en septiembre, y empieza un nuevo curso. ¿Qué mejor momento para poner en práctica nuestros conocimientos de programación? Así que el equipo de MSDN España nos hemos puesto manos a la obra y hemos creado los #retosMSDN, una serie de retos de programación con Visual Studio con los que queremos que pongas a prueba tus conocimientos de programación y, a ser posible, que aprendas cosas nuevas que te ayuden a sacarle más provecho a nuestras herramientas y tecnologías de desarrollo.

Cada dos semanas publicaremos un nuevo reto, y a la semana siguiente de publicar cada uno de ellos, publicaremos su solución.

Empezamos hoy mismo, así que dentro de poco podrás encontrar en nuestro blog el primer reto. ¿Estás preparado?

 

Y no dudes en contarnos qué te parecen. ¿Te parecen demasiado fáciles o demasiado difíciles? ¿Te gustaría que tratásemos algún tema en particular, alguna funcionalidad especifica de Visual Studio, algún lenguaje de programación concreto? ¿Te gustaría que publicásemos un reto creado por ti? Cualquier comentario que nos ayude a mejorar será bienvenido.

 

¡Ah! Y guárdate un enlace a este artículo en tus favoritos, ya que en él iremos listando todos los retos publicados hasta el momento.

 

Reto 1 – ¡Ordenando listas!

 

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

#retosMSDN: Reto 1 – ¡Ordenando listas!

0
0

 

Aquí tienes el primero de los retos de nuestra serie de #retosMSDN. Empezaremos con algo sencillo. ¿O no es oro todo lo que reluce?

 

El Reto

Crea una librería de clase con Visual Studio que reúna los siguientes requisitos:

1) que funcione como mínimo en aplicaciones hechas con .NET Framework 4.5, y en apps Universales (Windows 8.1 + Windows Phone 8.1).

2) que contenga una clase Persona con una propiedad Nombre y una propiedad Edad.

3) que contenga una clase Reto1 con un método que reciba una lista de personas y que la devuelva ordenada por orden descendente de edad (es decir, los recién nacidos aparecerían al final de la lista). Si dos personas tienen la misma edad, aparecerán por orden alfabético.

4) que el método creado en el punto #3 pase los tests unitarios incluidos en este proyecto de Visual Studio 2013 que puedes descargarte de GitHub.

 

La Solución

¿Ya lo has resuelto? Comparte con nosotros tu solución de Visual Studio en esmsdn@microsoft.com.

El viernes de la semana que viene, el día 12 de septiembre, publicaremos la solución que nosotros proponemos para el reto.

 

¿Sabías que…

…con Visual Studio 2013 y CodeLens puedes ver sobre tu código, y de manera muy sencilla e inmediata, los resultados de tus tests unitarios?

 

Si tienes cualquier duda o problema durante la resolución del reto, no dudes en ponerte en contacto con nosotros.

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

Eventos de Microsoft Azure en Septiembre

0
0

clip_image002

Este mes de septiembre volvemos desde Microsoft España cargados de eventos de Azure, así que si quieres publicar tu web en Azure o aprender cómo se despliega una máquina virtual es tú momento:

Bonus Point!

Curso de Introducción al desarrollo de videojuegos con Unity3D en Barcelona el 18 de septiembre 15:00 a 20:00

clip_image003

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032592606&Culture=es-ES

Nos vemos en la nube!

Luis Guerrero.

@guerrerotook

MSP Summit una semana en el campus de Microsoft

0
0

Este es un post invitado en el que Quique Fernández nos relata su experiencia en el MSP Summit que tuvo lugar en Seattle este verano. Tal vez quieras conocer también qué es un MSP.

 

MSP Summit es un evento anual, en el cual un grupo de MSP de todo el mundo se reúnen para aprender, compartir e intercambiar experiencias. El lugar escogido para el evento fue el campus de Microsoft en Seattle, Washington (y parece que va a ser el lugar de los próximos años).

Este año nos reunimos unos 70 estudiantes de alrededor de 50 países para pasar unos días en Seattle y en la sede de Microsoft, donde hemos vivido una de nuestras mejores experiencias tecnológicas.

Personalmente me ha parecido una semana increíble, cada día he aprendido cosas, me llevo algo de cada persona que he conocido y un gran recuerdo de cada lugar que he podido visitar.

001

Durante los dos primeros días nos dieron varias charlas en las oficinas de Microsoft. Profesionales de la compañía nos hablaron sobre Microsoft Research, la nueva versión de Kinect para pc, cómo llegar a ser MVP y sobre el programa #YouthSpark para estudiantes, entre muchas otras.

Fue una buena experiencia ver cómo nos enseñaban sobre estos temas las mismas personas que están creando y trabajando en las tecnologías de Microsoft, pero sobretodo cómo nos animaban a que siguiéramos siendo, no solo estudiantes sino, personas curiosas que quieren ir más allá para seguir aprendiendo y mejorando. En momentos así ves claramente que para llegar lejos en tu carrera profesional no solo vale con estudiar en la universidad, hay que esforzarse mucho todos los días y ayuda estar en programas cómo Microsoft Student Partners gracias al cuál nos podemos formar en las tecnologías de Microsoft y aspirar a ir a este tipo de eventos. 

002

Esa misma semana se celebraba la final de la Imagine Cup, un concurso a nivel mundial sobre tecnología. Estudiantes de los países finalistas nos enseñaron sus aplicaciones mientras competían por ganar una de las tres categorías (World citizenship, Games, Innovation) y para ser la gran ganadora de la final, puedes ver la lista de finalistas en su web.
Me parecieron aplicaciones muy interesantes, de entre todas he escogido las tres que más me gustaron: un juego para XBox muy adictivo, una aplicación para windows phone que ayuda a controlar las calorías de la comida mediante fotos y una para Windows usando Kinnect que simplemente pasa en tiempo real lo que estás tocando a una partitura que luego puedes imprimir (increíble).

game1
game2
game3

También nos dieron la oportunidad de enseñar nuestras apps e intercambiar opiniones (una de las partes de las que más aprendí) encontré apps muy entretenidas y recibí feedback de algunas de las mías. Me encantó ver las ideas tan geniales de otros MSP, pero sobretodo me quedo con la aplicación de mi compañero MSP de Turquía Oytun “Yegin Typing Warrior”, una app para Windows Phone que utiliza el teclado swipe para poder jugar y además practicar con ese estilo de teclado.

003

La siguiente tarde asistimos a la gala final de la Imagine Cup, un evento espectacular mucho más grande de lo que me imaginaba que fue retransmitido en directo, también puedes ver el vídeo en la web.
Después de ver las presentaciones de todos los concursantes y de que desvelaran los terceros y segundos premios, los finalistas de las 3 categorías fueron:
- TurnOn, Russia.
- Estimeet, New Zeland.
- Eyenaemia, Australia.
El gran ganador de estos que escogió el jurado fue Eyenaemia, una aplicación para ver el nivel de Anemia en las personas con solo hacer una foto.

004

Otra de las actividades de esa semana fue dedicar un día a una competición por equipos, es algo que ya hicimos en Madrid el año pasado con los MSP y MVP de nuestro país.
Se hacen equipos con gente a la que no conoces y hay una serie de pruebas por la ciudad, de manera que te ayuda a conocer a otras personas y también a conocer la ciudad en la que estás.
Me divertí mucho ese día y conocí a un montón de personas con las que no había hablado aún, además pude descubrir lugares increíbles de Seattle.

005

El último día visitamos MOHAI, que es el museo de historia e industria de Seattle, donde se dedicó todo el día a enseñar las Apps de los concursantes a la gente de la ciudad y tuvimos la oportunidad de dar consejos a los concursantes.
Sin duda una experiencia interesante la de poder dar opiniones e ideas a otros estudiantes que quizá no están tan experimentados cómo nosotros con este tipo de tecnologías y agradecieron mucho que les pudiéramos ayudar en algunos detalles.

Pero sobretodo fue un día para disfrutar y acabar de conocer a todos los concursantes y MSP.
Al final del día vimos otro ganador más, el ganador del público que fue elegido con los votos de la gente que vino al museo. Este año fue Chemicalium con la que puedes crear moléculas o incluso unirlas juntando dos móviles con NFC.

006

Resumiendo la gran semana:
- He intercambiado información y opiniones, conocido gente increíble de todo el mundo, con la que he aprendido mucho.
- You are students, you are the future! - ¡Sois estudiantes, sois el futuro!
Por mi parte solo puedo dar las gracias a las personas que han hecho que pueda ser parte de esto, Yalda, Jose y Scott ¡Gracias!

007

Y ahora si has llegado hasta aquí, te animo a participar en la Imagine Cup del año que viene, forma un equipo busca un mentor y muchas ganas de competir. Además si te gusta la tecnología Microsoft y eres estudiante te animo a participar en el grupo de MSP España, para mi estos dos últimos años han sido un continuo cambio y me han hecho crecer mucho cómo profesional y cómo persona.

Las fotos de este artículo han sido realizadas por diferentes MSP que acudieron al evento, muchas gracias a: Christian Barrero, Asar Dhandala, Tatty Gomez y Gustavo H. Magella.

 

Quique Fdez. Guerra – @Ckgrafico

Microsoft Student Partner

Cómo desarrollar aplicaciones de Node.js en Visual Studio

0
0

Node.js (Wikipedia) se ha convertido en un lenguaje de programación muy famoso para crear aplicaciones de servidor con Javascript. Dada la popularidad de este lenguaje en las aplicaciones web y lo extendido que están los navegadores no es de extrañar.

De hecho hay soporte nativo de Node.js en Azure Web Sites, donde puedes tener subir una aplicación hecha en noche con el fichero de package.js que contenga una lista de dependencias de paquetes de npm y se resolverán automáticamente en Azure.

Node.js Tools for Visual Studio

En este artículo se va a utilizar esta extensión de Visual Studio que permite a los desarrolladores de Node.js tener soporte de este lenguaje dentro de Visual Studio. Esto significa que se puede crear un nuevo proyecto basado en Node.js incluso utilizando un código existente o creando una aplicación de Express.js.

clip_image002

Nuevo proyecto

A la hora de crear un nuevo proyecto de Node.js en Visual Studio se puede utilizar una de las diferentes plantillas. Se puede crear una aplicación de consola en Node.js, una aplicación web vacía, basada en Express y además especificar que se puede subir a Azure.clip_image004

Intellisense

Hay dos tipos de Intellisense incluido en las Node.js Tools, uno que permite sugerir código de la aplicación que está desarrollando, es decir, del propio código Javascript y otro intellisense de los require.

clip_image006clip_image007

Depuración

Las Node.js Tools incluyen soporte de depuración con total integración de las características de depuración de Visual Studio. Para poder empezar a depurar solamente hay que establecer un punto de ruptura (breakpoint) en alguna línea de código y partir de ese instante se puede pulsar F5 o Start Debugging. En ese momento se lanza el runtime de Node.js basado en la configuración del proyecto y empieza la depuración.

clip_image009

Los punto de ruptura además soportan características avanzadas como por ejemplo establecer el número de veces que el código se ejecuta por ese punto antes de que se pare (Hit Count). También soportan el When Hit, que permite establecer un filtro para decidir cuándo se activa el punto de ruptura en basa a un pequeño código.

clip_image011

Si estas depurando tu aplicación pero no has establecido ningún punto de ruptura el depurador se parará cuando se produzca una excepción en el código. Esto se puede configurar en el menú de excepciones de Visual Studio.

clip_image013

Otra característica muy interesante del depurador de Visual Studio es el soporte del inspector de variables, que también está disponible en Node.js. De esa manera se puede explorar todas las propiedades de los objeto de Javascript que se tengan en ese instante en la pila.

clip_image014

clip_image015

Además se puede utilizar también la ventana del inmediato que permite ejecutar trozos de código contra la aplicación que está ahora mismo parada. Permitiendo volver a ejecutar alguna función o evaluar de nuevo alguna expresión.

clip_image017

Para finalizar la depuración dos cosas más, la posibilidad de ver la pila de llamadas en Javascript y poder explorar en todo momento el código fuente de la solución.

clip_image019

Y para terminar comentar que se permite la posibilidad de tener depuración remota en máquinas Linux y Mac desde Visual Studio.

NPM

NPM es el gestor de paquetes de Node.js que está perfectamente integrado en Visual Studio y permite agregar paquetes de Node.js desde una interfaz de usuario en la que se puede buscar.

clip_image021

Una vez que se ha instalado el paquete se puede ver como dependencia dentro del proyecto y ver el estado del mismo:

clip_image022

Como los paquetes no se pueden tener instalados localmente hay un estado para cada uno de ellos:

Package status:

  • clip_image023 Instalado y referenciado desde package.json
  • clip_image024 Externo (instanado pero no referenciado desde package.json)
  • clip_image025 No disponible (sin instalar, pero referenciado desde package.json)

Profiling

Conforme las aplicaciones van creciendo en complejidad y tamaño pueden hacerse pesadas y lentas, es importante tener una herramienta para poder hacer profiling del código e identificar donde se están produciendo el mayor gasto de cpu o memoria.

Para iniciar una sesión de profiling desde el menú analizar:

clip_image026

Aparece una ventana donde se puede seleccionar que aplicación se desea hacer el profiling.

clip_image027

Se ejecuta la aplicación, se navega a través de páginas para generar tráfico y una vez que se termina la sesión se cierra el runtime de Node.js y aparecerá una ventana dentro de Visual Studio con el resultado del profiling.

clip_image028clip_image029

Conclusión

Si estas desarrollando una aplicación de Node.js o estás pensando en hacerlo puedes tener toda la potencia de Visual Studio durante el desarrollo, y además tener la posibilidad de publicar el código en Azure directamente desde VS. Junto con Visual Studio Online se puede gestionar las tareas de trabajo, el código fuente y todo lo relacionado con el ciclo de vida de proyecto.

Luis Guerrero

Technical Evangelist Microsoft Azure

@guerrerotook


Microsoft Cloud Camps

0
0

Entre los meses de octubre y noviembre, tendrán lugar los Cloud Camps en diferentes ciudades de España. Te invitamos a unos eventos únicos ,y de formato reducido, en los que aprenderás a sacarle el máximo partido a las nuevas funciones de Microsoft Azure.

¿Qué tipo de eventos son?

Los Cloud Camps son eventos gratuitos y reducidos, hechos a medida por y para desarrolladores. De esta manera, podrás aprovechar y sacar todo el provecho posible a la jornada.

¿Qué voy a aprender?

Aprenderás a utilizar las nuevas características de Microsoft Azure y los servicios que incluye como Microsoft Azure Virtual Machines, Websites y Visual Studio 2013 para construir y mover una gran variedad de aplicaciones a la nube. Si ya tienes algún proyecto en mente, ¡este curso es un buen lugar para empezar!

¿Qué necesito para ir a un Cloud Camp?

Lo primero de todo, registrarte en el día y la ciudad que te interese. Tenemos cursos disponibles en Madrid, Barcelona, Bilbao, Sevilla y Valencia. Es imprescindible que lleves tu ordenador portátil para que puedas seguir el curso ya que el aula donde se impartirá no dispone de equipos.

Es recomendable que lleves instalado Visual Studio 2013 y tengas activada tu suscripción en Azure.

Regístrate ya en la página de los Cloud Camps. ¡Las plazas son limitadas! ;-)

Saludos,

Equipo MSDN

#retosMSDN: Solución al Reto 1 – ¡Ordenando listas!

0
0

Aquí tienes la solución que proponemos para el primero de los #retosMSDN: Reto 1 – ¡Ordenando listas!. Pero antes de continuar, queríamos dar las gracias a todos los que habéis participado en el reto, ¡y en especial a todos los que nos habéis enviado vuestras soluciones!

 

Nuestra Solución

Para cumplir el primero de los requisitos, con Visual Studio 2013 podemos crear una librería portable que funcione en aplicaciones hechas con .NET Framework 4.5, y en apps Universales (Windows 8.1+Windows Phone 8.1). Este debería de ser el mínimo de plataformas soportadas al crear la librería para este caso en particular:

 

clip_image002

 

Como ves podríamos haber creado una librería que incluso funcionase en apps para Android e iOS gracias a Xamarin.

 

Para cumplir el segundo de los requisitos, creamos una clase Persona con estas propiedades:

 

publicclass Persona
{publicstring Nombre { get; set; }publicuint Edad { get; set; }
}

Para cumplir el tercer requisito, creamos una clase Reto1 con un método que reciba una lista de personas y que la devuelva ordenada según los criterios especificados: por orden descendente de edad (es decir, los recién nacidos aparecerían al final de la lista), y si dos personas tienen la misma edad, por orden alfabético. En esta ocasión hemos optado por utilizar LINQ (Language-Integrated Query) y expresiones Lambda, que nos permiten ordenar la lista de manera muy sencilla:

 

publicclass Reto1
{publicstatic List<Persona> OrdenarLista(List<Persona> personas)
    {if (personas == null)
        {returnnull;
        }return personas.OrderByDescending(p => p.Edad).ThenBy(p => p.Nombre).ToList();
    }
}

 

Ahora, para que este método pase todos los tests y cumplir así el cuarto y último requisito, tenemos que sobrescribir el método Equals de la clase Persona. Si no hacemos esto verás que el test TestOrdenarListaDePersonasConElementos falla en el método CollectionAssert.AreEqual a pesar de estar ordenando bien las listas en nuestro método OrdenarLista. Y esto es así porque el método Equals que tienen los objetos por defecto (y que según la documentación es el que CollectionAssert.AreEqual usa por debajo) determina que dos objetos Persona son iguales sólo si sus referencias son iguales (si apuntan al mismo objeto), y no si los valores de sus propiedades son iguales:

 

publicoverridebool Equals(Object obj)
{
    Persona otra = obj as Persona;return (otra != null) && (this.Edad == otra.Edad) && (this.Nombre == otra.Nombre);
}

 

Y no olvides que si implementas el método Equals, deberías de implementar el método GetHashCode también, como especifica la documentación:

 

publicoverrideint GetHashCode()
{returnthis.Edad.GetHashCode() ^ this.Nombre.GetHashCode();
}
 

El código completo lo puedes encontrar en esta solución de Visual Studio 2013 que puedes descargarte de GitHub.

 

Vuestras Soluciones

Y como casi siempre, no hay una única manera de hacer las cosas. A continuación puedes ver algunas de las otras soluciones que nos habéis propuesto para la implementación de OrdenarLista:

 

@angel_g_santos ha optado por utilizar el método List<T>.Sort:

 

publicstatic List<Persona> OrdenarLista(List<Persona> lista)
{if (null != lista)
    {
        lista.Sort(new Persona.PersonaComparer());
    }return lista;
}

 

Donde PersonaComparer lo ha definido así:

 

publicclass Persona
{internalsealedclass PersonaComparer : IComparer<Persona>
    {publicint Compare(Persona x, Persona y)
        {int result = y.Edad.CompareTo(x.Edad);if (result == 0)
            {
                result = x.Nombre.CompareTo(y.Nombre);
            }return result;
        }
    }
}

 

Y @jfmiranda75 también ha optado por LINQ, pero sin usar expresiones Lambda:

 

publicstatic List<Persona> OrdenarLista(List<Persona> lista) 
{if (lista != null)return (from p in lista
                orderby p.Edad descending, p.Nombre 
                select p).ToList();returnnull;
}

 

Ya estamos preparando el reto de la semana que viene. El viernes 19 de septiembre ¡volveremos a la carga con los #retosMSDN!

Un saludo,

 

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

#retosMSDN: Reto 2 – ¡Esos eventos!

0
0

¡Por fin es viernes! Y como prometimos, aquí tienes el segundo de nuestros #retosMSDN.

 

El Reto

Partiendo de esta solución de Visual Studio 2013 que puedes descargarte de GitHub implementa la clase Reto2, cumpliendo los siguientes requisitos:

1) Funciona tal cual está especificado en los comentarios de los ficheros de la librería Reto2ClassLibrary.

2) Sólo puedes incluir código en el fichero Reto2.cs de la librería Reto2ClassLibrary. No puedes modificar ningún otro fichero de ninguno de los proyectos incluidos en la solución.

3) Para verificar que todo funciona bien, utiliza la aplicación de ejemplo incluida y ejecútala con Visual Studio. Pulsa todos los botones del “Botón 1” al “Botón 6” en cualquier orden. Al pulsar el botón “Ejecuta”, tienen que aparecer estos mensajes en la Consola de Visual Studio, exactamente en este orden e independientemente del orden en el que hayamos pulsado los botones:

 

[Reto2ClassLibrary] Verbose: OnEvent Item 1
[Reto2ClassLibrary] Verbose: OnEvent Item 2
[Reto2ClassLibrary] Verbose: OnEvent Item 3
[Reto2ClassLibrary] Verbose: OnEvent Item 4
[Reto2ClassLibrary] Verbose: OnEvent Item 5
[Reto2ClassLibrary] Verbose: OnEvent Item 6

 

4) En la clase Reto2 no puedes llamar directamente a ningún método de las clases de System.Diagnostics, ni a ningún método de las clases de la librería ETWClassLibrary, ni a ningún método de Reto2ClassLibrary.Item.

 

La Solución

¿Ya lo has resuelto? Comparte con nosotros tu solución de Visual Studio en esmsdn@microsoft.com.

El viernes de la semana que viene, el día 26 de septiembre, publicaremos la solución que nosotros proponemos para el reto.

 

¿Sabías que…

Con el namespace System.Diagnostics.Tracing puedes utilizar Event Tracing for Windows (ETW) para instrumentar tus aplicaciones .NET (incluidas las apps WinRT para Windows 8.1 y Windows Phone 8.1). ETW nos proporciona un sistema de tracing de eventos de propósito general y alto rendimiento.

 

 

Si tienes cualquier duda o problema durante la resolución del reto, o si quieres proponer tu propio reto para retar al resto de la comunidad, no dudes en ponerte en contacto con nosotros.

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

#retosMSDN: Solución al Reto 2 – ¡Esos eventos!

0
0

Aquí tienes la solución que proponemos para el segundo de los #retosMSDN: Reto 2 – ¡Esos eventos!. Una vez más, queríamos dar las gracias a todos los que habéis participado en el reto. Vuestra participación nos anima a seguir creando nuevos retos. Y si quieres retar al resto de la comunidad con tu propio reto, recuerda que puedes enviárnoslo a esmsdn@microsoft.com.

 

Nuestra solución

La clave de la resolución de este reto está en entender el propósito del código con la ayuda de los comentarios incluidos, y entender como funcionan los eventos en C#.

 

Según el código y sus comentarios:

1) Al Reto2.EventFired sólo se pueden subscribir métodos de objetos de tipo Item. Los demás son ignorados.

2) Item.Index determina el orden en el que se ejecutarán los métodos de los diferentes objetos Item subscritos.

3) Reto2.FireEvent se utiliza para lanzar el evento.

4) Al lanzar el evento, el método correspondiente (Item.OnEvent en este caso) debería de ser invocado para cada uno de los objetos Item subscritos, en el orden especificado en el punto #2.

Respecto al funcionamiento por defecto de los eventos C#: cuando varios objetos subscriben uno de sus métodos a un evento, al lanzarse el evento dichos métodos serán invocados en el mismo orden en el que se subscribieron.

Así que resumiendo, la idea de este reto es tener un evento en la clase Reto2 al que de igual en qué orden se subscriban los métodos de los objetos Item, ya que al lanzarse el evento dichos métodos se invocarán en el orden especificado por la propiedad Index del Item.

 

Cuando declaramos un evento en nuestra clase podemos utilizar una sintaxis similar a la de las propiedades, e implementar unos métodos add y remove (Event Accessors) que nos permiten modificar el comportamiento cuando algún objeto se subscribe o se de-subscribe. En nuestro caso hemos declarado así el evento:

 

private EventHandler eventFired;publicevent EventHandler EventFired
{
    add
    {if ((value != null) && (value.Target is Item))
        {this.eventFired += value;

            var orderedDelegates =
                from oneDelegate inthis.eventFired.GetInvocationList()
                let item = oneDelegate.Target as Item
                orderby item.Index
                select oneDelegate;this.eventFired = (EventHandler)Delegate.Combine(orderedDelegates.ToArray());
        }
    }

    remove
    {
        this.eventFired -= value;
    }
}

 

Lo primero que hacemos en add es comprobar que el objeto del método que se está subscribiendo es de tipo Item, para ignorarlo en caso contrario. Verás que también ignoramos el que alguien se subscriba al evento con un ‘null’, ya que este es el comportamiento por defecto de los eventos en C#. Después subscribimos el método que nos han pasado al evento interno que nos hemos creado en la clase (eventfired). Con LINQ (Language-Integrated Query) ordenamos la lista de métodos subscritos a ese evento interno. Y por último reconstruimos el evento interno ahora ya sí, con la lista de métodos a invocar ordenada tal y como queremos.

La parte de remove es muy sencilla, ya que nos da igual que el método a de-subscribir no sea de un objeto de tipo Item o incluso sea ‘null’; son ignorados sin más por defecto.

 

A la hora de disparar el evento usamos el evento interno, y nos quedaría así de sencillo:

 

publicvoid FireEvent()
{if (this.eventFired != null)
    {this.eventFired(this, EventArgs.Empty);
    }
}

Lo más importante de este método es tener en cuenta que si FireEvent fuese llamado antes de que nadie se subscribiese al evento, eventFired estaría a null.

 

El código completo lo puedes encontrar en esta solución de Visual Studio 2013 que puedes descargarte de GitHub.

 

Vuestras soluciones

Como siempre, no hay una única manera de hacer las cosas.

 

@lantoli, por ejemplo, ha ordenado la lista de invocación con LinQ pero utilizando expresiones Lambda, y ha reconstruido la lista de invocación de manera diferente:

 

private EventHandler handler;publicevent EventHandler EventFired
{
    add {if (value.Target is Item) {
            var list = handler == null ? new List<EventHandler>() 
                       : handler.GetInvocationList().OfType<EventHandler>().ToList();foreach (var evt in list) {
                handler -= evt;
            }
            list.Add(value);foreach (var evt in list.OrderBy(x => (x.Target as Item).Index)) {   
                handler += evt;
            }
        }
    }

    remove {
       handler -= value;
    }
}publicvoid FireEvent() {if (handler != null) { 
        handler(this, EventArgs.Empty);
    }
}

 

Por otro lado, a la hora de implementar nuestra solución hemos asumido que normalmente la subscripción de los objetos al evento pasará pocas veces (una vez por objeto), mientras que FireEvent podría ser llamado muchas más veces (aunque en el ejemplo que os proporcionamos sólo se le llame una vez). Por lo que optamos por ordenar la lista de invocación en add. Ahora, en otros casos podría ser más eficiente ordenar la lista en FireEvent. Y esa es la solución por la que habéis optado varios de vosotros, como por ejemplo @javierglozano:

 

private EventHandler _store;publicevent EventHandler EventFired
{
    add
    {if (value.Target is Item)
        {
            _store += value;
        }
    }

    remove
    {
        _store -= value;
    }
}publicvoid FireEvent()
{if (_store != null)
    {
        IEnumerable<Delegate> callbacks = from s in _store.GetInvocationList() orderby (s.Target as Item).Index select s;foreach (Delegate d in callbacks)
        {
            d.DynamicInvoke(this, EventArgs.Empty);
        }
    }
}

 

¡El próximo viernes 3 de octubre publicaremos el siguiente de nuestros #retosMSDN!

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

#retosMSDN: Reto 3 – Volcando objetos en C#

0
0

 

¡Ya está aquí el tercero de los #retosMSDN! Pero esta vez el reto no lo ponemos nosotros. Eduard Tomàs (@eiximenis), MVP en ASP.NET, nos ha propuesto el siguiente reto. ¿Estás preparado?

 

El Reto

El objetivo del reto es crear una clase ObjectDumper que permita obtener la información de las propiedades que tenga un objeto.

Dicha clase debe tener un método Dump() que reciba el objeto y debe devolver una colección de KeyValuePair<string, string> donde:

· El valor de la propiedad “Key” es el nombre de la propiedad

· El valor de la propiedad “Value” es el valor de la propiedad (por defecto convertido a cadena).

Dicha colección debe estar ordenada por el nombre de la propiedad.

Así para ver las propiedades de un objeto por pantalla podríamos tener el siguiente código:

 

var desc = dumper.Dump(ufo);foreach (var line in desc)
{
    Console.WriteLine(string.Format("{0}:{1}", line.Key, line.Value));
}

 

P. ej. si tenemos un objeto como el siguiente:

 

var ufo = new Ufo()
{
    Name = "Conqueror III",
    Speed = 10,
    Origin = new Planet()
    {
        Name = "Alpha Centauri 3",
        DaysPerYear = 452
    }
};

 

Y mostrásemos por pantalla la información, la salida sería algo como:

 

image

 

La clase ObjectDumper debe ofrecer un método AddTemplateFor para permitir especificar una plantilla (un método) para convertir a cadena aquellas propiedades especiales. El uso de dicho método sería como sigue:

 

dumper.AddTemplateFor(u => u.Origin, p=>string.Format("({0},{1})", p.Name, p.DaysPerYear));

El primer parámetro (u=>u.Origin) indica la propiedad para la cual se desea establecer la plantilla, mientras que la segunda expresión indica el código a usar para pasar los valores de dicha propiedad a cadena.

Con esa plantilla añadida la salida por pantalla sería:

 

image

 

Por último, debe evitarse llamar a las propiedades del objeto que está siendo “volcado” hasta que no es necesario. P. ej. en este caso, solo se invocaria la propiedad Name del objeto “ufo”:

 

var desc = dumper.Dump(ufo);
var nameProp = desc.First();

Ni la propiedad “Origin”, ni la “Speed” son invocades debido a que en ningún momento se consultan.

 

Puedes apoyarte en los tests unitarios incluidos en este proyecto de Visual Studio 2013 que puedes descargarte de GitHub para verificar que tu implementación es correcta.

 

La Solución

¿Ya lo has resuelto? Comparte con nosotros tu solución de Visual Studio en esmsdn@microsoft.com.

El viernes de la semana que viene, el día 10 de octubre, publicaremos la solución que Eduard nos ha proporcionado para el reto.

 

¿Conoces…

… la palabra clave yield de C#? Puede serte útil.

 

Si tienes cualquier duda o problema durante la resolución del reto, o si quieres retar al resto de la comunidad como ha hecho Eduard, no dudes en ponerte en contacto con nosotros.

¡¡¡Muchas gracias Eduard por hacer nuestra semana más interesante!!!

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

#retosMSDN: Solución al Reto 3 – Volcando objetos en C#

0
0

El pasado viernes Eduard Tomàs (@eiximenis), MVP en ASP.NET, nos propuso el tercero de los #retosMSDN: Reto 3 – Volcando objetos en C#. En primer lugar, quiero darle las gracias a Eduard por proponer un reto tan interesante que ha puesto a prueba nuestros conocimientos de C#. En segundo lugar, quiero daros las gracias una vez más a todos los que habéis participado en el reto.

 

La solución de Eduard

La solución que nos propone Eduard es muy completa, ya que combina el uso de Genéricos para que ObjectDumper pueda funcionar con cualquier tipo de objeto, Reflexión para poder obtener información del objeto y sus propiedades, LINQ y expresiones lambda para poder manipular la colección de propiedades del objeto de manera muy sencilla, expresiones de LINQ para poder obtener información de las expresiones lambda pasadas a AddTemplateFor como parámetro y poder llegar así a obtener el nombre de la propiedad a la que añadimos el template, y la palabra clave Yield para evitar el uso de colecciones intermedias en el método Dump:

 

publicclass ObjectDumper<T>
{privatereadonly Dictionary<string, Delegate> _templates;public ObjectDumper()
    {
        _templates = new Dictionary<string, Delegate>();
    }publicvoid AddTemplateFor<TR>(Expression<Func<T, TR>> propExp, Func<TR, string> template)
    {
        var property = propExp.AsPropertyInfo();if (property == null)
        {return;
        }
        _templates.Add(property.Name, template);

    }

    public IEnumerable<KeyValuePair<string, string>> Dump(T data)
    {if (((object)data) == null ) yieldbreak;

        var dataType = data.GetType();
        foreach (var property in dataType.GetProperties().Where(p => p.CanRead).OrderBy(p=>p.Name))
        {
            var template = _templates.ContainsKey(property.Name) ? _templates[property.Name] : null;if (template != null)
            {yieldreturn ApplyTemplateForProperty(property, data, template);
            }elseyieldreturn ApplyStandardDumpForProperty(property, data);
        }
    }private KeyValuePair<string, string> ApplyTemplateForProperty(PropertyInfo property, T data, Delegate template)
    {
        var value = property.GetValue(data);returnnew KeyValuePair<string, string>(property.Name, template.DynamicInvoke(value) asstring);
    }private KeyValuePair<string, string> ApplyStandardDumpForProperty(PropertyInfo property, T data)
    {
        var value = property.GetValue(data);returnnew KeyValuePair<string, string>(property.Name, Convert.ToString(value));
    }

}

 

Y AsPropertyInfo lo ha definido como un método de extensión de la clase Expression:

 

staticclass ExpressionExtensions
{publicstatic PropertyInfo AsPropertyInfo<T, TR>(this Expression<Func<T, TR>> expr)
    {
        var memberExp = expr.Body as MemberExpression;if (memberExp == null)
        {returnnull;
        }return memberExp.Member as PropertyInfo;
    }
}

El código completo lo puedes encontrar en esta solución de Visual Studio 2013 que puedes descargarte de GitHub.

 

Vuestras soluciones

Y como no hay una única manera de hacer las cosas, a continuación puedes ver la solución que nos propuso @rsciriano:

 

publicclass ObjectDumper<T> where T: class
{
    Dictionary<string, Delegate> templates = new Dictionary<string,Delegate>();public IEnumerable<KeyValuePair<string, string>> Dump(object source)
    {if (source == null)
        {yieldbreak;
        }else
        {// Bucle por las propiedades publicas del objetoforeach (var prop in source.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty).OrderBy(p => p.Name))
            {// Solo trabajar con propiedades que tienen método Getif (prop.GetMethod != null)
                {// Buscar template para la propiedad
                    Delegate templateDelegate;if (templates.TryGetValue(prop.Name, out templateDelegate))
                    {// Aplicar template al valoryieldreturnnew KeyValuePair<string, string>(prop.Name, (string) templateDelegate.DynamicInvoke(prop.GetValue(source)));
                    }else
                    {// Llamar a ToString (teniendo en cuenta el valor null)yieldreturnnew KeyValuePair<string, string>(prop.Name, prop.GetValue(source) != null ? prop.GetValue(source).ToString() : null);
                    }
                }
            }
        }
    }publicvoid AddTemplateFor<TValue>(Expression<Func<T, TValue>> property, Func<TValue, string> value)
    {if (property != null)
        {// Obtener expresión para poder extraer el nombre de la propiedad
            MemberExpression exp = property.Body as MemberExpression;// Almacenar la template en el diccionario  if (exp != null)
                templates[exp.Member.Name] = value;
        }
    }
}

 

Además de todo lo que hemos mencionado que usa Eduard en su solución, puedes ver en esta solución el uso de la cláusula where al definir la clase genérica ObjectDumper. 

 

¡El próximo viernes 17 de octubre publicaremos el siguiente de nuestros #retosMSDN! Y si quieres retar al resto de la comunidad con tu propio reto, recuerda que puedes enviárnoslo a esmsdn@microsoft.com.

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

El stack MEAN (Mongo+Express+AngularJS+Node.js) de JavaScript con tecnología de Microsoft

0
0

JavaScript se ha convertido en un lenguaje lo suficientemente maduro para que, no solo se pueda usar para validar formularios HTML en un navegador, sino que es una tecnología que permite crear aplicaciones en cliente y en servidor de forma muy potente.

En este artículo se va a repasar la pila de MEAN de JavaScript que se refiere a: Mongo+Express+AngularJS+Node.js salvo que en vez de utilizar Mongo como almacén de datos se va a utilizar DocumentDB el servicio de almacenamiento de Documento basado en JSON como servicio que se ofrece en Azure. Y en vez de programar JavaScript directamente se va a utilizar TypeScript un lenguaje open source por parte de Microsoft que es un subset de JavaScript permitiendo utilizar orientación a objetos a la hora de escribir el código.

Así que al final se va a tener DEANT que sería DocumentDB+Express+Angular+Node.js+TypeScript

clip_image002[1]

Node.js Tools for Visual Studio

Antes de comenzar con el artículo merece la pena recordar que Microsoft ofrece de manera gratuita para los desarrolladores de Node.js un plugin que se integra con Visual Studio 2012 y 2013 que permite crear aplicaciones en Node.js con soporte de depuración, Intellisense, profiling y demás integraciones con Visual Studio.

Para más información en este artículo de MSDN España: http://blogs.msdn.com/b/esmsdn/archive/2014/09/11/c-243-mo-desarrollar-aplicaciones-de-node-js-en-visual-studio.aspx

Backend del stack DEANT

Por la parte de servidor se va a utilizar los siguientes componentes Express, DocumentDB y Node.js

Express

Express.js es un framework web para crear aplicaciones web con Node.js, se puede descargar desde http://expressjs.com/ o utilizando el comando npm install express

Este framework es muy ligero y no oculta ninguna de las características que hacen interesante a Node.js, pero permite utilizar un sistema de plantillas para generar las vistas de las diferentes rutas, se apoya en Jade, otro framework para la generación de vistas basadas en fichero .jade

clip_image004[1]

clip_image006[1]

DocumentDB

DocumentDB es la base de datos basada en documentos sin esquema, ofrecida como servicio en Azure. Estas son lagunas de las características que ofrece el servicio:

  • Consultas Ad hoc con una sintaxis familiar de SQL: Se puede almacenar documentos JSON heterogéneos dentro del servicio y luego tener la posibilidad de hacer consultas de esos documentos usando un lenguaje SQL. DocumentDB utiliza un sistema de indexación altamente concurrente, libre de bloqueos y estructurado que permite automáticamente indexar todo el contenido del documento sin importar el esquema del mismo.
  • Ejecución de JavaScript dentro de la base de datos: Procedimientos almacenados, disparadores (triggers) y funciones definidas por el usuario (UDFs) se pueden definir utilizando JavaScript, eso permite tener la posibilidad de escribir toda la lógica de tu aplicación directamente usando JSON sin tener que tener problemas de esquemas. DocumentDB es una base de datos completamente transaccional utilizando JavaScript, permitiendo así que las operaciones CRUD de INSERT, REPLACE, DELETE y SELECT se ejecuten como transacciones aisladas.
  • Niveles de consistencia configurables: Se puede elegir un nivel de consistencia en el servicio, para balancear entre consistencia y rendimiento de datos. Para consultas y operaciones de lectura DocumentDB ofrece cuatro niveles de consistencia: Strong, Bounded-Stateness, Session y Eventual.
  • Completamente administrado: Se elimina la necesidad de administrar la base de datos y los recursos de la maquina en la que se ofrece el servicio. Como servicio completamente administrado en Azure, no hay necesidad de administrar máquinas virtuales, desplegar y configurar el software o tener que lidiar con complejas actualizaciones del servicio. Todo funciona directamente.
  • Almacenamiento y throughput escalable y elástico: Escala fácilmente los recursos disponibles de DocumentDB para que cumpla con las exigencias de tu aplicación.
  • Abierto por diseño: Empieza a utilizar DocumentDB directamente sin necesidad de adquirir nuevos conocimientos. DocumentDB utiliza una API RESTful con JSON para comunicarse y no hay necesidad de crear conexiones contra la base de datos.

Recursos de Azure DocumentDB

DocumentDB maneja el acceso a los diferentes recursos a través de recursos bien definidos como tramos de la URL.

El nivel jerárquico más alto es la cuenta, de la cual aparece una colección de base de datos. Para cada base de datos hay dos recursos, usuarios y colecciones de documentos.

Los usuarios es un mecanismo que tiene DocumentDB para generar usuarios que puedan acceder a determinadas colecciones dentro de la base de datos.

Las colecciones representan los documentos JSON que están alojados dentro de la base de datos, pero los documentos pertenecientes a la misma colección no tienen por qué tener el mismo esquema, es decir, que puede ser de cualquier manera.

Dentro de cada uno de los documentos JSON aparece una sección llamada adjuntos, que como su nombre aclara, sirve para gestionar los binarios adjuntos a ese documento en concreto. La parte interesante de esta gestión de archivos adjuntos por cada documento, es que estos binarios son almacenados en una cuenta de Azure Storage, así que el usuario no tiene que añadir una capa de complejidad mayor para gestionar estos adjuntos.

Las tres últimas secciones son procedimientos, disparadores y funciones definidas por el usuario.

DocumentDB Node.js API

Para empezar a trabajar con DocumentDB desde Node.js hay que instalar el paquete documentdb, además para gestionar la configuración de acceso a la base de datos se utiliza el paquete nconf.


var DocumentDBClient = require('documentdb').DocumentClient;
var nconf = require('nconf');
// tell nconf which config file to use
nconf.env();
nconf.file({ file: 'config.json' });
var host = nconf.get("HOST");
var authKey = nconf.get("AUTH_KEY");
var databaseId = nconf.get("DATABASE");
var collectionId = nconf.get("COLLECTION");
// create an instance of the DocumentDB client
var client = new DocumentDBClient(host, { masterKey: authKey });

TypeScript

Otro de los elementos que aparece en el diagrama de la aplicación es TypeScript. Este lenguaje, junto con las definiciones de lenguaje permite al desarrollador, utilizar frameworks de terceros como, jQuery y AnguarJS directamente en TypeScript, como si estuvieran escritos en el mismo lenguaje. En nuget hay una lista con las definiciones de los lenguajes que se están disponibles para poder utilizar TypeScript.

https://www.nuget.org/profiles/DefinitelyTyped

clip_image008

Ese paquete de nuget lo que descarga es un fichero con extensión .d.ts que son las definiciones para poder usarlas dentro de otros ficheros TypeScript.

clip_image009

Para poder acceder a esas definiciones dentro de cualquier otro fichero de TypeScript hay que incluir esta referencia al principio del fichero:

/// <reference path="../scripts/typings/jquery/jquery.d.ts" />

/// <reference path="../scripts/typings/angularjs/angular.d.ts" />

Así de esa manera se tiene acceso a las definiones de lenguaje de jQuery y AngularJS.

Por ejemplo, en esta clase, se ha definido un método para poder hacer llamadas a un servicio web usando el objeto JQueryAjaxSettings de jQuery, directamente desde código de TypeScript.

clip_image011

Conlusión

Hoy en día Visual Studio es lo suficientemente flexible como para poder trabajar con diferentes tipos de frameworks y tecnologías con un soporte fantástico. Además si eres desarrollador de JavaScript puedes desarrollar aplicaciones utilizando este lenguaje tanto en cliente como en servidor de una manera muy cómoda.

Además todo esto si quieres rizar el rizo, se puede programar la parte de servidor con Node.js con TypeScript también, haciendo que la parte de servidor la programes en este lenguaje y el resultado del fichero de TypeScript sea JavaScript que el intérprete de Node.js ejecute.

Por supuesto en Visual Studio tiene soporte de esta característica, permitiéndote crear un proyecto de Node.js con TypeScript.

clip_image013

Luis Guerrero.

Technical Evangelists Microsoft Azure.

@guerrerotook


C# está en todas partes

0
0

C# es uno de los lenguajes de programación más populares del mundo. Es parte de la plataforma de desarrollo Microsoft .NET Framework (actualmente en su versión 4.5.2), y estas son algunas de sus principales características:

  • Deriva de C/C++, y es similar a Java.
  • Es Orientado a Objetos.
  • Es simple, moderno y de propósito general.
  • Tiene revisión estricta de tipos de datos.
  • Tiene revisión de límites de vectores.
  • Tiene detección de intentos de usar variables no inicializadas.
  • Tiene recolección de basura.

 

image

 

En MSDN (Microsoft Developer Network) puedes encontrar más información sobre .NET Framework, la guía de programación de C#, conceptos de programación de C#  y mucho más. Estos son algunos ejemplos de funcionalidades de este lenguaje(actualmente en su versión 5.0) y que hacen que tenga la potencia que tiene:

 

Pero aquí no acaba la cosa. .NET y C# está en constante evolución, y aquí tienes un adelanto de lo que está por venir: The New and Improved C# 6.0, .NET Compiler Platform ("Roslyn")

 

El Universo .NET es muy amplio, y a continuación te contamos algunas de las cosas que puedes hacer gracias a .NET en general y a C# en particular.

 

¿Qué puedo desarrollar con C#?

Aplicaciones de escritorio

  • Aplicaciones de consola, de las de toda la vida, sin interfaz de usuario propiamente dicho.

image 

image

  • Aplicaciones de cliente Windows con Windows Presentation Foundation (WPF) , mucho más avanzadas visualmente hablando. Gracias a la creación de interfaces de usuario con XAML y a capacidades avanzadas como los databinding, podemos desacoplar el código de la capa de presentación para que diseñadores y desarrolladores puedan trabajar de manera simultánea, y reducir los costes de desarrollo y mantenimiento de nuestras aplicaciones.

image

 

Apps

image

  • Apps Multi-Dispositivo con Xamarin. Gracias a Mono, una implementación Open Source del .NET Framework y compatible con éste, puedes desarrollar aplicaciones .NET para los más variados dispositivos con Windows, Linux, OS X, Android, iOS, Xbox 360, PlayStation 3, Wii, etc. Xamarin se apoya en Mono, y nos permite desarrollar apps móviles multi-plataforma con C# para Windows, OS X, Windows Phone, Android e iOS.

image

 

Servicios

image

 

Aplicaciones y Servicios Web

image

  • Aplicaciones Web con ASP.NET Web Pages o ASP.NET Web Forms, que nos permiten desarrollar aplicaciones web de manera muy rápida y sencilla.
  • Servicios Web con ASP.NET Web API, un framework con el que podemos construir servicios HTTP de manera muy sencilla para todo tipo de clientes, navegadores y dispositivos móviles. Es una plataforma ideal para crear aplicaciones RESTful.

image

 

Además, con la librería ASP.NET SignalR podemos hacer que el lado de servidor de nuestras aplicaciones web provea de contenido en tiempo real a los clientes conectados según lo tenga disponible, gracias a la comunicación bi-direccional que permite entre el servidor y los clientes.

Por cierto, ASP.NET MVC, Web Pages y Web API son proyectos Open Source.

 

Videojuegos

  • Videojuegos con MonoGame, un proyecto Open Source basado en Mono, que nos permite utilizar C# para desarrollar grandes juegos multi-plataforma de manera muy sencilla: para Windows, Windows Store, Linux, OS X, Windows Phone, Android e iOS.
  • Videojuegos con Unity, uno de los motores de videojuegos multiplataforma más conocidos y utilizados del mercado, con el que han sido creados grandes juegos, y que nos permite utilizar C# para escribir sus scripts. Podremos crear videojuegos para numerosas plataformas: para Windows, Windows Store, OS X, Linux, Windows Phone, iOS, Android, BlackBerry, Xbox 360, Xbox One, PS3, PS4, PSVita, Playstation Mobile, Wii U, e incluso para web gracias a Unity Web Player. Podemos además utilizar las  Visual Studio Tools for Unity para ayudarnos en la creación y depuración del videojuego.

image

 

Internet of Things (IoT)

  • Aplicaciones embebidas con .NET Compact Framework, una versión reducida del .NET Framework usada con Windows Mobile y Windows Embedded CE.
  • Aplicaciones embebidas con .NET Micro Framework, la versión más pequeña del .NET Framework, Open Source, y cuyo SDK que podemos utilizar para desarrollar con placas como las de netduino.

image

 

Las herramientas

Para desarrollar en C#, la mejor herramienta que tienes a tu disposición es Visual Studio (actualmente en su versión 2013 Update 3), uno de los IDEs más potentes del mercado (el más potente si me preguntas a mí). Y además de todo lo que ofrece de serie, cuenta con muchas extensiones que te harán la vida más fácil, como por ejemplo:

Tienes también a tu disposición un gran número de Bibliotecas .NET (NuGet) para añadir funcionalidad a tus proyectos, como por ejemplo:

También tienes una serie de SDKs que te ayudarán a desarrollar tus diferentes proyectos, y te proporcionarán librerías y herramientas adicionales como emuladores, etc.:

 

Si además quieres gestionar el ciclo de vida completo de tu aplicación, puedes utilizar Visual Studio Online.

 

¿Quieres saber más?

Tanto si estás aprendiendo a programar, como si quieres aprender C# o afianzar conocimientos sobre este lenguaje, en Microsoft Virtual Academy encontrarás todo tipo de cursos gratuitos sobre C#, ASP.NET MVC, desarrollo de apps móviles, videojuegos, etc., etc.

 

También tienes a tu disposición nuestros diferentes sitios para desarrolladores, donde podrás encontrar herramientas, documentación, ejemplos, etc.:

MSDN (Microsoft Developer Network)

Windows Dev Center

Azure Dev Center

Office Dev Center

Xbox Dev Center

Visual Studio Dev Center

 

 

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

#retosMSDN: Reto 4 – Mezclando con eficiencia en C#

0
0

¡Por fin es viernes! Y como prometimos, ¡ya tienes aquí el cuarto de nuestros #retosMSDN!

Esta vez el reto está basado en una idea que nos ha dado @maktub82. ¡Muchas gracias Sergio!

 

El Reto

Crea un método que dada una lista de elementos devuelva dicha lista con todos sus elementos mezclados de manera aleatoria, y de manera que ningún elemento esté en la misma posición que en la lista original.

 

Puedes apoyarte en los tests unitarios incluidos en este proyecto de Visual Studio 2013 que puedes descargarte de GitHub para verificar que tu implementación es correcta (teniendo en cuenta que los tests no van a probar que de verdad el orden es aleatorio, sólo las otras condiciones que tiene que cumplir la lista mezclada resultante).

 

¡Ah! Y queremos que la ejecución del método sea lo más rápida posible.

 

La Solución

¿Ya lo has resuelto? Comparte con nosotros tu solución de Visual Studio en esmsdn@microsoft.com.

El viernes de la semana que viene, el día 24 de octubre, publicaremos la solución que nosotros proponemos para el reto. ¿Será la tuya más rápida que la nuestra? De entre todas las soluciones que nos enviéis durante la semana publicaremos las más rápidas de todas.

 

¿Sabías que…

… con Test Explorer de Visual Studio puedes por un lado ver el tiempo que tardan en ejecutarse los Test Unitarios y la salida de los mensajes que escriban por consola…

image

… y por otro lado depurarlos, analizar el código que cubren o ejecutar el Profiler para analizar su rendimiento?

image

Aquí puedes encontrar más información que te será de utilidad para resolver este reto:

Walkthrough: Creating and Running Unit Tests for Managed Code

Running Unit Tests with Test Explorer

 

Si tienes cualquier duda o problema durante la resolución del reto, o si quieres proponer tu propio reto para retar al resto de la comunidad, no dudes en ponerte en contacto con nosotros.

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

Clubs .NET: Pequeñas iniciativas, gran potencial

0
0

A menudo escuchamos tanto la coletilla “change the world” que a veces deja de tener sentido. No nos damos cuenta de que son, precisamente, las pequeñas iniciativas las que ayudan a empujar la rueda que hace girar el mundo.

Así que, me gustaría presentaros a los clubs .NET: nacen del espíritu de estudiantes apasionados que lo “único” que desean es disfrutar con lo que más les gusta: la tecnología. Y sin embargo, nos sorprenden en más de una ocasión.

 

Instituto Tajamar (Madrid)

Universidad de Albacete

Universidad de Alcalá

Universidad de Alicante

Universidad Autónoma de Barcelona

Universidad Autónoma de Madrid

Universidad de Cantabria

Universidad Complutense de Madrid

  • Nombre:
  • Web:  Construyendo
  • Twitter:
  • Contacto: Alberto González
  • Información: club creado este año pero que dará mucho de que hablar con sus talleres de  Unity.

Universidad de A Coruña

  • Nombre: Fic .NET Club
  • Web: Construyendo
  • Email:   fic.net@outlook.com
  • Contacto: Alejandro Martín (@alex030293 )
  • Información:focalizados en la promoción de las novedades de Microsoft, y próximamente será uno de los participantes de un proyecto que está en plena ebullición.

Universidad de Málaga

Universidad Oberta de Catalunya

  • Nombre: UOC DotNetClub
  • Web: Construyendo
  • Twitter: @UOCDotNetClub
  • Contacto:  Cristian Moreno (@dantebcn85)
  • Información:les encantan dar webcasts y podcasts y próximamente unos vídeos chulísimos creados por ellos.

Universidad de Oviedo

  • Nombre: Uniovi
  • Twitter:  @eiinetclub
  • Contacto:Diego Zapico (@Zapy91)
  • Información: su objetivo es aprender y compartir conocimientos de cualquier tecnología.

Universidad Politécnica de Madrid Campus Sur

  • Nombre:DotNetClub EUI UPM
  • Web: http://dotnet.eui.upm.es/blog/
  • Twitter:@dotnetclubEUI
  • Contacto:Roberto Pérez
  • Información: otro club que está en renovación de equipo, pero en el pasado estuvieron muy activos y este año empezarán con energías renovadas. Les gusta mucho Azure, robótica, IA, BBDD, microelectrónica, apps...

Universidad Politécnica de Madrid IEEE

Universidad Rey Juan Carlos

Universidad de Salamanca

UNED

 

#retosMSDN: Solución al Reto 4 – Mezclando con eficiencia en C#

0
0

Aquí tienes la solución que proponemos para el cuarto de nuestros #retosMSDN: Reto 4 – Mezclando con eficiencia en C#, basado en una idea de @maktub82. Gracias Sergio por la idea y gracias una vez más a todos los que habéis participado en el reto.

 

Nuestra solución

En esta ocasión pedíamos velocidad a la hora de realizar las operaciones, además de cumplir con los requisitos del reto. Nosotros para nuestra solución hemos optado por un algoritmo de mezcla basado en el de Fisher-Yates, y hemos usado la clase Random para generar los números aleatorios. Como bien puntualizaba @lantoli hay algoritmos con mejores propiedades aleatorias pero más lentos, y clases con aleatoriedad más fuerte como RNGCryptoServiceProvider, pero también más lentas.

 

publicstaticclass ListExtensions
{privatestatic Random random = new Random();publicstatic List<T> Shuffle<T>(this List<T> original)
    {
        T[] shuffled = original.ToArray();for (int index = shuffled.Length - 1; index > 0; index--)
        {int randomIndex = random.Next(index);

            T temp = shuffled[index];
            shuffled[index] = shuffled[randomIndex];
            shuffled[randomIndex] = temp;
        }

        return shuffled.ToList();
    }
}

 

El método Shuffle que hemos implementado es un método de extensión de la clase List, ya que los tests unitarios lo usan así:

 
List<int> original = GenerateTestList(10000000);

List<int> shuffled = original.Shuffle();
 

El método Shuffle no viene de serie con la clase List, y no podemos heredar de la clase List.

El método además es genérico para poder funcionar con cualquier tipo de datos, y no sólo con los int que se usan en los tests unitarios para pruebas.

 

El código completo lo puedes encontrar en esta solución de Visual Studio 2013 que puedes descargarte de GitHub.

 

Vuestras soluciones

Muchos nos habéis enviado soluciones muy similares a la nuestra, pero manipulando directamente un objeto de tipo List, en lugar de un array. Algo como esto:

 

publicstatic List<T> Shuffle<T>(this List<T> original)
{
    List<T> shuffled = original.ToList();for (int index = shuffled.Count - 1; index > 0; index--)
    {int randomIndex = random.Next(index);

        T temp = shuffled[index];
        shuffled[index] = shuffled[randomIndex];
        shuffled[randomIndex] = temp;
    }

    return shuffled;
}

 

Tomando tiempos en mi máquina, este método tarda casi un 50% más de tiempo en mezclar 10 millones de elementos que el que utiliza el array.

Si utilizamos el Profiler de los tests unitarios con el método TestShuffle10000000Items, podemos ver donde se nos va más el tiempo cuando utilizamos el objeto List en lugar del array:

 

image

Donde más se nos va el tiempo es leyendo y escribiendo los elementos que intercambiamos de la lista. Usando un array en su lugar, encontrar un elemento por su índice es bastante más rápido.

 

@lantoli nos ha enviado una solución prácticamente idéntica a la nuestra, y @angel_g_santos nos ha enviado una solución también muy similar, aunque con una pequeña variación, ya que usa un método para intercambiar los elementos del array, cosa que apenas tiene impacto en el rendimiento del método Shuffle:

 

publicstaticclass ListTExtensionMethods
{staticreadonly Random generator = new Random();publicstatic List<TObject> Shuffle<TObject>(this List<TObject> obj)
    {
        TObject[] input = obj.ToArray();int swap;for (var top = input.Length - 1; top > 0; --top)
        {
            swap = generator.Next(top);
            Swap(ref input[top], ref input[swap]);
        }returnnew List<TObject>(input);
    }privatestaticvoid Swap<TObject>(ref TObject first, ref TObject second)
    {
        TObject tmp = first;
        first = second;
        second = tmp;
    }
}

 

¡El próximo viernes 31 de octubre publicaremos el siguiente de nuestros #retosMSDN! Y si quieres retar al resto de la comunidad con tu propio reto, recuerda que puedes enviárnoslo a esmsdn@microsoft.com.

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

#retosMSDN: Reto 5 – Extendiendo funcionalidad en C#

0
0

¡Ya tienes aquí el quinto de nuestros #retosMSDN! Aunque en realidad no se trata de un reto, si no de 4 mini-retos independientes entre sí. Además, tenemos dos entradas para el Codemotion 2014 que necesitan dueño, y que serán para los dos primeros desarrolladores de España que nos enviéis la solución correcta a los 4 mini-retos.

 

El Reto

Antes de empezar, en este proyecto de Visual Studio 2013 que puedes descargarte de GitHub encontrarás los tests unitarios con los que puedes verificar que tu implementación es correcta, y que son mencionados en cada uno de los puntos que verás a continuación.

Necesitamos que implementes lo siguiente:

1) Duration y su método From, de manera que pase los tests unitarios de UnitTestDuration.cs.

2) El método NotNull, que comprobará si un objeto de cualquier clase es nulo o no, y que pase los tests unitarios de UnitTestNotNull.cs.

3) Un diccionario DictionaryPlus al que le podamos pasar como índice el conjunto de claves cuyos valores queramos obtener y que nos devuelva una enumeración con dichos valores, y que pase los tests unitarios de UnitTestDictionaryPlus.cs.

4) El método ToUpperNoCopy, que convierta todos los caracteres de cualquier string a mayúsculas, y que pase los tests unitarios de UnitTestToUpperNoCopy.cs.

 

Recuerda, no estamos haciendo TDD. Los tests proporcionados son una ayuda, y además de pasarlos habrá que cumplir también cualquier requisito adicional especificado en este artículo, y que será verificado manualmente.

 

La Solución

¿Ya has resulto alguno de los mini-retos? Comparte con nosotros tu solución de Visual Studio en esmsdn@microsoft.com. ¡No hace falta que esperes a resolverlos todos!

El viernes de la semana que viene, el día 7 de noviembre, publicaremos la solución que nosotros proponemos para los 4 mini-retos, y los ganadores de las entradas al Codemotion.

 

¿Sabías que…

…si tienes Visual Studio instalado puedes encontrar las especificaciones de C# en un documento en formato Word dentro de la carpeta VC#\Specifications que hay en la carpeta de Visual Studio de Program Files (o Program Files (x86) en máquinas de 64 bit)?

Yo por ejemplo tengo aquí el documento de C# 5.0: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1033\CSharp Language Specification.docx

 

Si tienes cualquier duda o problema durante la resolución del reto, o si quieres proponer tu propio reto para retar al resto de la comunidad, no dudes en ponerte en contacto con nosotros.

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

Viewing all 464 articles
Browse latest View live




Latest Images