Está en la página 1de 60

nº 39 julio-agosto 2007 6,50 € Visual Basic • C# • ASP.NET • ADO.

NET • SQL Server • Windows System

dotNetManía
www.dotnetmania.com

dedicada a los profesionales de la plataforma .NET

DataGridView y estilos
Presentaciones de datos visualmente atractivas

eventos
Cuando el diseño conoció a Media Center
Arquitecturas distribuidas con Service Broker (y II) ReMIX 2007
Referencias débiles en .NET Framework Madrid
Ayuda en las aplicaciones .NET
Laboratorio
Guidance Application Toolkit
entrevista TodotNet@QA
Charlie Calvert El propósito de algunas características de .NET
Community Program Manager de C# Comunidad .NET
Microsoft Corporation Baleares on .NET
dotNetManía editorial
Dedicada a los profesionales de la plataforma .NET
Vol. III •Número 39 • Julio-Agosto 2007
Precio: 6,50 €

Editor
Paco Marín
Adiós a Orcas y a Katmai
(paco.marin@netalia.es)

Redactor jefe
Marino Posadas
(marino.posadas@netalia.es)

Editor técnico Bienvenido al número 39, de julio y agos- Este mes entrevistamos a un viejo ami-
Octavio Hernández to de 2007, de dotNetManía. go de Octavio Hernández: Charlie Cal-
(octavio.hernandez@netalia.es)
El pasado mes de junio se celebró en vert, Community Program Manager de
Redacción
Dino Esposito, Guillermo 'Guille' Som, José
Orlando el Tech-Ed 2007, donde como C# de Microsoft Corporation. Es una
Manuel Alarcón, Luis Miguel Blanco y Miguel siempre surgieron muchas noticias. A des- entrevista muy personal; léasela si tiene
Katrib (Grupo Weboo) tacar —por su repercusión mediática, más tiempo, y descubra cómo pasar de perio-
que por su importancia real—, la asigna- dista a compañero de los mejores arqui-
Empresas Colaboradoras
ción de nombres comerciales a los próxi- tectos de software del momento.
Alhambra-Eidos mos Visual Studio y SQL Server. Final- Cristian Manteiga —uno de los
Plain Concepts mente, Orcas pasa a llamarse Visual Stu- nuevos de este mes, ¡bienvenido Cris-
Raona dio 2008 y Katmai se llamará SQL Ser- tian!— publica su trabajo “Cuando el
ver 2008. ¡Ohhh, qué sorpresón...! Des- diseño conoció a Media Center. Desa-
Solid Quality Learning
pués de que el mes anterior perdiéramos rrollo de aplicaciones para Windows
Además colaboran en este número otro clásico como Longhorn, sustituido Media Center con WPF”. Precisa-
Cristian Manteiga, José Francisco Bonnín, por Windows Server 2008, la verdad es mente el desarrollo para Windows
Miguel Egea y Rodrigo Corral.
que se lo esperaba hasta el más pintado. Media Center fue uno de los temas que
Corresponsal para América Latina
Pablo Tilotta
Lamento que no hayamos podido asis- se tocaron en el CodeCamp de Huelva,
tir este año al Tech-Ed americano, aun- como tema innovador y que tiene
Ilustraciones
Mascota: Yamil Hernández
que le hemos traído las crónicas de dos muchas particularidades a estudiar.
Portada: Javier Roldán eventos locales, pero muy especiales: El artículo de portada “DataGridView
Fotografía REMIX 2007, celebrado en un lugar y estilos. Presentaciones de datos visual-
Roberto Mariscal entrañable, el Círculo de Bellas Artes de mente atractivas”, que creo que será del
Madrid, muy propio para presentar algo agrado de la mayoría de los lectores por
Atención al suscriptor tan artístico como los productos que con- su orientación práctica, es de Luis Miguel
Pilar Pérez forman la nueva suite Expression; y Blanco. Luis Miguel seguirá escribiendo
(pilar.perez@netalia.es)
CodeCamp, más campero, sí, pero un sobre esto en algunos números más, así
ejemplo más de por qué los que estamos que será cuestión de acostumbrarse.
trabajando bajo esta plataforma de desa- Por último, tenemos otro estreno, el
Edición, suscripciones y publicidad rrollo podemos estar contentos por nues- de José Francisco Bonnín, que además
.netalia tra elección (y no lo digo por las gambas de presentarnos el grupo de usuarios Bale-
c/ Robledal, 135 de Huelva, ni por el jamón de Jabugo, a ares on .NET, nos escribe un pequeño
28529 Rivas-Vaciamadrid (Madrid)
www.dotnetmania.com
los que Microsoft nos invitó generosa- pero muy interesante artículo, que le reco-
mente, no se vaya a pensar). Vea la infor- miendo: “Referencias débiles en .NET
Tf. (34) 91 666 74 77
mación en estos artículos y comprobará a Framework”. Sé bienvenido también, José.
Fax (34) 91 499 13 64
lo que tenemos la suerte de asistir por Esto parece el camarote de los Hermanos
Imprime haber elegido estar aquí. Quizá es por esto Marx, pero aún hay sitio para otro más.
Gráficas MARTE
por lo que no necesitan ser muy origina- Espero que le guste este ejemplar y que
ISSN
1698-5451
les al poner el nombre a sus productos disfrute de unas merecidas vacaciones; y,
para que éstos tengan éxito. por favor, siga leyéndonos a la vuelta.
Depósito Legal
M-3.075-2004

Paco Marín
<< dotNetManía

3
sumario 39
Eventos: REMIX 2007 de Madrid y CodeCamp 2007 de Huelva 8-10
Entrevista a Charlie Calvert 12-15
Durante el pasado MVP Summit tuvimos la oportunidad de reencontrarnos con un viejo
amigo, Charlie Calvert, Community Program Manager de C#.

Personas o bits 16-17


Los desarrolladores de software, yo el primero, tendemos a centrarnos en cuestiones técnicas, a
pensar que este tipo de cuestiones son las de mayor importancia en la vida de los proyectos de
desarrollo. Pero esto no es cierto. Voy a dedicar esta columna a argumentar el porqué. La
cuestión es muy interesante en mi opinión, porque quizás los desarrolladores y la industria del
software han estado equivocando dónde deben poner su foco de atención.

Cuando el diseño conoció a Media Center.


Desarrollo de aplicaciones para Windows Media Center con WPF 18-23
Windows Presentation Foundation ha supuesto una revolución en el mundo del desarrollo de
interfaces de usuario para nuestras aplicaciones. En anteriores entregas de esta revista, hemos
podido conocer un poco más sobre lo que el nuevo subsistema de presentación de Windows nos
proporciona; a lo largo de este artículo, vamos a dar a conocer lo necesario para poder
aprovechar las bondades de WPF en la creación de aplicaciones para Windows Media Center.

DataGridView y estilos. Presentaciones de datos visualmente atractivas 24-32


En el presente artículo haremos un repaso de los estilos, una de las características que este
control proporciona, con la finalidad de conseguir que la información visualizada en nuestras
aplicaciones tenga un toque más sugestivo para los usuarios.

Arquitecturas distribuidas con Service Broker (y II) 33-38


Lanzar procesos asíncronos, o usar la base de datos como sustento para conseguir asincronía es sin
duda interesante; ahora bien, lo es más aún que esa arquitectura permita, de forma transparente al
que la programa, distribuir los componentes en distintos servidores e incluso balancear la carga que
pueda suponer la operación en destino. En esto invertiremos párrafos de este artículo, veremos cuál es
la arquitectura que sustenta todas estas operaciones dentro de Service Broker.

Referencias débiles en .NET Framework 40-41


Seguramente en alguna ocasión se le ha presentado una situación en la que tiene que crear un
objeto que ocupa bastante memoria y que tarda en crearse. En tales casos, lo primero sería
revisar el diseño de ese objeto para ver cómo optimizarlo, pero si no podemos hacerlo es común
que nos asalte la duda de qué hacer: ¿hacemos Dispose() del objeto al acabar de utilizarlo para
liberar memoria? ¿o lo mantenemos para evitar los costes de construcción en un futuro?

Ayuda en las aplicaciones .NET.


El ayudador que nos ayude… seguramente será HelpProvider 42-47
Un sistema de ayuda es algo que siempre deberíamos implementar en nuestras aplicaciones. En
este artículo veremos cómo usar el componente HelpProvider, que nos permite añadir ayuda a
nuestras aplicaciones Windows de una forma muy sencilla.

dnm.todotnet.qa 48-50
El propósito de algunas características de .NET

dnm.laboratorio.net 52-55
Guidance Application Toolkit

dnm.biblioteca.net 57
Essential Windows Presentation Foundation
Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries

dnm.comunidad.net 57
Baleares on .NET. .NET Users Group de las Islas Baleares

dnm.desvan 58
noticias noticias noticias noticias noticias
Noticias desde Tech-Ed 2007 de Orlando
Microsoft desveló la estrategia de la compañía para el futuro próximo en lo referente
a las herramientas de desarrollo y para profesionales TI en el pasado Tech-Ed USA,
celebrado del 4 al 8 de junio en el Orange County Convention Center en Orlando,
Florida.
Bob Muglia, vicepresidente Talk Service y el anuncio de BizTalk Server 2006 R2
senior de Server and Tools Busi- para el tercer trimestre de 2007, que aportará infraes-
ness en Microsoft Corporation tructura RFID, soporte nativo para intercambio de datos
fue el encargado de presentar la electrónicos (EDI) y nuevas tecnologías para integrar
keynote inicial en Tech-Ed 2007, .NET Framework 3.0, el 2007 Microsoft Office System
donde detalló la estrategia de la y Windows Vista (la beta 2 del producto ya está disponi-
compañía para el próximo año. ble); y, por último, el SDK para Open XML, que ha sido
Entre las novedades que más pue- diseñado para ayudar a los desarrolladores a crear aplica-
den interesar al desarrollador están: la asignación de nom- ciones de negocio para Office que aprovechen este for-
bre comercial a Orcas por Visual Studio 2008, y el anun- mato estándar de ECMA.
cio para el verano de la beta 2, que incluirá Visual Stu- Puede ver un vídeo espectacular y divertido de esta
dio Shell; la asignación de nombre comercial a Katmai keynote en: http://www.microsoft.com/winme/0706/29992/
por SQL Server 2008, el anuncio de la compra de herra- teched_.asx y la transcripción de ésta en: http://www.micro-
mientas de Dundas Data Visualization Inc. para SQL soft.com/presspass/exec/bobmuglia/06-04-2007TechEd.mspx.
Server Reporting Services y la presentación de la CTP de Más información en el sitio del Tech-Ed Virtual en:
junio de 2007; los lanzamientos de la primera beta públi- http://www.virtualteched.com o en el sitio oficial en:
ca de Microsoft NET Framework 3.5, una CTP de Biz- http://www.microsoft.com/events/teched2007.

CTP de junio de SQL Server 2008


Microsoft ha libera-
do la CTP de junio
de la nueva versión
de SQL Server, antes
llamada Katmai, y cuyo nombre comercial será Micro-
soft SQL Server 2008.
SQL Server 2008 sienta las bases para una gestión
innovadora basada en políticas que permite a los admi-
nistradores reducir el tiempo que gastan en las tareas de
mantenimiento. SQL Server 2008 aporta mejoras en la
plataforma de BI de SQL Server, permitiendo a los clien- Asimismo, Microsoft ha desvelado la compra de los
tes proveer información actualizada con el Change Data productos de visualización de datos de la compañía Dun-
Capture y las nuevas características de MERGE y desa- das Data Visualization, los cuales aportan gráficos ricos
rrollar cubos de servicios de análisis altamente escalables dentro de SQL Server Reporting Services, permitiendo
con los nuevos entornos de desarrollo. a los usuarios crear informes y aplicaciones con infor-
Microsoft está promocionando cuatro capacidades mación rica. Las herramientas que Microsoft ha inclui-
clave que serán la base de SQL Server 2008: desarro- do en SQL Server 2008 son Dundas Gauge, Dundas
llo dinámico, soporte para tipos de datos no estructu- Map y Dundas Chart.
rados, soporte para aplicaciones de misión crítica y Más información: http://www.microsoft.com/sql/prodin-
business intelligence. fo/futureversion/default.mspx y en https://connect.microsoft.com/
<<dotNetManía

En el gráfico puede observar algunas de las mejoras SQLServer/content/content.aspx?ContentID=5470. También


más significativas que ya están en esta CTP y las que irán puede descargarse un white paper en inglés desde: http://www.
viniendo con cada CTP cada 60 días a partir de ahora. microsoft.com/sql/techinfo/whitepapers/sql2008Overview.mspx.

6
<< dnm.directo.noticias
Orcas ya tiene nombre: Visual Studio 2008 Altova anuncia soporte para
Open XML en XML Spy
Servirá a quienes desarrollen otros len-
guajes de programación u otras herra- Altova acaba de anunciar soporte com-
Otro de los recientes anuncios de Micro- mientas especializadas, que podrán inte- pleto para el formato Open XML introduci-
soft en el Tech-Ed de Orlando es el nom- grar dentro del mismo Visual Studio o eje- do con Office 2007 en su producto estrella,
bre comercial de Orcas, la nueva versión cutar de manera asilada. El modo inte- XMLSpy. XMLSpy 2007 Release 3 ofrece
de Visual Studio, que se llamará Visual grado está pensado fundamentalmente validación completa de documentos Open
Studio 2008 (los de marketing no se han para lenguajes de programación, por XML, ayuda inteligente en la edición de esos
estrujado el cerebro, ciertamente). Tam- ejemplo, Iron Python o uno que desarro- documentos, y soporte para el desarrollo de
bién se ha hecho público lo que ya sabía- llemos nosotros y que se unirá al resto de transformaciones XSLT y XQuery sobre
mos todos, que el próximo Framework se lenguajes de Visual Studio; el modo ais- datos en formato Open XML.
llamará .NET Framework 3.5 e irá lado está más bien pensado para herra- XMLSpy es el editor XML líder de la
incluido con Visual Studio 2008, si bien mientas especializadas desarrolladas por industria, y ofrece una vasta funcionalidad
esta versión, por primera vez, soportará nosotros, que pueden ejecutarse como basada en los estándares W3C relacionados
también versiones anteriores como .NET herramientas independientes, sin los len- con XML, incluyendo XSLT, XQuery,
Framework 2.0 y .NET Framework 3.0 guajes ni proyectos estándar, y se puede XPath, XML Schema y otros. Asimismo,
(aunque no las versiones 1.x, ya que entre desplegar -si procede- otra instancia de ofrece una perfecta integración con el entor-
éstas y las posteriores hay cambios en el un Visual Studio estándar. no integrado de Visual Studio 2005. Para más
CLR de importancia que lo impiden). No El SDK de Visual Studio 2008 con- información, visite http://www.altova.com.
obstante, Visual Studio 2008 se podrá eje- tendrá documentación y ejemplos para
cutar en la misma máquina que versiones ayudarle a comenzar a integrar sus herra- Novell hace una presentación
anteriores. mientas o lenguajes. de Silverlight 1.1 sobre Linux
La beta 2 de Visual Studio 2008 y Puede encontrar más información
Recientemente, Miguel de Icaza, vice-
.NET Framework 3.5 se esperan para este sobre Visual Studio 2008 Shell en la
presidente de desarrollo de Novell, presentó
mismo verano. Ésta soportará la licencia página http://msdn2.microsoft.com/en-
en el marco del REMIX 2007 que tuvo lugar
go-live, lo que quiere decir que ya pueden us/vstudio/bb510103.aspx o en el blog
en París una versión preliminar de Silverlight
ponerse aplicaciones en producción con del equipo de desarrollo de Visual
1.1 (a la que han denominado Moonlight)
esta versión previa. Studio Extensibility (VSX) en:
basada en los recursos del proyecto Mono,
Una de las novedades presentadas es http://blogs.msdn.com/vsxteam.
una alternativa de software libre de .NET,
Visual Studio 2008 Shell, que se incluirá Más información sobre Visual Studio
corriendo sobre un sistema Linux. Según de
de forma gratuita como parte del SDK de 2008 en: http://msdn2.microsoft.com/es-
Icaza, el equipo de desarrollo de Mono (dis-
Visual Studio 2008 a partir de la beta 2. es/vstudio.
tribuido por todo lo largo y ancho del plane-
ta) implementó la versión en 21 días de tra-
bajo continuo. Más información en el sitio
Primera CTP de Acropolis Web del producto, http://www.mono-
project.com/Moonlight.
Microsoft ha anunciado la primera CTP módulos reusables y conectables que le
de Acropolis, code name de un conjunto de permitirán crear fácilmente aplicacio-
componentes y herramientas que hacen nes complejas y basadas en el negocio
eScrum 1.0
más fácil para los desarrolladores la cons- en menos tiempo. Según publica Somasegar en su blog,
trucción y gestión de aplicaciones cliente • Integrar y alojar sus módulos en aplica- muchos equipos de desarrollo de Microsoft
.NET modulares y enfocadas al negocio. ciones tales como Microsoft Office o están usando metodologías ágiles para el desa-
Acropolis es parte de la ola de versiones construir rápidamente interfaces cliente. rrollo de software. Un equipo de desarrollo
“.NET Client Futures”, una vista previa de • Cambiar rápidamente el aspecto de sus de Microsoft ha construido para este propó-
la tecnología de Microsoft que está por venir aplicaciones usando temas incorpora- sito una herramienta basada en Web y cons-
para las aplicaciones cliente Windows. dos o diseños personalizados usando truida bajo VS TFS. Viendo la aceptación que
Acropolis se basa en WPF, propor- XAML. ha tenido internamente en los equipos de
cionando herramientas y componentes • Añadir características tales como nave- desarrollo, han decidido ponerla a disposi-
precompilados que ayudan a los desarro- gación de workflow y vistas específicas ción de los clientes en MSDN en http://www.
lladores a ensamblar aplicaciones. Con del usuario con un código mínimo. microsoft.com/downloads/details.aspx?Famil-
<<dotNetManía

Acropolis usted será capaz de: • Gestionar, actualizar y desplegar sus yID=55a4bde6-10a7-4c41-9938-
• Crear rápidamente experiencias de usua- módulos rápida y fácilmente. f388c1ed15e9&displaylang=en.
rio WPF para sus aplicaciones cliente. Más información en: http://windows- Más información en el blog de Somase-
• Construir aplicaciones cliente desde client.net/Acropolis. gar: http://blogs.msdn.com/somasegar.

7
eventos
REMIX 2007 en Madrid
eventos

David Carmona y Enrique Fernández-Laguilhoat en la keynote oficial

<< Con la presencia de unos 700 diseñadores y desarro- sión de Desarrollo y Plataforma. Debió haber sido
lladores venidos de toda España, los pasados 4 y 5 de presentada por Forest Key, Development Tools Pro-
junio se celebró en el Círculo de Bellas Artes de duct Management Director (recientemente entrevis-
Madrid el REMIX 2007, evento que resumió lo mejor tado en dotNetManía), pero una inoportuna varice-
de lo sucedido el mes pasado durante el MIX de Las la le impidió hacer el viaje. Enrique Fernández hizo
Vegas, a la vez que sirvió para hacer la presentación énfasis en la aparente contradicción Alcance vs. Rique-
oficial en España de los productos que conforman la za (una frase que pierde necesariamente cuando se
nueva suite Expression, dirigida principalmente a los traduce el juego de palabras original, Reach vs. Rich, y
diseñadores. El evento contó con la presencia de des- que alude a la disponibilidad universal de las aplica-
tacadas personalidades llegadas desde Redmond espe- ciones Web frente a las mayores posibilidades gráfi-
cialmente para el evento, como Arturo Toledo (User cas de presentación de las aplicaciones locales), y en
Experience Technical Product Manager), Tim Sne- el conjunto de tecnologías y herramientas que sumi-
ath (Group Manager Client Platform Evangelism), nistra Microsoft para ofrecer a los diseñadores y desa-
Steve Marx, Katherine Heller y Jason Suess (Tech- rrolladores lo mejor de ambos mundos. Destacó ade-
nical Evangelists), así como de otros ponentes de reco- más la cada vez más amplia gama de dispositivos para
nocida fama internacional, como Tom Raftery los que los creadores de software actuales deben desa-
(www.tomrafteryit.net). rrollar aplicaciones, y cómo la estrategia de Micro-
La jornada del lunes 4 comenzó con la keynote de soft, centrada en .NET Framework, permite “atacar”
apertura, a cargo de Enrique Fernández Laguilho- todas esas plataformas con una inversión y curva de
at, Director de Desarrollo de Microsoft Ibérica, y aprendizaje mínimas. Por último, hizo la presenta-
David Carmona, Development Advisor de la divi- ción de Silverlight, un plug-in compatible con los
<< dnm.directo.eventos

principales navegadores disponibles en el mercado


(Explorer, Firefox, Opera y Safari), y de la suite Expres-
sion, un conjunto de potentes herramientas visuales que
hacen posible el trabajo conjunto de diseñadores y pro-
gramadores a la hora de crear aplicaciones tanto para la
Web como para el escritorio.
David Carmona, por su parte, habló sobre las posi-
bilidades que abre ante los desarrolladores la disponibi-
lidad de WPF y Silverlight para la creación de aplica-
ciones con interfaces de usuario más intuitivas, usables
y visualmente impactantes. En ese sentido, presentó tres
aplicaciones pioneras en España: el lector digital de MAR-
CA, desarrollado por Plain Concepts en colaboración
con el periódico; un visor de competiciones deportivas,
creado por Indra; y una aplicación de gestión de recur-
sos humanos desarrollada por Meta4.
Arturo Toledo y Enrique Fernández-Laguilhoat en rueda de prensa
A lo largo de las dos jornadas de trabajo se pre-
sentaron, en dos tracks diferentes, numerosas ponen-
cias de gran interés para los asistentes: tuvo como objetivo a presentar las nuevas posibi-
• Arturo Toledo llevó una buena parte del peso del lidades incorporadas a WPF que hacen posible
evento en lo relativo a presentar las diferentes crear experiencias de lectura digital como las que
herramientas que componen la suite Expression, ya ofrecen el New York Times y otros periódicos.
con tres ponencias dedicadas a Silverlight, Expres- • Steve Marx impartió tres ponencias relaciona-
sion Web y Expression Blend, respectivamente. das con aspectos avanzados del desarrollo para
• David Carmona hizo las delicias de los asisten- la Web, una de ellas (“Creación de un sitio Web
tes a lo largo de dos sesiones dedicadas al desa- de vídeos”) en colabora-
rrollo con WPF. También fueron muy bien reci- ción con Ethel García
bidas por los participantes las sesiones dedica- (Microsoft).
das a diferentes aspectos de AJAX, impartidas • Jason Suess y Jesús de
por David Salgado (Microsoft) y nuestro Pablos (Tenea Tecno-
columnista Miguel Jiménez (ilitia). logías) disertaron sobre
• Sumamente claras y detalladas fueron las dos las posibilidades que
ponencias presentadas por Catherine Heller, ofrece Windows Media
relacionadas con los servicios de Windows Live Center tanto para el
y la utilización de las API que estos servicios entretenimiento como
ponen a disposición de los desarrolladores. para los negocios y
• Por su parte, José Carlos Palencia (Universidad sobre los modelos de
de Cantabria) hizo una amplia presentación de publicidad que se están
conceptos cuyo uso es imprescindible en todas las comenzando a aplicar
aplicaciones Web modernas, desde XHTML y para esta plataforma.
CSS hasta los principios de la accesibilidad y los • Tom Raftery incidió
fundamentos de la próxima Web semántica. sobre los aspectos de
• En la sala en la que transcurrieron las sesiones en negocio relacionados
inglés, Tim Sneath también impartió tres sesio- con la Web en su ponencia “La Web 2.0 apli-
nes: las dos primeras dedicadas al desarrollo para cada a su negocio”.
Silverlight con Javascript y con .NET, respecti-
<<dotNetManía

