Blog de José R. Guay

Temas de Microsoft .NET Framework

Channel 9

¿Conoces Channel 9?

Es un portal creado y soportado por Microsoft para desarrolladores donde puedes encontrar muchos recursos sobre las tecnologías que se están desarrollando actualmente, así como las tendencias y las cosas que están por venir.

Desafortunadamente no está en español pero puedes eso no debe impedir que le eches un vistazo de cuando en cuando y veas las posibilidades y todo lo que allí se puede aprender.

Disfrútalo.

Enero 28, 2008 Publicado por joseguay | Temas | , , , , , , | Aún no hay comentarios

XNA Game Studio 2.0

Hola.

Para los amantes de los juegos, Microsoft ha puesto a disposición general la descarga del nuevo XNA Game Studio 2.0, con el que puedes trabajar en Visual Studio 2005 y C# la creación de juegos para las plataformas PC y XBOX 360.

El website oficial de XNA Game Studio es el conocido XNA Developer Center y allí podrás descargar el XNA Game Studio 2.0.

Conócelo y disfrútalo…

Saludos.

Enero 28, 2008 Publicado por joseguay | Temas | , , , | 2 comentarios

MSDN Tour Guatemala

El próximo miércoles 30 tendremos el primer MSDN Tour en nuestra ciudad.

Será en el Hotel Intercontinental salón Guayacán a partir de las 17:00 horas.  Los temas y expositores son los siguientes:

MSDN Tour: Extreme Session with .NET

Tema 1:  (Marlon Ramos)

- Visionamiento

- Requerimientos y Casos de Uso

- Desarrollo

- Pruebas

- Cambios

Tema 2: (Manolo Herrera)

- Estandares de Codigo

- Uso de Componentes

- Ejemplo (FX Cop)

 

Tema 3: (Carlos Lone)

- Pruebas (metodologia agil) TDD Concepto

- Ejemplo (Uso de Nunit, MbUnit, etc)

 

Tema 4: (Cristian Prieto)

- Pruebas de Integracion

- Control de Versiones

- Ejemplo ( SubVersion, Team System)

 

Inscríbite aquí

Saludos.

Enero 27, 2008 Publicado por joseguay | Temas | , , , | Aún no hay comentarios

Software Licensing and Protection Services

Para los desarrolladores de Visual Studio:

Ahora tenemos esta oferta de Microsoft para nuestra protección de código y evitar que nuestros programas sean “pirateados”. Véanlo, está muy interesante.

http://www.microsoft.com/SLPS/visualstudiousers.aspx

Saludos.

Enero 27, 2008 Publicado por joseguay | Programación .NET | | Aún no hay comentarios

Ejecución Diferida en LINQ

La ejecución diferida de LINQ es uno de los conceptos más importantes y menos entendidos de esta tecnología. Es bastante importante que los desarrolladores comprendan este concepto si quieren llegar a explotar al máximo el potencial de LINQ.

Nota: En varias partes de este artículo sobre ejecución diferida, me referiré a una estructura de datos llamada árbol de expresión. Para entender esto solo se necesita entender que un árbol de expresión es una estructura de datos como lo es una lista o una cola. Contiene un query LINQ to SQL, no los resultados del query, sino los elementos de dicho query.

Video: Existe un video que explica este artículo y puede ser visto aquí. 

Veamos este simple ejemplo de query LINQ to SQL :

var query = from customer in db.Customers  << El query
            where customer.City == "Paris" << no se ejecuta 
            select customer;               << aquí

Es fácil asumir que estas pocas líneas de código  ejecutan un query contra la base de datos. De hecho, no lo hacen. Este código apenas captura la idea de un query en una estructura de datos llamada árbol de expresión. Este árbol contiene información acerca de la tabla que se quiere consultar, la pregunta que quiere preguntar sobre la tabla, y la respuesta que quiere le sea retornada. Pero no hace, en ningún momento, la consulta efectiva a la base de datos.

En LINQ, la ejecución de un query es diferida hasta el momento preciso en que se solicitan los datos. Para nuestro ejemplo, las siguientes líneas de código provocarán que el query se ejecute:

foreach (var Customer in query) << El query se ejecuta aquí
{ 
	Console.WriteLine(Customer.CompanyName);
}

