[Pregunta] ¿Cuál es la salida de este programa?

class Program

{

   static void Main(string[] args)

   {

       var arrayAction = new Action[10];

 

       for (var i = 0; i < 10; i++)

       {

           arrayAction[i] = () => Console.Write("{0} ", i);

       }

 

       foreach (var action in arrayAction)

       {

           action();

       }

 

       Console.Read();

   }

}

a) 0 1 2 3 4 5 6 7 8 9

b) 1 2 3 4 5 6 7 8 9 10

c) 0 0 0 0 0 0 0 0 0 0

d) 10 10 10 10 10 10 10 10 10 10

Un saludo.

[Evento] SUG.CAT – SharePoint 2010 desde todo tipo de dispositivos

Este miércoles 23 de mayo, estaré con el Grupo de Usuarios de SharePoint de Cataluña dando una pequeña charla sobre servicios REST con WCF en SharePoint 2010, donde podremos ver como hacer más extensible la plataforma y así, poder consumirla desde todo tipo de dispositivos.

Tendré el placer de compartir cartel con dos mega-cracks de SharePoint, Edin Kapic (Pasiona) que nos deleitará con el "Desarrollo de aplicaciones de Windows 8 conectadas a SharePoint " y David Martos (Spenta/Beezy) nos mostrará como consumir estos servicios desde un front-end javascript usando como sistema de templates PURE.

No os lo podéis perder!!! Regístrate ya!!!

Os Esperamos.

[Pregunta] Sobre métodos extensores II

Dada la siguiente clase:

public class Striker

{

    public string Name { get; set; }

    public int  Goals { get; set; }

    public Look Looks { get; set; }

}

 


public enum Look

{

    Handsomd,

    Ugly

}

Creamos un método extensor Where:

public static class Extensions

{

    public static IEnumerable<Striker> Where(

        this IEnumerable<Striker> source,

        Func<Striker, bool> filter)

    {

        foreach (var striker in source)

        {

            if (filter(striker) && (striker.Looks == Look.Handsomd))

                yield return striker;

        }

    }

}

Y probamos:

class Program

{

    static void Main(string[] args)

    {

        var strikers = new[] {

            new Striker { Name = "Ronaldo", Looks = Look.Handsomd, Goals = 46},

            new Striker { Name = "Messi", Looks = Look.Ugly, Goals = 50},

            new Striker { Name = "Falcao", Looks = Look.Ugly, Goals = 26}

         };

 

        var result = strikers.Where(s => s.Goals > 40);

 

        foreach (var striker in result)

        {

            Console.WriteLine(striker.Name);

        }

 

        Console.Read();

    }

}

¿Cual creéis que será la salida?

Un saludo

[Pregunta] Sobre métodos extensores

Partiendo de una clase llamada Foo con un método Hello:

public class Foo

{

    public void Hello()

    {

        Console.WriteLine("Hello Foo!");

    }

}

Añadimos un método extensor a dicha clase que se llama también Hello:

public static class Extensions

{

    public static void Hello(this Foo foo)

    {

        Console.WriteLine("Hello Foo Extension!");

    }

}

¿Que crees que ocurrirá?

  1. Error de compilación porque el compilador encuentra 2 métodos que se llaman igual.
  2. Error de ejecución porque el runtime encuentra 2 métodos que se llaman igual.
  3. Hello Foo!
  4. Hello Foo Extension!

Un saludo.

[Evento] Resumen y conclusiones del evento de AUGES “Cómo construir tu entorno de integración continua desde cero”

El sábado pasado, tuve el placer dar un evento con el Grupo de Usuarios de ASP.NET España y que a través de twitter bautizamos como el #geeksaturday, donde montamos un evento sobre cómo contruir un entorno de integración continua de principio a fin. El evento tuvo lugar en las oficinas de Ábaco Ibérica de Software, que Victor Gónzalez @vimagode para los tuiteros, nos prestó para tal ocasión (Muchas gracias)

¿Qué vimos durante el evento?

