August 2007 - Posts

Concurso OpenXML

Mi colega Francisco Fagas, Microsoft MVP en Visual Studio Team System, me pasó el dato de un interesante concurso que él, en conjunto con Microsoft, acaban de lanzar. Con su permiso, copio textualmente las bases del concurso aquí:

Continuando con una iniciativa de Microsoft para la región me complace en comunicarles el inicio del concurso OPENXML para Ecuador, cuyo objetivo principal es dar a conocer OpenXml y a su vez las personas que forman parte de las comunidades del país puedan empezar a implementar este estándar en sus aplicaciones las cuales les van a agregar mayor valor al negocio. El concurso consiste en:

Lo que tienes que hacer es crear un documento Word, Excel o Powerpoint pero sin usar Office, de la siguiente manera:

  1. Construye una aplicación (C#, VB, Java, PHP, no importa ya que OpenXML lo puedes usar desde donde sea) que produzca un archivo OpenXML. Como tú sabes OpenXML es un formato XML para hacer 3 tipos de archivos: un documento, una hoja de excel, o una presentación. En el caso de tu programa tú eliges cuál hacer (fíjate en los premios que habrá para cada tipo). 
  2. La aplicación debe ser un EXE que cuando yo lo ejecute en mi PC, creará el archivo en el mismo directorio. No necesita tener intefaz gráfica ni nada, puede ser todo línea de comando.
  3. Ahora, cuando yo abra ese archivo desde Office (o como es OpenXML lo puedo abrir desde WordPerfect Office, Open Office, etc), el archivo debe contener tu nombre, email, dirección física, compañía para la que trabajas o universidad donde estudias, tu puesto y un pequeño texto sobre qué te pareció programar con OpenXML. Si elegiste hacer un documento Word, solo necesitas poner esta info en la primera página del documento; si elegiste una hoja de cálculo Excel, los datos pueden ir en celdas separadas o como tu quieras; si elegiste una presentación Powerpoint tus datos pueden estar en el primer slide.
  4. La unica restricción es que no puedes usar los objetos COM de Office para hacer esto, ya que así sería un simple comando. Debes usar el formato OpenXML como tal desde .NET o el lenguaje que selecciones.

Tienes de tiempo (1) una semana para hacerlo y deberás enviar tu archivo EXE junto con el código fuente compilable y el script paso a paso de como ejecutar tu programa en un archivo ZIP a la dirección franciscofagas@msn.com con el subject Concurso OpenXML antes de las 8am (hora Ecuador) del viernes 07 de Septiembre del 2007. No se aceptarán más admisiones luego de esa hora.

Lo mejor de todo es que puedes participar hasta 3 veces!! Puedes enviarnos tres programas, uno que haga un archivo Word, otro que haga una Hoja de Excel y otra que haga una presentación de PowerPoint!!!

Así serán los premios para el ganador de cada categoría (recuerda que no es rifa):

Por un programa que construya exitosamente un archivo Word, un Age of Empires III

Por un programa que construya exitosamente un archivo Excel, un Halo 2 para Windows

Por un programa que construya exitosamente un archivo PowerPoint, un Shadowrun para Windows

Si mandaste los 3 programas (Word, Excel y PowerPoint) te daremos un premio adicional de un Fable: The Lost Chapters

Qué no sabes cómo usar el formato OpenXML? No te preocupes, hemos creado un kit de entrenamiento online para ti con toda la información del caso que puedes acceder en: http://www.dotnetfitnesscenter.com/kits/openxml

Si tienes alguna duda escríbela acá como comentario en el blog, yo trataré de responderla durante el fin de semana.

Un par de cosas legales: el concurso es válido solo para Ecuador, solo programas que funcionen y con el código fuente podrán participar. Los premios serán entregados en los próximos 2 meses ya que los estamos enviando a traer acá para distribuirlos entre los ganadores. Además nos reservamos el derecho de descalificar a alguien que creamos haya copiado su programa de otro participante.

Cómo evaluarán a los ganadores: Existirá un jurado conformado por Microsoft y MVPs locales los cuales evaluaremos:

  • Cumplimiento de las bases del concurso
  • Conforme vayan llegando los proyectos iremos evaluando el cumplimiento del punto anterior, código de generación del OpenXML optimizado y a su vez el documento generado debe contener el valor agregado de cada uno de ustedes, esto es evaluaremos también su creatividad para generar un documento amigable. 

Si no cuentas con acceso a internet, enviame tus datos (nombre y dirección física) a mi correo y Microsoft te hará llegar un DVD con el material.

Suerte a todos!!!

 

¡A participar!

Nueva Guía Esencial: Team Development with Team Foundation Server

TeamDevTFSGuide El equipo de Patterns & Practices acaba de publicar la versión final de su guía esencial para desarrollo en equipo utilizando Visual Studio Team Foundation Server. ¿Qué tiene de bueno esta guía? ¡Pues mucho! En esta guía encontrarán finalmente una gran, pero gran cantidad de principios y buenas prácticas del mundo real sobre cómo establecer su ambiente de desarrollo utilizando correctamente las diversas características de TFS.

Team Foundation Server es un poderoso y práctico producto para controlar diversas facetas del desarrollo de software, como el control y versionamiento de código, administración del proyecto, generación de builds, presentación de reportes, entre otros. Pero, así como es poderoso, es también un reto el lograr instalarlo y configurarlo correctamente y, más aún, saber sacarle provecho a sus múltiples características.

Quienes ya están trabajando con TFS ya se habrán topado con dudas como:

  • ¿Cuáles son los pasos a seguir para desarrollar y administrar un proyecto de inicio a fin con TFS?
  • ¿Cómo debo estructurar físicamente mi proyecto tanto en el servidor como en los equipos de los desarrolladores?
  • ¿Cómo utilizo correctamente el Branching?
  • ¿Dónde coloco las librerías de terceros que yo reutilizo en mi proyecto?
  • ¿Qué son y para qué me sirven los builds diarios?
  • ¿Cómo habilito integración continua en mi proyecto?
  • ¿Cómo se utilizan y personalizan las Plantillas de Proceso?
  • ¿Cómo se está utilizando MSF for Agile en el mundo real?
  • ¿Cómo se interpretan los reportes que brinda TFS?
  • ¿Cómo puedo configurar TFS para proveer acceso remoto al proyecto desde Internet?

TFSWorkFlow

 La guía está disponible para su libre descarga desde acá:

http://www.codeplex.com/TFSGuide

Espero les sea de utilidad.

Julio.

100MB para tus Servicios de Datos Astoria

Microsoft acaba de publicar un servicio experimental gratuito de 100MB para almacenar tus Astoria Data Services. El proyecto Astoria fue anunciado en el Mix 07 y su objetivo es el permitir exponer datos como "servicios de datos" que pueden ser consumidos por clientes web tanto en la intranet como en el Internet.

CrearServicioOnlineAstoria

Este servicio de datos puede ser consumido a través de HTTP y se utilizan URIs para identificar las distintas porciones de información que ofrece el servicio. El servicio Online de Astoria ya ofrece algunas URIs con las que se pueden empezar a probar las aplicaciones, como por ejemplo estas que se relacionan a la clásica base de datos Northwind:

Todas las categorías de productos 
http://astoria.sandbox.live.com/northwind/northwind.rse/Categories

Todos los productos de categoría ‘Beverages’
http://astoria.sandbox.live.com/northwind/northwind.rse/Categories[CategoryName eq 'Beverages']/Products

Todos los clientes radicados en Londres
http://astoria.sandbox.live.com/northwind/northwind.rse/Customers[City eq 'London']

Este último URI, por ejemplo, entrega este XML:

ClientesDeLondres

Puedes crear y publicar tus Astoria Data Services desde esta dirección:

http://astoria.mslivelabs.com

...y los puedes consumir desde cualquier aplicación Ajax, Silverlight ó desde cualquier otra aplicación .NET.

Más info en el Blog de Astoria y en el blog de Pablo Castro.

Julio.

Sobre el proceso de desarrollo de software en mi ciudad

Mientras respondía a un post de Douglas, un colega de la comunidad, me di cuenta de que mi comentario se extendía un poco más de lo normal, por lo que decidí mejor publicar un post en mi blog y así extenderme un poco más.

Douglas comenta su interés por conocer si es que realmente el proceso de desarrollo que propone Microsoft a través de Visual Studio Team System podría significar un cambio en el modelo tradicional que se puede ver en una gran cantidad de empresas de desarrollo de Guayaquil y si realmente se obtiene alguna ganancia de adoptar ese tipo de proceso.

El modelo de desarrollo (si se le puede llamar modelo) que usualmente se utiliza acá en Guayaquil (no sé si en el resto del país) carece de incontables falencias y yo lo he experimentado una y otra vez en cada empresa de desarrollo para la que he trabajado. Afortunadamente llevo poco más de un año trabajando para John Galt, una empresa extranjera con oficinas en Guayaquil a modo offshore y acá, por lo menos, no se utiliza ese estilo de desarrollo.

En mi empresa trabajamos utilizando una combinación entre las metodologías MSF for Agile y MSF for CMMI, buscando sobre todo un desarrollo ágil y mantener siempre la más alta calidad posible. Acá no nos complicamos con toneladas de papeles de documentación ni con diseños, ni arquitecturas súper complejos, sino que principalmente nos enfocamos en entender lo que realmente desea el cliente (con feedback constante), tener el equipo de desarrollo de más alto nivel posible (cero programadores junior) y tener un excelente equipo de testers que aseguren la calidad del producto final.

Visual Studio Team System ha sido fundamental para poder implementar el proceso de desarrollo con éxito, porque provee en gran medida de la infraestructura básica para poder integrar el trabajo de todo el equipo y llevar tracking de todo el avance. No puedo decir que sea una herramienta perfecta, pero no me imagino yo en este punto trabajando sin Team System, por la cantidad de facilidades que ofrece y por la forma como se integra al proceso de desarrollo que elegimos.

Cambiar la mentalidad de quienes dirigen los proyectos de desarrollo en esta ciudad es ridículamente difícil y complejo y requiere, sobre todo, cambiar la mentalidad de los líderes de estas empresas, pues son solo ellos quienes pueden dar la pauta para hacer el cambio. En mi empresa nos falta mucho, pero mucho, para llegar a un nivel de madurez de desarrollo aceptable, pero por lo menos creo que ya hemos dado un pequeño paso hacia adelante.

Debo anotar también que, como siempre, pues hay notables excepciones, así que en Guayaquil sí existe una que otra empresa que maneje un proceso de desarrollo más maduro, aunque generalmente son sucursales de multinacionales que vienen a hacer inversión en este país. Así mismo, debo recalcar que no soy ningún experto en metodologías de desarrollo, por lo que lo expuesto aquí es solamente mi apreciación personal en función de lo que he experimentado en mi vida de desarrollador.

Para quienes estén interesados, les sugiero revisen este link, que es el punto de entrada para conocer sobre MSF y Team System, y también el blog de Randy Miller, quien es una de las principales personas detrás de la concepción de MSF for Agile y MSF for CMMI.

Julio.

Mapeando Bases de Datos hacia Objetos .NET utilizando LINQ to SQL

Con la llegada de LINQ (Language Integrated Query) tenemos finalmente (entre otras cosas) el tan ansiado ORM (Object Relational Mapping) creado por Microsoft, el cual nos va a permitir no solo convertir transparentemente entidades de base de datos en objetos .NET, sino que nos da la habilidad de hacer todo tipo de queries contra el modelo relacional sin tener nunca que utilizar sentencias SQL, ya que las mismas se generan "tras bastidores".

El ORM al que me refiero se conoce específicamente como LINQ to SQL. Esta es solo una de las variantes de LINQ, puesto que el mismo puede utilizarse con otros orígenes de datos, como por ejemplo XML y objetos. En sí, LINQ brinda el poder de hacer todo tipo de queries en el lenguaje de preferencia, contra cualquier origen de datos, transformar (opcionalmente) los datos a la forma que uno desee y luego manipular fácilmente los resultados.

Quisiera entonces en este post brindar un vistazo rápido sobre cómo puede utilizarse LINQ to SQL para modelar una base de datos relacional utilizando objetos .NET y luego hacer queries sobre los mismos.

Preparando la Aplicación

Para demostrar el beneficio del uso de LINQ to SQL vamos a crear una sencilla aplicación ASP.NET con un DataGridView para poder visualizar los resultados de la consulta. El utilizar ASP.NET como cliente es solo una cuestión de gustos y preferencias, puesto que también podría haber utilizado una aplicación Windows Forms ó incluso una aplicación de Consola para demostrar el concepto.

Abramos entonces Visual Studio 2008 (Beta 2) y creemos una nueva ASP.NET Web Application:

AplicacionAspNet

...y a la página Default.aspx agreguémosle el GridView y démosle algún formato agradable:

AutoFormat

Generando el Modelo

Necesitamos ahora definir el modelo de objetos con el que vamos a trabajar. Para esto agregamos al proyecto un nuevo elemento del tipo "LINQ to SQL Clases":

AddLinqToSql

En el diseñador que se abre podemos empezar a arrastrar objetos desde el Server Explorer. En este caso, vamos a arrastrar las tablas Customers y Orders de la base de datos Northwind:

ModeloClases

Con esto nuestro modelo de clases inicial está listo y podemos pasar a realizar queries sobre los datos.

Realizando Queries

Supongamos ahora que, con el modelo planteado, queremos traer de la base de datos todos los Clientes radicados en Londres y mostrar los resultados en el GridView. ¿Cómo lo haríamos?

Agreguemos el siguiente código al manejador del evento Load de Default.aspx:

image

Lo primero que estoy haciendo aquí es crear una instancia de la clase NorthwindDataContext, la cual es un intermediario que nos permitirá realizar queries contra las distintas entidades de nuestra base de datos específica, así como aplicar luego los cambios realizados. Esta clase contiene propiedades que representan a cada tabla modelada en el diseñador, así como métodos para cada procedimiento almacenado que hayamos modelado (esto último lo veremos más adelante):

Intellisense

A continuación estoy usando una Query Expression, una de las extensiones al lenguaje agregadas por LINQ. Como pueden ver, se está infiriendo el tipo de datos de retorno para así simplificar el código. Sé que tanto la expresión como la inferencia de tipos suenan y se ven algo chocantes a primera vista, pero son características súper poderosas que veremos de ahora en adelante tanto en C# como en VB. Ahondar en estos temas se sale del alcance de este post, pero para quienes deseen adelantarse un poco pueden echarle un ojo a este post de Edgar Sánchez y a este otro post de Scott Guthrie.

Por último, simplemente tomamos el resultado del query y lo utilizamos como origen de datos del GridView. El resultado es este:

Resultado1

Tenemos entonces a los seis clientes radicados en Londres. ¿Qué pasaría si quisiéramos ahora traer las órdenes de compra asociadas a aquellos clientes?

Trayendo Datos de Varias Tablas

Gracias a los mapeos y relaciones establecidos en nuestro modelo pues no resulta difícil crear ahora un query que traiga todas las órdenes de compra de los clientes radicados en Londres:

VariasTablas

Noten cómo puedo navegar fácilmente hacia las relaciones de la clase Customer, en este caso hacia la colección de Ordenes del cliente (cliente.Orders).

Este nuevo query crea también un nuevo objeto con un tipo anónimo (otra de las nuevas características de C# 3.0) con dos cadenas que toman el nombre de las propiedades de los datos originales (OrderID y ContactName). Estos tipos anónimos son sumamente poderosos al usarlos en queries, porque ahorra todo el trabajo de crear clases para que almacenen cada tipo de resultado creado por varios tipos de queries.

Por acá el resultado de este query:

Resultados2

OK, OK, sé lo que están pensando: "Sí, pero yo no quiero SQL dinámico en mi código C#, quiero seguir utilizando mis procedimientos almacenados". LINQ también tiene algo que decir al respecto.

Utilizando Procedimientos Almacenados

El uso de procedimientos almacenados es y seguirá siendo un argumento válido, porque ya sea por razones de rendimiento, de seguridades, de tiempo disponible para migración, de reglas de negocio contenidas en los procedimientos, entre otras, en muchos casos será preferible mantener los procedimientos almacenados que ya hacen el trabajo por nosotros.

Como lo había mencionado antes, podemos agregar procedimientos almacenados a nuestro modelo de la misma forma como hicimos con las tablas. Agreguemos entonces el procedimiento almacenado TenMostExpensiveProducts a nuestro modelo:

StoredProceduresEnModelo

Como pueden ver, los procedimientos almacenados se ubican en el panel derecho del diseñador de LINQ to SQL. Ya con este elemento adicional en el modelo, podemos modificar nuestro query para que invoque al procedimiento almacenado y muestre sus resultados en el GridView:

StoredProcedures

Nótese que aún cuando utilizamos un procedimiento almacenado para traer los datos podríamos a continuación modificar los mismos utilizando las diversas propiedades de los objetos e invocando luego al método SubmitChanges() de NorthwindDataContext para que los cambios sean enviados a la base de datos (esto será motivo de otro post).

El GridView mostrará lo siguiente:

Resultado3

En Resumen

Vaya, este post se hizo un poco más largo de lo que pensaba, pero creo que ha demostrado el punto: LINQ to SQL ofrece una forma realmente simple y fascinante de modelar la capa de datos de una aplicación. Una vez definido el modelo de datos puedes hacer todos los queries que te puedas imaginar con facilidad y eficiencia, sin salir nunca de tu lenguaje de preferencia.

Pronto estaré publicando nuevos posts relacionados a LINQ y sus diversas características. ¡Hay tanto que cubrir!

Julio.

Más envíos