Las expresiones de query usualmente no causan que el código se ejecute. Solamente definen la pregunta que se quiere hacer. Si este no fuera el caso, entonces sería muy difícil o imposible para LINQ, converitr los queries en álgebra relacional que hace posible la composición, y que permite a los desarrolladores que les importa eso, optimizar su código. La ejecución diferida hace posible crear queries complejos de varios componentes sin gastar ciclos del cpu para efectivamente obtener los datos. O al menos, los datos no serán solicitados hasta que sea absolutamente necearios.

Hagamos un ligero cambio al ejemplo anterior: 

var query = (from customer in db.Customers << El query se ejecuta aquí
             where customer.City == “Paris”
             select customer).Count();

Esta vez, el query se ejecutará cuando el punto de ejecución pase por él. El código se ejecuta cuando se hace la llamada Count(), como si se hubiera hecho una llamada a cualquier otro operador que debe iterar sobre el resultado del query para obtener un valor que no es IEnumerableable<T> o IQueryable<T>. El operador ToList() del query se ejecuta inmediatamente porque devuelve un List<T> en vez de un IQueryable<T>. Consiere el siguiente código:

public void SimpleQuery01()
{
   db.Log = Console.Out;             // El query se ejecuta aquí y devuelve un List<T>
   List<Customer> list = (from customer in db.Customers
                          where customer.City == "Paris"
                          select customer).ToList();            foreach (var Customer in list)
   {
     Console.WriteLine(Customer.CompanyName);
   }
}

Una de las últimas cosas que el proveedor de LINQ to SQL hace antes de ejecutar un query es crear el SQL que será enviado por la red. Este hecho nos da una idea para tratar de determinar el momento exacto de cuando se ejecuta un query.

Asignando db.Log a Console.Out de la forma en que se hace en la primera línea del código, asegura que el SQL del query será escrito a la consola tan pronto como se ha generado. Cuando se ejecuta el código anterior, verá el log escrito en la pantalla tan pronto como la expresión de query se ejecuta. 

Considere el siguiente código, que no llama a ToList():

db.Log = Console.Out;   var query = from customer in db.Customers
             where customer.City == "Paris"
             select customer;   foreach (var Customer in query)  << El query se ejecuta aquí
{
   Console.WriteLine(Customer.CompanyName);
}

Si ejecuta el código anterior con el debugger mientras mira la ventana de consola, verá que el SQL no es generado hasta la ejecución de la sentencia foreach. Cuando se llama a ToList(), el SQL se escribe en la pantalla antes, dando la evidencia de que el query mismo se ejecuta antes:

List<Customer> list = (from customer in db.Customers
                        where customer.City == "Paris"
                        select customer).ToList(); << El query se ejecuta aquí 

Veamos ahoara la ejecución diferida desde un ángulo un poco diferente:

public void SimpleQuery03()
{
   string city = "London";        var query = from c in db.Customers
               where c.City == city
               select new { c.City };        city = "Madrid";    foreach (var q in query) << El query se ejecuta aquí 
   {
     Console.WriteLine(q);
   }
}

Este método mostrará Madrid en la pantalla, en vez de London. Al cambiar el valor de la variable cityMadrid, justo antes de la sentencia foreach, nos asegura que Madrid, en vez de London, se incluirá en el SQL que será enviado al servidor. El punto es que la expresión de query solamente genera un árbol de expresión, no envía el SQL a la base de datos.

Veamos ahora al ejemplo final, solo para aterrizar este muy importante punto. Considere el siguiente código:

public void DeleteInsert01()
{
   db.Log = Console.Out;    string customerId = "WIDGE";    // Expresión de query que se utilizará repetidamente 
   var query = from c in db.Customers
               where c.CustomerID == customerId
               select c;    Console.WriteLine("Count before insert: {0}", query.Count()); << Envío de SQL        // Inicializador del objeto
   var newCustomer = new Customer 
   {
     CustomerID = customerId,
     CompanyName = "Microsoft",
     ContactName = "John Doe",
     ContactTitle = "Sales Manager",
     Address = "1 Microsoft Way",
     City = "Redmond",
     Region = "WA",
     PostalCode = "98052",
     Country = "USA",
     Phone = "(425) 555-1234",
     Fax = null
   };        // Inserta 
   db.Customers.InsertOnSubmit(newCustomer);
   db.SubmitChanges();
   Console.WriteLine("Count after insert: {0}", query.Count()); << SEnvío de SQL        // Borra
   db.Customers.DeleteAllOnSubmit(query);
   db.SubmitChanges();
   Console.WriteLine("Count after delete: {0}", query.Count()); << Envío de SQL
}