Empezamos con una introducción teórica sobre la integración continua. Una vez vista la teoría, pasamos a la practica instalando Jenkins como servidor de integración continua y creando unas builds que nos servirían para el ejemplo. A continuación instalamos Mercurial sobre Internet Information Server 7 como sistema de control de código fuente distribuido y como plugins adicionales, TortoiseHg como alternativa visual a la consola de comandos y VisualHg para Visual Studio 2010. Luego abrimos la aplicación de ejemplo, una app desarollada con ASP.NET MVC 3 y empezamos a crearnos un archivo de script de MSBuild desde cero para la creación y limpieza de directorios, compilación, pruebas unitarias (NUnit), cobertura de código (OpenCover) y reporting (ReportGenerator), paquetizado de la solución y despliegue automatizado de la misma (WebDeploy). En total 4 horas muy bien aprovechadas y que incluso podrían haberse alargado.

Al final del evento y gracias la CampusMVP (Patrocinador del grupo) sorteamos 2 libros Trabajando en equipo con Visual Studio ALM y un descuento para los asistentes en el curso Gestión de proyectos de software con Team System y Team Foundation Server. También sorteamos 6 suscripciones de un mes a Pluralsight, también patrocinador del grupo.

Por último unas fotillos de los asistentes

WP_000718 WP_000720

Material del evento para descargar

Tengo pendiente escribir una serie de posts relacionados con este evento, como por ejemplo la instalación de Mercurial sobre IIS, plugins…

Un saludo y hasta la próxima.

[Tip] Usar NuGet sin tener que subir los paquetes a nuestro repositorio de código fuente

Creo que es una de las pegas que más he comentado con la gente que usa NuGet, es decir, cuando usas NuGet en tus proyectos, se crea una carpeta packages donde se descargan todas las librerías que usas en tus proyectos:

image

Y es un verdadero engorro tener que estar subiendo todo el contenido de esta carpeta al control de código fuente por varias razones:

  • Tamaño: Sí tenemos muchas referencias a librerías, herramientas… esta carpeta hará crecer considerablemente el tamaño de nuestros repositorios y cada vez que lo clonemos tendremos que descargarnos todos los paquetes. Además sí el espacio nos cuesta dinero, estaremos pagando de más innecesariamente.
  • Problemas con la actualización de paquetes al tener todo bajo el control de código fuente.

Pues a partir de la nueva versión de NuGet podemos evitar todos estos problemas ¿Cómo? A continuación te lo cuento:

Una vez abierta tu solución en Visual Studio 2010, selecciona tu *.sln y pulsa botón derecho:

image

Pulsamos sobre Enable NuGet Package Restore y nos aparece esta ventana emergente en la que se nos informa que los paquetes de NuGet van a ser añadidos/restaurados cuando se compile la solución:

image

¿Y como lo hace?

Pues si aceptamos, se crea una nueva carpeta de solución llamada .nuget:

image

que contiene el ejecutable de NuGet.exe y un archivo de llamado NuGet.targets que contiene una secuencia de commandos de MSBuild, en la que busca en cada proyecto de la solución el archivo packages.config para chequear si los paquetes están descargados o no, y si no están los descarga.

El contenido del archivo packages.config es muy sencillo. Es un xml donde se indica el nombre de paquete y la versión que se está utilizando:

image

Ahora vamos a ver como funciona todo esto. Lo primero es borrar nuestra carpeta de packages.

Una vez borrada, compilamos nuestra solución y echamos un vistazo al Output:

image

Si os fijáis, se ha descargado todos los paquetes que estaban en el fichero packages.config y una vez descargados ha compilado la solución.

Sí lo volvemos a ejecutar, chequea que existen y no se los descarga:

image

Si no usas TFS como control de código fuente y como es mi caso usas Mercurial, puedes usar el archivo .hgignore (Este archivo sirve para indicar las extensiones de archivos y directorios que no quieres que esten bajo el control de código fuente) para indicar que la carpeta packges no se suba al servidor centralizado. Añadimos la siguiente entrada:

[Pp]ackges/

Editado: Como bien comenta Unai hay que decirle que el directorio .nuget lo suba al respositorio con el exe y con el msbuild target para que todo esto funcione, porque seguramente tengamos una entrada para que no suba los exe y entonces nos falle al compilar 🙂

Así pues con este pequeño flujo de trabajo, cualquier programador o el mismo servidor de integración continua podrá descargar los paquetes necesarios para compilar satisfactoriamente la solución sin tener que subirlos al control de código fuente.

Un saludo.