vamente; mientras que la tercera (presentada con- Se espera que en el futuro REMIX se convierta en un
juntamente con Iván González, Cristian Man- evento periódico para la comunidad de desarrolladores
teiga y Octavio Hernández, de Plain Concepts) que utilicen las nuevas tecnologías presentadas este año.

Texto: Octavio Hernández


Fotografía: Roberto Mariscal 9
<< dnm.directo.eventos

CodeCamp Huelva 2007


Evento “freekie” de fin de semana para emprendedores

Durante los días 2 al 3 de junio Micro- Ludópatas anónimos. Desarrollo de tores principiantes y profesionales com-
soft Ibérica celebró en el camping La juegos con XNA. Donde Javi Cantón puesto por una pantalla y un salpicadero
Aldea en El Rocío (Huelva) el último e Iñaki Ayúcar nos hicieron revivir aque- de coche real, desarrollado íntegramen-
CodeCamp, que reunió aproximada- llos viejos juegos con el lema “Un vista- te en C# y ManagedDirectX 9.0c. Más
mente a 200 emprendedores y apasiona- zo rápido a los últimos 30 años para enten- detalles de este proyecto en www.simax.es.
dos de la tecnología (o al revés). der los próximos 10”. El Rock ha muerto. Web 2.0. Chema
Los asistentes no eran, ni mucho El tunante y el tunero. Movilidad. Don- Alonso y Ricardo Varela.
menos, empresarios al uso, ávidos de de Alejandro Mezcua y Unai Zorrilla nos Ask the Experts.
hacer negocios y nuevos contactos con el dieron una larga lista de consejos para mejo-
dinero como único fin. Como en otros Reconocimiento de voz. Pilar Man-
rar el rendimiento de nuestro código.
CodeCamp, la gran mayoría eran apa- chón, de la empresa Intelligent Dialo-
Tetris empresarial. Cómo montar una gue Systems (INDISYS), presentó su
sionados de la tecnología, que lo único
empresa. “Ni un solo proyecto sin asis- asombroso proyecto que une al recono-
que pretenden es vivir de sus ideas, per-
tencia” por la Fundación Red Andalu- cimiento de voz el procesamiento del len-
sonas creativas que no aspiran a hacerse
cía Emprende, que es una entidad sin guaje natural, aportando un sistema de
ricos –aunque si cuela…–, pero sí a ganar-
ánimo de lucro dedicada a la promoción diálogo inteligente enfocado a la domó-
se la vida sin la presión de un jefe que les
de la actividad emprendedora en la tica, especialmente indicado para perso-
guíe, realizando trabajos repetitivos y poco
Comunidad Autónoma Andaluza (www.a- nas con problemas de movilidad, aunque
motivantes. La cantera está clara: los clu-
emprende.net). con otros posibles usos en la industria.
bes de .NET, creados en la universidad y
formados por estudiantes de este perfil. ShowCase Emprendedores. Alberto Permite hacer consultas al sistema en len-
El programa de ayuda permanente es Resco Pérez y Rubén Pérez Estévez guaje natural, del tipo “Ambrosio, ¿está
Emprendia (www.msdnemprendia.com), de la Universidad de Deusto presentaron todo apagado y la alarma conectada?”.
desde donde se ofrecen recursos técnicos, el proyecto ubiClassRoom, que es una Según sus creadores: “La voz y el lenguaje
licencias y promoción, así como recursos plataforma multicanal para el seguimien- natural son el futuro de las comunicacio-
de negocio y económicos a través de los to y reproducción de clases tanto en tiem- nes”. Y que lo digan, ¡yo quiero uno! Más
socios del programa. po real como en modo off-line desde cual- detalles en www.indisys.es.
En este evento intervinieron empren- quier localización. ShowCase Emprendedores.
dedores consagrados que vienen consi- ShowCase Emprendedores. “Ponemos Robocop .NET. Robótica. Cómo hacer
guiendo vivir de sus ideas hasta la fecha, voz a tus sentimientos”, por Óscar Pino una aplicación para robots con Microsoft
aunque ninguno rico, o eso creo, y técni- Morillas, José Luis González Sánchez Robotics Studio, por parte de Miguel
cos de renombre en el ámbito académico y Cristóbal Espinosa Morente, ganado- Ángel Ramos, MVP de ASP.NET y uno
y profesional. res de la edición española de la Imagine de los ganadores de una edición anterior
La agenda no fue únicamente sobre Cup 2007, presentaron su proyecto Sc@ut, de la Imagine Cup española con la Uni-
la filosofía del “emprendedor freekie” un software comunicativo aumentativo versidad de Sevilla.
(dicho cariñosamente), ni mucho menos; diseñado para favorecer el uso de sistemas
Programando la tele. Media Center.
hubo mucho de tecnología puntera y de interacción sonoro-pictográficos de los
Por Pedro J. Gómez y Nuno Sima-
ejemplos de pequeñas empresas que han niños autistas (http://scaut.ugr.es).
ria de la empresa Hoplite Software
salido adelante -o están en ello- con sus La Web se vuelve sexy. Silverlight. Isa- (www.hoplite.es), que han desarrollado una
ideas, como por ejemplo con el recono- bel Gómez y José Murillo, ambos ISV versión del servicio de revelado de foto-
cimiento de voz, desarrollo de simulado- Developer Evangelists en el departamento grafías on-line revelaonline.com para Media
res y juegos, robótica, programación para DPE de Microsoft Ibérica, dieron un Center y que han conseguido que Micro-
Media Center, etc.; ejemplos de que es repaso a las características de las futuras soft presente esta aplicación en el lanza-
posible hacerse un hueco en este merca- versiones 1.0 y 1.1 de Silverlight (http://sil- miento público del Media Center y que
do si se tiene una buena idea y el empu- verlight.net). la incluya en el Online Spotlight.
je necesario. ShowCase Emprendedores. Iñaki Ayú-

agenda
<<dotNetManía

Más información en la Web de car presentó el proyecto SIMAX, un


Emprendia o en MSDN España en: espectacular simulador de conducción de
www.microsoft.com/spain/msdn. bajo coste para la formación de conduc-

10
Octavio Hernández
entrevista

Charlie Calvert en Surprise Lake, Washington

entrevista a Charlie Calvert


Charlie, es un placer volvernos a ver después de
Durante el pasado MVP Sum- tanto tiempo (la última vez fue durante la época
dorada de Delphi, en el milenio pasado ☺). Para
mit tuvimos la oportunidad de comenzar, ¿cuáles son tus responsabilidades aquí
reencontrarnos con un viejo en Microsoft?
Fui contratado por Microsoft por mi experien-
Octavio
amigo, Charlie Calvert, Com- cia de trabajo con las comunidades de desarrolla-
dores. Mi trabajo es establecer conexiones con los
Hernández es munity Program Manager de desarrolladores de la comunidad Microsoft, y ayu-
Development Advisor
dar a nuestro equipo de desarrollo a hacer el tra-
de Plain Concepts, C#. No pudimos resistir la ten- bajo necesario para satisfacer los requerimientos de
editor técnico de
dotNetManía y tación de entrevistarlo, a lo que la comunidad. Una parte del trabajo es muy corrien-
tutor de campusMVP. te, como hacer un seguimiento de los foros o del
Es MVP de C# desde él accedió gentilmente. programa Connect (http://connect.microsoft.com).
2004, MCSD y MCT. Otras actividades, como hablar con los desarrolla-
<< dnm.directo.entrevista
dores, escribir en mi blog o mantener
la página del Centro de Desarrollo
(http://msdn2.microsoft.com/vcsharp), son
muy satisfactorias para mí. Me gusta
mucho trabajar con la comunidad y
tratar con los desarrolladores.
Somos parte de una generación que
creció cuando el software empezó a
hacerse esencial en todas las áreas
de la vida cotidiana. ¿Puedes con-
tarnos cómo empezaste en el mun-
do de la informática?
La primera vez que fui a la univer-
sidad mi especialidad era Lengua y Lite-
ratura Inglesa, y pasaba gran parte del
tiempo leyendo novelas y poesía. No
terminé esa primera vez, pero sí la
segunda, y a mediados de los ochenta
obtuve mi título de Periodismo en la Octavio Hernández con algunos de los Program Managers del equipo de C#:
Universidad Evergreen en Olympia, de izquierda a derecha, Scott Nonnenberg, Raj Pai y Charlie Calvert
Washington. Después de graduarme,
empecé a trabajar en un pequeño perió- ¿Y cómo empezaste a trabajar en sado en los servicios online, especialmen-
dico que tenía la oficina en Olympia y Borland? te Compuserve, que utilizaban todos los
la imprenta en Portland, Oregón. El Poco tiempo después pasé a trabajar programadores Pascal de la época. Cono-
periódico necesitaba encontrar una en otro pequeño periódico, “The Mor- ciendo eso, Borland puso un día una ofer-
manera de enviar los artículos entre ton Journal”, cerca de Mount Rainier, ta de empleo en uno de los foros de Pas-
ambas sedes, y no recuerdo por qué Washington. En aquel tiempo comenza- cal, y yo rellené el formulario realmente
razón me ofrecí para resolver aquel pro- ba ya la transición hacia un periodismo sin mucha esperanza de obtener res-
blema. Prácticamente no tenía expe- informatizado. Utilizaban WordPerfect, puesta. Pero cerca de un mes después
riencia ninguna con los ordenadores, ni y pronto me convertí en el experto de la sonó el teléfono, y alguien llamado David
conocía a nadie que la tuviera. casa en desarrollar código para automa- Wilhelm me dijo que me enviaría un
El periódico tenía un ordenador tizar las tareas de oficina utilizando el len- billete de avión a San José, California para
portátil Osborne1 con un módem de guaje de macros del producto. una entrevista de trabajo.
puerto serie, y después de muchos expe- En aquella época todo el mundo ya El día que llegué a la central de
rimentos y con la ayuda de un grupo de hablaba sobre las expectativas de creci- Borland en Scotts Valley, California,
gente de la Universidad de Puget Sound miento de la industria informática. Así llovía a cántaros. Me entrevistaron
logré resolver el problema, transmitien- que me apunté a diversos cursos bási- diversas personas durante horas. Al ter-
do archivos a lo que entonces me parecía cos de programación en la Universidad minar, volví al hotel, y cuando me dis-
una velocidad increíble: 110 baudios. Yo de Centralia. Un buen profesor me ponía a llamar a mi esposa para con-
quedé realmente entusiasmado con aque- enseño allí a programar en Turbo Pas- tarle cómo había ido todo (no hacía ni
llo, y miraba asombrado en la pequeña cal 4.0, y mi entusiasmo por el mundo veinte minutos que había salido de Bor-
pantalla monocroma cómo se transfería de la programación se disparó. Me land) el teléfono empezó a sonar. El
cada carácter a través de la línea. recuerdo trabajando obsesivamente en jefe de departamento de Soporte téc-
Entonces descubrí el mundo de los una versión del “Juego de la vida” de nico me comunicaba que había sido
Bulletin Board Systems (BBS). Comencé a Conway, y desarrollando estructuras de aceptado. Así que el mensaje a mi espo-
escribir correos y leer grupos de noticias, datos como colas, pilas y listas doble- sa cambió por “prepara las cosas, nos
e imaginé (como seguramente miles de mente enlazadas. Enamorado de la pro- mudamos a California”.
otras personas en aquella época) el fabu- gramación, decidí volver a Evergreen ¿Qué empezaste haciendo allí?
loso mundo conectado que se nos venía para obtener un título en Informática, Primero estuve trabajando seis meses
encima. Fue un momento de revelación lo que logré al cabo de año y medio en el soporte técnico de Turbo Pascal. Un
<<dotNetManía

para un lingüista que nunca antes pensó aproximadamente. día, después de unos seis meses, una edi-
que tendría que hacer algo más técnico Entonces llegó el momento de bus- torial llamó a la dirección de la empresa
que instalar un equipo de música. car un trabajo adecuado. Seguía intere- diciendo que estaban buscando un autor
1
Ver http://en.wikipedia.org/wiki/Osborne_1.

13
<< dnm.directo.entrevista
que escribiera un libro sobre Turbo Pas- hace ya muchos años), valían 30 centavos Muchos de mis viejos amigos de Bor-
cal. Alguien recordó que yo había sido cada una. land han terminado trabajando en Micro-
periodista: “Ese tío nuevo de soporte téc- Tuve la fortuna, no obstante, de soft. La mayoría de ellos vino hace ya
nico se ganaba la vida escribiendo, ¿por encontrar trabajo rápidamente en Fala- años, y yo me siento como el último reza-
qué no le preguntan si quiere escribir el fel, una empresa creada por algunos vie- gado que finalmente ha encontrado el
libro?”. Así que escribí en unos tres meses jos amigos de Borland. Allí empecé a camino de Scotts Valley a Redmond.
mi primer libro, “El 101 de programación programar en C#, y esa fue mi puerta Por supuesto, es emocionante volver
en Turbo Pascal”; eso me introdujo en el de entrada al mundo del desarrollo para a estar en un mismo equipo con Anders
mundo de la escritura de libros técnicos. .NET Framework. Hejlsberg. Es un desarrollador de gran
Después de publicado el libro, ¿Cómo es que viniste a trabajar a talento, y una persona fascinante a la que
alguien llamado David Intersimone, Microsoft? es un placer conocer. A Chuck Jazd-
del departamento de Relaciones con los En el momento en que empecé a tra- zewski también lo veo frecuentemente.
desarrolladores, me hizo una visita. Esta- bajar en Falafel, era un entusiasta de De hecho, un par de veces he pasado por
Linux y Java, y realmente no esperaba delante del despacho de Anders y los he
que la plataforma .NET me interesara visto hablando como si fuera en los vie-
mucho. Sabía que Anders Hejlsberg, jos tiempos, cuando planificaban la
el gran arquitecto que creó Turbo Pas- siguiente versión de Delphi. Hay muchos
cal y Delphi, estaba involucrado en el otros viejos amigos de Borland por aquí,
desarrollo de C#, pero no podía imagi- y verlos es siempre un placer.
narme que aquello me entusiasmaría Por supuesto, trabajar con Anders es
mucho. Estaba equivocado. C# y Visual un privilegio muy especial. Él tiene
Studio me sedujeron desde el principio. muchas cualidades, pero creo que su
El lenguaje estaba muy bien diseñado, y mayor talento está en su habilidad para
el entorno era fácil de usar y estaba reple- analizar un problema complejo y descu-
to de las características que hacen el desa- brir una solución simple e intuitiva. Su
rrollo fácil y productivo. mente filtra automáticamente las solu-
ba trabajando en un vídeo técnico para Luego Steve Teixeira, uno de mis ciones confusas o demasiado complejas.
el aprendizaje de C++ y necesitaba ayu- compañeros en Falafel se fue a trabajar Siente una aversión natural hacia las solu-
da con el guión. Antes de darme cuen- a Microsoft. Seguí su carrera desde la ciones enredadas. Esta es una opinión
ta, estaba en un estudio de grabación. El distancia, y me decía que estaba muy muy subjetiva mía, pero creo que parte
vídeo tuvo mucho éxito, y aunque lue- contento en Seattle. Steve y yo nos de su genio también está simplemente
go no trabajé en ninguno más, sí escribí conocemos desde hace mucho tiempo, en saber cuándo eliminar una caracterís-
nueve libros más de los que en total se y sus experiencias en Microsoft tuvie- tica que aún no se puede implementar
han vendido más de 100.000 copias. ron su influencia en mí. limpiamente. Para él es mejor no hacer
En cierto momento, David Intersi- Mi propia fascinación con C# con- algo antes que hacerlo mal. Por supues-
mone me llevó con él al departamento tinuó creciendo, y como sin darme to, él generalmente encuentra solucio-
de Relaciones con los desarrolladores, cuenta empecé a buscar trabajo en nes a problemas que se resisten a otros
y empecé a viajar por todo el mundo a Redmond. Al poco tiempo volaba a desarrolladores; pero si no logra encon-
presentar Delphi, C++ Builder y JBuil- Seattle para una entrevista, y unas trarla, sabe cuándo retroceder. Otros
der a audiencias técnicas. Fueron tiem- semanas después aceptaba la oferta. arquitectos hacen mucho énfasis en la
pos maravillosos, y aún sigo siendo buen Fue otro de esos cambios contunden- completitud, y a veces terminan ofre-
amigo de David. tes que parecen ocurrir sin que uno se ciendo soluciones difíciles de usar. Por
¿Cuándo dejaste Borland? dé bien cuenta de cómo han sucedido. último, puede que a él no le guste que yo
Dejé Borland en 2000. Como casi Quince años atrás me mudé del esta- diga esto, pero creo que otra parte más
todo el mundo (al menos, eso parece), me do de Washington a California para de su genio está en saber cuándo hay que
fui a trabajar a una empresa “.com” de trabajar en Borland; ahora volvía a crear algo nuevo y cuándo utilizar algo
nueva creación en el Silicon Valley. Elegí Washington para trabajar en Micro- que otro ha desarrollado. Las personas
muy mal momento, porque la debacle de soft. Había dado una vuelta en círcu- creativas frecuentemente quieren hacer-
las “.com” se produjo solo algunos meses lo para volver al sitio del que partí; lo todo por sí mismas. Pero Anders reco-
después. Cierto día tenía miles de accio- pero ahora todo era diferente. noce rápidamente una buena solución
<<dotNetManía

nes a 130 dólares cada una, y un mes des- ¿Qué se siente al volver a trabajar cuando la ve. Él la sopesa contra las otras
pués habían perdido todo su valor. La últi- con viejos amigos como Anders, opciones, y la utiliza si piensa que es la
ma vez que comprobé su valor (de esto Chuck y otros? mejor alternativa.

14
<< dnm.directo.entrevista
aplazada. En el futuro, estas técnicas de
programación funcional nos darán una
oportunidad de hacer un procesamien-
to paralelo que es difícil de lograr con el
código tradicional.
LINQ y la base de código basado en la programación LINQ es también flexible y confi-
funcional que lo acompaña son pasos de avance gurable. Ya se han desarrollado pro-
veedores LINQ personalizados, como
gigantescos para la comunidad de desarrolladores LINQ to Amazon. Los programado-
res con talento podrán crear otras
herramientas similares, que luego
serán utilizadas por toda la comunidad
para mejorar sus oportunidades de
desarrollo. LINQ, los genéricos, las
¿Cómo es tu interacción con el res- ¿Cuál es tu opinión respecto a las expresiones lambda, los árboles de
to del equipo de C#? nuevas características que se incluirán expresiones y otras innovaciones en el
En el equipo de C# hay una cantidad en C# 3.0, y especialmente LINQ? lenguaje C# hacen posible que las tare-
de talento increíble. Yo he sido bendeci- LINQ y la base de código basado en as de desarrollo sean mucho más sim-
do con la oportunidad de trabajar en dos la programación funcional que lo acom- ples de lo que eran anteriormente.
empresas de software de talla mundial. paña son pasos de avance gigantescos para LINQ y la programación funcional
Cuando empecé a trabajar allí, Borland la comunidad de desarrolladores. El bene- representan un cambio significativo en la
tenía más desarrolladores de primera línea ficio principal y obvio es la introducción manera en que los desarrolladores escri-
por metro cuadrado que ninguna otra de capacidades de consultas nativas para ben el código. No obstante, las tecnologías
empresa de software en aquel momento. el lenguaje C#. Llevamos años desarro- fundamentales de LINQ, como LINQ
Aquello era un imán para el talento, y el llando aplicaciones corporativas en las que to SQL o LINQ to Objects, no son difí-
entusiasmo y energía con el que los desa- la mitad de la aplicación está escrita en ciles de entender. Éste es un momento
rrolladores de Borland perseguían sus SQL y la otra mitad en un lenguaje de apasionante para los desarrolladores que
objetivos era inspiradora. programación estándar como C#, VB, quieran expandir su arsenal de habilida-
La cantera de talento y la atmósfera Java o Delphi. LINQ to SQL es un gran des para escribir código más fácilmente y
de trabajo aquí en Microsoft son muy paso hacia el fin de ese cuadro esqui- con resultados más potentes.
parecidas a las que había en Borland zofrénico. Vamos a disponer de una sin- Charlie, tus libros han sido recono-
durante los 90. Igual que Phillip Kahn, taxis única, basada en un fuerte control cidos siempre por su gran valor
Bill Gates y Steve Ballmer tienen tanto de tipos y dotada de ayuda Intellisense didáctico. ¿Podemos esperar en un
grandes habilidades técnicas como de ges- que utilizaremos para crear aplicaciones futuro cercano algún libro tuyo, por
tión. Microsoft ha desarrollado una cul- de bases de datos. La capacidad de desa- ejemplo, sobre estas nuevas carac-
tura muy sofisticada centrada en la tec- rrollar y depurar nuestras aplicaciones de terísticas de C#?
nología. Cuando se combinan esas capa- bases de datos sobre una base de código Estoy trabajando duro para sacar
cidades de gestión con el extraordinario única es un paso enorme en la dirección tiempo para escribir un libro sobre
potencial intelectual de la empresa... bue- correcta. LINQ es un hito muy signifi- LINQ. Creo que podré tener algo para
no, realmente no hay nada similar en el cativo en la historia de los lenguajes de principios del año próximo, pero no todas
mundo. Con esto no estoy diciendo que programación. las piezas han sido encajadas aún.
la empresa es perfecta; pero en términos Y si se mira por detrás de LINQ se Sin duda alguna, escribir y trabajar
de habilidades técnicas y potencial inte- verán los fundamentos de programación con la comunidad son mis grandes pasio-
lectual es indudablemente extraordinaria. funcional y declarativa sobre los que está nes. No hay nada que yo preferiría hacer
Microsoft es una empresa guiada creado. Ahí encontraremos toda una aquí en Microsoft que escribir sobre tec-
por métricas. El equipo de gestión es serie de características (notablemente, nología y conocer a los miembros de esta
muy práctico, y tiene un enfoque muy los árboles de expresiones) que añaden extraordinaria comunidad.
serio en su trabajo. Estoy aprendiendo una gran potencia al arsenal de herra- Por favor, unas palabras finales…
muchísimo de la interacción con un mientas de un programador. A diferen- Simplemente agradeceros la opor-
equipo que hace énfasis en la impor- cia del código imperativo, un árbol de tunidad de participar en esta entrevis-
<<dotNetManía

tancia de unos objetivos de desarrollo expresión no está atado a la lógica que ta, y el gran trabajo que hacéis para la
claros, y de trabajar luego sistemática- lo rodea –es válido de manera indepen- comunidad. Espero que algún día nos
mente para alcanzarlos. diente–. Más aún, su ejecución puede ser veamos en España.

15
opinión
Rodrigo Corral

Personas o bits

Los desarrolladores de << Pensemos en las típicas estadísticas que a menudo leemos
software, yo el primero, sobre los motivos por los que los proyectos fallan. Nunca cuestiones o
tendemos a centrarnos en dificultades técnicas ocupan los primeros lugares. Otro síntoma claro
de que la tecnología no es el factor clave es el hecho evidente de que
cuestiones técnicas, a existen proyectos exitosos y sonoros fracasos desarrollados en todas la
pensar que este tipo de tecnologías y lenguajes de programación.
cuestiones son las de Uno de los autoengaños en los que solemos caer los desarrollado-
mayor importancia en la res, yo el primero, es preocuparnos demasiado por las herramientas o
vida de los proyectos de las tecnologías, sobre todo por las nuevas. A menudo se encuentra a los
desarrolladores discutiendo sobre tal o cual herramienta o nuevo len-
desarrollo. Pero esto no es guaje… Es normal, los fabricantes de esas herramientas promueven ese
cierto. Voy a dedicar esta debate prometiendo mejoras en la productividad que debemos reco-
columna a argumentar el nocer rara vez son tales y que, si se producen, nunca llegan a lo pro-
porqué. La cuestión es metido. ¿Alguien puede citar alguna herramienta que mejorase radi-
muy interesante en mi calmente su productividad? No hablo de usar un potente IDE frente a
usar simple editor de texto, sino de usar la versión actual de un poten-
opinión, porque quizás los te IDE frente a usar la versión anterior. Pensándolo en frío, creo que
desarrolladores y la es evidente que, si bien es cierto que las herramientas mejoran nuestra
Rodrigo Corral es MVP industria del software han productividad, estas mejoras no son radicales, sino que se producen de
y MCPD y uno de los manera muy distribuida en el tiempo. En resumen: las herramientas
fundadores de Plain
estado equivocando dónde
deben poner su foco de evolucionan, pero no revolucionan de manera puntual nuestra mane-
Concepts, donde cola-
bora como arquitecto ra de hacer software. Esto no quiere decir que debamos desdeñar las
atención. mejoras que puedan surgir de utilizar las mejores herramientas, sino
de software. Además
trabaja en Sisteplant que las mejoras que debemos esperar en este aspecto del desarrollo de
como líder técnico en software son pequeñas. Lo aquí comentado se aplica, punto por pun-
un proyecto desarrolla- to, también a las tecnologías. ¿Alguien piensa que es mucho más fácil
do sobre .NET 3.0 utili- desarrollar una aplicación distribuida con WCF que con Remoting o
zando Scrum como Web Services, o incluso que con DCOM? No, la dificultad no está rela-
metodología de desa- cionada con las herramientas a usar sino con la complejidad del pro-
rrollo. También adminis-
blema a resolver.
tra Geeks.ms. Su blog es
http://geeks.ms/blog/ Otro punto que tendemos a olvidar es que las tecnologías y herra-
rcorral. mientas, antes de que tengamos la oportunidad de que nos ayuden,
tenemos que aprender a utilizarlas y este proceso, a menudo, minimi-
za las mejoras que podemos esperar.
<< dnm.opinión

Con lo que he comentado anteriormente no quiero decir y la maestría de los desarrolladores. Es curioso cómo cuando
que no haya que buscar y seleccionar nuevas herramientas se habla de este tema todo el mundo asiente, pero sin embar-
o tecnologías y aprender a utilizarlas, sino que no debemos go luego todo el mundo lo olvida con facilidad. A menudo se
creer que vayan a cambiar radicalmente nuestra capacidad trata a los desarrolladores como piezas intercambiables, o meto-
o la de nuestro equipo a la hora de crear software y sacar dologías con amplia aceptación como CMMI se olvidan de
adelante nuestros proyectos. incluir el factor humano en la ecuación, centrándose única-
Las metodologías son otra de las áreas que prometen gran- mente en el proceso. Como si un excelente proceso permitie-
des mejoras en el desarrollo de software, y en este caso creo se realizar desarrollos excelentes sin desarrolladores excelen-
que, bien implementadas, las metodologías (sobre todo aque- tes. La realidad es que desarrolladores excelentes pueden lle-
llas centradas en ayudar al desarrollador) producen grandes var a cabo desarrollos excelentes con metodologías mediocre-
resultados. El problema es que implementar bien una meto- mente implantadas o incluso sin metodología explícita algu-
dología es un proceso extremadamente difícil, complejo, cos- na. Si todos asentimos cuando alguien clama que las personas
toso y largo en el que muchas empresas o equipos de desarro- son el factor principal, ¿por qué nos olvidamos de este factor
llo fallan en repetidas ocasiones. ¿Cuántos de vosotros habéis con tanta facilidad? Quizá sea porque es el factor sobre el que
sufrido un intento fallido de implementar una metodología? es más difícil actuar. Pero no por eso debemos dejar de actuar.
Estoy seguro que muchos. ¿Cuántos de vosotros tenéis teóri- Un hecho que la industria del software lleva obviando
camente una metodología y realmente lucháis para que nos os durante gran parte de su historia es que los buenos desarro-
entorpezca? Pocos equipos de desarrollo tienen una metodo- lladores son extremadamente baratos. Existen numerosísimos
logía y entre los que la tienen, pocos están plenamente satis- estudios que “demuestran” que la diferencia de rendimiento,
fechos con ella. Resumiendo, usar una metodología adecua- se mida como se mida, entre los mejores y los peores progra-
da puede mejorar en mucho nuestra productividad, pero es madores es de alrededor de ¡treinta veces! Ahora os propon-
muy difícil cerrar el triángulo mágico de encontrar una meto- go un juego: pensad en el mejor y el peor desarrollador con
dología adecuada, implantarla con éxito y lograr que ayude a quienes hayáis trabajado. Pensad en su rendimiento, y decid-
los desarrolladores. Esta última es condición necesaria para me si no se cumple lo anterior. Ahora pensad en su sueldo,
que perdure y se extienda a otros proyectos de nuestra empre- ¿alguien cree que la diferencia era de alrededor de treinta veces?
sa. Solo una metodología que ayude a los desarrolladores y que La conclusión es clara: la relación rendimiento/sueldo no es
mejore su vida profesional día a día tiene alguna oportunidad lineal; luego proporcionalmente los desarrolladores, cuanto
de perdurar. El motivo es claro: todos somos reacios al cam- mejores y más experimentados son, más baratos resultan.
bio, y mucho más reacios a aquellos que no se revelan rápida Entonces, ¿por qué sigue habiendo proyectos plagados de gen-
y claramente como ayudas. Es también evidente que el rol más te sin experiencia?
numeroso en los proyectos de desarrollo es el de desarrolla- Las personas cuentan mucho, pero aún cuentan más
dor, mucho más que el de jefe de proyecto, gerente y demás cuando juntamos varias. Cuando lo que se comparan son
puestos “de responsabilidad”, y por tanto cualitativamente de equipos y no personas individuales, la diferencia es todavía
quien más resistencia encontramos cuando una metodología más apabullante. El rendimiento que puede alcanzar un
no ayuda es, precisamente de los desarrolladores. No deja de equipo bien engrasado es espectacular. El problema es que
ser paradójico, además, que a menudo se escuche poco o nada solo quien ha estado en alguna ocasión en uno de esos equi-
la opinión de los desarrolladores a la hora de seleccionar e pos puede saber de lo que hablo. Pero creedme, nada pue-
implantar una metodología. de impulsar más vuestros desarrollos que lograr que el equi-
Bien, hemos comentado que a pesar de lo que tende- po de desarrollo funcione como un reloj. De hecho, nues-
mos a pensar, las herramientas, las tecnologías y las meto- tro principal cometido como gestores de proyectos es, sin
dologías no tienen un impacto radical en mejorar cómo duda, construir el ambiente en el que nuestro equipo pue-
hacemos software. Aunque tienen su importancia. También da realizar su trabajo en condiciones óptimas. El resto, aun-
es claro que en el mundo competitivo en el que nos move- que es importante, es menos importante.
mos, cuando hablamos de desarrollo de software necesita- Supongo que más de uno os estaréis preguntando por qué
mos mejorar día a día. Ahora os preguntaréis: si lo esencial os cuento todo esto. La idea que tengo es dedicar algunas entre-
en el desarrollo de software no son, según defiendo en este gas de este espacio que tan amablemente me ha cedido dot-
artículo, las herramientas, las tecnologías y las metodologías, NetManía a desgranar lo que se esconde bajo cada uno de los
¿qué es lo esencial?: las personas y sus interacciones. puntos que constituyen el Manifiesto Ágil, cimiento sobre el
El factor más importante en el desarrollo de software es que se fundamentan todas las metodologías ágiles. Todo lo que
la calidad de los desarrolladores que llevan a cabo el trabajo. os he contado en esta entrega se corresponde con el principio
Nada puede suplir este factor. A pesar de los muchos intentos que dice: “Individuos e interacciones sobre procesos y herra-
que en la industria del software se han hecho por hacernos cre- mientas”. ¿No os parece que todo lo dicho tiene sentido y que
<<dotNetManía

er lo contario. Un equipo de “juniors” es un equipo poco capaz, sin embargo es algo que llevamos obviando mucho tiempo?
lo dirija quien lo dirija, use las herramientas que use y aplique ¿De qué pensáis vosotros que va el desarrollo de software, de
la metodología que aplique. Nada puede suplir la experiencia personas o de bits?

17
Cristian Manteiga
plataforma.net
Cuando el diseño conoció
a Media Center
Desarrollo de aplicaciones para Windows Media Center con WPF

Windows Presentation Foundation ha supuesto una revolución en el


mundo del desarrollo de interfaces de usuario para nuestras aplica-
ciones. En anteriores entregas de esta revista, hemos podido conocer
un poco más sobre lo que el nuevo subsistema de presentación de
Windows nos proporciona; a lo largo de este artículo, vamos a dar a
conocer lo necesario para poder aprovechar las bondades de WPF en
la creación de aplicaciones para Windows Media Center.

Hace ya algunos años, allá por 2004, Micro- El desarrollador


soft lanzaba su apuesta para el hogar multimedia,
basada en Windows XP y bautizada como Win- Un desarrollador puede decidirse a usar MCML,
dows XP Media Center Edition. Esta propuesta que ha sido creado con el propósito de aprovechar
no tardó en renovarse: un año después llegó Win- todo el potencial que nos ofrece Windows Media
dows Media Center Edition 2005, y a nuestros Center, y que al llevar más tiempo en el mercado
días llega integrado en las versiones Windows Vis- dispone de una documentación más completa y
ta Home Premium y Windows Vista Ultimate, exacta. Pero a pesar de esto debe luchar contra lo
con un look & feel renovado y adaptado a las nece- que, en algunas situaciones, puede resultar un
sidades de hoy. inconveniente.
Desde la aparición de la primera versión de
Windows Media Center, los desarrolladores de
aplicaciones para este entorno han hecho uso de El diseñador
un lenguaje declarativo de marcas basado en XML
y conocido como MCML (Media Center Markup MCML carece de un diseñador que nos abstrai-
Language). Este lenguaje impone una serie de ga del lenguaje, lo que dificulta el proceso de defi-
requisitos que pueden hacer que el desarrollador nición de la interfaz, así como su creación o modi-
Cristian Manteiga es opte por una alternativa de desarrollo diferente ficación. Un diseñador deberá centrarse en apren-
Development Advisor de para su aplicación, decisión que suele estar supe- der dicho lenguaje y en su uso para poder llevar a
Plain Concepts. Es Micro- ditada al rol de la persona encargada de desarro- cabo un proceso; la ausencia de una herramienta
soft Cerfitied Professional llar la aplicación. de diseño le dificultará trabajar adecuadamente en
y Microsoft Student
Dentro de los roles involucrados en el desa- el cuidado de los detalles de la interfaz, como pue-
Partner, así como funda-
dor y coordinador de
rrollo de una aplicación destacamos dos figuras den ser el diseño, la usabilidad, etc.
CLM.NET User Group. principales, encargadas de llevar a cabo las tareas El uso de Media Center Markup Language,
Blog: desde dos puntos de vista diferentes pero com- salvo en el caso de un grupo de desarrollo experi-
http://geeks.ms/blogs/cristian plementarios. Estas dos figuras son la del desa- mentado, puede suponer una grave deficiencia en
(cristian@plainconcepts.com) rrollador y la del diseñador: la productividad del equipo, y por lo tanto hacer
<< dnm.plataforma.net

inviable el desarrollo de la aplicación a corto-medio En contraposición a las aplicaciones HTML, WPF


plazo. nos aporta también la capacidad de trabajar con ani-
maciones de un modo más productivo y elegante, ya
que dispone de Microsoft Expression Blend como
Hosted vs. Native herramienta de desarrollo. Pero las ventajas de optar
por WPF no terminan aquí: esta tecnología nos per-
Para intentar paliar estos inconvenientes, Microsoft mite cuidar todos los aspectos relativos a la experien-
optó por ofrecer una alternativa a los desarrolladores cia de usuario (UX –User eXperience–).
que les permitiese aprovechar toda su experiencia en
otros entornos, y decidió permitir la elaboración de soft-
ware para Media Center mediante un host (figura 1). Ventajas de WPF
Muchas de las ventajas que se aplican al desarrollo gené-
rico de aplicaciones mediante el uso de Windows Pre-
sentation Foundation se pueden aplicar al de aplica-
ciones para Windows Media Center. Entre estas ven-
tajas se encuentran los aspectos relacionados con la
experiencia de usuario, como son: una mayor produc-
tividad no solo en el desarrollo, si no en el uso por par-
te del usuario final, mejoras en el rendimiento, ya que
Figura 1
se hace uso de .NET Framework, incorporación de
elementos multimedia en la interfaz y una mejor con-
Dentro de esta categoría nos encontramos con dos textualización de los elementos de nuestra aplicación.
posibles vías de desarrollo. La primera de ellas es la Para entender esto con mayor profundidad es
posibilidad de realizar aplicaciones Web HTML que necesario explicar que las aplicaciones de WPF para
se ejecuten dentro de Windows Media Center, lo que Media Center hacen uso del despliegue Web de WPF,
permite aprovechar toda la experiencia adquirida en es decir, son aplicaciones XBAP (XAML Browser
el desarrollo Web y llevar a cabo aplicaciones con una Application), cuyo uso conlleva unas limitaciones
curva de aprendizaje menor. Otra de las grandes ven- implícitas. Las aplicaciones XBAP se ejecutan en un
tajas es la posibilidad de usar herramientas de diseño nivel de seguridad de confianza parcial (partial trust),
que nos permitan trabajar con la apariencia gráfica de lo que impide el uso de ventanas; por esta razón, no
nuestra aplicación. podemos abrir nuevas ventanas en nuestra aplicación
Pero no todo son ventajas, ya que los desarrollos Media Center, sino que tendremos que hacer uso de
Web se ven limitados por el modelo de interacción con un modelo de navegación entre páginas. Otra de las
el usuario al que se han ido adaptando, y resulta más limitaciones a tener en cuenta a nivel de diseño es la
complicado realizar diseños pensados para la interac- ausencia de soporte para el uso de los efectos sobre
ción con un mando a distancia. Recordemos que el dis- mapas de bits (bitmap effects): el procesado de píxeles
positivo de interfaz humana por excelencia en un entor- de estos efectos ha sido desarrollado en código no ges-
no Windows Media Center corresponde a este man- tionado y .NET Framework 3.0 hace uso de ellos a
do a distancia, y en raras ocasiones un teclado. Por este través de un pequeño envoltorio (wrapper) gestiona-
motivo, todos nuestros desarrollos deberán tener en do, lo que impide que podamos hacer uso de ellos des-
cuenta que el usuario manejará nuestra aplicación de un contexto de confianza parcial.
mediante él, por lo que todo debe ser fácilmente acce- En contraposición a esto, nos encontramos con la
sible desde esta interfaz de interacción. posibilidad de usar elementos multimedia como vídeo
Otro de los puntos a los que deberemos prestar y audio, crear animaciones, diseñar gráficos, hacer uso
especial atención es la resolución de nuestra aplica- fuentes de texto vectoriales, incorporar elementos 3D,
ción, ya que nuestra interfaz tendrá como salida están- hacer uso de estilos y plantillas en nuestros contro-
dar un televisor, por lo que la resolución será limita- les, integrar documentos dinámicos y usar documen-
da con respecto a los monitores que suelen usar los tos XPS, así como aprovechar el uso de los dicciona-
PC hoy en día. rios de recursos para crear bloques reutilizables en
En este punto nos ayuda especialmente WPF, ya nuestra aplicación, entre otras.
que utiliza unidades de píxel relativas e independien- Todas estas características que hemos menciona-
<<dotNetManía

tes de la resolución real; pero este no es el único fac- do se pueden aplicar de una forma muy ágil y poten-
tor que nos puede hacer optar por usarlo para el desa- te haciendo uso de Expression Blend, la herramienta
rrollo de nuestra aplicación. de diseño de interfaces para WPF, pero también des-

19
<< dnm.plataforma.net

de Visual Studio 2005, así como en la Hacer hincapié también en el archi- El servicio de navegación de nues-
futura versión de éste, que se espera vo MediaCenterTheme.xaml, ya que nos tra aplicación nos proporciona todo lo
para finales de año. hace accesible un diccionario de recur- necesario para poder navegar entre las
sos, con un ámbito a nivel de aplicación, distintas páginas que la componen; sus
Desarrollando para que contiene plantillas de los principa- miembros más relevantes son los que
les controles, modificando su aspecto podemos ver en la tabla 1.
Windows Media Center para adaptarlo a los requisitos de usa- Otro de los aspectos relevantes
Para poner en práctica lo expuesto, bilidad de Media Center (listado 1). para el desarrollo de nuestras aplica-
vamos a presentar una sencilla aplica-
ción de prueba que nos permitirá ver
qué ventajas nos proporciona utilizar
WPF en nuestros desarrollos. Tenien- <Application x:Class=”MediaCenterDNM.App”
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
do en cuenta que el objetivo que persi-
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
gue este artículo no es el de mostrar StartupUri=”Page1.xaml”>
cómo desarrollar aplicaciones XBAP <Application.Resources>
con WPF, nos centraremos en los <ResourceDictionary>
aspectos más relevantes, aquellos que <ResourceDictionary.MergedDictionaries>
son comunes a todos los desarrollos. <ResourceDictionary Source=”MediaCenterTheme.xaml” />
Prerrequisitos: </ResourceDictionary.MergedDictionaries>
• Microsoft Windows Vista Home, </ResourceDictionary>
Premium o Ultimate. </Application.Resources>
</Application>
• Microsoft Visual Studio 2005.
• Microsoft Windows Media Cen-
ter SDK 5.1 (5.0 Update).
Listado 1. Código del archivo App.xaml que hace referencia al diccionario de recursos
• Microsoft Expression Blend 1.0.

Especial atención nos merecen las Una vez llevado a cabo el diseño de ciones es el hecho de poder mostrar
referencias a los ensamblados Micro- la primera página de nuestra aplicación, mensajes al usuario a través de venta-
soft.MediaCenter y Microsoft.MediaCen- la primera duda que se nos plantea es nas. Tal y como comentamos ante-
ter.UI, que nos proporcionan acceso al cómo llevar a cabo la navegación entre riormente, las aplicaciones XBAP no
modelo de objetos de Media Center, las distintas páginas que la componen. admiten la instanciación de nuevas
tanto a nivel de entorno como a nivel Esta tarea se lleva a cabo con bastante ventanas, por lo que se hace necesario
de los elementos de la interfaz, respec- simplicidad usando el servicio de nave- el uso de las API de Windows Media
tivamente (figura 2). gación de WPF, que se encuentra acce- Center para llevar a cabo esta tarea.
sible a través del espacio de nombres Accediendo al entorno actual de eje-
System.Windows.Navigation. cución de nuestra aplicación, podre-

Tipo Nombre Descripción


Método GoBack() Navega un paso hacia atrás en la historia de
navegación.
Método GoForward() Navega un paso hacia adelante en la historia
de navegación.
Propiedad CanGoBack Devuelve true en el caso de que exista por lo
menos un elemento en la historia de navega-
ción hacia atrás.
Propiedad CanGoForward Devuelve true en el caso de que exista por lo
menos un elemento en la historia de navega-
ción hacia delante.
Método Navigate() Navega hasta la página pasada como parámetro.
<<dotNetManía

Tabla 1
Figura 2

20
<< dnm.plataforma.net

mos hacer uso de alguno de los dos siguientes méto- ción final. Para ejecutar la aplicación, no basta con
dos (tabla 2): iniciar la depuración, tal y como haríamos con una
aplicación normal: debe-
mos abrir el archivo
Tipo Descripción
$(OutputPath)\MediaCen-
DialogNotification Muestra una ventana de diálogo de notifica- terDNM.mcl para ejecutar
ción al usuario la aplicación y así poder
depurarla.
Dialog Muestra una ventana modal al usuario
Como buena prácti-
Tabla 2 ca en las tareas de depu-
ración, se deben dar

También nos puede resultar útil en nuestra apli-


cación el hecho de poder navegar a páginas de Win-
dows Media Center, como la página de Música, la de
TV o la página de inicio. Esta capacidad también nos
la expone el entorno actual de ejecución de la aplica-
ción, y deberemos hacer uso del método NavigateTo-
Page(), al que pasaremos como argumentos el PageId
de la página a la que queremos navegar y los argu-
mentos que queremos pasarle.
Algunas de estas capacidades se encuentran ilus-
tradas en la aplicación de ejemplo que acompaña el
artículo, cuya interfaz de usuario se compone de las
páginas que muestran las figuras 3 y 4. La mascota de
dotNetManía ha sido tomada del blog de José Luis
Quintero [1]. El código fuente de ambas páginas (tan-
to XAML como code-behind en C#) se presenta en los Figura 4. Página principal de la aplicación
listados 2-5.

varios pasos para comprobar que la


versión que estamos depurando es
siempre la correcta. Para ello cerra-
remos Media Center, comprobare-
mos que el proceso Presentation-
Host.exe no se está ejecutando y
por último abriremos la línea de
comandos de Visual Studio y eje-
cutaremos el comando mage -cc y
comprobaremos que el directorio
%localappdata%\apps\2.0 se encu-
entra vacío.

Conclusión
Figura 3. Página de introducción de la aplicación
WPF nos permite desarrollar aplica-
ciones para Windows Media Center
haciendo uso de las mejores herramientas para el
Ejecución y depuración diseño de interfaces, y al mismo tiempo sacar par-
tido de toda la potencia que nos ofrece .NET Fra-
<<dotNetManía

Visual Studio 2005 nos proporciona la posibilidad de mework 3.0 dentro del marco del hogar multime-
depurar nuestra aplicación dentro de Media Center, dia, sin menoscabar los servicios que Media Cen-
lo que nos permite probarla en su entorno de ejecu- ter nos expone mediante sus API.

21
<< dnm.plataforma.net

<Page
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
x:Class=”MediaCenterDNM.Intro”
Title=”Intro”
Width=”Auto” Height=”Auto”
xmlns:d=”http://schemas.microsoft.com/expression/blend/2006”
xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006”
mc:Ignorable=”d”
>
<Grid Background=”{DynamicResource PageGlassyBackground}”>
<!—Código correspondiente a la mascota de dotNetManía—>
<TextBlock HorizontalAlignment=”Left” Margin=”390,-300,0,0” VerticalAlignment=”Center”
Width=”Auto” Height=”Auto” FontSize=”72” TextWrapping=”Wrap”>
<Run FontSize=”60”>dot</Run>
<Run FontSize=”60” FontWeight=”Bold” Foreground=”#FFFF0000”>Net</Run>
<Run FontSize=”60”>Manía</Run>
</TextBlock>
<TextBlock HorizontalAlignment=”Left” Margin=”390,-120,0,0” VerticalAlignment=”Center”
Width=”400” Height=”Auto” FontSize=”24” Foreground=”#FFFFFFFF” TextWrapping=”Wrap”>
<Run Language=”es-es”>Desarrollo de aplicaciones para Windows Media Center con</Run>
<LineBreak/>
<Run Language=”es-es”>Windows Presentation Foundation</Run>
</TextBlock>
<Button d:LayoutOverrides=”Height” HorizontalAlignment=”Left” Margin=”390,110,120,0”
VerticalAlignment=”Center” Width=”250” Content=”Entrar” Click=”Entrar_Click”/>
</Grid>
</Page>

Listado 2. XAML correspondiente a la página de introducción

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MediaCenterDNM
{
/// <summary>
/// Interaction logic for Intro.xaml
/// </summary>

public partial class Intro : System.Windows.Controls.Page


{
public Intro()
{
InitializeComponent();
}

private void Entrar_Click(object sender, RoutedEventArgs e)


{
this.NavigationService.Navigate(new Uri(“Main.xaml”, UriKind.RelativeOrAbsolute));
//this.NavigationService.Source = new Uri(“Main.xaml”, UriKind.RelativeOrAbsolute);
}
<<dotNetManía

}
}

Listado 3. Code-behind correspondiente a la página de introducción

22
<< dnm.plataforma.net

<Page
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
x:Class=”MediaCenterDNM.Main”
Title=”Main”
Width=”Auto” Height=”Auto”
>
<Grid Background=”{DynamicResource PageGlassyBackground}”>
<StackPanel HorizontalAlignment=”Center” Margin=”0,0,0,0” VerticalAlignment=”Center”>
<Button Content=”Mostrar PopUp” Click=”PopUp_Click”/>
<Button Content=”Volver atrás” Click=”GoBack_Click”/>
<Button Content=”Ir al Inicio” Click=”Inicio_Click”/>
</StackPanel>
</Grid>
</Page>

Listado 4. XAML correspondiente a la página principal

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace MediaCenterDNM
{
/// <summary>
/// Interaction logic for Main.xaml
/// </summary>
public partial class Main : System.Windows.Controls.Page
{
public Main()
{
InitializeComponent();
}
private void PopUp_Click(object sender, RoutedEventArgs e)
{
Microsoft.MediaCenter.Hosting.AddInHost.Current.MediaCenterEnvironment.Dialog(
“Esto es una ventana modal”, “Advertencia”,
Microsoft.MediaCenter.DialogButtons.Ok, 10, true);
}
private void GoBack_Click(object sender, RoutedEventArgs e)
{
if (NavigationService.CanGoBack)
NavigationService.GoBack();
}
private void Inicio_Click(object sender, RoutedEventArgs e)
{
Microsoft.MediaCenter.Hosting.AddInHost.Current.MediaCenterEnvironment.
NavigateToPage(Microsoft.MediaCenter.PageId.Start, null);
}
}
}

Listado 5. Code-behind correspondiente a la página principal

Referencias
<<dotNetManía

[ 1 ] Blog de José L. Quintero: http://geeks.ms/blogs/jlquintero/archive/2007/01/20/expression-ante-masco-


ta-de-dnm-en-xaml.aspx.

23
Luis Miguel Blanco
plataforma.net
DataGridView y estilos.
Presentaciones de datos visualmente atractivas
Mostrar datos en formato tabular es una funcionalidad necesaria en la inmen-
sa mayoría de las aplicaciones que se desarrollan. Es por ello que Visual Studio
2005 incorpora, para las aplicaciones orientadas al entorno Windows, un nue-
vo control de cuadrícula: DataGridView, evolución del anterior DataGrid, dota-
do de un excelente conjunto de funcionalidades que le confieren una gran
potencia y flexibilidad. En el presente artículo haremos un repaso de los esti-
los, una de las características que este control proporciona, con la finalidad de
conseguir que la información visualizada en nuestras aplicaciones tenga un
toque más sugestivo para los usuarios.

Configuración predeterminada.Visuali- Confección de estilos.


zación básica Nuestro primer estilo
Cuando empleamos un control DataGridView con Daremos comienzo a las técnicas que debemos
su configuración de propiedades por defecto, el emplear en la creación y uso de estilos con un sen-
aspecto de los datos ofrecidos es correcto. No obs- cillo ejemplo. El lector puede encontrar todos los
tante, de la austeridad en su presentación se des- ejemplos desarrollados en este artículo en la direc-
prende la sensación de que con ciertos retoques ción http://www.dotnetmania.com. En primer lugar,
estéticos, aunque los datos sigan siendo los mismos, crearemos un nuevo proyecto Windows, en cuyo
el control ganaría enormemente en atractivo. formulario predeterminado añadiremos un Data-
GridView. A continuación, escribiremos en el even-
to Load el código del listado 1, necesario para
Estilos. Los ornamentos conectarnos a una base de datos y enviar una con-
sulta que nos devuelva el consabido conjunto de
del DataGridView resultados.
Para paliar esta carencia de vistosidad, es momento Una vez obtenido el DataSet con los registros
de que entren en el terreno de juego unos elementos a mostrar dentro del correspondiente DataTable,
que resultarán una inestimable ayuda en el trabajo asignaremos esta fuente de datos al DataGridView
cotidiano con el control DataGridView: los estilos. utilizando sus propiedades DataSource y Data-
Un estilo es un objeto de la clase DataGrid- Member. A continuación, instanciaremos un obje-
ViewCellStyle, que contiene una serie de propie- to DataGridViewCellStyle, estableciendo valores
dades relacionadas con los aspectos visuales de una en sus principales propiedades, lo que nos per-
Luis Miguel Blanco es celda, tales como colores, alineación, tipo de letra, mitirá modificar las características visuales pre-
redactor de dotNet- etc. Actuando a todos los efectos como una plan- determinadas de los datos mostrados. Finalmen-
Manía. Es consultor en
tilla de presentación de datos, que permite al pro- te, asignaremos el objeto de estilo a la propiedad
Alhambra-Eidos.Ha
escrito varios libros y
gramador aplicar uniformemente un conjunto de DefaultCellStyle del control, como vemos en el
decenas de artículos características visuales sobre la totalidad del con- listado 2, mientras que el resultado podemos ver-
sobre la plataforma trol DataGridView, o solo en determinadas regio- lo en la figura 1.
.NET nes del mismo. En la tabla 1 podemos ver las pro- Aparte del evidente cambio en la combinación
(lalibreriadigital.com) piedades más importantes de esta clase. de colores para los estados normal y seleccionado de
<< dnm.plataforma.net

Propiedad Descripción
// establecer la fuente de datos
BackColor Color de fondo para la celda. // para el DataGridView
ForeColor Color de primer plano para la celda. this.dgvGrid.DataSource=dsAdvWorks;
this.dgvGrid.DataMember=“DimProduct”;
SelectionBackColor Color de fondo para la celda en estado seleccionado
SelectionForeColor Color de primer plano para la celda en estado selec- // creación de estilo para el
cionado. // control DataGridView
DataGridViewCellStyle styEstilo;
Format Cadena de formato para personalizar la presentación
de datos numéricos, fechas, etc. styEstilo =
Alignment Valor de la enumeración DataGridViewContentAlignment, new DataGridViewCellStyle();
que utilizaremos para establecer la alineación del con- styEstilo.BackColor =
tenido de la celda. Color.LightYellow;
styEstilo.ForeColor=
Font Tipo de letra con el que se mostrará el texto de la celda. Color.DarkViolet;
styEstilo.Alignment=
WrapMode En celdas con texto extenso, esta propiedad permite DataGridViewContentAlignment.TopRight;
dividir dicho texto en varias líneas o truncarlo. styEstilo.NullValue =
“Sin asignar”;
NullValue Tipo Object que utilizaremos para mostrar el valor de
styEstilo.SelectionBackColor=
la celda cuando el campo original del origen de datos Color.DarkGreen;
sea nulo. styEstilo.SelectionForeColor =
Padding Establece el espacio de relleno para los márgenes de Color.LightSkyBlue;
la celda. styEstilo.WrapMode =
DataGridViewTriState.True;
Tabla 1. Propiedades de la clase DataGridViewCellStyle
this.dgvGrid.DefaultCellStyle =
las celdas, existen algunos aspectos adi- styEstilo;
cionales dignos de mención, como sería
// obtención de datos el tratamiento del texto mostrado. Por
SqlConnection cnConexion;
cnConexion = new SqlConnection(); defecto, el contenido de las celdas queda Listado 2
cnConexion.ConnectionString = alineado a la izquierda, pero en esta oca-
“Data Source=localhost;” + sión, utilizando la enumeración Data- Respecto a la columna SpanishPro-
“Initial Catalog=AdventureWorksDW;”+
“Integrated Security=True”; GridViewContentAlignment, logramos que ductName, habremos notado que es un
se sitúe en la parte superior derecha. campo con valores de longitud superior
string sSQL;
sSQL=“SELECT ProductKey, ” +
“SpanishProductName, ListPrice, ”+
“EndDate, ProductLine ”;
sSQL+=“FROM DimProduct “;
sSQL+=“WHERE ListPrice IS NOT NULL”;

SqlCommand cmdComando;
cmdComando = new
SqlCommand(sSQL, cnConexion);

SqlDataAdapter daAdaptador;
daAdaptador = new
SqlDataAdapter(cmdComando);

DataSet dsAdvWorks;
dsAdvWorks = new DataSet();

daAdaptador.Fill( dsAdvWorks,
“DimProduct”);
<<dotNetManía

Figura 1. Creación de un primer estilo


Listado 1.

25
<< dnm.plataforma.net

al resto. Gracias a la propiedad WrapMo- // creación de estilo para las cabeceras del DataGridView
de del estilo, conseguimos que su texto DataGridViewCellStyle styEstilo;
se divida en varias líneas, de forma que styEstilo = new DataGridViewCellStyle();
encaje adecuadamente en la celda. Esto styEstilo.BackColor = Color.LightBlue;
podemos comprobarlo aumentando styEstilo.ForeColor = Color.DarkOliveGreen;
manualmente la altura de algunas filas styEstilo.Font = new Font(“Bradley Hand ITC”, 10, FontStyle.Bold);
en la cuadrícula. styEstilo.Alignment = DataGridViewContentAlignment.BottomRight;
Finalmente, nos encontramos con
// asignar estilo a las cabeceras del control
el caso de registros conteniendo cam-
this.dgvGrid.ColumnHeadersDefaultCellStyle = styEstilo;
pos con valores nulos, como ocurre en
la columna EndDate, para la que utiliza- Listado 3
mos una cadena con un literal infor-
mativo de tal situación en la propiedad
NullValue del estilo. bleHeadersVi- //....
Como puede comprobar el lector, sualStyles , la // establecer altura para las
establecer un estilo básico en un con- cual tiene por // cabeceras de columna
trol DataGridView resulta una operación defecto el valor this.dgvGrid.ColumnHeadersHeightSizeMode =
muy sencilla de realizar. true, significando DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
esto que las cabe- this.dgvGrid.ColumnHeadersHeight = 75;
ceras del control
Aplicación de estilos utilizarán la com- // deshabilitar el uso de estilos
// del tema actual
binación de colo-
por regiones res del tema
this.dgvGrid.EnableHeadersVisualStyles = false;

Acabamos de ver que el área de actua- actualmente Listado 4


ción de un estilo, cuando es asignado a seleccionado en
la propiedad DefaultCellStyle de un el sistema operativo. El control resultante lo vemos en la
DataGridView, abarca todas las celdas de Asignando false a esta propiedad figura 2.
datos del control. Pero podemos ser lograremos que las cabeceras se mues- Para establecer estilos en el resto
más selectivos en el uso de un estilo, tren con los colores establecidos en de regiones del DataGridView, tendre-
haciendo que éste afecte a una zona más nuestro estilo. Adicionalmente, para mos que asignar el objeto de estilo a
concreta, por ejemplo, las cabeceras de comprobar que la alineación del texto la propiedad adecuada del control. La
columna. en la cabecera se realiza en la parte infe- tabla 2 relaciona las propiedades con
Esta funcionalidad la conseguire- rior derecha de sus celdas, configura- las que tendremos que trabajar para
mos asignando el estilo a la propiedad remos el control para establecer por aplicar estilos a las diferentes regiones
ColumnHeadersDefaultCellStyle del con- código la altura de las mismas, utili- de la cuadrícula.
trol, como vemos en el listado 3, don- zando para ello las propiedades Column- En el caso de las colecciones Columns
de empleamos un tipo de letra distinto HeadersHeightSizeMode y ColumnHeaders- y Rows, el estilo se aplica por separado
del resto de celdas y establecemos una Height, como vemos en el listado 4. a la propiedad DefaultCellStyle de cada
alineación a la derecha usando la pro-
piedad Alignment del estilo, de forma
que el texto de las cabeceras y el del res-
to de celdas queden alineados en extre-
mos opuestos.
Sin embargo, al ejecutar la apli-
cación, los colores definidos para la
cabecera del control con toda segu-
ridad no se mostrarán, permanecien-
do la combinación predeterminada
original.
<<dotNetManía

La respuesta a este aparentemente


anómalo comportamiento la encontra-
mos en la propiedad DataGridView.Ena- Figura 2. Estilo aplicado a las cabeceras del control

26
<< dnm.plataforma.net

Propiedad Región de DataGridView afectada DataGridView, en función del tipo de


datos con el que deban trabajar.
DefaultCellStyle Todas las celdas del control excepto las cabe-
Este es el objetivo que perseguimos
ceras de columna y fila
en el listado 6, donde en primer lugar cre-
Columns. Colección de objetos amos un estilo para cada tipo de datos.
Una o varias columnas del control
DataGridViewColumn Recorriendo a continuación la colección
Columns del control, comprobaremos el
ColumnHeadersDefaultCellStyle Cabeceras de columna
tipo de datos de cada columna y asigna-
Rows. Colección de objetos remos el estilo según cuál sea dicho tipo.
Una o varias filas del control
DataGridViewRow Dado que estamos manejando datos
de fecha y numéricos, los cuales se pres-
RowsDefaultCellStyle Todas las filas del control
tan amablemente a ser formateados, en
AlternatingRowsDefaultCellStyle Filas alternas del control esta ocasión haremos uso de la propie-
RowHeadersDefaultCellStyle Cabeceras de fila
dad Format, existente en la clase Data-
GridViewCellStyle, para adaptar la pre-
Tabla 2. Propiedades para aplicar estilos por regiones del DataGridView sentación de las columnas correspon-
dientes a estos valores.

uno de los objetos integrantes de la // estilo para las filas alternas


colección que necesiten el estilo. DataGridViewCellStyle styAlterno;
Si, por ejemplo, además de los esti- styAlterno = new DataGridViewCellStyle();
los que ya hemos establecido previa- styAlterno.BackColor = Color.DarkViolet;
mente sobre las celdas de datos y styAlterno.ForeColor = Color.LightYellow;
styAlterno.NullValue = “SIN VALOR”;
columnas, necesitamos facilitar la legi- this.dgvGrid.AlternatingRowsDefaultCellStyle = styAlterno;
bilidad de las filas, aplicaremos un nue-
vo estilo mediante la propiedad Alter- // estilo para una columna independiente
natingRowsDefaultCellStyle, lo que se DataGridViewCellStyle styColumna;
muestra en el listado 5, donde además, styColumna = new DataGridViewCellStyle();
styColumna.BackColor = Color.LightSeaGreen;
también creamos y asignamos un esti- styColumna.ForeColor = Color.FloralWhite;
lo para la columna ListPrice. styColumna.Font = new Font(“Tahoma”, 12, FontStyle.Bold);
El resultado queda palpable en la styColumna.Alignment = DataGridViewContentAlignment.MiddleCenter;
figura 3. this.dgvGrid.Columns[“ListPrice”].DefaultCellStyle = styColumna;
El mecanismo que controla el Listado 5
orden de asignación de los estilos a las
regiones de la cuadrícula se encuentra
gobernado por el propio control. De
esta forma, independientemente del
orden que en nuestro código utilice-
mos para establecer los estilos, estos
serán aplicados según el orden mos-
trado por la tabla 3.

Un estilo y un formato para


cada tipo de dato
Gracias a la propiedad DataGridViewCo-
lumn.ValueType, podemos conocer el
tipo de datos que internamente mani-
pula una columna determinada del con-
<<dotNetManía

trol, lo cual resulta de gran ayuda si


nuestra intención se basa en utilizar un
estilo distinto para las columnas del Figura 3. Estilos aplicados a diversas regiones del control DataGridView

27
<< dnm.plataforma.net

La figura 4 muestra este ejemplo


Región de control Propiedad
en ejecución, donde podemos apreciar
Conjunto general de todas las celdas las diferentes configuraciones de colo-
de datos excepto las cabeceras DefaultCellStyle res, formato y alineación, dependien-
de columna y filas do del tipo de datos de cada columna.
La excepción la representa la combi-
Columnas (se asignan de forma
DataGridView.Columns[IndiceColumna].DefaultCellStyle nación de colores para las columnas
independiente)
en estado seleccionado, donde hemos
Filas RowsDefaultCellStyle utilizado los mismos valores en las
Filas alternas AlternatingRowsDefaultCellStyle
propiedades SelectionBackColor y
SelectionForeColor para todos los
Tabla 3. Orden de asignación de estilos a las regiones del DataGridView estilos.

Observe el lector que al manipular


la columna correspondiente al valor de
fecha, establecemos el ajuste de
tamaño de la misma mediante la pro-
piedad AutoSizeMode , para que su
anchura se adapte al valor que debe
mostrar y no quede éste truncado. Por
otro lado, al final de este listado tam-
bién establecemos el ajuste de tamaño,
en este caso para la altura de las filas
del control, empleando su propiedad
AutoSizeRowsMode. Con ello consegui-
mos que el texto del campo Spanish-
ProductName se muestre en su
totalidad, en aquellas celdas
cuyo contenido sea más Figura 4. Aplicando diferentes estilos según el tipo de datos de cada columna
extenso.

Modificación dinámica
de estilos durante
la navegación
Cuando manipulamos un control Data-
GridView, existen situaciones en las que
resultaría deseable que al efectuar una
interacción determinada sobre el con-
trol, este respondiera mediante algún
cambio en su estado visual.
Pongamos como ejemplo un
requerimiento bastante típico: cuan-
do el usuario desplaza el cursor del
ratón sobre las celdas del control,
debemos cambiar las propiedades de
presentación de la celda sobre la que
se encuentre el cursor, o bien la fila
<<dotNetManía

entera.
Tal funcionalidad la lograremos
utilizando los eventos CellMouseEn-

28
<< dnm.plataforma.net

// crear un estilo para cada tipo de datos de las columnas del grid
DataGridViewCellStyle styTexto = new DataGridViewCellStyle();
styTexto.BackColor = Color.SeaShell;
styTexto.ForeColor = Color.DarkMagenta;
styTexto.SelectionBackColor = Color.Lime;
styTexto.SelectionForeColor = Color.MediumBlue;
styTexto.Alignment = DataGridViewContentAlignment.TopCenter;
styTexto.Font = new Font(“Century Gothic”, 10, FontStyle.Italic |
Gracias a la propiedad
FontStyle.Bold);
styTexto.WrapMode = DataGridViewTriState.True; WrapMode del estilo, con-
DataGridViewCellStyle styFecha = new DataGridViewCellStyle();
styFecha.BackColor = Color.LightYellow;
seguimos que su texto se
styFecha.ForeColor = Color.Olive;
styFecha.SelectionBackColor = Color.Lime; divida en varias líneas, de
styFecha.SelectionForeColor = Color.MediumBlue;
styFecha.Format = “dddd, dd \\de MMMM \\de yyyy”;
styFecha.NullValue = “SIN FECHA”;
forma que encaje adecuada-
DataGridViewCellStyle styInt = new DataGridViewCellStyle();
mente en la celda
styInt.BackColor = Color.PowderBlue;
styInt.ForeColor = Color.Navy;
styInt.SelectionBackColor = Color.Lime;
styInt.SelectionForeColor = Color.MediumBlue;
styInt.Alignment = DataGridViewContentAlignment.MiddleRight;

DataGridViewCellStyle styDec = new DataGridViewCellStyle();


styDec.BackColor = Color.SandyBrown;
styDec.ForeColor = Color.DarkBlue;
styDec.SelectionBackColor = Color.Lime; ter y CellMouseLeave del control
styDec.SelectionForeColor = Color.MediumBlue;
styDec.Alignment = DataGridViewContentAlignment.MiddleRight; DataGridView, que como indican sus
styDec.Format = “#,#.#0”; respectivos nombres se producen
cuando el cursor del ratón entra y
// recorrer la colección de columnas,
// en función del tipo de datos, asignar un estilo sale de la superficie ocupada por una
foreach (DataGridViewColumn dgvcColumna in this.dgvGrid.Columns) celda.
{ Estos eventos reciben como pará-
if (dgvcColumna.ValueType == typeof(string))
{ metro un objeto DataGridViewCellEven-
dgvcColumna.DefaultCellStyle = styTexto; tArgs, cuyas propiedades ColumnIndex y
} RowIndex, utilizadas en combinación con
if (dgvcColumna.ValueType == typeof(DateTime)) la colección DataGridView.Cells, nos ser-
{ virán para averiguar la celda sobre la
dgvcColumna.DefaultCellStyle = styFecha; que deberemos aplicar el cambio de
// ajustar automáticamente el tamaño de la columna de fecha estilo.
dgvcColumna.AutoSizeMode = El listado 7 muestra el caso descri-
DataGridViewAutoSizeColumnMode.DisplayedCells; to, donde primeramente declaramos
}
una variable con ámbito para la clase
if (dgvcColumna.ValueType == typeof(int)) del formulario, que contendrá el nom-
{ bre del campo/columna sobre el que
dgvcColumna.DefaultCellStyle = styInt;
} vamos a actuar, ListPrice . A conti-
if (dgvcColumna.ValueType == typeof(decimal)) nuación, en el evento Load del formu-
{ lario, creamos un estilo para el control
dgvcColumna.DefaultCellStyle = styDec;
} y deshabilitamos la visualización de las
} etiquetas flotantes en las celdas, para
poder apreciar mejor el resultado en
// ajustar automáticamente el tamaño de las filas
this.dgvGrid.AutoSizeRowsMode = ejecución.
DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders; Seguidamente, escribimos los
<<dotNetManía

métodos manipuladores de los even-


tos antes mencionados. En CellMou-
Listado 6 seEnter , en lugar de instanciar un

29
<< dnm.plataforma.net

public partial class Form1 : Form


{
// asignar el nombre de columna
string sNombreColumna = “ListPrice”;

private void Form1_Load(object sender, EventArgs e)


{
//....
// desactivar la visualización de tooltips en las celdas
this.dgvGrid.ShowCellToolTips = false;
Figura 5. Modificación dinámica de estilo
// crear y aplicar un estilo al grid en celda al pasar el cursor del ratón
DataGridViewCellStyle styTexto = new DataGridViewCellStyle();
styTexto.BackColor = Color.Wheat;
styTexto.ForeColor = Color.DarkMagenta; objeto DataGridViewCellStyle, mani-
this.dgvGrid.DefaultCellStyle = styTexto;
}
pulamos directamente las propieda-
des del estilo ya existente en la celda
// al entrar el cursor del ratón en la celda para obtener el resultado deseado;
private void dgvGrid_CellMouseEnter( object sender, mientras que CellMouseLeave es
DataGridViewCellEventArgs e) mucho más simple: asignamos a la cel-
{
// si el cursor está en una celda de datos
da el estilo predeterminado (original)
if (e.RowIndex >= 0) del control.
{ La figura 5 muestra este ejemplo en
// comprobar el nombre de la columna ejecución, donde podemos apreciar la
if (this.dgvGrid.Columns[e.ColumnIndex].Name == sNombreColumna) celda sobre la que está posicionado
{
// modificar propiedades de estilo de la celda en la
actualmente el cursor.
// que estamos situados Si queremos hacer extensiva esta
this.dgvGrid.Rows[e.RowIndex].Cells[sNombreColumna].Style.BackColor= funcionalidad a la totalidad de la fila,
Color.MediumPurple; recorreremos todas sus celdas emple-
this.dgvGrid.Rows[e.RowIndex].Cells[sNombreColumna].Style.ForeColor=
Color.Lavender;
this.dgvGrid.Rows[e.RowIndex].Cells[sNombreColumna].Style.Format=
“#,#.#0”;
this.dgvGrid.Rows[e.RowIndex].Cells[sNombreColumna].Style.Font=
new Font(“Sylfaen”, 14, FontStyle.Bold);
this.dgvGrid.Rows[e.RowIndex].Cells[sNombreColumna].Style.Alignment=
DataGridViewContentAlignment.MiddleCenter;

}
} La propiedad Format de
}
DataGridViewCellStyle
// al salir el cursor del ratón en la celda
private void dgvGrid_CellMouseLeave( object sender, permite adaptar la
DataGridViewCellEventArgs e)
{ presentación de las
// si el cursor está en una celda de datos
if (e.RowIndex >= 0) columnas que contienen
{
// devolver el estilo de la celda a su valor original
this.dgvGrid.Rows[e.RowIndex].Cells[sNombreColumna].Style =
valores de fecha y
}
this.dgvGrid.DefaultCellStyle; numéricos
}
}
<<dotNetManía

Listado 7

30
<< dnm.plataforma.net

private void dgvGrid_CellMouseEnter(object sender, DataGridViewCellEventArgs e)


{
if (e.RowIndex >= 0)
{
foreach (DataGridViewCell oCelda in this.dgvGrid.Rows[e.RowIndex].Cells)
{
oCelda.Style.BackColor = Color.MediumPurple;
oCelda.Style.ForeColor = Color.Lavender;
oCelda.Style.Font = new Font(“Sylfaen”, 14, FontStyle.Bold);
oCelda.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
switch (oCelda.OwningColumn.Name)
{
case “ListPrice”:
oCelda.Style.Format = “#,#.#0”;
break;
case “EndDate”:
oCelda.Style.Format = “ddd-MMMM-yy”;
break;
}
}
}
}
private void dgvGrid_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
foreach (DataGridViewCell oCelda in this.dgvGrid.Rows[e.RowIndex].Cells)
{
oCelda.Style = this.dgvGrid.DefaultCellStyle;
}
}
}

Listado 8

el que averiguamos la columna


sobre la que estamos iterando, apli-
cando el formato cuando sea opor-
tuno. Todo ello lo podemos ver en
el listado 8.

Articulo.Style.Estado =
Terminando;

A lo largo de este artículo, hemos


abordado los estilos del DataGrid-
Figura 6. Modificación dinámica de estilo en fila al pasar el cursor del ratón View, como medio para realzar los
datos expuestos mediante este con-
trol, de manera que la información
ando la colección Cells del objeto DataGridView- exhibida resulte al usuario atractiva a la par que útil.
Row actual. Nótese que para las celdas en las que Esperamos que todo este conjunto de característi-
<<dotNetManía

debemos aplicar formato hacemos uso de la pro- cas sirvan para allanar el camino a los lectores que
piedad DataGridViewCell.OwningColumn , que nos necesiten desarrollar aplicaciones utilizando este
devuelve un objeto DataGridViewColumn, mediante control.

32
<< dnm.servidores.sql
Miguel Egea
servidores.sql
Arquitecturas distribuidas
con Service Broker (y II)

Lanzar procesos asíncronos, o usar la base de datos como sustento para


conseguir asincronía es sin duda interesante; ahora bien, lo es más aún que
esa arquitectura permita, de forma transparente al que la programa, distri-
buir los componentes en distintos servidores e incluso balancear la carga
que pueda suponer la operación en destino. En esto invertiremos los
siguientes párrafos, veremos cuál es la arquitectura que sustenta todas
estas operaciones dentro de Service Broker.

Introducción
BEGIN DIALOG [ CONVERSATION ] @dialog_handle
En la primera entrega sobre Service Broker mos- FROM SERVICE initiator_service_name
tramos cómo usar los nuevos mecanismos de asin- TO SERVICE 'target_service_name'
cronía dentro de SQL Server. Si nos paramos a pen- [ , { 'service_broker_guid' |
sar, estamos ante una arquitectura muy desacopla- 'CURRENT DATABASE' } ]
da: cada pieza de código se encarga de su tarea o del [ ON CONTRACT contract_name ]
servicio que tiene que ofrecer y eso es bueno, muy [ WITH
bueno, puesto que nos permite una versatilidad enor- [ { RELATED_CONVERSATION =
related_conversation_handle |
me a la hora de enviar y procesar mensajes de for-
RELATED_CONVERSATION_GROUP =
ma asíncrona. related_conversation_group_id } ]
Sin embargo, en la entrega anterior no vimos [ [ , ] LIFETIME = dialog_lifetime ]
nada sobre la distribución de la información basada [ [ , ] ENCRYPTION = { ON | OFF } ] ]
en Service Broker. ¿Acaso éste solamente propor- [ ; ]
Miguel Egea ciona mensajes asíncronos que han de ser entrega-
es un Mentor Asocia-
dos y consumidos en la misma máquina? La res-
do de Solid Quality Listado 1
Learning Iberoameri-
puesta es, obviamente, no.
cana, Ingeniero Técni- La clave para enviar mensajes que puedan ser
co en Informática de consumidos en otro servidor y otra base de datos la
Sistemas con más de tenemos en la sintaxis de la instrucción BEGIN DIA- rar cuanto sea necesario para que esos servidores
16 años de experien- LOG, que podemos ver en el listado 1. estén accesibles; es decir, tendremos que construir
cia. MVP en SQL Ser- El servicio de destino viene entrecomillado, y toda la estrategia de enrutado y seguridad para que
ver, ejerce como eso es simplemente porque ese servicio no tiene los mensajes puedan ser entregados.
DBA para importan- por qué estar en la base de datos actual, sino que
tes empresas del Sec-
puede estar en cualquier base de datos de cualquier
tor. Miguel es, además,
ponente asiduo en
servidor que esté conectado a nuestro servidor SQL Service Broker y las comunicaciones
eventos relacionadas Server 2005.
<<dotNetManía

con tecnologías Pero vayamos por partes: antes de poder enviar El proceso de comunicación se basará en TCP, y
Microsoft. mensajes a otros servidores, habremos de configu- básicamente podremos, mediante endpoints, con-

33
<< dnm.servidores.sql

figurar SQL Service Broker para que entregue


mensajes entre distintos servidores. Una vez que
hayamos visto cómo se configuran esos endpoints,
indagaremos sobre los protocolos que se utilizan y
los mecanismos de seguridad que podemos imple-
mentar. Finalmente, veremos cómo implementar Los endpoints son el mecanismo
reenvío de mensajes (forwarding) y la arquitectura
resultante una vez tenidos en cuenta todos estos que utiliza SQL Server 2005 para
aspectos.
comunicarse con el exterior, no
Endpoints
Los endpoints son el mecanismo que utiliza SQL
solo para Service Broker sino
Server 2005 para comunicarse con el exterior. De
hecho, los usa no solo para Service Broker sino para
para cualquier petición que le
cualquier petición que le llega del exterior, incluyen-
do las tradicionales peticiones TDS por el puerto en llega del exterior, incluyendo las
el que escuche el servicio SQL.
Los endpoints no son, por tanto, exclusivos de Ser- tradicionales peticiones TDS
vice Broker; el mismo mecanismo se usa para otros
tipos de puertos, como SOAP, a través de los que
podemos publicar procedimientos almacenados como
servicios Web; mirroring, mecanismo que sirve para
dotar a SQL Server de alta disponibilidad incluso con
failover automático sin necesidad de clustering, y por
supuesto, para Service Broker, que será de lo que tra-
taremos en este artículo. En resumen, un endpoint de Service Broker no es
Un ejemplo de creación de un endpoint podría ser sino un puerto en el que Service Broker estará espe-
el que se muestra en el listado 2. rando mensajes para ser procesados en cuanto lleguen.
Todos estos objetos pertenecen a la arquitectu-
ra interna de Service Broker, y no será necesario
tenerlos en mente más allá de la primera vez que los
CREATE ENDPOINT SBServer1EndPoint montemos.
STATE=STARTED
AS TCP (LISTENER_PORT =4025)
FOR SERVICE_BROKER Protocolos
(AUTHENTICATION = WINDOWS,
ENCRYPTION =SUPPORTED) La aproximación que Service Broker utiliza en
cuanto a protocolos es una aproximación basada en
capas; esto es lo que le permite operar sin necesidad
Listado 2 de conocer el servicio de destino ni el tipo de trans-
porte físico que se va a usar. Estos protocolos son
Si nos fijamos, veremos que en esta sentencia transparentes a la aplicación que los usa, pero está
especificamos su estado, es decir, si desde el princi- bien conocerlos para entender los mecanismos de
pio está o no escuchando; el puerto, que por supues- funcionamiento de Service Broker.
to ha de ser un puerto libre, y además identificamos Las capas que usa Service Broker son las llama-
el mecanismo de autenticación, en el que profundi- das Dialog Protocol (protocolo de diálogo), Adjacent
zaremos cuando hablemos de Service Broker y la Broker Protocol (protocolo de broker adyacente), y Trans-
seguridad. port Protocol (protocolo de transporte).
Existen vistas de metadatos que proporcionan La capa superior es el llamado protocolo de diá-
información sobre los endpoints instalados y su confi- logo, que es el encargado de garantizar que los
guración, como sys.endpoints, sys.tcp_endpoints y mensajes se entregan una vez y solo una vez, y ade-
sys.service_broker_endpoints. Estas vistas pueden ayu- más también se encarga de garantizar el orden de
<<dotNetManía

darnos a administrarlos, aunque naturalmente SQL entrega de los mensajes. La vista del sistema
Server Management Studio nos será también de ayu- sys.conversation_endpoints nos muestra la infor-
da en esta labor. mación que maneja esta capa.

34
<< dnm.servidores.sql

La capa intermedia, creada de acuerdo al pro-


tocolo de transporte a utilizar, es la que sirve para
que el protocolo de diálogo no tenga que conocer
nada sobre el transporte. Esta capa se encarga de
dividir los mensajes de la forma necesaria para que La infraestructura de routing se basa en
viajen adecuadamente por el protocolo de trans-
porte. La vista del sistema sys.dm_broker_connec-
tions contiene información acerca del trabajo que
la tabla de rutas y en un algoritmo de
está realizando esta capa.
Por último, el protocolo de transporte (por ejem-
elección de la ruta, y ofrece una
plo, TCP-IP) se encarga de la transmisión del men-
saje, y cae fuera de los límites de Service Broker.
impresionante versatilidad
Todas estas capas se encargan de procesos tan
importantes como el envío de reconocimientos (ACK),
particionado de mensajes, chequeos de integridad…
Resultan por tanto imprescindibles para el correcto
funcionamiento de Service Broker. Routing

Mensajes especiales Un servicio como Service Broker, cuya utilidad


fundamental será implementar arquitecturas distri-
Hay algunos tipos especiales de mensajes que son buidas basadas en conversaciones (ya no decimos men-
insertados por los protocolos. Estos mensajes tienen sajes: es un paso más allá de esto), quedaría incom-
que ver con la lógica propia de tratamiento de men- pleta sin un sistema que permita enrutar mensajes
sajes y son tres: mensajes de temporizador de diálogo hacia distintos servicios. Más aún, es muy posible que
(dialog timer), que se producirán si establecemos un nuestro servidor de back-end no vaya a estar directa-
timer para la entrada de mensajes en una cola, los men- mente expuesto a Internet, pero que sí sea Internet
sajes de error, que se enviarán en caso de que se pro- el mecanismo de envío, transporte y recepción de
duzca cualquier tipo de error y contendrán informa- información.
ción relativa a ese error, y los mensajes de fin de diá- La infraestructura de routing se basa en la tabla de
logo, que sirven para acabar la conversación en los dos rutas y en un algoritmo de elección de la ruta que vere-
extremos del servicio. mos un poco más adelante. En la tabla de rutas
Estos mensajes son realmente importantes y ade- (sys.routes) siempre existe una ruta llamada AutoCre-
más tienen utilidad no solo a nivel de infraestructura atedLocal, tal y como puede verse en la tabla 1.
sino en muchos otros ámbitos. Por ejemplo, los men- Esa ruta será la usada para cualquier servicio
sajes de temporizador podrían usarse para levantar cuyo nombre no se encuentre en el campo remo-
alertas por falta de tráfico, y que un servicio se encar- te_service_name. En esta tabla, lo más importante
gase de mandar mensajes “de sonda” para comprobar el campo Address, que en el caso de la ruta auto-
que realmente toda la infraestructura sigue funcio- creada apunta a la base de datos local. Si usted ha
nando. leído nuestro artículo anterior, seguramente aca-

Name Remote_service_name Broker_instance Address Mirror_adress


AutoCreatedLocal NULL NULL LOCAL NULL

Tabla 1

Name Remote_service_name Broker_instance Address Mirror_adress


AutoCreatedLocal NULL NULL LOCAL NULL

RutaRemota RutaEnvio 6F1D7685-91AA- TCP:// TCP://


<<dotNetManía

4788-961E- servidordestino.sqlint.com:4022 servidordestino2.sqlint.com:4022


489D897C6429

Tabla 2

35
<< dnm.servidores.sql

bará de comprender por qué sin poner ni una sola balance de carga no supondría ningún problema; sin
ruta el código que publicamos simplemente fun- embargo, una vez comenzada una conversación, en el
ciona. Nada como las cosas “por defecto” para que mensaje ACK viene la información de destino, y en
todo funcione mágicamente. adelante el resto de conversación irá al mismo servi-
dor de destino.
Además, puede configurarse un servicio para que
simplemente ejerza tareas de forwarding; es decir, que
cuando llegue un mensaje a su dirección, simplemente
La seguridad basada en certificados envíe ese mensaje al servidor de destino real. El ser-
vidor estará en este caso haciendo meramente de
permite garantizar la seguridad sin puente entre el servidor de origen y el servidor de
destino. Esto es muy útil, por ejemplo, para no expo-
necesidad de que los intervinientes ner un servidor de front-end a Internet. La forma de
implementar esto es incluir esa ruta en la tabla MSDB.
pertenezcan a ningún dominio, tengan La base de datos MSDB tiene, por tanto, un rol espe-
cial en el enrutado de Service Broker.
Un servidor que se encarga de las tareas de for-
entre sí una relación de confianza warding de mensajes no tiene la necesidad de alma-
cenar ningún mensaje en disco. Esto es debido a que
ni nada que se le parezca el único ACK válido para el mensaje será el del ser-
vidor de destino, esté éste en el dominio en que esté,
y el servidor de forwarding únicamente hará de puen-
te entre origen y destino para mensajes normales y
Sin embargo, este mecanismo de rutas da una mensajes ACK generados automáticamente.
impresionante versatilidad, como vamos a ver con La sintaxis completa de la instrucción para crear
algunos ejemplos. una ruta es la que puede verse en el listado 3.
En la tabla 2 podemos ver una entrada cuya direc-
ción ya no es local; ya no se estará buscando en la pro-
pia base de datos, sino que se irá a buscar una instan- CREATE ROUTE route_name
cia específica de Service Broker en el servidor de des- [ AUTHORIZATION owner_name ]
tino; aquella cuyo código de instancia se correspon- WITH
da con el GUID que ahí figura. [ SERVICE_NAME = ‘service_name’, ]
Ese GUID se buscará en la tabla sys.databases [ BROKER_INSTANCE =
que existe en master. Uno de los nuevos campos incor- ‘broker_instance_identifier’,]
[ LIFETIME = route_lifetime , ]
porados en SQL Server 2005 es el identificador de la
ADDRESS = ‘next_hop_address’
base de datos para Service Broker. Este identificador [ ,MIRROR_ADDRESS = ‘next_hop_mirror_address’]
puede cambiarse con la instrucción ALTER DATABASE xxx [ ; ]
SET NEW_BROKER, comando, que obviamente, habrá de
ser usado con mucho cuidado, puesto que hará que
todas las conversaciones a medias acaben sin mandar Listado 3
el mensaje de tipo END DIALOG. La dirección
Mirror_Address se utiliza para escenarios de mirroring;
en este caso, Service Broker será capaz de enviar datos
a la dirección de la base de datos que esté activa en En algunas ocasiones puede resultar interesan-
cada momento. te implementar enrutado dinámico — hasta el
Basado en el mismo mecanismo podremos inclu- momento solo hemos visto enrutado estático—, es
so gestionar escenarios de balance de carga (load balan- decir, un enrutado en el que la ruta de destino está
cing). La forma de implementarlo es insertando una escrita en la tabla sys.routes. La forma de escribir
nueva ruta a otra dirección para un mismo nombre rutas dinámicas es leer un mensaje de tipo Missin-
de servicio remoto. Cuando se envíe un mensaje a un gRoute de la cola y reaccionar creando en ese
servicio, Service Broker buscará en la tabla de rutas y momento la ruta adecuada. En el mensaje Missin-
aleatoriamente enviará datos a una u otra dirección. gRoute viene la información del nombre del servi-
<<dotNetManía

Si estuviésemos utilizando una estrategia “dispara y cio para el que no se conoce ruta, y sería posible por
olvida”, es decir, de enviar un mensaje y simplemen- tanto preguntar a una aplicación externa o a una
te tener garantizada su entrega, esta forma de hacer tabla de configuración la dirección actual válida para

36
<< dnm.servidores.sql

enrutar el mensaje. No hay que confundir el routing Un ejemplo práctico


dinámico con el uso de la cláusula TRANSPORT que se
puede especificar en la instrucción CREATE ROUTE y Crearemos una ruta para nuestro servicio, como
que lo que hará es enrutar en base al nombre del ser- puede verse en el listado 4. El código tiene algunas
vicio. No profundizaremos más aquí en el enrutado particularidades; por ejemplo, usa el nombre en cua-
dinámico —creo que con esta pincelada el lector tro partes, lo que hará necesario que el servidor de
podrá hacerse una idea bastante aproximada de cómo destino esté añadido como servidor vinculado (linked
implementar esta técnica, si es adecuada, en sus sis- server). El único motivo para hacer esto es determi-
temas—. nar el GUID de la instancia de broker en destino; no
obstante, esta rutina podría sustituirse, evitando tam-
Seguridad bién el código dinámico, simplemente copiando el
identificador de instancia de broker y quitando toda
Service Broker ofrece seguridad de transporte y referencia al servidor vinculado.
seguridad de diálogo. La seguridad de diálogo es Recordemos que ya hay un endpoint creado, cuyo
implementada mediante la encriptación de los men- código puede verse en el listado 2. Un endpoint habrá
sajes que se intercambian, mientras que la seguridad de ser creado en cada uno de los servidores que entren
de transporte previene de que conexiones no autori- en conversación.
zadas envíen mensajes a Service Broker. El mecanismo elegido para la autenticación será
A la hora de crear endpoints pueden especificarse el de certificados. Lo que hacemos es crear un certi-
credenciales Windows; esas credenciales con los per- ficado y crear un usuario basado en ese certificado que
misos necesarios dentro de Service Broker son una tenga los permisos necesarios para poder enviar y reci-
de las opciones de seguridad. Sin embargo, para el bir mensajes. Para ello, primero obviamente hay que
artículo vamos a centrarnos en la seguridad basada crear el certificado; en el listado 5 puede verse cómo
en certificados. se crean esos certificados.
La seguridad basada en certificados nos permite
garantizar la seguridad sin necesidad de que todos los
intervinientes pertenezcan a ningún dominio, ni ten- USE MASTER
gan entre sí una relación de confianza ni nada que se GO
le parezca. En este sentido, nos ofrece la versatilidad CREATE MASTER KEY ENCRYPTION BY
que necesitamos en entornos complejos de arquitec- PASSWORD=’Pa$$w0rd1234567890’
GO
turas realmente distribuidas.
CREATE CERTIFICATE CertificadoServer1
Adicionalmente podemos crear un Remote Servi- WITH SUBJECT =’servidor5.sqlint.com’,
ce Binding, de tal forma que podemos especificar el START_DATE=’20060101’,
“principal”, es decir, la identidad propietaria del cer- EXPIRY_DATE=’21000101’
tificado con el servicio; de esta forma garantizaremos ACTIVE FOR BEGIN_DIALOG=ON;
que el transporte se hace encriptado, como veremos
más adelante. Listado 5

DECLARE @brokIns uniqueidentifier

SELECT @brokIns=service_broker_guid
FROM [SERVIDOR CON SERVICE BROKER DE DESTINO].master.sys.databases where name=’pruebas’

DECLARE @sql nvarchar(1000)

set @sql = ’use pruebas CREATE ROUTE RutaEnvio WITH SERVICE_NAME=’’SrvPeticion’’, BROKER_INSTANCE = ‘’’ +
cast(@brokIns as nvarchar(50)) +
‘’’,ADDRESS = ‘’TCP://server5.sqlint.com:4025’’’

EXEC (@sql);
<<dotNetManía

Listado 4

37
<< dnm.servidores.sql

BACKUP CERTIFICATE CertificadoServer1 TO FILE = ‘x:\ruta\Certificadoserver1.cer’


CREATE CERTIFICATE CertificadoServer1 FROM FILE = ‘y:\ruta\Certificadoserver1.cer’

CREATE LOGIN LoginSb FROM CERTIFICATE CertificadoServer1

GRANT CONNECT ON ENDPOINT::SBServer2EndPoint TO LoginSb

Listado 6

El crear la clave maestra es una necesidad a la hora La tabla 3 nos indica también cuándo la conver-
de poder crear un certificado, de ahí que incluyamos sación fluye en texto claro por la red y cuándo está
el comando en el listado anterior. cifrada. Las conversaciones diferidas lo que indican
es que los mensajes quedarán en las tablas de
sys.transmission_queue, es decir, en el estado de listas
para ser transportadas, hasta que la encriptación pue-
da ser garantizada.

Con Remote Service Binding Sin Remote Service Binding


ENCRYPTION = ON Conversación cifrada Conversación diferida
ENCRYPTION = OFF Conversación cifrada Conversación en texto claro
(sin cláusula ENCRYPTION) Conversación cifrada Conversación diferida

Tabla 3

Este certificado lo vamos a llevar al servidor de Algunas herramientas


destino, y aunque para recibir mensajes cifrados nos
bastaría por supuesto con llevar solamente la clave En el blog de Resmu Rusanu puedes encontrar un enla-
pública, lo vamos a llevar entero para simplificar el ce a una joyita que él mismo ha desarrollado:
mecanismo, para ello le haremos una copia de segu- http://www.codeplex.com/slm. Se trata de una aplica-
ridad usando la instrucción BACKUP CERTIFICATE. A con- ción que con una interfaz gráfica más amigable ayuda a
tinuación, lo que deberíamos hacer es copiar ese cer- crear todo lo necesario para disponer de rutas, endpoints
tificado al servidor desde el que queremos conectar- y seguridad. Lo cierto es que buena parte de la com-
nos, y una vez en ese otro servidor habremos de lan- plejidad asociada con la sintaxis y los conceptos quedan
zar los comandos de restauración del certificado, cre- bastante simplificados con esta interfaz.
ación del login asociado a ese certificado y de los per-
misos de acceso correspondientes, como puede com- Resumen
probarse en el listado 6.
La parte de encriptación va asociada no solamente Service Broker es una herramienta muy interesante
al endpoint, sino también a la conversación. Como hemos para crear aplicaciones que necesiten establecer conver-
comentado anteriormente, en la instrucción que hemos saciones completas, aportando una infraestructura espec-
ejecutado hemos indicado que este endpoint va a ser tacular para soportar esas aplicaciones. No solamente por
capaz de recibir mensajes tanto encriptados como no la conversación; la disponibilidad, escalabilidad y versa-
encriptados. Yo recomendaría leer este documento: tilidad de la plataforma, además de la robustez transac-
<<dotNetManía

http://blogs.msdn.com/remusrusanu/archi- cional que le da estar en la base de datos hacen de Servi-


ve/2006/07/07/659319.aspx para ampliar la informa- ce Broker un producto que merece la pena tener en cuen-
ción al respecto. ta para crear aplicaciones distribuidas complejas.

38
José Francisco Bonnín
plataforma.net
Referencias débiles
en .NET Framework
Seguramente en alguna ocasión se le ha presentado una situación en la que tiene
que crear un objeto que ocupa bastante memoria y que tarda en crearse. En tales
casos, lo primero sería revisar el diseño de ese objeto para ver cómo optimizarlo,
pero si no podemos hacerlo es común que nos asalte la duda de qué hacer: ¿hace-
mos Dispose() del objeto al acabar de utilizarlo para liberar memoria? ¿o lo man-
tenemos para evitar los costes de construcción en un futuro?

Uno de los primeros consejos que recibimos a la


hora de optimizar el rendimiento de cualquier apli-
cación es que sigamos el principio básico de cre- class BigStuff
ar los objetos solo cuando vayamos a utilizarlos y {
private int id;
liberarlos lo antes posible. Sin embargo, nadie
duda de la efectividad de utilizar cachés en según public BigStuff(int identifier)
qué casos. {
En .NET Framework disponemos de una cla- id = identifier;
se llamada WeakReference (referencia débil) para obte- Console.Out.WriteLine(string.Format(
ner una solución intermedia a la duda planteada al “Creating BigStuff {0} on thread {1}.”,
inicio. Esta clase está disponible desde la primera id, System.Threading.Thread.
versión de .NET, aunque su uso no está muy exten- CurrentThread.ManagedThreadId));
dido en desarrollos convencionales. La clase Wea- }
kReference nos permite mantener la referencia a un
public void PrintId()
objeto y al mismo tiempo dejar dicho objeto a dis- {
posición del recolector de basura para que lo reco- Console.Out.WriteLine(
lecte cuando sea necesario. Veamos cómo es posi- string.Format(“BigStuff Id: {0}”,id));
ble hacer esto y el comportamiento de este meca- }
nismo ante distintas situaciones.
Supongamos que disponemos de la clase BigS- ~BigStuff()
tuff que vemos en el listado 1. En el código que {
va continuación vemos cómo se crea un objeto del Console.Out.WriteLine(string.Format(
“Finalizing BigStuff {0} on thread {1}.”,
tipo anterior y cómo, encapsulando la instancia
id, System.Threading.Thread.CurrentThread.
creada dentro de una WeakReference, podemos recu- ManagedThreadId));
perarlo a través de la propiedad Target a pesar de }
haber asignado el valor null a la variable big que }
José Francisco Bonnín es lo contenía (listado 2).
Product Development
Lo que hemos hecho ha sido crear una WeakRe-
Manager en Payvision y
ference “corta”, gracias a la cual podremos recu- Listado 1
coordinador del grupo
de usuarios Baleares on perar la referencia siempre y cuando el recolector
.NET. de basura no haya finalizado el objeto, en cuyo caso
http://blogs.clearscreen.co obtendríamos null al acceder a la propiedad Tar- de una muy mala práctica, podemos forzar una lla-
m/jfbonnin get. Para comprobarlo, aún sabiendo que se trata mada al recolector (listado 3).
<< dnm.plataforma.net

De esta manera verá, que a pesar de asignar null


BigStuff big = new BigStuff(1);
WeakReference weakRef=new WeakReference(big); a la variable big y haber llamado al recolector de basu-
big = null; ra, seguimos siendo capaces de obtener una referen-
big = weakRef.Target as BigStuff; cia, lo que será posible hasta que el recolector se encar-
if (big != null) gue de limpiarlo en la próxima recolección.
{ Es importante destacar que sólo podemos utilizar
big.PrintId();
} este último tipo de WeakReference con objetos cuya cla-
se implemente un finalizador, dado que es ahí donde
se “resucitará” el objeto; de no ser así, la referencia
Listado 2 débil “larga” tendría el mismo comportamiento que
las anteriores, puesto que no habría manera de saber
cuándo se está eliminando el objeto.
big = null;
GC.Collect(); Por último, si consulta las propiedades de la clase
GC.WaitForFinalizers(); WeakReference verá que dispone de una propiedad lla-
big = weakRef.Target as BigStuff; mada IsAlive, la cual nos permite saber si podemos recu-
if (big != null) perar el objeto encapsulado en la referencia débil. El uso
{ de esta propiedad presenta un problema importante y es
big.PrintId();
} que —como sabrá— el recolector de basura utiliza su
propio hilo para llamar a los finalizadores. Para verlo más
fácilmente, en los mensajes que se muestran durante la
Listado 3 creación y destrucción del objeto de la clase BigStuff
hemos añadido el ManagedThreadId. Imagine por un
La variación introducida en el código anterior tan momento que tenemos el siguiente código:
solo fuerza la llamada al recolector de basura, y espe-
ra a que todos los finalizadores acaben de ejecutarse BigStuff big = new BigStuff(1);
antes de continuar. Verá que esta vez no podemos recu- WeakReference weakRef=new WeakReference(big);
perar la referencia a la instancia creada e imprimir por big = null;
if (weakRef.IsAlive)
pantalla el id que le habíamos asignado, sino que, por {
el contrario, se ejecuta el finalizador. Al haber elimi- GC.Collect();
nado todas las referencias a nuestro objeto, el reco- GC.WaitForPendingFinalizers();
lector, haciendo honor a su nombre, lo considera basu- big = weakRef.Target as BigStuff;
ra y lo recolecta. big.PrintId();
}
Si anteriormente hemos utilizado una WeakRefe-
rence que hemos denominado “corta”, supongo que Listado 4
habrá imaginado que también existe una WeakRefe-
rence “larga”. La diferencia entre ambas radica en Después de haber visto los ejemplos anteriores,
cuándo la propiedad Target se convierte en null y seguro que ya ha deducido que al ejecutarlo se lanzará
por tanto, cuándo nuestro objeto deja de ser accesi- una excepción indicando que big es igual a null. Con
ble. Ya hemos visto que en las referencias débiles cor- este ejemplo comprobamos que, aunque IsAlive
tas esto sucede cuando el recolector de basura reco- devuelva true, puede darse el caso de que el recolec-
lecta el objeto después de que, en nuestro programa, tor de basura haya recolectado el objeto justo antes de
se hayan eliminado todas las referencias a él. En una que vayamos a recuperar la referencia, por lo que es
referencia débil “larga” podemos conseguir que, aun necesario realizar siempre la comprobación de que la
habiendo eliminado todas las referencias, el reco- propiedad Target no devuelva null, haciéndose total-
lector de basura resucite el objeto al ejecutar el fina- mente superfluo el uso de la propiedad IsAlive.
lizador, promoviéndolo a la siguiente generación y
por tanto otorgándole un tiempo de vida más largo.
Puede comprobarlo asignando true a la propiedad Conclusión
TrackResurrection o utilizando la sobrecarga del
constructor: Como hemos visto, las referencias débiles nos pro-
<<dotNetManía

porcionan una forma distinta de gestionar el tiempo


public WeakReference (Object target, de vida de nuestros objetos que puede resultarnos muy
bool trackResurrection); útil en algunos casos.

41
dnm.inicio.taller

Guillermo «Guille» Som


inicio
Ayuda en las aplicaciones .NET
El ayudador que nos ayude… seguramente será HelpProvider

Un sistema de ayuda es algo que siempre deberíamos implementar en nuestras


aplicaciones. En este artículo veremos cómo usar la clase Help y el componen-
te HelpProvider, el cual nos permite añadir ayuda a nuestras aplicaciones Win-
dows de una forma muy sencilla.

Agregar ayuda a nuestras aplicaciones es HTML; es decir, se crean como páginas Web,
se le añaden algunos aditivos, se compilan y tene-
En la mayoría de las aplicaciones actuales, salvo excep- mos nuestro fichero de ayuda con la extensión .chm.
ciones, el formato de ayuda utilizado es el conocido Una vez que hemos creado un fichero de este tipo,
como ayuda HTML 1.0 o también ayuda CHM, por lo podemos asociar con nuestra aplicación y usar-
la extensión que tienen estos ficheros de ayuda (.chm). lo por medio de las clases definidas en .NET Fra-
El aspecto de este tipo de ayuda es el que podemos mework. El mayor problema seguramente se pue-
ver en la figura 1. de presentar a la hora de crear este tipo de ayuda,
aunque eso no será un inconve-
niente, ya que en este mismo artí-
culo veremos cómo crear este tipo
de ayudas usando la utilidad HTML
Help Workshop que se incluye con
Visual Studio.
Básicamente, hay dos formas de
usar este tipo de ayuda desde nues-
tras aplicaciones de Visual Studio
2005. Por un lado, tenemos la cla-
Guillermo “Guille” se Help, que expone ciertos méto-
Som es Microsoft MVP dos estáticos (compartidos) que nos
de Visual Basic desde permiten mostrar la ayuda conteni-
1997. Es redactor de da en un fichero CHM. También
dotNetManía, mentor existe un componente llamado Help-
de Solid Quality Iberoa- Provider el cual, además de pro-
mericana, tutor de cam- porcionar una forma de acceder a
pusMVP, miembro de
esos tipos de ficheros de ayuda, nos
Ineta Speakers Bureau
Latin America, y autor Figura 1. Aspecto de la ayuda HTML permite agregar ayuda emergente a
de los libros “Manual cualquier control que tengamos en
Imprescindible de Visual nuestro formulario. Veamos cómo
Basic .NET” y “Visual Como podemos suponer, el formato de los usar estas dos clases para proporcionar ayuda en
Basic 2005”. documentos usados para crear este tipo de ayuda nuestras aplicaciones.
http://www.elguille.info
<< dnm.inicio.taller

Añadir ayuda con HelpProvider que nuestros usuarios desearían ver cuando pulsaran
la tecla [F1] en la aplicación.
El componente HelpProvider nos ofrece una forma
muy sencilla de añadir ayuda a nuestras aplicacio-
nes. Cuando agregamos un componente de este tipo Mejorar la ayuda proporcionada
a nuestro formulario, se añaden unas propiedades
con HelpProvider
adicionales a cada control que tenga dicho formula-
rio. Dos de esas propiedades sirven para acceder al Una forma de mejorar la ayuda mostrada por nues-
contenido de un fichero de ayuda compilada (.chm); tra aplicación es mostrar un fichero HTML en lugar
otra simplemente sirve para indicar si se debe mos- del texto emergente proporcionado por la propiedad
trar o no la ayuda proporcionada por este compo- HelpString.
nente ( ShowHelp), y la cuarta propiedad agregada Para indicar qué fichero HTML queremos usar
(HelpString) sirve para mostrar una ayuda emergente como ayuda, tenemos que indicar el path (la ruta com-
cuando el usuario pulse la tecla [F1] mientras el con- pleta, incluyendo el nombre del fichero) a la propie-
trol tenga el foco. Sabiendo esto, podemos utilizar dad HelpNamespace del componente HelpProvider.
esa propiedad (HelpString) para que nuestras apli- Cuando asignamos un valor a esa propiedad, lo que
caciones muestren ayuda a los usuarios. La ventaja hayamos asignado a la propiedad HelpString no se tie-
de usar la propiedad HelpString es que el texto de ne en cuenta, y lo que ocurre cuando el usuario pul-
ayuda que queremos mostrar no es necesario que sa la tecla [F1] es que se muestra el contenido del fiche-
esté en un fichero de ayuda, sino que lo indicamos ro HTML que hemos indicado en la propiedad Help-
nosotros de forma directa en cada uno de los con- Namespace. Esto es un “adelanto” con respecto al tex-
troles que queremos que ofrezcan esa funcionalidad
cada vez que se pulse la tecla [F1].
Como podemos imaginar, esa forma de mostrar
ayudas no es la que el usuario preferirá, pero a falta
de otra cosa mejor, al menos nuestra aplicación reac-
cionará al pulsar esa tecla, lo que nos puede sacar de
apuros en algún momento en el que no tenemos muy
claro qué es lo que debemos hacer en nuestra aplica-
ción o queremos saber para qué sirven ciertas opcio-
nes que la aplicación nos muestra.
En la figura 2 podemos ver cómo usar el texto asig-
nado a la propiedad HelpString y qué es lo que vería
el usuario si pulsara la tecla de ayuda al estar posicio-
nado en la primera caja de textos del formulario.

Figura 3. Usar la ayuda de un componente

to emergente, pero no es la solución “deseada”, ya


que ese mismo fichero es el que se usará para todos
los controles que tengamos en nuestro formulario.
Si queremos usar varios ficheros de ayuda, con
idea de asociar cada uno de ellos a un control dife-
rente, la única forma de hacerlo es agregando varios
componentes HelpProvider, de forma que cada uno
de esos componentes esté asociado con un fichero
Figura 2. La ayuda emergente con el HTML diferente, según el valor que hayamos asig-
texto asignado a HelpString nado a la propiedad HelpNamespace. Después asigna-
mos un valor verdadero a la propiedad ShowHelp del
<<dotNetManía

componente con la ayuda a mostrar en ese control;


Como podemos apreciar en la figura 2, esta ayu- de esta forma, cuando el usuario pulse la tecla de ayu-
da es “para salir del paso” y seguramente no sería lo da se mostrará el fichero correspondiente al “prove-

43
<< dnm.inicio.taller

edor” de ayuda que hemos decidido Cuando decidimos usar un fichero dro “Creación de un fichero de ayuda
usar con ese control. En la figura 3 de ayuda HTML, el nombre de ese HTML”, los valores que podemos usar
podemos ver cómo el control seleccio- fichero CHM será el que indiquemos en la propiedad TopicId son valores
nado utiliza la ayuda de uno de los com- en la propiedad HelpNamespace del com- numéricos que previamente hemos aso-
ponentes HelpProvider que tenemos en ponente HelpProvider. De forma prede- ciado en la ayuda HTML con páginas
el formulario. terminada, al pulsar [F1] en uno de los de contenido de ese fichero de ayuda,
Como podemos suponer, esto sería controles del formulario, se mostrará el aunque también podemos asociar esos
bastante tedioso de hacer en una apli- fichero de ayuda que hemos indicado. tópicos con marcadores dentro de una
cación con muchos controles, al menos Aunque al hacerlo, lo que se muestra es página; todo dependerá de cómo haya-
si para cada uno de esos controles que- la “página” predeterminada de dicho mos creado el fichero de ayuda.
remos usar un fichero de ayuda dife- fichero de ayuda. Lo deseado no es pre-
cisamente que siempre se muestre la Mostrar ayuda usando la clase
misma página, sino que según el con-
trol en el que el usuario pulse [F1] se
Help
muestre la información referente a ese Además del componente HelpProvider,
“tópico”. Esto último es lo más intere- .NET Framework también proporciona
sante y es también lo deseado, pero para la clase Help para mostrar el contenido
La clase Help no es que eso sea posible, debemos tener pre- de un fichero de ayuda compilado o bien
parado el fichero de ayuda, ahora vere- de páginas HTML independientes.
instanciable, por tanto, la mos cómo, aunque antes de continuar La clase Help no es instanciable,
leyendo, es necesario saber las distintas por tanto, la ayuda la mostraremos
ayuda la mostraremos opciones que podemos configurar en un
fichero de ayuda HTML, y eso es lo que
usando los métodos estáticos (o com-
partidos) que expone. Estos métodos
usando los métodos explico en los recuadros “Estructura de
un fichero de ayuda HTML” y “Creación
son ShowHelpIndex , que muestra el
índice de la ayuda, ShowPopup , que
estáticos (o comparti- de un fichero de ayuda HTML”.
Para utilizar de forma más eficiente
muestra un texto emergente y Show-
Help, que permite indicar el fichero de
el fichero de ayuda HTML que tenemos ayuda compilada o una página
dos) que expone asociado al componente HelpProvider, HTML. En el caso de usar un fiche-
tendremos que usar la propiedad Help- ro CHM, podemos indicar si quere-
Navigator que el componente agrega a mos mostrar la ficha de contenido, del
cada control del formulario. Según el índice o de la búsqueda, además de
valor que indiquemos en esa propiedad, poder indicar el valor del tópico a
podremos acceder a las diferentes par- mostrar; esos valores los indicaremos
tes de que se compone un fichero de ayu- por medio de la enumeración HelpNa-
da HTML. Por ejemplo, si al pulsar [F1] vigator. En todos estos métodos, el
rente, sin contar que tendríamos que en un control queremos que se muestre
agregar tantos componentes del tipo la ficha de contenido de la ayuda, el valor
HelpProvider como ficheros HTML de la propiedad HelpNavigator debe ser

[ ]
diferentes queramos utilizar. TableOfContents. De la misma forma, al
Una mejor solución es usar un fiche- asignar un valor Index se mostrará la ayu- NOTA
ro de ayuda compilada. Veamos cómo da con la ficha del índice seleccionada,
la podríamos usar por medio del com- y si asignamos Find, la ficha que se mos- Como podemos comprobar, al
ponente HelpProvider. trará será la de búsqueda. tener que indicar el nombre del
Pero, como comentaba antes, la fichero al llamar a cada méto-
opción que más usaremos es asignando do de la clase Help, con esta
el valor TopicId. En este caso, debemos clase podemos crear un siste-
Una solución más elegante ma de ayuda para nuestras apli-
asignar a la propiedad HelpKeyword el
Si tenemos creado un fichero de valor del “tópico” que queremos mos- caciones de una forma muy
ayuda HTML, podemos asociarlo con trar. Ese valor debe estar asociado con fácil, ya que podemos usar
un componente HelpProvider de forma un elemento del fichero de ayuda; por varios ficheros con la extensión
que sea ese fichero de ayuda el que se tanto, es importante crear de forma ade- .htm, sin necesidad de crear un
<<dotNetManía

utilice en lugar del texto proporciona- cuada el fichero de ayuda para poder fichero de ayuda compilada.
do por la propiedad HelpString o de un usarlo correctamente en nuestras apli-
fichero HTML. caciones. Tal como comento en el recua-

44
<< dnm.inicio.taller

[ ]
primer parámetro será la ventana propietaria (normalmente
usaremos una referencia a la instancia actual del formula- NOTA
rio, Me en Visual Basic o this en C#), y en caso de los méto-
dos ShowHelp y ShowHelpIndex , en el segundo parámetro El evento HelpRequested se produce tanto al pulsar la
indicaremos el fichero de ayuda a utilizar, que puede ser tecla [F1] como al usar el botón de ayuda (indicado en
de tipo .chm o .htm; en el último caso, solo será aplicable el formulario con una interrogación) y pulsar con el
al método ShowHelp y, por supuesto, no tendrá sentido mos- cursor sobre un control.
trar el contenido, el índice ni ningún otro valor que solo Para mostrar el botón de la interrogación en un for-
es aplicable a los ficheros de ayuda compilada. mulario, debemos asignar un valor verdadero a la pro-
Por ejemplo, si queremos mostrar el contenido de la ayu- piedad HelpButton del formulario, además de que tan-
da de un fichero indicado en la variable hlp, usaremos el méto- to MaximizeBox como MinimizeBox deben tener un
do ShowHelp de la siguiente forma: valor falso (para que no se muestren). El aspecto del
formulario sería el mostrado en la siguiente figura:
Help.ShowHelp(Me, hlp, HelpNavigator.TableOfContents)

Para mostrar el índice, podemos hacerlo de dos formas,


una usando el método ShowHelp y la otra es llamando al méto-
do ShowHelpIndex; en ambos casos, indicaremos tanto el pro-
pietario como el fichero de ayuda a usar:

Help.ShowHelp(Me, hlp, HelpNavigator.Index)

‘ también así:
Help.ShowHelpIndex(Me, hlp)

Para mostrar un tópico en concreto, usaremos el método


ShowHelp de la siguiente forma:

Help.ShowHelp(Me, hlp, HelpNavigator.TopicId, “1001”) El botón de ayuda en los formularios

Como vemos, el valor del tópico lo tenemos que indicar


como una cadena, pero siempre hará referencia al valor numé-
rico que hemos asociado en el fichero de la ayuda.
En el caso del método ShowPopup, además de indicar la ven-
tana propietaria, indicaremos el texto a mostrar y la posición
en la que queremos que se muestre el texto emergente, el cual que queramos proporcionar ayuda y llamar a los métodos de la
se mostrará al estilo de cómo vimos en la figura 2. clase Help que en cada ocasión queramos usar.
Dim p As New Point( Button2.Left + Left, _
Button2.Top + Top + Button2.Height)
Help.ShowPopup(Me, “El botón 2”, p) Conclusiones
En este artículo hemos comprobado que proporcionar ayuda en
nuestras aplicaciones es relativamente fácil gracias a las dos cla-
¿Cómo saber que debemos mostrar la ayuda?
ses que proporciona .NET Framework, aunque el mayor rendi-
Con el componente HelpProvider estaba claro que el propio miento lo sacaremos usando ficheros de ayuda HTML (en for-
componente se encargaba de detectar la pulsación de la tecla de mato CHM). Si bien la clase Help nos permite usar ficheros del
ayuda y de mostrar la ayuda según lo hubiésemos definido en tipo .htm de una forma mucho más fácil que el componente Help-
cada control, pero con la clase Help tendremos que detectar noso- Provider, el uso de los ficheros de ayuda compilada ofrecerá mayor
tros esa pulsación de la tecla [F1]. Seguramente lo primero que funcionalidad que los “simples” ficheros HTM, ya que permitirá
se nos vendrá a la cabeza es detectar la pulsación de la tecla [F1] al usuario buscar en la ayuda, crear marcadores (favoritos) y una
mediante un evento del tipo KeyDown o KeyUp, pero existe otra for- navegación más cómoda por el contenido de la ayuda.
ma más práctica y simple, que es usando el evento HelpReques- Como de costumbre, en el ZIP que acompaña a este artícu-
<<dotNetManía

ted. Este evento se produce cuando se pulsa la tecla [F1] , y es lo están los proyectos tanto para Visual Basic como para C#, en
aplicable a cualquier control (incluso el formulario); por lo tan- los que se muestra cómo usar las dos clases con todas las combi-
to, podemos crear un evento en cada uno de los controles en los naciones explicadas en el artículo.

45
<< dnm.inicio.taller

Estructura de un fichero de ayuda HTML

Tal como vimos en la figura 1, un fichero de ayuda


HTML se compone principalmente de dos paneles.
A la izquierda tenemos una serie de fichas (solapas)
en las que tenemos el contenido (“Contents”), el índi-
ce (“Index”), la ficha de búsqueda (“Search”) e inclu-
so una ficha para agregar los favoritos (“Favorites”).
Estos últimos serán los marcadores que nosotros agre-
guemos, pero solo los que están dentro del fichero de
ayuda, y no los favoritos que tenemos en el navega-
dor o en el explorador de Windows.
Cuando seleccionamos la ficha de contenido, se
muestran las distintas partes o grupos de tópicos que
hayamos definido. Por regla general, esos elementos
se muestran como libros y hojas. Los libros son los Figura 5. Buscar en la ayuda
nodos principales o secciones dentro de la ayuda y las
hojas representan a cada uno de los tópicos o ele-
mentos de la ayuda.
El índice representa una serie de elementos, que
habitualmente mostramos de forma ordenada; en la
figura 4 se muestra el índice de la ayuda del compila-
dor de ayudas HTML.

Figura 6. Resultado de la búsqueda

del botón “Add” podremos agregarlo a la lista de favo-


ritos, tal como vemos en la figura 7.

Figura 4. El índice de la ayuda

La ficha de búsqueda será la que el usuario usará


para realizar búsquedas dentro del contenido de la
ayuda. En las figuras 5 y 6 vemos cómo realizar bús-
quedas usando varias palabras y el resultado de dicha
búsqueda. Una vez que hemos indicado lo que que-
remos buscar, el resultado se mostrará como una lis-
ta dentro de la misma ficha.
Por último, la ficha de favoritos nos permite agre-
<<dotNetManía

gar enlaces a elementos (tópicos) de la ayuda. Cada


vez que seleccionemos un tópico, el título del mismo
Figura 7. Agregar a favoritos
se mostrará en la parte inferior de esa ficha y por medio

46
<< dnm.inicio.taller

En el panel de la derecha se mostrará el elemen- ten navegar entre los distintos tópicos mostrados,
to que hemos seleccionado. Este panel es configura- ir a la página de inicio, ocultar el panel de la
ble en cuanto al aspecto y tamaño, incluso podemos izquierda, imprimir, etc. Todos estos botones, así
crear diferentes “ventanas” para poder mostrar los como las diferentes fichas del panel de la izquier-
tópicos de forma diferente, con idea de poder llamar da son configurables desde el compilador de ayu-
la atención del usuario o bien para que distintos ele- da HTML, pudiendo indicar los que queremos
mentos de la ayuda se muestren en ventanas diferen- mostrar.
tes o con un aspecto y tamaño diferente. En el recuadro “Creación de un fichero de ayuda
Además de estos dos paneles, en la parte supe- HTML” explico los conceptos más importantes para
rior tenemos una serie de botones que nos permi- crear un fichero de ayuda.

Creación de un fichero de ayuda HTML

La creación de ayuda HTML la haremos con la uti- rio tendremos que asignar un valor TopicId a la propie-
lidad hhw.exe (HTML Help Workshop). Esta herra- dad HelpNavigator, y a la propiedad HelpKeyword asocia-
mienta se incluye con Visual Studio 2005, además de mos el valor numérico; de esa forma, al pulsar la tecla de
que está disponible para descarga desde el centro de ayuda se mostrará la parte de la ayuda que está asociada
descargas de Microsoft. a ese tópico.
Antes de utilizar esta utilidad, tendremos que cre- Para crear los tópicos debemos hacer lo siguiente
ar los ficheros HTML que queremos usar como “tópi- en la utilidad HTML Help Workshop: en la barra de
cos” de nuestra ayuda; es decir, debemos crear los dife- botones de la derecha de la utilidad debemos pulsar
rentes apartados como si se tratara de un sitio Web en el cuarto botón (“HmlHelp API Information”), lo
basado en HTML. Podemos agregar imágenes, docu- que nos mostrará un cuadro de diálogo con varias
mentos para descargar, poner enlaces entre las distin- fichas; seleccionamos la segunda (“Alias”) y pulsamos
tas secciones o tópicos, etc. en el botón “Add”. Nos pedirá que indiquemos una
Una vez que tenemos creado el contenido en for- constante o un número, que se usará para hacer refe-
mato HTML es cuando usamos el compilador de ayu- rencia a una página HTML de las que tenemos agre-
das, ya que básicamente eso es lo que hace la utilidad gadas al proyecto. Además de una página, podemos
hhw.exe, compilar todo ese contenido HTML en un indicar un marcador dentro de una página, lo cual nos
fichero con la extensión .chm. permite tener varias asociaciones dentro de una mis-
Para no hacer demasiado extenso este artículo, los ma página HTML.
pasos para crear un fichero de ayuda HTML lo puede Una vez que hemos agregado las palabras y las
descargar desde el sitio Web de dotNetManía, donde hemos asociado con ficheros HTML, tenemos que
explico, con todo lujo de detalles, cómo crear el propio crear un fichero include (sí, al estilo de los ficheros de
fichero de ayuda con la explicación, incluyendo cómo cabecera de C/C++; de hecho, ese fichero deberá tener
agregar el contenido, el índice, cómo definir las venta- la extensión .h, que es la que la utilidad usará para bus-
nas, cómo seleccionar las diferentes fichas que queremos car el fichero cuando lo queramos agregar). En ese
mostrar, etc. Lo que sí explicaré aquí es cómo agregar fichero definiremos constantes numéricas que estarán
cierta funcionalidad para que la podamos asociar a los asociadas a las constantes o palabras que hemos defi-
diferentes controles o apartados de nuestra aplicación. nido en el paso anterior.
El contenido de ese fichero estará formado por
Asociar contenido de la ayuda a valores líneas que usan el formato:
utilizables desde las aplicaciones #define <constante> <valor numérico>
Si queremos mostrar cierto contenido de la ayuda
HTML cuando el usuario pulse la tecla [F1], ese conte- Siendo <constante> la constante que hemos agre-
nido lo tenemos que asociar a lo que se conoce como un gado en la ficha “Alias” y <valor numérico> un valor
tópico de la ayuda. En realidad, consiste en asociar cual- que usaremos en la propiedad HelpKeyword.
quier parte de la ayuda con un valor numérico; ese valor Una vez hemos creado ese fichero include, tene-
<<dotNetManía

numérico será el que se utilice desde la aplicación. En el mos que agregarlo al proyecto de ayuda HTML por
caso del componente HelpProvider, en las propiedades medio de la ficha “Map” del cuadro de diálogo mos-
que ese componente agrega a los controles del formula- trado por la opción “HtmlHelp API Information”.

47
todotNet.qa@dotnetmania.com
Dino Esposito
todonet@qa

El propósito de algunas
características de .NET
Las tecnologías del software se renuevan constantemente, y algunas veces el pobre desarrollador
no llega a captar ciertos aspectos. En otros casos, podemos tardar más de lo deseado intentan-
do comprender algunas características. No es, por tanto, casual que este mes abordemos varias
de las preguntas que empiezan con la frase “Cuál es el propósito”. Trataremos de mostrar cuál
fue la idea central en cada uno de los casos.

¿Cuál es el propósito de la sobrecarga de operadores en Visual Basic 2005? Tengo un colega que
sabe un montón de C++, y que continuamente está alabando las virtudes de esta característica. De
cualquier forma, no veo una gran diferencia entre un operador personalizado y la llamada a un
método.

La sobrecarga de operadores es un viejo concep- nes en las que las sobrecargas están definidas por
to de la programación y nació, primero, y cobró el lenguaje. En otros casos, el programador imple-
importancia después, debido a la programación menta el soporte para nuevos operadores con nue-
orientada a objetos (POO). En sí misma, la sobre- vos tipos.
carga de operadores, es sencillamente una varian- Visual Basic 2005 soporta operadores per-
te del polimorfismo; uno de los tres pilares de la sonalizados, lo que significa que puedes sobre-
POO junto con la herencia y la encapsulación. cargar un operador existente para especializar
¿Pero qué es realmente el polimorfismo? su comportamiento. Al mismo tiempo, es posi-
El polimorfismo indica la capacidad de un ble definir nuevos operadores que pueden ope-
método para suministrar distintos comporta- rar sobre nuevos tipos de datos. En general, los
mientos cuando es llamado por clases distintas. El operadores sobrecargados simplifican el traba-
método tiene el mismo nombre y requiere la mis- jo con tipos complejos y permiten especificar
ma signatura, pero la implementación interna es tu propia implementación para operaciones fun-
diferente para clases diferentes. El ejemplo canó- damentales.
nico comienza con la clase base Persona, de la que Como, por ejemplo, restar dos fechas, o sumar
puedes heredar clases como Español o Inglés. La una hora dada a una fecha. Cualquier framework que
clase base tiene un método Hablar() cuya imple- soporte fechas como tipo nativo ofrecerá métodos
mentación produce las salidas “Hola” y “Hi” res- en la clase Date para ejecutar esas operaciones. Diga-
Dino Esposito pectivamente. mos que quieres restar dos fechas. Tendrás que recu-
es mentor de Solid Hablando lógicamente, un operador como +, rrir a un código como el siguiente:
Quality Learning. Es
= o == no es más que un método. En este sentido,
ponente habitual en
los eventos de la están sujetos al polimorfismo. Tú estableces que Date d1, d2;
industria a nivel tales operadores tienen diferentes implementa- int diff = Date.Subtract(d1, d2);
mundial.Visite su ciones dependiendo de los tipos de sus argumen-
blog en: http://weblogs. tos. Sumar dos enteros es distinto de sumar dos ¿No sería más natural y más claro escribir, en
asp.net/despos. decimales o dos fechas. En general, hay situacio- su lugar, éste código?
(todotNet.QA@
dotnetmania.com)
<< dnm.todonet@qa

TodotNet.qa@dotnetmania.com TodotNet.qa@dotnetmania.com
Date d1, d2; La misma sintaxis se requiere para sobrecargar ope-
int diff = d1 – d2; radores estándar de forma que trabajen con tipos per-
sonalizados. Se vincula un método existente o fragmen-
Sin embargo, para poder hacerlo, se necesita to de código a un símbolo. La definición de un opera-
sobrecarga de operadores. .NET Framework sumi- dor no es diferente de la definición de un método excep-
nistra exactamente este tipo de soporte mediante el to por el empleo de una sintaxis ligeramente diferente.
tipo System.DateTime. Puedes sumar y restar fechas ¿Deberías usar operadores en lugar de crear méto-
usando los operadores matemáticos clásicos. Es algo dos? Pues es una cuestión de preferencias, pero, en
incluido por defecto. El siguiente código muestra un general, los operadores hacen que el código sea nota-
fragmento de la implementación real del operador + blemente más claro cuando se utilizan tipos persona-
para la clase System.DateTime. lizados. Ahora bien, no cualquier tipo personalizado,
sino aquellos cuya lógica y comportamiento encajen
public static DateTime operator +(DateTime d,TimeSpan t) con la semántica del operador. La claridad y legibili-
{ dad del código es el mejor valor añadido que yo veo
long internalTicks = d.InternalTicks; en los operadores personalizados. No depende de nin-
long toAdd = t._ticks; guna otra cosa. Es una característica presente en los
lenguajes .NET, y la usas si te sientes confortable con
return new DateTime( (ulong) (internalTicks+toAdd) ); ella. Y punto.
}

¿Cuál es el propósito de las páginas no compiladas en ASP.NET? Si no quieres ningún código ASP.NET
compilado, ¿por qué no usar HTML plano?

En ASP.NET 2.0, las páginas no compiladas son límite, el rendimiento del sistema se degrada signifi-
páginas especiales que no se compilan nunca. Se cativamente. En otras palabras, para un sitio Web con-
crea una página no compilada estableciendo el atri- siderable en tamaño, las páginas no compiladas habi-
buto CompilationMode de la directiva @Page a su valor litan un sistema adecuado para descargar de la memo-
“Never”. Alternativamente, si no se sabe bien qué ria páginas concretas. Si se compilan regularmente en
hacer, este valor puede dejarse como “Auto” en la un ensamblado, no podrían ser descargadas sin des-
sección <pages> del fichero de configuración. En cargar el propio dominio de aplicación (AppDomain).
ese caso, ASP.NET deducirá si la página debe de Después de todo, un sitio web no compilado puede
compilarse o no. servir un número infinito de páginas, sin necesidad de
¿Cuál es el propósito, entonces, de las páginas no reiniciar el dominio de aplicación. Las páginas no com-
compiladas? Y, más importante aún, ¿cuál es la dife- piladas son una característica de escalabilidad y no
rencia entre las páginas no compiladas y las páginas específicamente de rendimiento. Entonces, ¿por qué
HTML estáticas? no usar páginas HTML planas?
Mi abuela solía decir que no porque algo pueda Una página no compilada se escribe como cual-
hacerse tú tienes que hacerlo. De forma similar, las quier otra página ASP.NET y está, realmente, hecha
páginas no compiladas, no son para todas las aplica- de controles de servidor. No obstante, no pueden con-
ciones. Si tienes un sitio Web pequeño con unas pocas tener código. Pero, en una página no compilada pue-
páginas, ¿qué sentido tiene complicarse con páginas des utilizar numerosos controles ricos de ASP.NET
no compiladas? 2.0 y otras características, como Páginas Maestras
Las páginas no compiladas están diseñadas para (Master Pages), controles Login, Gridview y DataSour-
mejorar la escalabilidad de sitios Web de gran tamaño, ce. Todas las maravillas que puedes haber oído res-
digamos de varios miles de páginas. En ese tipo de pecto a las páginas no compiladas en ASP.NET 2.0
sitios, las páginas no compiladas evitan la necesidad son ciertas, y es una página de ese tipo la que marca
de compilar miles de páginas. ¿Es esto un problema? claramente la diferencia entre las páginas ASP.NET
¿Y cuándo? no compiladas y las páginas estáticas HTML.
<<dotNetManía

El sistema operativo Windows impone un límite Pero una página no compilada no puede enla-
al número de DLLs que pueden ser cargadas simultá- zarse a un fichero de código, y no puede contener
neamente por una aplicación. Cuando se alcanza ese un bloque <script> de servidor. La única parte de

49
<< dnm.todonet@qa
<<dotNetManía T o d o t N e t . q a @ d o t n e t m a n i a . c o m T o d o t N e t . q a @ d o t n e t m a n i a . c o m

código ejecutable admitida en una página así, es una disminuir el número de ensamblados guardados en
expresión $. memoria.
Desde el punto de vista del rendimiento, no Así que la clave consiste en que no hay ensamblados
deberías esperar un beneficio tangible por la utiliza- guardados ni almacenados en disco. En su lugar, el cons-
ción de páginas no compiladas. De hecho, probable- tructor de la página se guarda en memoria y se reutili-
mente es algo más lento. Como ya he mencionado, za para crear la página para cada petición. Este caché es
las páginas no compiladas tienen sentido para aliviar actualizado siempre que, por cualquier razón, se reini-
el trabajo de compilación en sitios de gran tamaño, y cia la aplicación.

Necesito suministrar un recurso grande desde un sitio Web. Obviamente, me encantaría poder
enviar una versión comprimida. ¿Qué opciones hay disponibles en ASP.NET?

using (Stream stmCompressed = new GZipStream(stm,


Al objeto de utilizar el ancho de banda de forma más
CompressionMode.Compress))
eficiente, puedes habilitar la compresión HTTP a
{
nivel de IIS. Se pueden comprimir tanto ficheros está- // Escribe datos comprimidos
ticos como respuestas generadas dinámicamente. Y using (StreamWriter writer = new
se puede habilitar la compresión para toda la aplica- StreamWriter(stmCompressed))
ción o solo para un directorio concreto. En el admi- {
nistrador de IIS, seleccionas la carpeta “Sitios Web”, StreamReader reader = new
y luego, “Propiedades”. A continuación activas la sola- StreamReader(context.Server.MapPath("..."));
pa “Servicio” y en la sección “Compresión HTTP” writer.Write(reader.ReadToEnd());
seleccionas la casilla “Comprimir ficheros de la apli- }
cación”, para habilitar la compresión de ficheros diná-
// Escribe datos comprimidos
micos. También puedes personalizar los tipos de fiche-
// al stream de salida
ro a comprimir, siguiendo las instrucciones que apa-
byte[] tmp = stm.ToArray();
recen en la siguiente dirección Web: context.Response.AddHeader("Content-encoding",
"gzip");
http://www.microsoft.com/technet/prodtechnol/
WindowsServer2003/Library/IIS/d52ff289-94d3-4085-bc4e- context.Response.OutputStream.Write(tmp,0,
24eb4f312e0e.mspx?mfr=true tmp.Length);
return;
Sin embargo, esto es simplemente una opción. Si }
existen condicionantes en tiempo de ejecución, o sola- }
mente se quiere comprimir un recurso dado, puedes }
optar por la vía del software y escribir código que lo
bool IHttpHandler.IsReusable
haga. En este caso, yo sugeriría escribir un maneja-
{
dor HTTP, para servir el recurso y usar internamen- get { return true; }
te la clase GzipStream para comprimir los contenidos. }
A continuación muestro algo de código para ilustrar }
este punto.
Puedes copiar este código entero a un fichero C#
using System; en la carpeta App_Code y vincularlo a un recurso de
using System.Drawing; manejador HTTP, ya sea con la extensión .AXD o
using System.Web; .ASHX. A continuación, te refieres al recurso utilizan-
using System.Web.UI; do su manejador. Si hay que comprimir múltiples
using System.IO.Compression;
recursos, puedes utilizar parámetros en la cadena de
using System.IO;
consulta para indicar un fichero concreto a cargar y
public class CompressorHandler : IHttpHandler comprimir. Como puedes ver, la estructura del mane-
{ jador es bastante simple; todo lo que hace es usar un
void IHttpHandler.ProcessRequest(HttpContext context) stream para leer el recurso y un writer para añadirlo
{ a la pila de streams: uno en memoria y un GZip. La
using (MemoryStream stm = new MemoryStream()) compresión sucede de forma natural según va reco-
{ rriéndose el stream Gzip.

Traducido al castellano por Marino Posadas


50
Octavio Hernández
Laboratorio.net
Guidance Application Toolkit
Este mes no dedicamos nuestra columna a un producto comercial, sino a Guidance
Automation Toolkit, una extensión de Visual Studio 2005 que permite a los
arquitectos de software crear experiencias de usuario ricas e integradas para la
utilización dentro del entorno integrado, de una forma consistente con las guías
de arquitectura, de diversos activos de software, como pueden ser marcos de
trabajo, librerías, componentes o patrones.

Introducción Ficha técnica


Guidance Automation Toolkit (en lo adelante GAT) Nombre: Guidance Automation Toolkit
ha sido desarrollado conjuntamente por Microsoft y la Fabricante: Microsoft/Clarius Consulting
empresa Clarius Consulting (www.clariusconsul- Web: www.guidanceautomation.net
ting.net), y es, del mismo modo que DSL Tools Categoría: Extensiones de Visual Studio
(Domain Specific Language Tools), uno de los componentes Precio: Gratuita
básicos de las iniciativas que están teniendo lugar alre-
Valoración: ****o
dedor de las Factorías de Software (Software Factories),
metodología concebida por Microsoft con el objetivo
último de incrementar la productividad y predictibili-
dad del desarrollo de software y centrada alrededor de Conceptos fundamentales
un entorno de desarrollo configurado para facilitar al
máximo el desarrollo rápido, siguiendo guías arqui- GAT puede considerarse como una evolución de los
tectónicas bien definidas y prácticas recomendadas, de add-ins, el mecanismo de extensibilidad de Visual Stu-
ciertos tipos de aplicaciones. GAT también ha sido uti- dio al que hemos dedicado varios artículos de dotNet-
lizado en la implementación de la recién aparecida ver- Manía, más notablemente los de Carlos Quintero [1]
sión 3.0 de Enterprise Library, lo que deja entrever que y del Grupo WebOO de la Universidad de La Haba-
la herramienta ha alcanzado un alto grado de madurez na [2]. Para desarrollar este tipo de extensiones hay que
y está preparada para dar el salto al prime time, por ejem- lidiar con EnvDTE (Environment Developer Tools Exten-
plo, como parte del SDK de Visual Studio. sibility), una librería COM extensa y compleja que apor-
GAT es un kit de herramientas concebido para ta el modelo de objetos necesario para interactuar con
que los arquitectos de software desarrollen paque- el entorno integrado. Solo el mero hecho de que GAT
tes de orientación (guidance packages) que ayuden a encapsula muchas de las complejidades de EnvDTE
los desarrolladores en su trabajo. Se ha implemen- (eso sí, permitiendo acceder a él si fuera necesario) ya
tado como un vía “ligera” para extender Visual Stu- es un gran plus; pero GAT aporta mucho más que eso,
dio, de un modo que permita simplificar la integra- especialmente en el aspecto conceptual, ámbito en el
Octavio Hernández ción en las aplicaciones de los activos de código reu- define que toda una serie de conceptos que simplifican
es Development tilizable (tanto propios como de terceros) y promo- y dan consistencia y sistematicidad a la creación de exten-
Advisor de Plain
ver el uso de patrones y prácticas recomendados, así siones de Visual Studio.
Concepts, editor
como automatizar tareas que generalmente se eje- La arquitectura sobre la que se apoya GAT se
<<dotNetManía

técnico de
dotNetManía y tutor cutan de forma manual y realizar de una manera con- muestra en la figura 1. Se apoya directamente en una
de campusMVP. sistente labores repetitivas o propensas a error; obje- librería llamada GAX (Guidance Automation Exten-
Es MVP de C# desde tivos que redundan en definitiva en un incremento sions), que se descarga e instala independientemente.
2004, MCSD y MCT. de la productividad y calidad del desarrollo. GAX es el motor de ejecución de GAT, y deberá ins-

51
<< dnm.laboratorio.net

• Asistentes (wizards). Los asistentes • Plantillas de Visual Studio (Visual


incorporan estrategias de obtención Studio templates). A partir de estas
de datos que serán utilizados como plantillas, Visual Studio crea solu-
argumentos de las recetas. Cual- ciones o agrega uno o más proyec-
quier receta puede terne asociado tos o elementos a una solución exis-
un asistente. Los asistentes guían al tente. Las plantillas, que se definen
desarrollador a lo largo de una serie en XML, son expandidas por el
de pasos, que se presentan en for- motor de plantillas de Visual Stu-
ma de páginas (pages). dio. Mediante GAT, es posible aso-
• Conversores de tipos (type conver- ciar recetas a las plantillas de Visual
ters). Los conversores de tipos vali- Studio. Esta asociación implica que
dan los datos introducidos en los asis- cuando una plantilla es ejecutada, el
Figura 1. Arquitectura y escenario de tentes y los transforman de su repre- motor llamará a la receta para reco-
uso de GAT sentación visual a su representación ger valores de argumentos para la
en el tipo de datos de destino. ejecución, y que una vez que la plan-
• Proveedores de valores (value tilla haya sido aplicada, ejecutará las
talarse tanto en los equipos de los arqui- providers). Los proveedores de acciones indicadas por la receta para
tectos (como prerrequisito de GAX), valores son clases que pueden ser transformar aún más los ficheros
como en los de los desarrolladores que utilizadas por las recetas para cal- creados por la plantilla.
harán uso de los paquetes de orientación cular los valores que necesitan • Referencias (references). Por últi-
que los arquitectos desarrollen. pasar a las acciones. mo, las referencias son clases que
GAT permite a los arquitectos de • Editores (editors). Los editores son implementan la lógica que se uti-
software crear toda una serie de ele- clases utilizadas por los asistentes liza para determinar si una planti-
mentos que podrán luego utilizarse con- para mejorar la experiencia de lla o receta debe aparecer o no
juntamente para automatizar la ejecu- usuario a la hora de introducir los cuando se seleccione cualquier ele-
ción de diferentes tareas: datos que utilizan las recetas. mento de la solución activa.
• Recetas (recipes). Las recetas per- • Plantillas de transformación de
miten automatizar tareas que los plantillas de texto (Text Template Todos estos elementos se recopilan,
desarrolladores normalmente rea- Transformation Templates). Estas conjuntamente con un fichero de confi-
lizan manualmente, frecuente- plantillas, conocidas coloquialmen- guración, en paquetes de orientación, que
mente siguiendo una serie de ins- te como “plantillas T4”, son la base se empaquetan y despliegan como un todo
trucciones. Pueden utilizarse para para la generación automática de único. Para la gestión de estos paquetes,
garantizar que las actividades repe- código desde los paquetes GAT. GAX integra a Visual Studio 2005 dos ven-
titivas y propensas a error se reali- Durante la generación de código, tanas especiales, el Gestor de Paquetes de
zan de una manera consistente, y estas plantillas son expandidas por Orientación (Guidance Package Manager)
para simplificar las tareas de desa- el motor de transformación corres- y el Navegador de Orientación (Guidance
rrollo complejas o repetitivas. Las pondiente, y el resultado es inser- Navigator). Una vez que un paquete de
recetas se pueden aplicar a ele- tado directamente en el flujo de sali- orientación es activado para una solución
mentos específicos de una solución, da de la plantilla. Se componen de específica, el desarrollador podrá ejecutar
o a un grupo de elementos de una una combinación de texto y scrip- las recetas que el paquete incorpora para
solución con una cierta caracterís- tlets, que son expresiones de C# o llevar a cabo las tareas.
tica común (por ejemplo, todos los Visual Basic que, al ser ejecutadas,
proyectos C#). devuelven una cadena de caracteres La plantilla de paquetes
• Acciones (actions). Las acciones son que es enviada a la salida.
unidades atómicas de trabajo que • Fragmentos de código (Snippets):
de orientación
son llamadas en un orden específi- Se trata de trozos de código fre- Para facilitar el desarrollo de paquetes de
co por las recetas. Este orden se cuentemente utilizados que pue- orientación, GAT incluye una plantilla
especifica precisamente en la defi- den reproducirse con la simple de Visual Studio que genera una solu-
nición de una receta. Una acción pulsación de una combinación de ción orientada a la creación de un paque-
puede operar sobre argumentos que teclas. Los snippets que incorpore- te de orientación. Esta plantilla, muy
<<dotNetManía

le envía la receta que la llama o sobre mos a un paquete de orientación completa, define elementos de práctica-
el resultado de una acción ejecuta- se añadirán a los que ya tenga defi- mente todos los tipos posibles, de modo
da con anterioridad. nidos Visual Studio. que podamos utilizarlos como ejemplos

52
<< dnm.laboratorio.net

para nuestras propias definiciones o que implementan la interfaz Micro-


modificarlos directamente. soft.Practices.RecipeFramework.IA
Una vez instalados GAX y GAT ction; las páginas de los asistentes, como
sobre Visual Studio, tendremos instala- clases que heredan de Microsoft.Prac-
da, como es típico de las herramientas tices.WizardFramework.CustomWi-
de extensibilidad, una nueva plantilla zardPage; etc. El proyecto que genera
dentro de Visual Studio, la plantilla de el asistente ofrece ejemplos básicos para
paquetes de orientación (figura 2). cada tipo de elemento. Por ejemplo, el
Después de introducir la informa- listado 1 muestra el código de la acción
ción básica sobre el proyecto (figura 3), HelloWorldAction.
obtendremos una solución compuesta La puesta a punto de un paquete de
por tres proyectos (figura 4): instalación es similar a la de los add-ins.
• El proyecto de paquete de orien- Lo primero que hay que hacer es regis- Figura 3. Datos básicos del paquete de instalación
tación en sí. Como puede verse en
la figura 4, en el proyecto que se
genera automáticamente los dife-
rentes elementos se organizan en
carpetas diferentes para su mejor
organización.

Figura 4. Solución creada por el asistente de paquetes de orientación

Figura 2. La plantilla de paquetes de orientación


trar el paquete de instalación, de modo
similar a como lo hará automáticamen-
• Un proyecto de librería de clases te el instalador en los puestos de los desa-
que incluye una clase instaladora. rrolladores; para ello, los proyectos de
• Un proyecto de instalación, que se paquete de orientación ofrecen un acce-
encarga de recopilar todos los ele- so directo (figura 5). Entonces podremos
mentos de los otros dos proyectos, lanzar una segunda instancia de Visual
más todos los recursos de los que Studio, que ya tendrá instalado el paque-
éstos dependen, para crear un te. Si en esta segunda instancia seleccio-
Setup.exe que permita el despliegue namos “Archivo” | “Nuevo…”, veremos
del paquete en los equipos de los que tenemos en el área de Paquetes de
desarrolladores. Orientación una nueva plantilla (figura
Es en este punto donde se hace 6). Lo que restará es crear un nuevo pro-
imprescindible consultar la documenta- yecto a partir de esa plantilla, y probar si
ción en línea de GAT para conocer los los elementos que componen nuestro
detalles relacionados con la implemen- paquete funcionan como es debido, posi-
tación de los diferentes elementos que blemente ayudándonos del Navegador
se pueden incorporar a un paquete. En de Orientación (figura 7), que instala
<<dotNetManía

lo fundamental, son técnicas familiares accesos directos para que los desarrolla-
de orientación a objetos; por ejemplo, dores tengan a mano las recetas, accio-
las acciones se programan como clases nes y plantillas. Figura 5

53
<< dnm.laboratorio.net

using System;
using System.Windows.Forms.Design;
using Microsoft.Practices.RecipeFramework;

namespace PlainConcepts.GAT.Actions
{
public class HelloWorldAction : Action
{

#region Input Properties

[Input(Required = true)]
public string HelloMessage
{
Figura 6. Registrando un paquete get
{
return helloMessage;
}
set
{
helloMessage = value;
}
}

private string helloMessage;

#endregion

#region IAction Members

public override void Execute()


Figura 7. El Navegador de orientación en acción {
IUIService uiService = GetService<IUIService>(true);
if (uiService != null)
Conclusión {
uiService.ShowMessage(helloMessage, “Hello Action”);
}
GAT abre ante los arquitectos un amplio
else
abanico de posibilidades a la hora de exten- {
der Visual Studio con nuevas posibilida- System.Windows.Forms.MessageBox.Show(helloMessage,
des que faciliten a los desarrolladores la “Hello Action”);
tarea de crear aplicaciones y librerías con }
}
menor esfuerzo y respetando al máximo
los estándares requeridos por la organiza- public override void Undo()
ción. Esperamos que este breve artículo {
ayude a atraer la atención hacia este kit de }
herramientas y los temas relacionados con
#endregion
la arquitectura del software en general.
}
}
Referencias
dotNetManía Nº 33 y 34, enero y [2] Documentación de GAT, incluida
Sobre los add-ins de Visual Studio febrero de 2007. con la herramienta.
[1] Quintero C., “Creación de asis- [3] GuidanceAutomation.net, http://
tentes en Visual Studio”, en dot- Sobre GAT www.guidanceautomation.net.
NetManía Nº 30, octubre de 2006
Descargas
[2] Hernández Y., Katrib M., “Atribu- [1] Introduction to Guidance Automa-
<<dotNetManía

tos, aspectos y cómo entretejer códi- tion Toolkit, http://msdn2.micro- [1] Descarga de GAT y GAX, http://
go desde Visual Studio para hacer soft.com/en-us/teamsystem/ msdn2.microsoft.com/en-us/team
AOP en .NET” (partes I y II), en aa718950.aspx system/bb229214.aspx.

54
biblioteca.net
Essential Windows Presentation Foundation
Chris Anderson
Editorial: Addison-Wesley Professional
Páginas: 512
Publicado: 2007
ISBN: 978-0321374479
Idioma: inglés
El hecho de que Don Box y Chris Sells sean los prologuistas de esta obra no la hace
mejor, pero sí que avala su contenido, a pesar que los 3 trabajen para la misma empresa:
Microsoft. Chris Anderson trabaja en la actualidad en la Connected Systems Division,
en Redmond, pero desde 2002 fue el arquitecto principal del equipo de desarrollo de
WPF, así que algo debe saber sobre el tema. Para más detalles sobre Chris, recomenda-
mos una visita a su blog: www.simplegeek.com.
El libro es –junto a los de Petzold y Nathan, ya recomendados en esta columna– de los
mejor valorados por sus lectores en este tema y se lo recomendaría a los que –como yo- nos
gusta ver las “tripas” de las cosas. Su funcionamiento interno. E, incluso, el porqué de cier-
tas decisiones tomadas a la hora de su diseño e implementación. De hecho, la organización
del libro es excelente, y, en vez de repetir, completa de forma notable a los dos anteriores.
Todo el recorrido por el amplio espacio de WPF se hace a través de ejemplos muy bien selec-
cionados, y que ilustran con precisión la materia a la que sirven de ejemplo.

Framework Design Guidelines: Conventions, Idioms, and Patterns for


Reusable .NET Libraries
Krzysztof Cwalina y Brad Abrams
Editorial: Addison-Wesley Professional
Páginas: 384
Publicado: 2006
ISBN: 978-0321246752
Idioma: castellano
No conocíamos a Cwalina antes de esta obra, pero sus credenciales no pueden ser mejores.
Es programador en Redmond, dentro de la Common Language Runtime Division, y ha sido
responsable de varios espacios de nombres que todos usamos. En la actualidad, lidera un esfuer-
zo por desarrollar, promocionar y aplicar guías de diseño a .NET Framework y WinFx (además
de haber participado en el proyecto FxCop en sus inicios). A Abrams ya lo conocen nuestros
lectores asiduos, por varias referencias a su trabajo en distintas secciones de la revista, y con-
tinúa como Lead Program Manager en Redmond, donde se centra en WinFX y Vista desde
sus mismos comienzos (en la compañía siempre ha estado vinculado a .NET).
Realmente, aparte de los trabajos mencionados, esta obra es parte de sus guías perso-
nales, que iban elaborando al tiempo que construían las distintas versiones del Framework.
El texto es fácil de leer y puede, además, servir de referencia. Es como si, a partir de un
documento Word, se hubiera pasado el documento al resto de “gurús” (hay comentarios
de Richter, Brumme y Hejlsberg), para que completaran la obra con su propia visión. Una
rareza en su género, más que interesante.

Embedded Programming with the Microsoft .NET Micro Framework


novedades

Donald Thompson, Rob S. Miles. Editorial Microsoft Press. Páginas: 288. Publicado: junio,
2007. ISBN: 978-0735623651.

Professional C# 2005 with .NET 3.0


Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson, Morgan Skinner. Editorial: Wrox. Páginas:
1.748 . Publicado: junio, 2007. ISBN: 978-0470124727.

TEXTO: MARINO POSADAS


comunidad.net
Baleares on .NET
.NET Users Group de las Islas Baleares

baleares on.Net
• Ubicación: Palma de Mallorca
• Fecha de fundación: 24-01-2007
minante. Estos mismos problemas impiden que los
• Fundador: José Francisco Bonnín desarrolladores de Baleares puedan asistir a eventos
• Número de miembros: 57 de otras ciudades.
• Página Web: www.baleareson.net Al conocer que el grupo de usuarios de Madrid
estaba compuesto por voluntarios, me empezó a sur-
• Email de contacto: gir la idea de que modestamente podía contribuir a
jfbonnin@baleareson.net que la situación de Mallorca mejorase un poco, aun-
que fue un post en el blog de David Carmona, el que
realmente me dio la energía que necesitaba para deci-
dirme a moverlo todo.
Lo primero que hice fue contactar con Javier
Jofre, al cual le entusiasmó la idea desde el primer
momento y cedió a la comunidad el aula de forma-
ción de su empresa Innova Desarrollos Informá-
ticos. Lo más difícil estaba hecho, ya teníamos la
sala donde realizar los eventos; así que hablamos con
“Baleares on .NET, comunidad surgida de la ilusión Miguel Jiménez que a su vez nos presentó a Alfon-
de un grupo de apasionados a la tecnología .NET de so Rodríguez, gracias al cual pudimos encaminar
Microsoft, que colaboran voluntariamente en difun- mejor nuestros esfuerzos aclarándonos tantas cosas
dir dicha tecnología y a compartir sus conocimientos y proporcionándonos el apoyo necesario para el
y experiencias a los desarrolladores .NET de las Islas registro a eventos y publicidad del grupo.
Baleares”. El siguiente paso era crear el portal
Con este mensaje damos la bienvenida a los inter- http://www.baleareson.net, que pudimos poner en
nautas que visitan nuestra Web y ahora también a los marcha muy rápido a través de la colaboración desin-
lectores de dotNetManía gracias a la oportunidad teresada de varias empresas para las licencias y hos-
que nos ha brindado Paco Marín. ting necesarios. Encontrar ponentes para las charlas
La historia de Baleares on .NET no es muy dis- fue sencillísimo, tan solo hubo que hablar con otros
tinta de la de otros grupos, tal vez la principal parti- dos grandes amigos, Salvador de la Rosa y Juan
cularidad radica en que uno de sus coordinadores, un Manuel Servera, los cuales al igual que Javier Jofre
servidor, no reside en la misma provincia que el gru- se ofrecieron de inmediato a preparar alguna de las
po sino en Madrid. Fue en esta ciudad donde me acer- charlas. Eso fue todo, con el entusiasmo de unos
qué por primera vez a los grupos de usuarios .NET. pocos teníamos creado el grupo y cubierto cuatro
Cuando vivía en Mallorca veía con gran envidia meses con eventos.
como en otros lugares de España y del mundo se rea- No sabíamos muy bien la acogida que iba a tener el
lizaban eventos de todo tipo con muchísima fre- primer evento, tan solo se había publicitado a través del
<<dotNetManía

cuencia, algo que en Baleares no sucede. Los costes boletín MSDN Flash y de nuestro sitio web, además
adicionales que suponen para las empresas los pro- nos encontrábamos con el hándicap de que en Mallor-
blemas de insularidad son, sin duda, un aspecto deter- ca el .NET Framework, al igual que otros productos

56
<< dnm.comunidad.net

Me gustaría dar ánimos a todos


aquellos que hayáis pensado en cre-
ar un grupo de usuarios, veréis que
la gente estupenda que rodea este
mundo hace que todo sea mucho
más sencillo de lo que parece

de Microsoft, no se utiliza tanto como más sencillo de lo que parece. En mi caso • Desarrollo con Sharepoint 2007,
ciertas tecnologías de otras empresas. lo más difícil fue lanzarme a dar el pri- Juan Manuel Servera.
El primer evento fue el 30 de mar- mer paso, superar la barrera psicológi-
zo y el tema “Novedades en C# 3.0”, ca de aquellos que no comprendían que Y sobre todo informar que los even-
que realicé yo mismo. Increíblemente fuera a invertir tanto dinero en viajes y tos siempre los realizamos los viernes
tuvo una respuesta fantástica: a las dos no obtener otro beneficio que la satis- de 19:00 a 21:00, así que todos aquellos
semanas de abrir el registro el aforo facción personal de ver que lo que hacía- que se animen a viajar a Mallorca como
estaba completo. Sin duda, fue algo mos era útil para los demás. ponentes, podrán aprovechar para que-
totalmente inesperado y nos sirvió para Para finalizar, tan solo invitaros a darse el fin de semana y conocer la isla
darnos la fuerza necesaria para seguir que asistáis a alguno de los próximos con guía incluido. Miguel Jiménez, al
adelante. La segunda charla acerca de eventos que vamos a realizar: cual estamos enormemente agradeci-
WCF la realizó Salvador de la Rosa y dos, será el pionero en aventurarse con
una vez más tuvimos que colgar el car- • Aplicaciones de la Web 2.0 con Baleares on .NET.
tel de aforo completo. Debido al éxito Microsoft AJAX Extensions,
de las dos primeras charlas decidimos Miguel Jiménez.
José Francisco Bonnín
probar con una sala más grande para el
evento realizado por Javier Jofre sobre
la Web 2.0, la gente no defraudó. Evento CatDotNet de Manresa
El número de usuarios registrados,
aunque poco a poco, no para de crecer
en la Web y, debido a la estupenda par-
ticipación que estamos teniendo en cada El pasado 14 de junio tuvo lugar en la sala de conferencias del
evento, tras varias gestiones finalmen- Centro Microsoft de Innovación en Productividad de Manre-
te hemos conseguido una nueva sala con sa la segunda reunión de CatDotNet, un mes después de hacer
muchísima más capacidad, gracias a la lo propio en Igualada.
colaboración de la empresa SM2 Bale- De entrada, y después de una pequeña presentación del gru-
ares, de manera que podremos dar cabi- po, Diego Gómez, Business Advisor del Centro, nos mostró las
da a toda la gente que hasta ahora no características de la tecnología Unified Communications, con las
ha podido asistir. nuevas propuestas en el campo como son MS Office Communi-
Todavía tenemos grandes retos por cator 2007, MS Office Communications Server 2007 y Outlook
delante, como poder formar parte de 2007, finalizando con una demostración en directo de las capa-
Ineta o conseguir que ponentes con más cidades de reconocimiento de voz a través de clientes móviles.
experiencia que nosotros vengan a Por otro lado, contamos también con la colaboración de Benjamín Adell, de grupo de usua-
Mallorca a realizar alguna charla. Sin rios BCN.DEV, que nos explicó las novedades relacionadas con LINQ en todas sus vertientes y
embargo, creo que hasta ahora hemos nos deleitó con una batería de ejemplos de aplicaciones.
avanzado mucho en nuestro sueño de Como punto final, además de recomendar unos libros y en nuestro ya habitual apartado, “Herra-
crear Baleares on .NET. mientas indispensables”, mostramos la utilización de Microsoft SandCastle con un ejemplo en vivo.
Desde estas líneas me gustaría dar En definitiva, que pese a que la asistencia fue menor que en Igualada, nos fuimos con un buen
ánimos a todos aquellos que hayáis pen- sabor de boca; una reunión más realizada y otra nueva en preparación, para el mes que viene.
sado en crear un grupo de usuarios,
veréis que la gente estupenda que rodea Santi Balboa y José Miguel Torres
este mundo hace que todo sea mucho eventos.eventos.eventos.eventos
Marino Posadas
desván
Aparatos sin cables y con un menor documentos en la red
gasto en baterías Trucos para acelerar Windows Vista. Deb Shinder, en el
sitio Web de ZDNet en Australia, publica sus hallazgos
Ese es el anuncio que un grupo de científicos de una de mis ins- sobre varias formas en las que podemos conseguir que el ren-
tituciones de investigación favoritas (Instituto Tecnológico de dimiento de Vista sea similar al de XP. Disponible en
Massachusetts o M.I.T.), ha realizado recientemente. Se trata de http://www.zdnet.com.au/insight/software/soa/Tips-to-boost-Vis-
transmitir potencia eléctrica a varios metros de distancia sin una ta-performance/0,139023769,339278888,00.htm?feed=rss, rea-
conexión física entre la fuente de potencia y el aparato de que se mente merece la pena, abarcando desde pistas para la moni-
trate, y ya se han inventado el término witricity, para describirla. torización del rendimiento, hasta políticas de mantenimien-
El fenómeno, bien usado to de discos o indexación de archivos.
y conocido desde hace tiem- Por otra parte, parece que ya es oficial la aparición –para
po, tiene la característica de finales del presente año– del primer service pack para Vista,
que –en vez de dispersar la que parece que incluirá varios cambios específicos: primero,
energía en todas direcciones– tanto usuarios como OEM tendrán la posibilidad de selec-
focaliza la transmisión a un cionar por defecto un motor de búsqueda diferente, y en
destino y permite alcanzar más segundo término, parece que la funcionalidad deberá ser
de dos metros de distancia en extendida en los otros buscadores/indexadores de igual for-
las primeras pruebas. Los ma a como funciona actualmente, para lo cual Microsoft
investigadores liderados por Marin Soljacic (a la izquierda, en la deberá informar a los ISV y OEM sobre la forma correcta de
foto adjunta) utilizan principios de resonancia magnética, y tal realizarlo.
como reza la noticia original: “podría iluminar bombillas, hacer
funcionar radios y tocadiscos, e incluso dispositivos médicos
implantados. De hecho, ni siquiera sería necesaria una batería para
que funcionaran dentro de una habitación dotada de este siste- sitios del mes
ma", comenta Peter Fisher, uno de los autores de los experi-
mentos, en los que se ha logrado encender una bombilla de 60 Blogs de los gurús de Silverlight. En la página
vatios desde una distancia de dos metros, y que han sido publica- http://msdn2.microsoft.com/en-us/asp.net/bb187358.aspx, se encuen-
dos en la prestigiosa revista Science. La financiación ha corrido tran referencias a algunos de los blogs más interesantes relacio-
por parte del Ejército, el Ministerio de Energía y la Fundación nados con Silverlight que se encuentran disponibles en la actua-
Nacional de Ciencia de Estados Unidos. lidad, y muy especialmente, los de Scott Guthrie, Mike Harsh,
En el proceso, la informática ha tenido un papel crucial, ya Joe Stegman y Lawrence Moroney. En el mismo sitio, tam-
que ha sido necesario un gran número de simulaciones por orde- bién podemos encontrar varios vídeos con charlas sobre el tema
nador para poder afinar los experimentos y abandonar opciones de algunos de los integrantes del equipo de desarrollo de este
inviables. Los experimentadores esperan tener en la calle el des- producto.
cubrimiento en menos de cinco años, y podría sustituir a los múl-
tiples enchufes de los hogares de hoy, ya que bastaría con un cen- Moreplus. Otro sitio Web dedicado a la programación
tro de emisión de energía por cada habitación de la casa, por ejem- con .NET Framework. En él participa un grupo muy acti-
plo. “Los usos industriales en la alimentación de robots para plan- vo de desarrolladores, y ofrecen –de momento– noticias y
tas de producción y similares también podrían estar disponibles artículos relacionados. Visitarlo en http://www.moreplus.es/
en cuanto los materiales nos permitan un control todavía más fino index.aspx.
del fenómeno”, afirmaba Soljacic en una conferencia impartida
en el Instituto Americano de Física.

noticias.noticias.noticias

utilidades del mes


Driver Max es una interesantísima herra- REVO Uninstaller 1.2. Se trata de una herra- Microsoft Network Monitor 3 es un analiza-
mienta que nos permite instalar/desins- mienta de desinstalación de programas, dor de tráfico y protocolos de red, dispo-
talar los drivers de nuestros sistemas sin claro, pero con una serie de característi- nible desde el centro de descargas de la
tener que preocuparnos por versiones, cas adicionales que le hacen bastante útil, compañía, en la dirección http://www.
ubicación, sitios Web especializados y a la par que gratuita, ya que la descarga es microsoft.com/downloads/details.aspx?
demás problemas relacionados con estos desde el sitio FreeFiles, del que ya hemos FamilyID=aa8be06d-4a6a-4b69-b861-
<<dotNetManía

procesos. Es gratuita y se encuentra dis- apuntado otras utilidades en esta revista. 2043b665cb53&DisplayLang=en. Ocupa
ponible en (http://www.innovative- (http://www.freewarefiles.com/pro- solamente 2,5 Mb, y está disponible para
sol.com/drivermax/index.htm). gram_9_104_32751.html) . versiones de 32 y 64 bits.

58

También podría gustarte