La primera llamada a WriteLine() mostrará el número inicial de registros con su CustomerID del cliente WIDGE. El valor que devolverá será cero. La segunda llamada a WriteLine muestra el valor de 1, porque se ha insertado un registro. La llamada final mostrará nuevamente el valor de cero, porque el registro insertado fue borrado.

Note que la expresión de query usada para obtener la información de conteo del servidor fue escrita solamente una vez al principio del método.  En cada una de las tres llamadas a la sentencia WriteLine el query se compone con el operador Count() y se ejecuta. El siguiente SQL fue el enviado a la base de datos tres veces:

SELECT COUNT(*) AS [value]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CustomerID] = @p0

Un SQL diferente fue enviado a la base de datos cuando se llamó al método DeleteAllOnSubmit

Suponga que reescribimos el método anteior para que luzca así: 

public void DeleteInsert02()
{
     db.Log = Console.Out;      string customerId = "WIDGE";      // La ejecución del query sucede aquí
     var query = (from c in db.Customers  << Se ejecuta el query
                  where c.CustomerID == customerId
                  select c).Count();      Console.WriteLine("Count before insert: {0}", query); << No se ejecuta      // Inicializador del objeto
     var newCustomer = new Customer
     {
         CustomerID = customerId,
         CompanyName = "Microsoft",
         ContactName = "John Doe",
         ContactTitle = "Sales Manager",
         Address = "1 Microsoft Way",
         City = "Redmond",
         Region = "WA",
         PostalCode = "98052",
         Country = "USA",
         Phone = "(425) 555-1234",
         Fax = null
     };            // Inserta
     db.Customers.InsertOnSubmit(newCustomer);
     db.SubmitChanges();
     Console.WriteLine("Count after insert: {0}", query); << No se ejecuta      var deleteQuery = from c in db.Customers
                       where c.CustomerID == customerId
                       select c;                  // Borra 
     db.Customers.DeleteAllOnSubmit(deleteQuery);
     db.SubmitChanges();
     Console.WriteLine("Count after delete: {0}", query); << No se ejecuta
}

Esta vez obtenemos el conteo de registros en la base de datos cuando la expresión de query se ejecuta al método. El valor correcto, que es cero, se devuelve de la base de datos en ese momento, y se muestra en la consola cuando la primera llamada a WriteLine se ejecuta. Cuando la segunda llamada a WriteLine se hace, el mismo valor cero que fue devuelto en el query inicial es mostrado. Como resultado, datos inválidos son reportados al usuario.

Esto ilustra porqué es tan importante el entender la ejecución diferida.

La ejecución diferida también es una espada de dos filos:

  • Queries compuestos y la ejecución diferida trabajan juntos para hacer de LINQ un lenguaje de consultas rico e inusual. Si se entiende adecuadamente estas características de LINQ estará en posición de escribir menos código y ejecutarlo más rápido para poder lograr más.
  • Como pudo haber notado, si no se entiende apropiadamente la ejecución diferida, entonces podemos terminar con muchos problemas. Los queries no se ejecutarán cuando esperamos que lo hagan y por ende podemos mostrar datos erróneos a los usuarios.

Conclusión: La ejecución diferida se aplica a todas las variedades de LINQ, incluyendo LINQ to SQL, LINQ to Objects y LINQ to XML. Sin embargo, de los tres, es solamente LINQ to SQL el único que devuelve un árbol de expresión por defecto. O más específicamente, devuelve una instancia de una interface IQueryable que referencia a un árbol de expresión. Un query que devuelve un IEnumerable aún soporta ejecución diferida, pero al menos una gran porción del resultado fue generado en comparación a LINQ to SQL. En otras palabras, LINQ soporta ejecución diferida, pero LINQ to SQL lo soporta de forma más completa que LINQ to Objects o LINQ to XML.

——————————————————————————————-
Obtenido del blog de Charlie Calvert (http://blogs.msdn.com/charlie/archive/2007/12/09/deferred-execution.aspx)

Diciembre 20, 2007 Publicado por joseguay | LINQ, Programación .NET | , , | Aún no hay comentarios

Evento MSDN Tour Guatemala

Pronto tendremos este evento en nuestra ciudad. Aca esta el calendario:

Lunes 10 de diciembre:

  • 13:00 – 14:45: Arquitectura Orientada a Servicios (SOA) Cristian Prieto. Inscribirse
  • 15:00 – 16:45: Silverlight para Diseñadores – Emy Alegre Inscribirse
  • 17:00 – 18:45: C# 3.0 “The New Lambda Expressions” – Luis Alfaro Inscribirse
  • 19:00 – 20:45: Web Service Software Factory Modeling Edition – Manolo Herrera Inscribirse

Martes 11 de diciembre:

  • 13:00 – 14:45: Arquitectura de Factories – Cristian Prieto Inscribirse
  • 15:00 – 16:45: Lo Nuevo de C# Completo en Visual Studio 2008 – Luis Alfaro Inscribirse
  • 17:00 – 18:45: Optimizando Desarrollo Web con Vistual Studio 2008 – Carlos Lone Inscribirse
  • 19:00 – 20:45: Cambios en C# y Visual Basic en Visual Studio 2008 – Marlon Ramos Inscribirse

Miércoles 12 de diciembre:

  • 13:00 – 14:45: SmartClients y SmartClient Software Factory (SCSF) – Marlon Ramos Inscribirse
  • 15:00 – 16:45: Silverlight para Desarrolladores – Carlos Lone Inscribirse
  • 17:00 – 18:45: .Net Framework 3.5 – Cristian Prieto Inscribirse
  • 19:00 – 20:45: Web Client Factories 2.0 – Manolo Herrera Inscribirse

Jueves 13 de diciembre:

  • 13:00 – 14:45: Model View Controller Pattern – Carlos Lone Inscribirse
  • 15:00 – 16:45: C# 3.0 [Extension Methods/ Partial Methods] – Luis Alfaro Inscribirse
  • 17:00 – 18:45: Introducción a Open XML Marlon Ramos Inscribirse
  • 19:00 – 20:45: Lo nuevo de Team System en Visual Studio 2008 – Manolo Herrera Inscribirse

Viernes 14 de diciembre:

  • 13:00 – 14:45: Consideraciones de Arquitectura con Patrones de Diseño – Carlos Lone Inscribirse
  • 15:00 – 16:45: Expression Studio Emy AlegreInscribirse
  • 17:00 – 18:45: Windows Vista Goodies Cristian Prieto Inscribirse
  • 19:00 – 20:45: LINQ – Lo último Marlon Ramos Inscribirse

Diciembre 1, 2007 Publicado por joseguay | ASP.NET, Programación .NET, Silverlight | , , , , , , | Aún no hay comentarios

Mapa de Avances de Nuevos Productos

De acuerdo con Scott Guthrie, en su blog, veremos lo siguiente: 

ASP.NET 3.5 Extensions Release

Visual Studio 2008 y el .NET Framework 3.5 incluyen muchas características nuevas para ayudar al desarrollador de ASP.NET y luego saldrán más con el lanzamiento del “ASP.NET 3.5 Extensions”.  Estas nuevas extensiones tendrán, entre otras, las siguientes:

  • ASP.NET MVC: El Model View Controller framework para ASP.NET provee un modelo estructurado que permite una clara separación entre algunas preocupaciones de aplicaciones web, y hace más fácil probar el código y soporta workflows TDD. Scott Guthrie escribe una serie de artículos sobre esto empezando por este Part 1 of ASP.NET MVC Tutorial series.
  • Mejoras de ASP.NET AJAX: Las nuevas características de ASP.NET AJAX en ASP.NET 3.5 Extension incluirán un mejor soporte de la historia del navegador, también se mejora el enlace de contenido con los nuevos “permalinks”, y mejoras en la librería de JavaScript.
  • Soporte Dinámico de Datos de ASP.NET: Las ASP.NET 3.5 Extensions tendrán nuevas características que permitirán una creación más rápida de web sites que manejan datos. Provee un framework rico de scaffolding, además se podrán desarrollar sitios que manejan ASP.NET WebForms y ASP.NET MVC.
  • Soporte para ASP.NET Silverlight: Dentro de las extensiones de ASP.NET 3.5 se agregará soporte para una fácil integración de Silverlight en sus aplicaciones ASP.NET. Se incluirán nuevos controles que harán más fácil integrar video y medios de Silverlight así como contenido interactivo en sus sitios.
  • Servicios de Datos de ADO.NET: En paralelo a las extensiones de ASP.NET se liberará el ADO.NET Entity Framework, el cual provee un nuevo modelo que permitirá a los desarrolladores definir un modelo conceptual del esquema de base de datos que se alinea con una vista de información del mundo real. También se liberarán un nuevo conjunto de servicios de datos (Código “Astoria”) que hará fácil el exponer “API endpoints” basados en REST desde sus aplicaciones ASP.NET.

Silverlight 2.0 Release

Hace dos meses se hizo el lanzamiento de Silverlight 1.0 para Windows y Mac, y también se anunció el soporte de Silverlight para Linux.  Silverlight 1.0 se enfoca principalmente en escenarios ricos de medios para el navegador, además soporta el modelo de programación de JavaScript/AJAX.

El próximo año se liberará una actualización mayor de Silverlight que se enfocará en Aplicaciones Ricas en Internet.  Esta actualización incluirá una versión del .NET Framework que es multi-plataforma y multi-navegador, y permitirá un desarrollo de .NET rico en el navegador. Algunas de las características del próximo preview de Silverlight: 

  • WPF UI Framework: La versión Alpha actual de Silverlight incluye solamente algunos controles básicos y un API manejado para dibujo de interfaces gráficas. La próxima actualización de Silverlight incluirá un alto nivel de características del framework de WPF UI.
  • Rich Controls: Tendrá un rico conjunto de controles para constuir aplicaciones de Internet ricas de una manera más fácil. Soportará controles básicos (textbox, checkbox, radiobutton, etc), controles de manejo de layout (StackPanel, Grid, etc.), controles comunes de funcionalidad (TabControl, Slider, ScrollViewer, ProgressBar, etc.) y controles de manipulación de datos (DataGrid, etc.).
  • Soporte Rico de Redes: Silverlight soportará REST, POX, RSS y comunicación WS*. También soportará acceso de redes a través de los dominios (así los clientes Silverlight podrán tener acceso a recursos y datos de cualquier fuente confiable de la Web).
  • Soporte de Librería de Clases Base Rica: Silverlight incluirá una librería de clases base rica de .NET (Collections, IO, generics, threading, globalization, XML, local storage, etc.). También soportará LINQ to XML y una integración más rica de HTML DOM.

Anteriormente esta actualización se había llamado “Silverlight V1.1″ pero después de un examen más profundo de la cantidad y calidad de características nuevas, se han dado cuenta que llamarlo de esa manera no refleja la verdadera naturaleza de él. Consecuentemente se ha decidido cambiar el nombre para llamarlo de ahora en adelante ”Silverlight V2.0″. 

La versión Beta de Silverlight 2.0 se liberará en el primer cuarto de 2008. 

También habrá una actualización de herramientas gratuitas para Visual Studio 2008 que mejorarán la experiencia de desarrollar programas Silverlight desde Visual Studio 2008 usando cualquier lenguaje de .NET. 

IIS 7.0

A principios de 2008 se liberará la versión final de IIS 7.0 como parte de Windows Server 2008.

Una de las cosas más bonitas acerca de IIS 7.0 es su integración con el .NET Framework, y permite que use cualquier lenguaje .NET para extender y personalizar el servidor. Ahora puede hacer cosas fácilmente en VB y C# que antes requerían hacer extensiones ISAPI en C++. La instalación y administración  de aplicaciones web es ahora realizada a través de una forma unificada entre IIS y ASP.NET.

————————————————————————————– 

El contenido de este artículo fue tomado del blog de Scott Gutrhie (http://weblogs.asp.net/scottgu/archive/2007/11/29/net-web-product-roadmap-asp-net-silverlight-iis7.aspx).

Noviembre 29, 2007 Publicado por joseguay | ASP.NET, IIS, Programación .NET, Silverlight | , , , , , , | Aún no hay comentarios

Características de Visual Studio 2008 y .NET Framework 3.5

Para obtener la última versión de Visual Studio acá están los enlaces: 

  • Si es un suscriptor de MSDN o pertenece a una universidad con una suscripción de MSDN Academic Alliance puede obtener Visual Studio 2008 por medio del sitio de descargas. 
  • Si no es suscriptor de MSDN puede obtener una versión de evaluación de 90 días de Visual Studio Team Suite aquí
  • Si quiere utilizar las versiones gratuitas de Visual Studio 2008 Express Edition (que por  cierto son completamente gratis y mucho más pequeñas) puede descargarlas desde aquí
  • Si solo quiere utilizar el .NET Framework 3.5 puede descargarlo desde aquí.
  • Algunas de las nuevas características son:

    Soporte Multi-Destino
    VS2008 soporta configurar el destino de versión de .NET Framework que desee utilizar, por ejemplo puede crear, abrir y modificar aplicaciones del .NET Framework 2.0 en VS2008 sin problema alguno, así como aplicaciones de versiones 3.0 y 3.5.

    ASP.NET AJAX y soporte para JavaScript
    VS2008 incluye en su instalación ASP.NET AJAX (no se requiere una instalación adicional).

    Diseñador Web y Soporte CSS
    VS2008 y Visual Web Developer 2008 Express incluyen un mejorado diseñador de HTML (el mismo de Expression Blend) y puede manejar vistas divididas, código, visual, CSS anidados, etc.

    Mejoras en los Lenguajes y LINQ
    Los compiladores de Visual Basic y C# se optimizaron mucho y proveen grandes facilidades y mejoras al desarrollador.

    ——————————————————————————-
    El contenido de este artículo fue tomado del blog de Scott Gutrhie (http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx)

    Noviembre 20, 2007 Publicado por joseguay | ASP.NET, Programación .NET | , , , , , , | Aún no hay comentarios

    Microsoft Silverlight (R)

    Silverlight es un complemento que se ejecuta en varios exploradores y plataformas para proporcionar la siguiente generación de experiencias multimedia y aplicaciones interactivas enriquecidas (RIA) para la web.

    Para los que aún no nos termina de convencer exactamente lo que és Silverlight, pensemos que es un componente parecido al Flash Player, nos permitirá tener contenido interactivo y muy rico en materia de gráficos y animaciones, y lo mejor es que podemos desarrollarlo desde nuestro habitual Visual Studio.

    El sitio web de Silverlight es http://www.microsoft.com/silverlight

    Y la parte de descargas con la información de los requisitos del sistema es http://www.microsoft.com/silverlight/default.aspx#4_0

    Empecemos por descargar Silverlight y veamos los recursos que hay para que lo podamos implementar.  En unos días tendré un tutorial para hacer pequeñas cosas y acostumbrarnos a esta nueva plataforma.

    Saludos.

    Noviembre 16, 2007 Publicado por joseguay | Silverlight, Temas | , , , , | Aún no hay comentarios

    Noviembre’07 – Mes para Visual Studio 2008 (“orcas”)

    Así es amigos.

    De acuerdo con S. “Soma” Somasegar, vicepresidente corporativo de la División de Desarrollo de Microsoft Corp. en su discurso realizado en el Microsoft TechEd Developers 2007 de Barcelona, España. Microsoft anuciará la liberación y disponibilidad de Visual Studio 2008 y el .NET Framework 3.5 para finales de Noviembre de 2007.

    La noticia completa está acá: (inglés)

     http://www.microsoft.com/presspass/press/2007/nov07/11-05TechEdDevelopersPR.mspx

    Esta es una gran noticia para nosotros los desarrolladores, es necesario tener en cuenta las diferencias y capacidades que estarán a nuestra disposición con la nueva versión de Visual Studio.

    Saludos.

    Noviembre 15, 2007 Publicado por joseguay | Programación .NET, Temas | , , , | Aún no hay comentarios