dotNetManía - sergiogonzalezc.files.wordpress.com · ejemplo más de por qué los que estamos ......

60
dedicada a los profesionales de la plataforma .NET L La ab bo or ra at to or ri io o www.dotnetmania.com entrevista Charlie Calvert Community Program Manager de C# Microsoft Corporation dotNetManía DataGridView y estilos Presentaciones de datos visualmente atractivas nº 39 julio-agosto 2007 6,50 Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows System Cuando el diseño conoció a Media Center Arquitecturas distribuidas con Service Broker (y II) Referencias débiles en .NET Framework Ayuda en las aplicaciones .NET eventos ReMIX 2007 Madrid G Gu ui id da an nc ce e A Ap pp pl li ic ca at ti io on n T To oo ol lk ki i t t T To od do ot tN Ne et t@ @Q QA A E El l p pr ro op pó ós si i t to o d de e a al l g gu un na as s c ca ar ra ac ct te er rí í s st ti i c ca as s d de e . .N NE ET T C Co om mu un ni id da ad d . .N NE ET T B Ba al le ea ar re es s o on n . .N NE ET T

Transcript of dotNetManía - sergiogonzalezc.files.wordpress.com · ejemplo más de por qué los que estamos ......

dedicada a los profesionales de la plataforma .NET

LLaabboorraattoorriioo

www.

dotne

tman

ia.co

m

entrevistaCharlie CalvertCommunity Program Manager de C#Microsoft Corporation

dotNetManíaDataGridView y estilosPresentaciones de datos visualmente atractivas

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

Cuando el diseño conoció a Media Center Arquitecturas distribuidas con Service Broker (y II)Referencias débiles en .NET Framework Ayuda en las aplicaciones .NET

eventosReMIX 2007

Madrid

GGuuiiddaannccee AApppplliiccaattiioonn TToooollkkiitt

TTooddoottNNeett@@QQAAEEll pprrooppóóssiittoo ddee aallgguunnaass ccaarraacctteerrííssttiiccaass ddee ..NNEETT

CCoommuunniiddaadd ..NNEETTBBaalleeaarreess oonn ..NNEETT

Bienvenido al número 39, de julio y agos-to de 2007, de dotNetManía.

El pasado mes de junio se celebró enOrlando el Tech-Ed 2007, donde comosiempre surgieron muchas noticias. A des-tacar —por su repercusión mediática, másque por su importancia real—, la asigna-ción de nombres comerciales a los próxi-mos Visual Studio y SQL Server. Final-mente, Orcas pasa a llamarse Visual Stu-dio 2008 y Katmai se llamará SQL Ser-ver 2008. ¡Ohhh, qué sorpresón...! Des-pués de que el mes anterior perdiéramosotro clásico como Longhorn, sustituidopor Windows Server 2008, la verdad esque se lo esperaba hasta el más pintado.

Lamento que no hayamos podido asis-tir este año al Tech-Ed americano, aun-que le hemos traído las crónicas de doseventos locales, pero muy especiales:REMIX 2007, celebrado en un lugarentrañable, el Círculo de Bellas Artes deMadrid, muy propio para presentar algotan artístico como los productos que con-forman la nueva suite Expression; yCodeCamp, más campero, sí, pero unejemplo más de por qué los que estamostrabajando bajo esta plataforma de desa-rrollo podemos estar contentos por nues-tra elección (y no lo digo por las gambasde Huelva, ni por el jamón de Jabugo, alos que Microsoft nos invitó generosa-mente, no se vaya a pensar). Vea la infor-mación en estos artículos y comprobará alo que tenemos la suerte de asistir porhaber elegido estar aquí. Quizá es por estopor lo que no necesitan ser muy origina-les al poner el nombre a sus productospara que éstos tengan éxito.

Este mes entrevistamos a un viejo ami-go de Octavio Hernández: Charlie Cal-vert, Community Program Manager deC# de Microsoft Corporation. Es unaentrevista muy personal; léasela si tienetiempo, y descubra cómo pasar de perio-dista a compañero de los mejores arqui-tectos de software del momento.

Cristian Manteiga —uno de losnuevos de este mes, ¡bienvenido Cris-tian!— publica su trabajo “Cuando eldiseño conoció a Media Center. Desa-rrollo de aplicaciones para WindowsMedia Center con WPF”. Precisa-mente el desarrollo para WindowsMedia Center fue uno de los temas quese tocaron en el CodeCamp de Huelva,como tema innovador y que tienemuchas particularidades a estudiar.

El artículo de portada “DataGridViewy estilos. Presentaciones de datos visual-mente atractivas”, que creo que será delagrado de la mayoría de los lectores porsu orientación práctica, es de Luis MiguelBlanco. Luis Miguel seguirá escribiendosobre esto en algunos números más, asíque será cuestión de acostumbrarse.

Por último, tenemos otro estreno, elde José Francisco Bonnín, que ademásde presentarnos el grupo de usuarios Bale-ares on .NET, nos escribe un pequeñopero muy interesante artículo, que le reco-miendo: “Referencias débiles en .NETFramework”. Sé bienvenido también, José.Esto parece el camarote de los HermanosMarx, pero aún hay sitio para otro más.

Espero que le guste este ejemplar y quedisfrute de unas merecidas vacaciones; y,por favor, siga leyéndonos a la vuelta.

dotN

etM

anía

<<

3

Adiós a Orcas y a Katmai

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 39 • Julio-Agosto 2007Precio: 6,50 €

EditorPaco Marín([email protected])

Redactor jefeMarino Posadas([email protected])

Editor técnicoOctavio Hernández([email protected])

RedacciónDino Esposito, Guillermo 'Guille' Som, JoséManuel Alarcón, Luis Miguel Blanco y MiguelKatrib (Grupo Weboo)

Empresas Colaboradoras

Alhambra-Eidos

Plain Concepts

Raona

Solid Quality Learning

Además colaboran en este númeroCristian Manteiga, José Francisco Bonnín,Miguel Egea y Rodrigo Corral.

Corresponsal para América LatinaPablo Tilotta

IlustracionesMascota: Yamil HernándezPortada: Javier Roldán

FotografíaRoberto Mariscal

Atención al suscriptorPilar Pérez([email protected])

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

www.dotnetmania.com

Tf. (34) 91 666 74 77Fax (34) 91 499 13 64

ImprimeGráficas MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

dotNetManíadotNetManía

Paco Marín

sumario 39Eventos: REMIX 2007 de Madrid y CodeCamp 2007 de Huelva 8-10Entrevista a Charlie Calvert 12-15

Durante el pasado MVP Summit tuvimos la oportunidad de reencontrarnos con un viejoamigo, Charlie Calvert, Community Program Manager de C#.

Personas o bits 16-17Los desarrolladores de software, yo el primero, tendemos a centrarnos en cuestiones técnicas, apensar que este tipo de cuestiones son las de mayor importancia en la vida de los proyectos dedesarrollo. Pero esto no es cierto. Voy a dedicar esta columna a argumentar el porqué. Lacuestión es muy interesante en mi opinión, porque quizás los desarrolladores y la industria delsoftware 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 deinterfaces de usuario para nuestras aplicaciones. En anteriores entregas de esta revista, hemospodido conocer un poco más sobre lo que el nuevo subsistema de presentación de Windows nosproporciona; a lo largo de este artículo, vamos a dar a conocer lo necesario para poderaprovechar las bondades de WPF en la creación de aplicaciones para Windows Media Center.

DataGridView y estilos. Presentaciones de datos visualmente atractivas 24-32En el presente artículo haremos un repaso de los estilos, una de las características que estecontrol proporciona, con la finalidad de conseguir que la información visualizada en nuestrasaplicaciones tenga un toque más sugestivo para los usuarios.

Arquitecturas distribuidas con Service Broker (y II) 33-38Lanzar procesos asíncronos, o usar la base de datos como sustento para conseguir asincronía es sinduda interesante; ahora bien, lo es más aún que esa arquitectura permita, de forma transparente alque la programa, distri buir los componentes en distintos servidores e incluso balancear la carga quepueda suponer la operación en destino. En esto invertiremos párrafos de este artículo, veremos cuál esla arquitectura que sustenta todas estas operaciones dentro de Service Broker.

Referencias débiles en .NET Framework 40-41Seguramente en alguna ocasión se le ha presentado una situación en la que tiene que crear unobjeto que ocupa bastante memoria y que tarda en crearse. En tales casos, lo primero seríarevisar el diseño de ese objeto para ver cómo optimizarlo, pero si no podemos hacerlo es comúnque nos asalte la duda de qué hacer: ¿hacemos Dispose() del objeto al acabar de utilizarlo paraliberar 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. Eneste artículo veremos cómo usar el componente HelpProvider, que nos permite añadir ayuda anuestras aplicaciones Windows de una forma muy sencilla.

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

dnm.laboratorio.net 52-55Guidance Application Toolkit

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

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

dnm.desvan 58

Bob Muglia, vicepresidentesenior de Server and Tools Busi-ness en Microsoft Corporationfue el encargado de presentar lakeynote inicial en Tech-Ed 2007,donde detalló la estrategia de lacompañía para el próximo año.

Entre las novedades que más pue-den interesar al desarrollador están: la asignación de nom-bre comercial a Orcas por Visual Studio 2008, y el anun-cio para el verano de la beta 2, que incluirá Visual Stu-dio Shell; la asignación de nombre comercial a Katmaipor SQL Server 2008, el anuncio de la compra de herra-mientas de Dundas Data Visualization Inc. para SQLServer Reporting Services y la presentación de la CTP dejunio de 2007; los lanzamientos de la primera beta públi-ca de Microsoft NET Framework 3.5, una CTP de Biz-

Talk Service y el anuncio de BizTalk Server 2006 R2para el tercer trimestre de 2007, que aportará infraes-tructura RFID, soporte nativo para intercambio de datoselectrónicos (EDI) y nuevas tecnologías para integrar.NET Framework 3.0, el 2007 Microsoft Office Systemy Windows Vista (la beta 2 del producto ya está disponi-ble); y, por último, el SDK para Open XML, que ha sidodiseñado para ayudar a los desarrolladores a crear aplica-ciones de negocio para Office que aprovechen este for-mato estándar de ECMA.

Puede ver un vídeo espectacular y divertido de estakeynote en: http://www.microsoft.com/winme/0706/29992/teched_.asx y la transcripción de ésta en: http://www.micro-soft.com/presspass/exec/bobmuglia/06-04-2007TechEd.mspx.Más información en el sitio del Tech-Ed Virtual en:http://www.virtualteched.com o en el sitio oficial en:http://www.microsoft.com/events/teched2007.

Microsoft ha libera-do la CTP de juniode la nueva versiónde SQL Server, antes

llamada Katmai, y cuyo nombre comercial será Micro-soft SQL Server 2008.

SQL Server 2008 sienta las bases para una gestióninnovadora basada en políticas que permite a los admi-nistradores reducir el tiempo que gastan en las tareas demantenimiento. SQL Server 2008 aporta mejoras en laplataforma de BI de SQL Server, permitiendo a los clien-tes proveer información actualizada con el Change DataCapture y las nuevas características de MERGE y desa-rrollar cubos de servicios de análisis altamente escalablescon los nuevos entornos de desarrollo.

Microsoft está promocionando cuatro capacidadesclave que serán la base de SQL Server 2008: desarro-llo dinámico, soporte para tipos de datos no estructu-rados, soporte para aplicaciones de misión crítica ybusiness intelligence.

En el gráfico puede observar algunas de las mejorasmás significativas que ya están en esta CTP y las que iránviniendo con cada CTP cada 60 días a partir de ahora.

Asimismo, Microsoft ha desvelado la compra de losproductos de visualización de datos de la compañía Dun-das Data Visualization, los cuales aportan gráficos ricosdentro de SQL Server Reporting Services, permitiendoa los usuarios crear informes y aplicaciones con infor-mación rica. Las herramientas que Microsoft ha inclui-do en SQL Server 2008 son Dundas Gauge, DundasMap y Dundas Chart.

Más información: http://www.microsoft.com/sql/prodin-fo/futureversion/default.mspx y en https://connect.microsoft.com/SQLServer/content/content.aspx?ContentID=5470. Tambiénpuede descargarse un white paper en inglés desde: http://www.microsoft.com/sql/techinfo/whitepapers/sql2008Overview.mspx.

dotN

etM

anía

<<

6

noticiasnnoottiicciiaass

nnoottiicciiaass

nnoottiicciiaass

nnoottiicciiaass

Noticias desde Tech-Ed 2007 de OrlandoMicrosoft desveló la estrategia de la compañía para el futuro próximo en lo referentea 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.

CTP de junio de SQL Server 2008

dotN

etM

anía

<<

7

dnm.directo.noticias<<

Otro de los recientes anuncios de Micro-soft en el Tech-Ed de Orlando es el nom-bre comercial de Orcas, la nueva versiónde Visual Studio, que se llamará VisualStudio 2008 (los de marketing no se hanestrujado el cerebro, ciertamente). Tam-bién se ha hecho público lo que ya sabía-mos todos, que el próximo Framework sellamará .NET Framework 3.5 e iráincluido con Visual Studio 2008, si bienesta versión, por primera vez, soportarátambién versiones anteriores como .NETFramework 2.0 y .NET Framework 3.0(aunque no las versiones 1.x, ya que entreéstas y las posteriores hay cambios en elCLR de importancia que lo impiden). Noobstante, Visual Studio 2008 se podrá eje-cutar en la misma máquina que versionesanteriores.

La beta 2 de Visual Studio 2008 y.NET Framework 3.5 se esperan para estemismo verano. Ésta soportará la licenciago-live, lo que quiere decir que ya puedenponerse aplicaciones en producción conesta versión previa.

Una de las novedades presentadas esVisual Studio 2008 Shell, que se incluiráde forma gratuita como parte del SDK deVisual Studio 2008 a partir de la beta 2.

Servirá a quienes desarrollen otros len-guajes de programación u otras herra-mientas especializadas, que podrán inte-grar dentro del mismo Visual Studio o eje-cutar de manera asilada. El modo inte-grado está pensado fundamentalmentepara lenguajes de programación, porejemplo, Iron Python o uno que desarro-llemos nosotros y que se unirá al resto delenguajes de Visual Studio; el modo ais-lado está más bien pensado para herra-mientas especializadas desarrolladas pornosotros, que pueden ejecutarse comoherramientas independientes, sin los len-guajes ni proyectos estándar, y se puededesplegar -si procede- otra instancia deun Visual Studio estándar.

El SDK de Visual Studio 2008 con-tendrá documentación y ejemplos paraayudarle a comenzar a integrar sus herra-mientas o lenguajes.

Puede encontrar más informaciónsobre Visual Studio 2008 Shell en lapágina http://msdn2.microsoft.com/en-us/vstudio/bb510103.aspx o en el blogdel equipo de desarrollo de VisualStudio Extensibility (VSX) en:http://blogs.msdn.com/vsxteam.

Más información sobre Visual Studio2008 en: http://msdn2.microsoft.com/es-es/vstudio.

Orcas ya tiene nombre: Visual Studio 2008 Altova anuncia soporte paraOpen XML en XML Spy

Altova acaba de anunciar soporte com-pleto para el formato Open XML introduci-do con Office 2007 en su producto estrella,XMLSpy. XMLSpy 2007 Release 3 ofrecevalidación completa de documentos OpenXML, ayuda inteligente en la edición de esosdocumentos, y soporte para el desarrollo detransformaciones XSLT y XQuery sobredatos en formato Open XML.

XMLSpy es el editor XML líder de laindustria, y ofrece una vasta funcionalidadbasada en los estándares W3C relacionadoscon XML, incluyendo XSLT, XQuery,XPath, XML Schema y otros. Asimismo,ofrece una perfecta integración con el entor-no integrado de Visual Studio 2005. Para másinformación, visite http://www.altova.com.

Novell hace una presentaciónde Silverlight 1.1 sobre Linux

Recientemente, Miguel de Icaza, vice-presidente de desarrollo de Novell, presentóen el marco del REMIX 2007 que tuvo lugaren París una versión preliminar de Silverlight1.1 (a la que han denominado Moonlight)basada en los recursos del proyecto Mono,una alternativa de software libre de .NET,corriendo sobre un sistema Linux. Según deIcaza, el equipo de desarrollo de Mono (dis-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 sitioWeb del producto, http://www.mono-project.com/Moonlight.

eScrum 1.0Según publica Somasegar en su blog,

muchos equipos de desarrollo de Microsoftestán usando metodologías ágiles para el desa-rrollo de software. Un equipo de desarrollode Microsoft ha construido para este propó-sito una herramienta basada en Web y cons-truida bajo VS TFS. Viendo la aceptación queha tenido internamente en los equipos dedesarrollo, han decidido ponerla a disposi-ción de los clientes en MSDN en http://www.microsoft.com/downloads/details.aspx?Famil-y I D = 5 5 a 4 b d e 6 - 1 0 a 7 - 4 c 4 1 - 9 9 3 8 -f388c1ed15e9&displaylang=en.

Más información en el blog de Somase-gar: http://blogs.msdn.com/somasegar.

Microsoft ha anunciado la primera CTPde Acropolis, code name de un conjunto decomponentes y herramientas que hacenmás fácil para los desarrolladores la cons-trucción y gestión de aplicaciones cliente.NET modulares y enfocadas al negocio.Acropolis es parte de la ola de versiones“.NET Client Futures”, una vista previa dela tecnología de Microsoft que está por venirpara las aplicaciones cliente Windows.

Acropolis se basa en WPF, propor-cionando herramientas y componentesprecompilados que ayudan a los desarro-lladores a ensamblar aplicaciones. ConAcropolis usted será capaz de:• Crear rápidamente experiencias de usua-

rio WPF para sus aplicaciones cliente.• Construir aplicaciones cliente desde

módulos reusables y conectables que lepermitirán crear fácilmente aplicacio-nes complejas y basadas en el negocioen menos tiempo.

• Integrar y alojar sus módulos en aplica-ciones tales como Microsoft Office oconstruir rápidamente interfaces cliente.

• Cambiar rápidamente el aspecto de susaplicaciones usando temas incorpora-dos o diseños personalizados usandoXAML.

• Añadir características tales como nave-gación de workflow y vistas específicasdel usuario con un código mínimo.

• Gestionar, actualizar y desplegar susmódulos rápida y fácilmente.

Más información en: http://windows-client.net/Acropolis.

Primera CTP de Acropolis

Con la presencia de unos 700 diseñadores y desarro-lladores venidos de toda España, los pasados 4 y 5 dejunio se celebró en el Círculo de Bellas Artes deMadrid el REMIX 2007, evento que resumió lo mejorde lo sucedido el mes pasado durante el MIX de LasVegas, a la vez que sirvió para hacer la presentaciónoficial en España de los productos que conforman lanueva suite Expression, dirigida principalmente a losdiseñadores. El evento contó con la presencia de des-tacadas personalidades llegadas desde Redmond espe-cialmente para el evento, como Arturo Toledo (UserExperience Technical Product Manager), Tim Sne-ath (Group Manager Client Platform Evangelism),Steve Marx, Katherine Heller y Jason Suess (Tech-nical Evangelists), así como de otros ponentes de reco-nocida fama internacional, como Tom Raftery(www.tomrafteryit.net).

La jornada del lunes 4 comenzó con la keynote deapertura, a cargo de Enrique Fernández Laguilho-at, Director de Desarrollo de Microsoft Ibérica, yDavid Carmona, Development Advisor de la divi-

sión de Desarrollo y Plataforma. Debió haber sidopresentada por Forest Key, Development Tools Pro-duct Management Director (recientemente entrevis-tado en dotNetManía), pero una inoportuna varice-la le impidió hacer el viaje. Enrique Fernández hizoénfasis en la aparente contradicción Alcance vs. Rique-za (una frase que pierde necesariamente cuando setraduce el juego de palabras original, Reach vs. Rich, yque alude a la disponibilidad universal de las aplica-ciones Web frente a las mayores posibilidades gráfi-cas de presentación de las aplicaciones locales), y enel conjunto de tecnologías y herramientas que sumi-nistra Microsoft para ofrecer a los diseñadores y desa-rrolladores lo mejor de ambos mundos. Destacó ade-más la cada vez más amplia gama de dispositivos paralos que los creadores de software actuales deben desa-rrollar aplicaciones, y cómo la estrategia de Micro-soft, centrada en .NET Framework, permite “atacar”todas esas plataformas con una inversión y curva deaprendizaje mínimas. Por último, hizo la presenta-ción de Silverlight, un plug-in compatible con los

REMIX 2007 en Madrid

eventos

<<

e ev ve en nt t

o os s

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

dotN

etM

anía

<<

9

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 quehacen posible el trabajo conjunto de diseñadores y pro-gramadores a la hora de crear aplicaciones tanto para laWeb 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, usablesy visualmente impactantes. En ese sentido, presentó tresaplicaciones pioneras en España: el lector digital de MAR-CA, desarrollado por Plain Concepts en colaboracióncon 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.

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:

• Arturo Toledo llevó una buena parte del peso delevento en lo relativo a presentar las diferentesherramientas que componen la suite Expression,con tres ponencias dedicadas a Silverlight, Expres-sion Web y Expression Blend, respectivamente.

• David Carmona hizo las delicias de los asisten-tes a lo largo de dos sesiones dedicadas al desa-rrollo con WPF. También fueron muy bien reci-bidas por los participantes las sesiones dedica-das a diferentes aspectos de AJAX, impartidaspor David Salgado (Microsoft) y nuestrocolumnista Miguel Jiménez (ilitia).

• Sumamente claras y detalladas fueron las dosponencias presentadas por Catherine Heller,relacionadas con los servicios de Windows Livey la utilización de las API que estos serviciosponen a disposición de los desarrolladores.

• Por su parte, José Carlos Palencia (Universidadde Cantabria) hizo una amplia presentación deconceptos cuyo uso es imprescindible en todas lasaplicaciones Web modernas, desde XHTML yCSS hasta los principios de la accesibilidad y losfundamentos de la próxima Web semántica.

• En la sala en la que transcurrieron las sesiones eninglés, Tim Sneath también impartió tres sesio-nes: las dos primeras dedicadas al desarrollo paraSilverlight con Javascript y con .NET, respecti-vamente; mientras que la tercera (presentada con-juntamente con Iván González, Cristian Man-teiga y Octavio Hernández, de Plain Concepts)

tuvo como objetivo a presentar las nuevas posibi-lidades incorporadas a WPF que hacen posiblecrear experiencias de lectura digital como las queya ofrecen el New York Times y otros periódicos.

• Steve Marx impartió tres ponencias relaciona-das con aspectos avanzados del desarrollo parala Web, una de ellas (“Creación de un sitio Webde vídeos”) en colabora-ción con Ethel García(Microsoft).

• Jason Suess y Jesús dePablos (Tenea Tecno-logías) disertaron sobrelas posibilidades queofrece Windows MediaCenter tanto para elentretenimiento comopara los negocios ysobre los modelos depublicidad que se estáncomenzando a aplicarpara esta plataforma.

• Tom Raftery incidiósobre los aspectos denegocio relacionadoscon la Web en su ponencia “La Web 2.0 apli-cada a su negocio”.

Se espera que en el futuro REMIX se convierta en unevento periódico para la comunidad de desarrolladoresque utilicen las nuevas tecnologías presentadas este año.

Arturo Toledo y Enrique Fernández-Laguilhoat en rueda de prensa

Texto: Octavio HernándezFotografía: Roberto Mariscal

dotN

etM

anía

<<

10

dnm.directo.eventos<<

Durante los días 2 al 3 de junio Micro-soft Ibérica celebró en el camping LaAldea en El Rocío (Huelva) el últimoCodeCamp, que reunió aproximada-mente a 200 emprendedores y apasiona-dos de la tecnología (o al revés).

Los asistentes no eran, ni muchomenos, empresarios al uso, ávidos dehacer negocios y nuevos contactos con eldinero como único fin. Como en otrosCodeCamp, la gran mayoría eran apa-sionados de la tecnología, que lo únicoque pretenden es vivir de sus ideas, per-sonas crea tivas que no aspiran a hacersericos –aunque si cuela…–, pero sí a ganar-se la vida sin la presión de un jefe que lesguíe, realizando trabajos repetitivos y pocomotivantes. La cantera está clara: los clu-bes de .NET, creados en la universidad yformados por estudiantes de este perfil.El programa de ayuda permanente esEmprendia (www.msdnemprendia.com),desde donde se ofrecen recursos técnicos,licencias y promoción, así como recursosde negocio y económicos a través de lossocios del programa.

En este evento intervinieron empren-dedores consagrados que vienen consi-guiendo vivir de sus ideas hasta la fecha,aunque ninguno rico, o eso creo, y técni-cos de renombre en el ámbito académicoy profesional.

La agenda no fue únicamente sobrela filosofía del “emprendedor freekie”(dicho cariñosamente), ni mucho menos;hubo mucho de tecnología puntera yejemplos de pequeñas empresas que hansalido adelante -o están en ello- con susideas, como por ejemplo con el recono-cimiento de voz, desarrollo de simulado-res y juegos, robótica, programación paraMedia Center, etc.; ejemplos de que esposible hacerse un hueco en este merca-do si se tiene una buena idea y el empu-je necesario.

Más información en la Web deEmprendia o en MSDN España en:www.microsoft.com/spain/msdn.

CodeCamp Huelva 2007Evento “freekie” de fin de semana para emprendedores

Ludópatas anónimos. Desarrollo dejuegos con XNA. Donde Javi Cantóne Iñaki Ayúcar nos hicieron revivir aque-llos viejos juegos con el lema “Un vista-zo rápido a los últimos 30 años para enten-der los próximos 10”.El tunante y el tunero. Movilidad. Don-de Alejandro Mezcuay Unai Zorrillanosdieron una larga lista de consejos para mejo-rar el rendimiento de nuestro código.Tetris empresarial. Cómo montar unaempresa. “Ni un solo proyecto sin asis-tencia” por la Fundación Red Andalu-cía Emprende, que es una entidad sinánimo de lucro dedicada a la promociónde la actividad emprendedora en laComunidad Autónoma Andaluza (www.a-emprende.net).ShowCase Emprendedores. AlbertoResco Pérez y Rubén Pérez Estévezde la Universidad de Deusto presentaronel proyecto ubiClassRoom, que es unaplataforma multicanal para el seguimien-to y reproducción de clases tanto en tiem-po real como en modo off-line desde cual-quier localización.ShowCase Emprendedores. “Ponemosvoz a tus sentimientos”, por Óscar PinoMorillas, José Luis González Sánchezy Cristóbal Espinosa Morente, ganado-res de la edición española de la ImagineCup 2007, presentaron su proyecto Sc@ut,un software comunicativo aumentativodiseñado para favorecer el uso de sistemasde interacción sonoro-pictográficos de losniños autistas (http://scaut.ugr.es).La Web se vuelve sexy. Silverlight. Isa-bel Gómez y José Murillo, ambos ISVDeveloper Evangelists en el departamentoDPE de Microsoft Ibérica, dieron unrepaso a las características de las futurasversiones 1.0 y 1.1 de Silverlight (http://sil-verlight.net).ShowCase Emprendedores. Iñaki Ayú-car presentó el proyecto SIMAX, unespectacular simulador de conducción debajo coste para la formación de conduc-

tores principiantes y profesionales com-puesto por una pantalla y un salpicaderode coche real, desarrollado íntegramen-te en C# y ManagedDirectX 9.0c. Másdetalles de este proyecto en www.simax.es.El Rock ha muerto. Web 2.0. ChemaAlonso y Ricardo Varela. Ask the Experts.Reconocimiento de voz. Pilar Man-chón, de la empresa Intelligent Dialo-gue Systems (INDISYS), presentó suasombroso proyecto que une al recono-cimiento de voz el procesamiento del len-guaje natural, aportando un sistema dediálogo inteligente enfocado a la domó-tica, especialmente indicado para perso-nas con problemas de movilidad, aunquecon otros posibles usos en la industria.Permite hacer consultas al sistema en len-guaje natural, del tipo “Ambrosio, ¿estátodo apagado y la alarma conectada?”.Según sus creadores: “La voz y el lenguajenatural son el futuro de las comunicacio-nes”. Y que lo digan, ¡yo quiero uno! Másdetalles en www.indisys.es.ShowCase Emprendedores.Robocop .NET. Robótica. Cómo haceruna aplicación para robots con MicrosoftRobotics Studio, por parte de MiguelÁngel Ramos, MVP de ASP.NET y unode los ganadores de una edición anteriorde la Imagine Cup española con la Uni-versidad de Sevilla.Programando la tele. Media Center.Por Pedro J. Gómez y Nuno Sima-ria de la empresa Hoplite Software(www.hoplite.es), que han desarrollado unaversión del servicio de revelado de foto-grafías on-line revelaonline.com para MediaCenter y que han conseguido que Micro-soft presente esta aplicación en el lanza-miento público del Media Center y quela incluya en el Online Spotlight.

agenda

Octavio Hernández

OctavioHernández es

Development Advisorde Plain Concepts,

editor técnico dedotNetManía y

tutor de campusMVP.Es MVP de C# desde2004, MCSD y MCT.

entrevista

entrevista a Charlie CalvertDurante el pasado MVP Sum-

mit tuvimos la oportunidad de

reencontrarnos con un viejo

amigo, Charlie Calvert, Com-

munity Program Manager de

C#. No pudimos resistir la ten-

tación de entrevistarlo, a lo que

él accedió gentilmente.

Charlie, es un placer volvernos a ver después detanto tiempo (la última vez fue durante la épocadorada de Delphi, en el milenio pasado ☺). Paracomenzar, ¿cuáles son tus responsabilidades aquíen Microsoft?

Fui contratado por Microsoft por mi experien-cia de trabajo con las comunidades de desarrolla-dores. Mi trabajo es establecer conexiones con losdesarrolladores de la comunidad Microsoft, y ayu-dar a nuestro equipo de desarrollo a hacer el tra-bajo necesario para satisfacer los requerimientos dela comunidad. Una parte del trabajo es muy corrien-te, como hacer un seguimiento de los foros o delprograma Connect (http://connect.microsoft.com).Otras actividades, como hablar con los desarrolla-

Charlie Calvert en Surprise Lake, Washington

dores, escribir en mi blog o mantenerla página del Centro de Desarrollo(http://msdn2.microsoft.com/vcsharp), sonmuy satisfactorias para mí. Me gustamucho trabajar con la comunidad ytratar con los desarrolladores.Somos parte de una generación quecreció cuando el software empezó ahacerse esencial en todas las áreasde 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 deltiempo leyendo novelas y poesía. Noterminé esa primera vez, pero sí lasegunda, y a mediados de los ochentaobtuve mi título de Periodismo en laUniversidad Evergreen en Olympia,Washington. Después de graduarme,empecé a trabajar en un pequeño perió-dico que tenía la oficina en Olympia yla imprenta en Portland, Oregón. Elperiódico necesitaba encontrar unamanera de enviar los artículos entreambas sedes, y no recuerdo por quérazón me ofrecí para resolver aquel pro-blema. Prácticamente no tenía expe-riencia ninguna con los ordenadores, niconocía a nadie que la tuviera.

El periódico tenía un ordenadorportátil Osborne1 con un módem depuerto serie, y después de muchos expe-rimentos y con la ayuda de un grupo degente de la Universidad de Puget Soundlogré resolver el problema, transmitien-do archivos a lo que entonces me parecíauna velocidad increíble: 110 baudios. Yoquedé realmente entusiasmado con aque-llo, y miraba asombrado en la pequeñapantalla monocroma cómo se transferíacada carácter a través de la línea.

Entonces descubrí el mundo de losBulletin Board Systems (BBS). Comencé aescribir correos y leer grupos de noticias,e imaginé (como seguramente miles deotras personas en aquella época) el fabu-loso mundo conectado que se nos veníaencima. Fue un momento de revelaciónpara un lingüista que nunca antes pensóque tendría que hacer algo más técnicoque instalar un equipo de música.

¿Y cómo empezaste a trabajar enBorland?

Poco tiempo después pasé a trabajaren otro pequeño periódico, “The Mor-ton Journal”, cerca de Mount Rainier,Washington. En aquel tiempo comenza-ba ya la transición hacia un periodismoinformatizado. Utilizaban WordPerfect,y pronto me convertí en el experto de lacasa en desarrollar código para automa-tizar las tareas de oficina utilizando el len-guaje de macros del producto.

En aquella época todo el mundo yahablaba sobre las expectativas de creci-miento de la industria informática. Asíque me apunté a diversos cursos bási-cos de programación en la Universidadde Centralia. Un buen profesor meenseño allí a programar en Turbo Pas-cal 4.0, y mi entusiasmo por el mundode la programación se disparó. Merecuerdo trabajando obsesivamente enuna versión del “Juego de la vida” deConway, y desarrollando estructuras dedatos como colas, pilas y listas doble-mente enlazadas. Enamorado de la pro-gramación, decidí volver a Evergreenpara obtener un título en Informática,lo que logré al cabo de año y medioaproximadamente.

Entonces llegó el momento de bus-car un trabajo adecuado. Seguía intere-

sado en los servicios online, especialmen-te Compuserve, que utilizaban todos losprogramadores Pascal de la época. Cono-ciendo eso, Borland puso un día una ofer-ta de empleo en uno de los foros de Pas-cal, y yo rellené el formulario realmentesin mucha esperanza de obtener res-puesta. Pero cerca de un mes despuéssonó el teléfono, y alguien llamado DavidWilhelm me dijo que me enviaría unbillete de avión a San José, California parauna entrevista de trabajo.

El día que llegué a la central deBorland en Scotts Valley, California,llovía a cántaros. Me entrevistarondiversas personas durante horas. Al ter-minar, volví al hotel, y cuando me dis-ponía a llamar a mi esposa para con-tarle cómo había ido todo (no hacía niveinte minutos que había salido de Bor-land) el teléfono empezó a sonar. Eljefe de departamento de Soporte téc-nico me comunicaba que había sidoaceptado. Así que el mensaje a mi espo-sa cambió por “prepara las cosas, nosmudamos a California”.¿Qué empezaste haciendo allí?

Primero estuve trabajando seis mesesen el soporte técnico de Turbo Pascal. Undía, después de unos seis meses, una edi-torial llamó a la dirección de la empresadiciendo que estaban buscando un autor

dotN

etM

anía

<<

13

dnm.directo.entrevista<<

Octavio Hernández con algunos de los Program Managers del equipo de C#: de izquierda a derecha, Scott Nonnenberg, Raj Pai y Charlie Calvert

1 Ver http://en.wikipedia.org/wiki/Osborne_1.

dotN

etM

anía

<<

14

dnm.directo.entrevista<<

que escribiera un libro sobre Turbo Pas-cal. Alguien recordó que yo había sidoperiodista: “Ese tío nuevo de soporte téc-nico se ganaba la vida escribiendo, ¿porqué no le preguntan si quiere escribir ellibro?”. Así que escribí en unos tres mesesmi primer libro, “El 101 de programaciónen Turbo Pascal”; eso me introdujo en elmundo de la escritura de libros técnicos.

Después de publicado el libro,alguien llamado David Intersimone,del departamento de Relaciones con losdesarrolladores, me hizo una visita. Esta-

ba trabajando en un vídeo técnico parael aprendizaje de C++ y necesitaba ayu-da con el guión. Antes de darme cuen-ta, estaba en un estudio de grabación. Elvídeo tuvo mucho éxito, y aunque lue-go no trabajé en ninguno más, sí escribínueve libros más de los que en total sehan vendido más de 100.000 copias.

En cierto momento, David Intersi-mone me llevó con él al departamentode Relaciones con los desarrolladores,y empecé a viajar por todo el mundo apresentar Delphi, C++ Builder y JBuil-der a audiencias técnicas. Fueron tiem-pos maravillosos, y aún sigo siendo buenamigo de David.¿Cuándo dejaste Borland?

Dejé Borland en 2000. Como casitodo el mundo (al menos, eso parece), mefui a trabajar a una empresa “.com” denueva creación en el Silicon Valley. Elegímuy mal momento, porque la debacle delas “.com” se produjo solo algunos mesesdespués. Cierto día tenía miles de accio-nes a 130 dólares cada una, y un mes des-pués habían perdido todo su valor. La últi-ma vez que comprobé su valor (de esto

hace ya muchos años), valían 30 centavoscada una.

Tuve la fortuna, no obstante, deencontrar trabajo rápidamente en Fala-fel, una empresa creada por algunos vie-jos amigos de Borland. Allí empecé aprogramar en C#, y esa fue mi puertade entrada al mundo del desarrollo para.NET Framework. ¿Cómo es que viniste a trabajar aMicrosoft?

En el momento en que empecé a tra-bajar en Falafel, era un entusiasta deLinux y Java, y realmente no esperabaque la plataforma .NET me interesaramucho. Sabía que Anders Hejlsberg,el gran arquitecto que creó Turbo Pas-cal y Delphi, estaba involucrado en eldesarrollo de C#, pero no podía imagi-narme que aquello me entusiasmaríamucho. Estaba equivocado. C# y VisualStudio me sedujeron desde el principio.El lenguaje estaba muy bien diseñado, yel entorno era fácil de usar y estaba reple-to de las características que hacen el desa-rrollo fácil y productivo.

Luego Steve Teixeira, uno de miscompañeros en Falafel se fue a trabajara Microsoft. Seguí su carrera desde ladistancia, y me decía que estaba muycontento en Seattle. Steve y yo nosconocemos desde hace mucho tiempo,y sus experiencias en Microsoft tuvie-ron su influencia en mí.

Mi propia fascinación con C# con-tinuó creciendo, y como sin darmecuenta empecé a buscar trabajo enRedmond. Al poco tiempo volaba aSeattle para una entrevista, y unassemanas después aceptaba la oferta.Fue otro de esos cambios contunden-tes que parecen ocurrir sin que uno sedé bien cuenta de cómo han sucedido.Quince años atrás me mudé del esta-do de Washington a California paratrabajar en Borland; ahora volvía aWashington para trabajar en Micro-soft. Había dado una vuelta en círcu-lo para volver al sitio del que partí;pero ahora todo era diferente. ¿Qué se siente al volver a trabajarcon viejos amigos como Anders,Chuck y otros?

Muchos de mis viejos amigos de Bor-land han terminado trabajando en Micro-soft. La mayoría de ellos vino hace yaaños, y yo me siento como el último reza-gado que finalmente ha encontrado elcamino de Scotts Valley a Redmond.

Por supuesto, es emocionante volvera estar en un mismo equipo con AndersHejlsberg. Es un desarrollador de grantalento, y una persona fascinante a la quees un placer conocer. A Chuck Jazd-zewski también lo veo frecuentemente.De hecho, un par de veces he pasado pordelante del despacho de Anders y los hevisto hablando como si fuera en los vie-jos tiempos, cuando planificaban lasiguiente versión de Delphi. Hay muchosotros viejos amigos de Borland por aquí,y verlos es siempre un placer.

Por supuesto, trabajar con Anders esun privilegio muy especial. Él tienemuchas cualidades, pero creo que sumayor talento está en su habilidad paraanalizar un problema complejo y descu-brir una solución simple e intuitiva. Sumente filtra automáticamente las solu-ciones confusas o demasiado complejas.Siente una aversión natural hacia las solu-ciones enredadas. Esta es una opiniónmuy subjetiva mía, pero creo que partede su genio también está simplementeen saber cuándo eliminar una caracterís-tica que aún no se puede implementarlimpiamente. Para él es mejor no haceralgo antes que hacerlo mal. Por supues-to, él generalmente encuentra solucio-nes a problemas que se resisten a otrosdesarrolladores; pero si no logra encon-trarla, sabe cuándo retroceder. Otrosarquitectos hacen mucho énfasis en lacompletitud, y a veces terminan ofre-ciendo soluciones difíciles de usar. Porúltimo, puede que a él no le guste que yodiga esto, pero creo que otra parte másde su genio está en saber cuándo hay quecrear algo nuevo y cuándo utilizar algoque otro ha desarrollado. Las personascreativas frecuentemente quieren hacer-lo todo por sí mismas. Pero Anders reco-noce rápidamente una buena solucióncuando la ve. Él la sopesa contra las otrasopciones, y la utiliza si piensa que es lamejor alternativa.

dotN

etM

anía

<<

15

dnm.directo.entrevista<<

¿Cómo es tu interacción con el res-to del equipo de C#?

En el equipo de C# hay una cantidadde talento increíble. Yo he sido bendeci-do con la oportunidad de trabajar en dosempresas de software de talla mundial.Cuando empecé a trabajar allí, Borlandtenía más desarrolladores de primera líneapor metro cuadrado que ninguna otraempresa de software en aquel momento.Aquello era un imán para el talento, y elentusiasmo y energía con el que los desa-rrolladores de Borland perseguían susobjetivos era inspiradora.

La cantera de talento y la atmósferade trabajo aquí en Microsoft son muyparecidas a las que había en Borlanddurante los 90. Igual que Phillip Kahn,Bill Gates y Steve Ballmer tienen tantograndes habilidades técnicas como de ges-tión. Microsoft ha desarrollado una cul-tura muy sofisticada centrada en la tec-nología. Cuando se combinan esas capa-cidades de gestión con el extraordinariopotencial intelectual de la empresa... bue-no, realmente no hay nada similar en elmundo. Con esto no estoy diciendo quela empresa es perfecta; pero en términosde habilidades técnicas y potencial inte-lectual es indudablemente extraordinaria.

Microsoft es una empresa guiadapor métricas. El equipo de gestión esmuy práctico, y tiene un enfoque muyserio en su trabajo. Estoy aprendiendomuchísimo de la interacción con unequipo que hace énfasis en la impor-tancia de unos objetivos de desarrolloclaros, y de trabajar luego sistemática-mente para alcanzarlos.

¿Cuál es tu opinión respecto a lasnuevas características que se incluiránen C# 3.0, y especialmente LINQ?

LINQ y la base de código basado enla programación funcional que lo acom-paña son pasos de avance gigantescos parala comunidad de desarrolladores. El bene-ficio principal y obvio es la introducciónde capacidades de consultas nativas parael lenguaje C#. Llevamos años desarro-llando aplicaciones corporativas en las quela mitad de la aplicación está escrita enSQL y la otra mitad en un lenguaje deprogramación estándar como C#, VB,Java o Delphi. LINQ to SQL es un granpaso hacia el fin de ese cuadro esqui-zofrénico. Vamos a disponer de una sin-taxis única, basada en un fuerte controlde tipos y dotada de ayuda Intellisenseque utilizaremos para crear aplicacionesde bases de datos. La capacidad de desa-rrollar y depurar nuestras aplicaciones debases de datos sobre una base de códigoúnica es un paso enorme en la direccióncorrecta. LINQ es un hito muy signifi-cativo en la historia de los lenguajes deprogramación.

Y si se mira por detrás de LINQ severán los fundamentos de programaciónfuncional y declarativa sobre los que estácreado. Ahí encontraremos toda unaserie de características (notablemente,los árboles de expresiones) que añadenuna gran potencia al arsenal de herra-mientas de un programador. A diferen-cia del código imperativo, un árbol deexpresión no está atado a la lógica quelo rodea –es válido de manera indepen-diente–. Más aún, su ejecución puede ser

aplazada. En el futuro, estas técnicas deprogramación funcional nos darán unaoportunidad de hacer un procesamien-to paralelo que es difícil de lograr con elcódigo tradicional.

LINQ es también flexible y confi-gurable. Ya se han desarrollado pro-veedores LINQ personalizados, comoLINQ to Amazon. Los programado-res con talento podrán crear otrasherramientas similares, que luegoserán utilizadas por toda la comunidadpara mejorar sus oportunidades dedesarrollo. LINQ, los genéricos, lasexpresiones lambda, los árboles deexpresiones y otras innovaciones en ellenguaje C# hacen posible que las tare-as de desarrollo sean mucho más sim-ples de lo que eran anteriormente.

LINQ y la programación funcionalrepresentan un cambio significativo en lamanera en que los desarrolladores escri-ben el código. No obstante, las tecnologíasfundamentales de LINQ, como LINQto SQL o LINQ to Objects, no son difí-ciles de entender. Éste es un momentoapasionante para los desarrolladores quequieran expandir su arsenal de habilida-des para escribir código más fácilmente ycon resultados más potentes.Charlie, tus libros han sido recono-cidos siempre por su gran valordidáctico. ¿Podemos esperar en unfuturo cercano algún libro tuyo, porejemplo, sobre estas nuevas carac-terísticas de C#?

Estoy trabajando duro para sacartiempo para escribir un libro sobreLINQ. Creo que podré tener algo paraprincipios del año próximo, pero no todaslas piezas han sido encajadas aún.

Sin duda alguna, escribir y trabajarcon la comunidad son mis grandes pasio-nes. No hay nada que yo preferiría haceraquí en Microsoft que escribir sobre tec-nología y conocer a los miembros de estaextraordinaria comunidad.Por favor, unas palabras finales…

Simplemente agradeceros la opor-tunidad de participar en esta entrevis-ta, y el gran trabajo que hacéis para lacomunidad. Espero que algún día nosveamos en España.

LINQ y la base de código basado en la programaciónfuncional que lo acompaña son pasos de avance gigantescos para la comunidad de desarrolladores

estadísticas que a menudo leemossobre los motivos por los que los proyectos fallan. Nunca cuestiones odificultades técnicas ocupan los primeros lugares. Otro síntoma clarode que la tecnología no es el factor clave es el hecho evidente de queexisten proyectos exitosos y sonoros fracasos desarrollados en todas latecnologías y lenguajes de programación.

Uno de los autoengaños en los que solemos caer los desarrollado-res, yo el primero, es preocuparnos demasiado por las herramientas olas tecnologías, sobre todo por las nuevas. A menudo se encuentra a losdesarrolladores discutiendo sobre tal o cual herramienta o nuevo len-guaje… Es normal, los fabricantes de esas herramientas promueven esedebate prometiendo mejoras en la productividad que debemos reco-nocer rara vez son tales y que, si se producen, nunca llegan a lo pro-metido. ¿Alguien puede citar alguna herramienta que mejorase radi-calmente su productividad? No hablo de usar un potente IDE frente ausar simple editor de texto, sino de usar la versión actual de un poten-te IDE frente a usar la versión anterior. Pensándolo en frío, creo quees evidente que, si bien es cierto que las herramientas mejoran nuestraproductividad, estas mejoras no son radicales, sino que se producen demanera muy distribuida en el tiempo. En resumen: las herramientasevolucionan, pero no revolucionan de manera puntual nuestra mane-ra de hacer software. Esto no quiere decir que debamos desdeñar lasmejoras que puedan surgir de utilizar las mejores herramientas, sinoque las mejoras que debemos esperar en este aspecto del desarrollo desoftware son pequeñas. Lo aquí comentado se aplica, punto por pun-to, también a las tecnologías. ¿Alguien piensa que es mucho más fácildesarrollar una aplicación distribuida con WCF que con Remoting oWeb Services, o incluso que con DCOM? No, la dificultad no está rela-cionada con las herramientas a usar sino con la complejidad del pro-blema a resolver.

Otro punto que tendemos a olvidar es que las tecnologías y herra-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.

Personas o bits

<< Pensemos en las típicas

Rodrigo Corral es MVPy MCPD y uno de los

fundadores de PlainConcepts, donde cola-bora como arquitectode software. Ademástrabaja en Sisteplant

como líder técnico enun proyecto desarrolla-do sobre .NET 3.0 utili-

zando Scrum comometodología de desa-

rrollo. También adminis-tra Geeks.ms. Su blog es

http://geeks.ms/blog/rcorral.

Los desarrolladores desoftware, yo el primero,tendemos a centrarnos encuestiones técnicas, apensar que este tipo decuestiones son las demayor importancia en lavida de los proyectos dedesarrollo. Pero esto no escierto. Voy a dedicar estacolumna a argumentar elporqué. La cuestión esmuy interesante en miopinión, porque quizás losdesarrolladores y laindustria del software hanestado equivocando dóndedeben poner su foco deatención.

opinión

Rodrigo Corral

Con lo que he comentado anteriormente no quiero decirque no haya que buscar y seleccionar nuevas herramientaso tecnologías y aprender a utilizarlas, sino que no debemoscreer que vayan a cambiar radicalmente nuestra capacidado la de nuestro equipo a la hora de crear software y sacaradelante nuestros proyectos.

Las metodologías son otra de las áreas que prometen gran-des mejoras en el desarrollo de software, y en este caso creoque, bien implementadas, las metodologías (sobre todo aque-llas centradas en ayudar al desarrollador) producen grandesresultados. El problema es que implementar bien una meto-dología es un proceso extremadamente difícil, complejo, cos-toso y largo en el que muchas empresas o equipos de desarro-llo fallan en repetidas ocasiones. ¿Cuántos de vosotros habéissufrido un intento fallido de implementar una metodología?Estoy seguro que muchos. ¿Cuántos de vosotros tenéis teóri-camente una metodología y realmente lucháis para que nos osentorpezca? Pocos equipos de desarrollo tienen una metodo-logía y entre los que la tienen, pocos están plenamente satis-fechos con ella. Resumiendo, usar una metodología adecua-da puede mejorar en mucho nuestra productividad, pero esmuy difícil cerrar el triángulo mágico de encontrar una meto-dología adecuada, implantarla con éxito y lograr que ayude alos desarrolladores. Esta última es condición necesaria paraque perdure y se extienda a otros proyectos de nuestra empre-sa. Solo una metodología que ayude a los desarrolladores y quemejore su vida profesional día a día tiene alguna oportunidadde perdurar. El motivo es claro: todos somos reacios al cam-bio, y mucho más reacios a aquellos que no se revelan rápiday claramente como ayudas. Es también evidente que el rol másnumeroso en los proyectos de desarrollo es el de desarrolla-dor, mucho más que el de jefe de proyecto, gerente y demáspuestos “de responsabilidad”, y por tanto cualitativamente dequien más resistencia encontramos cuando una metodologíano ayuda es, precisamente de los desarrolladores. No deja deser paradójico, además, que a menudo se escuche poco o nadala opinión de los desarrolladores a la hora de seleccionar eimplantar una metodología.

Bien, hemos comentado que a pesar de lo que tende-mos a pensar, las herramientas, las tecnologías y las meto-dologías no tienen un impacto radical en mejorar cómohacemos software. Aunque tienen su importancia. Tambiénes claro que en el mundo competitivo en el que nos move-mos, cuando hablamos de desarrollo de software necesita-mos mejorar día a día. Ahora os preguntaréis: si lo esencialen el desarrollo de software no son, según defiendo en esteartículo, las herramientas, las tecnologías y las metodologías,¿qué es lo esencial?: las personas y sus interacciones.

El factor más importante en el desarrollo de software esla calidad de los desarrolladores que llevan a cabo el trabajo.Nada puede suplir este factor. A pesar de los muchos intentosque en la industria del software se han hecho por hacernos cre-er lo contario. Un equipo de “juniors” es un equipo poco capaz,lo dirija quien lo dirija, use las herramientas que use y apliquela metodología que aplique. Nada puede suplir la experiencia

y la maestría de los desarrolladores. Es curioso cómo cuandose habla de este tema todo el mundo asiente, pero sin embar-go luego todo el mundo lo olvida con facilidad. A menudo setrata a los desarrolladores como piezas intercambiables, o meto-dologías con amplia aceptación como CMMI se olvidan deincluir el factor humano en la ecuación, centrándose única-mente en el proceso. Como si un excelente proceso permitie-se realizar desarrollos excelentes sin desarrolladores excelen-tes. La realidad es que desarrolladores excelentes pueden lle-var a cabo desarrollos excelentes con metodologías mediocre-mente implantadas o incluso sin metodología explícita algu-na. Si todos asentimos cuando alguien clama que las personasson el factor principal, ¿por qué nos olvidamos de este factorcon tanta facilidad? Quizá sea porque es el factor sobre el quees más difícil actuar. Pero no por eso debemos dejar de actuar.

Un hecho que la industria del software lleva obviandodurante gran parte de su historia es que los buenos desarro-lladores son extremadamente baratos. Existen numerosísimosestudios que “demuestran” que la diferencia de rendimiento,se mida como se mida, entre los mejores y los peores progra-madores es de alrededor de ¡treinta veces! Ahora os propon-go un juego: pensad en el mejor y el peor desarrollador conquienes hayáis trabajado. Pensad en su rendimiento, y decid-me si no se cumple lo anterior. Ahora pensad en su sueldo,¿alguien cree que la diferencia era de alrededor de treinta veces?La conclusión es clara: la relación rendimiento/sueldo no eslineal; luego proporcionalmente los desarrolladores, cuantomejores y más experimentados son, más baratos resultan.Entonces, ¿por qué sigue habiendo proyectos plagados de gen-te sin experiencia?

Las personas cuentan mucho, pero aún cuentan máscuando juntamos varias. Cuando lo que se comparan sonequipos y no personas individuales, la diferencia es todavíamás apabullante. El rendimiento que puede alcanzar unequipo bien engrasado es espectacular. El problema es quesolo quien ha estado en alguna ocasión en uno de esos equi-pos puede saber de lo que hablo. Pero creedme, nada pue-de impulsar más vuestros desarrollos que lograr que el equi-po de desarrollo funcione como un reloj. De hecho, nues-tro principal cometido como gestores de proyectos es, sinduda, construir el ambiente en el que nuestro equipo pue-da realizar su trabajo en condiciones óptimas. El resto, aun-que es importante, es menos importante.

Supongo que más de uno os estaréis preguntando por quéos cuento todo esto. La idea que tengo es dedicar algunas entre-gas de este espacio que tan amablemente me ha cedido dot-NetManía a desgranar lo que se esconde bajo cada uno de lospuntos que constituyen el Manifiesto Ágil, cimiento sobre elque se fundamentan todas las metodologías ágiles. Todo lo queos he contado en esta entrega se corresponde con el principioque dice: “Individuos e interacciones sobre procesos y herra-mientas”. ¿No os parece que todo lo dicho tiene sentido y quesin embargo es algo que llevamos obviando mucho tiempo?¿De qué pensáis vosotros que va el desarrollo de software, depersonas o de bits?

dotN

etM

anía

<<

17

dnm.opinión<<

Hace ya algunos años, allá por 2004, Micro-soft lanzaba su apuesta para el hogar multimedia,basada en Windows XP y bautizada como Win-dows XP Media Center Edition. Esta propuestano tardó en renovarse: un año después llegó Win-dows Media Center Edition 2005, y a nuestrosdías llega integrado en las versiones Windows Vis-ta Home Premium y Windows Vista Ultimate,con un look & feel renovado y adaptado a las nece-sidades de hoy.

Desde la aparición de la primera versión deWindows Media Center, los desarrolladores deaplicaciones para este entorno han hecho uso deun lenguaje declarativo de marcas basado en XMLy conocido como MCML (Media Center MarkupLanguage). Este lenguaje impone una serie derequisitos que pueden hacer que el desarrolladoropte por una alternativa de desarrollo diferentepara su aplicación, decisión que suele estar supe-ditada al rol de la persona encargada de desarro-llar la aplicación.

Dentro de los roles involucrados en el desa-rrollo de una aplicación destacamos dos figurasprincipales, encargadas de llevar a cabo las tareasdesde dos puntos de vista diferentes pero com-plementarios. Estas dos figuras son la del desa-rrollador y la del diseñador:

El desarrollador

Un desarrollador puede decidirse a usar MCML,que ha sido creado con el propósito de aprovechartodo el potencial que nos ofrece Windows MediaCenter, y que al llevar más tiempo en el mercadodispone de una documentación más completa yexacta. Pero a pesar de esto debe luchar contra loque, en algunas situaciones, puede resultar uninconveniente.

El diseñadorMCML carece de un diseñador que nos abstrai-ga del lenguaje, lo que dificulta el proceso de defi-nición de la interfaz, así como su creación o modi-ficación. Un diseñador deberá centrarse en apren-der dicho lenguaje y en su uso para poder llevar acabo un proceso; la ausencia de una herramientade diseño le dificultará trabajar adecuadamente enel cuidado de los detalles de la interfaz, como pue-den ser el diseño, la usabilidad, etc.

El uso de Media Center Markup Language,salvo en el caso de un grupo de desarrollo experi-mentado, puede suponer una grave deficiencia enla productividad del equipo, y por lo tanto hacer

Cuando el diseño conoció a Media CenterDesarrollo de aplicaciones para Windows Media Center con WPF

plataforma.net

Cristian Manteiga esDevelopment Advisor dePlain Concepts. Es Micro-soft Cerfitied Professional

y Microsoft Student Partner, así como funda-

dor y coordinador deCLM.NET User Group.

Blog:http://geeks.ms/blogs/cristian([email protected])

Windows Presentation Foundation ha supuesto una revolución en elmundo del desarrollo de interfaces de usuario para nuestras aplica-ciones. En anteriores entregas de esta revista, hemos podido conocerun poco más sobre lo que el nuevo subsistema de presentación deWindows nos proporciona; a lo largo de este artículo, vamos a dar aconocer lo necesario para poder aprovechar las bondades de WPF enla creación de aplicaciones para Windows Media Center.

Cristian Manteiga

inviable el desarrollo de la aplicación a corto-medioplazo.

Hosted vs. NativePara intentar paliar estos inconvenientes, Microsoftoptó por ofrecer una alternativa a los desarrolladoresque les permitiese aprovechar toda su experiencia enotros entornos, y decidió permitir la elaboración de soft-ware para Media Center mediante un host (figura 1).

Dentro de esta categoría nos encontramos con dosposibles vías de desarrollo. La primera de ellas es laposibilidad de realizar aplicaciones Web HTML quese ejecuten dentro de Windows Media Center, lo quepermite aprovechar toda la experiencia adquirida enel desarrollo Web y llevar a cabo aplicaciones con unacurva de aprendizaje menor. Otra de las grandes ven-tajas es la posibilidad de usar herramientas de diseñoque nos permitan trabajar con la apariencia gráfica denuestra aplicación.

Pero no todo son ventajas, ya que los desarrollosWeb se ven limitados por el modelo de interacción conel usuario al que se han ido adaptando, y resulta máscomplicado realizar diseños pensados para la interac-ción con un mando a distancia. Recordemos que el dis-positivo de interfaz humana por excelencia en un entor-no Windows Media Center corresponde a este man-do a distancia, y en raras ocasiones un teclado. Por estemotivo, todos nuestros desarrollos deberán tener encuenta que el usuario manejará nuestra aplicaciónmediante él, por lo que todo debe ser fácilmente acce-sible desde esta interfaz de interacción.

Otro de los puntos a los que deberemos prestarespecial atención es la resolución de nuestra aplica-ción, ya que nuestra interfaz tendrá como salida están-dar un televisor, por lo que la resolución será limita-da con respecto a los monitores que suelen usar losPC hoy en día.

En este punto nos ayuda especialmente WPF, yaque utiliza unidades de píxel relativas e independien-tes de la resolución real; pero este no es el único fac-tor que nos puede hacer optar por usarlo para el desa-rrollo de nuestra aplicación.

En contraposición a las aplicaciones HTML, WPFnos aporta también la capacidad de trabajar con ani-maciones de un modo más productivo y elegante, yaque dispone de Microsoft Expression Blend comoherramienta de desarrollo. Pero las ventajas de optarpor WPF no terminan aquí: esta tecnología nos per-mite cuidar todos los aspectos relativos a la experien-cia de usuario (UX –User eXperience–).

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 laexperiencia 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 quese hace uso de .NET Framework, incorporación deelementos multimedia en la interfaz y una mejor con-textualización de los elementos de nuestra aplicación.

Para entender esto con mayor profundidad esnecesario explicar que las aplicaciones de WPF paraMedia Center hacen uso del despliegue Web de WPF,es decir, son aplicaciones XBAP (XAML BrowserApplication), cuyo uso conlleva unas limitacionesimplícitas. Las aplicaciones XBAP se ejecutan en unnivel de seguridad de confianza parcial (partial trust),lo que impide el uso de ventanas; por esta razón, nopodemos abrir nuevas ventanas en nuestra aplicaciónMedia Center, sino que tendremos que hacer uso deun modelo de navegación entre páginas. Otra de laslimitaciones a tener en cuenta a nivel de diseño es laausencia de soporte para el uso de los efectos sobremapas de bits (bitmap effects): el procesado de píxelesde estos efectos ha sido desarrollado en código no ges-tionado y .NET Framework 3.0 hace uso de ellos através de un pequeño envoltorio (wrapper) gestiona-do, lo que impide que podamos hacer uso de ellos des-de un contexto de confianza parcial.

En contraposición a esto, nos encontramos con laposibilidad de usar elementos multimedia como vídeoy audio, crear animaciones, diseñar gráficos, hacer usofuentes de texto vectoriales, incorporar elementos 3D,hacer uso de estilos y plantillas en nuestros contro-les, integrar documentos dinámicos y usar documen-tos XPS, así como aprovechar el uso de los dicciona-rios de recursos para crear bloques reutilizables ennuestra aplicación, entre otras.

Todas estas características que hemos menciona-do se pueden aplicar de una forma muy ágil y poten-te haciendo uso de Expression Blend, la herramientade diseño de interfaces para WPF, pero también des-

dotN

etM

anía

<<

19

dnm.plataforma.net<<

Figura 1

dotN

etM

anía

<<

20

dnm.plataforma.net<<

de Visual Studio 2005, así como en lafutura versión de éste, que se esperapara finales de año.

Desarrollando para Windows Media CenterPara poner en práctica lo expuesto,vamos a presentar una sencilla aplica-ción de prueba que nos permitirá verqué ventajas nos proporciona utilizarWPF en nuestros desarrollos. Tenien-do en cuenta que el objetivo que persi-gue este artículo no es el de mostrarcómo desarrollar aplicaciones XBAPcon WPF, nos centraremos en losaspectos más relevantes, aquellos queson comunes a todos los desarrollos.

Prerrequisitos:• Microsoft Windows Vista Home,

Premium o Ultimate.• Microsoft Visual Studio 2005.• Microsoft Windows Media Cen-

ter SDK 5.1 (5.0 Update).• Microsoft Expression Blend 1.0.

Especial atención nos merecen lasreferencias a los ensamblados Micro-soft.MediaCenter y Microsoft.MediaCen-ter.UI, que nos proporcionan acceso almodelo de objetos de Media Center,tanto a nivel de entorno como a nivelde los elementos de la interfaz, respec-tivamente (figura 2).

Hacer hincapié también en el archi-vo MediaCenterTheme.xaml, ya que noshace accesible un diccionario de recur-sos, con un ámbito a nivel de aplicación,que contiene plantillas de los principa-les controles, modificando su aspectopara adaptarlo a los requisitos de usa-bilidad de Media Center (listado 1).

Una vez llevado a cabo el diseño dela primera página de nuestra aplicación,la primera duda que se nos plantea escómo llevar a cabo la navegación entrelas distintas páginas que la componen.Esta tarea se lleva a cabo con bastantesimplicidad usando el servicio de nave-gación de WPF, que se encuentra acce-sible a través del espacio de nombresSystem.Windows.Navigation.

El servicio de navegación de nues-tra aplicación nos proporciona todo lonecesario para poder navegar entre lasdistintas páginas que la componen; susmiembros más relevantes son los quepodemos ver en la tabla 1.

Otro de los aspectos relevantespara el desarrollo de nuestras aplica-

ciones es el hecho de poder mostrarmensajes al usuario a través de venta-nas. Tal y como comentamos ante-riormente, las aplicaciones XBAP noadmiten la instanciación de nuevasventanas, por lo que se hace necesarioel uso de las API de Windows MediaCenter para llevar a cabo esta tarea.Accediendo al entorno actual de eje-cución de nuestra aplicación, podre-

<Application x:Class=”MediaCenterDNM.App”xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”StartupUri=”Page1.xaml”>

<Application.Resources><ResourceDictionary>

<ResourceDictionary.MergedDictionaries><ResourceDictionary Source=”MediaCenterTheme.xaml” />

</ResourceDictionary.MergedDictionaries></ResourceDictionary>

</Application.Resources></Application>

Listado 1. Código del archivo App.xaml que hace referencia al diccionario de recursos

Tabla 1Figura 2

Tipo Nombre Descripción

Método GoBack() Navega un paso hacia atrás en la historia denavegación.

Método GoForward() Navega un paso hacia adelante en la historiade navegación.

Propiedad CanGoBack Devuelve true en el caso de que exista por lomenos un elemento en la historia de navega-ción hacia atrás.

Propiedad CanGoForward Devuelve true en el caso de que exista por lomenos un elemento en la historia de navega-ción hacia delante.

Método Navigate() Navega hasta la página pasada como parámetro.

dotN

etM

anía

<<

21

dnm.plataforma.net<<

mos hacer uso de alguno de los dos siguientes méto-dos (tabla 2):

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 deTV o la página de inicio. Esta capacidad también nosla 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 PageIdde 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 elartículo, cuya interfaz de usuario se compone de laspáginas que muestran las figuras 3 y 4. La mascota dedotNetManía ha sido tomada del blog de José LuisQuintero [1]. El código fuente de ambas páginas (tan-to XAML como code-behind en C#) se presenta en loslistados 2-5.

Ejecución y depuraciónVisual Studio 2005 nos proporciona la posibilidad dedepurar nuestra aplicación dentro de Media Center,lo que nos permite probarla en su entorno de ejecu-

ción final. Para ejecutar la aplicación, no basta coniniciar la depuración, tal y como haríamos con una

aplicación normal: debe-mos abrir el archivo$(OutputPath)\MediaCen-

terDNM.mcl para ejecutarla aplicación y así poderdepurarla.

Como buena prácti-ca en las tareas de depu-ración, se deben dar

varios pasos para comprobar que laversión que estamos depurando essiempre la correcta. Para ello cerra-remos Media Center, comprobare-mos que el proceso Presentation-Host.exe no se está ejecutando ypor último abriremos la línea decomandos de Visual Studio y eje-cutaremos el comando mage -cc ycomprobaremos que el directorio%localappdata%\apps\2.0 se encu -entra vacío.

ConclusiónWPF nos permite desarrollar aplica-ciones para Windows Media Center

haciendo uso de las mejores herramientas para eldiseño de interfaces, y al mismo tiempo sacar par-tido de toda la potencia que nos ofrece .NET Fra-mework 3.0 dentro del marco del hogar multime-dia, sin menoscabar los servicios que Media Cen-ter nos expone mediante sus API.

Figura 3. Página de introducción de la aplicación

Figura 4. Página principal de la aplicación

Tipo Descripción

DialogNotification Muestra una ventana de diálogo de notifica-ción al usuario

Dialog Muestra una ventana modal al usuario

Tabla 2

dotN

etM

anía

<<

22

dnm.plataforma.net<<

<Pagexmlns=”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);

}

}}

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

dotN

etM

anía

<<

23

dnm.plataforma.net<<

<Pagexmlns=”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

Blog de José L. Quintero: http://geeks.ms/blogs/jlquintero/archive/2007/01/20/expression-ante-masco-ta-de-dnm-en-xaml.aspx.

[1]

Configuración predeterminada. Visuali-zación básica

Cuando empleamos un control DataGridView consu configuración de propiedades por defecto, elaspecto de los datos ofrecidos es correcto. No obs-tante, de la austeridad en su presentación se des-prende la sensación de que con ciertos retoquesestéticos, aunque los datos sigan siendo los mismos,el control ganaría enormemente en atractivo.

Estilos. Los ornamentos del DataGridViewPara paliar esta carencia de vistosidad, es momentode que entren en el terreno de juego unos elementosque resultarán una inestimable ayuda en el trabajocotidiano con el control DataGridView: los estilos.

Un estilo es un objeto de la clase DataGrid-ViewCellStyle, que contiene una serie de propie-dades relacionadas con los aspectos visuales de unacelda, tales como colores, alineación, tipo de letra,etc. Actuando a todos los efectos como una plan-tilla de presentación de datos, que permite al pro-gramador aplicar uniformemente un conjunto decaracterísticas visuales sobre la totalidad del con-trol DataGridView, o solo en determinadas regio-nes del mismo. En la tabla 1 podemos ver las pro-piedades más importantes de esta clase.

Confección de estilos. Nuestro primer estilo

Daremos comienzo a las técnicas que debemosemplear en la creación y uso de estilos con un sen-cillo ejemplo. El lector puede encontrar todos losejemplos desarrollados en este artículo en la direc-ción http://www.dotnetmania.com. En primer lugar,crearemos un nuevo proyecto Windows, en cuyoformulario predeterminado añadiremos un Data-GridView. A continuación, escribiremos en el even-to Load el código del listado 1, necesario paraconectarnos a una base de datos y enviar una con-sulta que nos devuelva el consabido conjunto deresultados.

Una vez obtenido el DataSet con los registrosa mostrar dentro del correspondiente DataTable,asignaremos esta fuente de datos al DataGridViewutilizando sus propiedades DataSource y Data-Member. A continuación, instanciaremos un obje-to DataGridViewCellStyle, estableciendo valoresen sus principales propiedades, lo que nos per-mitirá modificar las características visuales pre-determinadas de los datos mostrados. Finalmen-te, asignaremos el objeto de estilo a la propiedadDefaultCellStyle del control, como vemos en ellistado 2, mientras que el resultado podemos ver-lo en la figura 1.

Aparte del evidente cambio en la combinaciónde colores para los estados normal y seleccionado de

DataGridView y estilos. Presentaciones de datos visualmente atractivas

plataforma.net

Luis Miguel Blanco esredactor de ddotNet-

Manía. Es consultor enAlhambra-Eidos.Ha

escrito varios libros ydecenas de artículossobre la plataforma

.NET(lalibreriadigital.com)

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 Studio2005 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 granpotencia 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 deconseguir que la información visualizada en nuestras aplicaciones tenga untoque más sugestivo para los usuarios.

Luis Miguel Blanco

dnm.plataforma.net<<

las celdas, existen algunos aspectos adi-cionales dignos de mención, como seríael tratamiento del texto mostrado. Pordefecto, el contenido de las celdas quedaalineado a la izquierda, pero en esta oca-sión, utilizando la enumeración Data-GridViewContentAlignment, logramos quese sitúe en la parte superior derecha.

Respecto a la columna SpanishPro-ductName, habremos notado que es uncampo con valores de longitud superior

dotN

etM

anía

<<

25

Propiedad Descripción

BackColor Color de fondo para la celda.

ForeColor Color de primer plano para la celda.

SelectionBackColor Color de fondo para la celda en estado seleccionado

SelectionForeColor Color de primer plano para la celda en estado selec-cionado.

Format Cadena de formato para personalizar la presentaciónde datos numéricos, fechas, etc.

Alignment Valor de la enumeración DataGridViewContentAlignment,que utilizaremos para establecer la alineación del con-tenido de la celda.

Font Tipo de letra con el que se mostrará el texto de la celda.

WrapMode En celdas con texto extenso, esta propiedad permitedividir dicho texto en varias líneas o truncarlo.

NullValue Tipo Object que utilizaremos para mostrar el valor dela celda cuando el campo original del origen de datossea nulo.

Padding Establece el espacio de relleno para los márgenes dela celda.

Tabla 1. Propiedades de la clase DataGridViewCellStyle

// establecer la fuente de datos // para el DataGridViewthis.dgvGrid.DataSource=dsAdvWorks;this.dgvGrid.DataMember=“DimProduct”;

// creación de estilo para el // control DataGridViewDataGridViewCellStyle styEstilo;

styEstilo = new DataGridViewCellStyle();

styEstilo.BackColor = Color.LightYellow;

styEstilo.ForeColor=Color.DarkViolet;

styEstilo.Alignment=DataGridViewContentAlignment.TopRight;

styEstilo.NullValue = “Sin asignar”;

styEstilo.SelectionBackColor=Color.DarkGreen;

styEstilo.SelectionForeColor = Color.LightSkyBlue;

styEstilo.WrapMode = DataGridViewTriState.True;

this.dgvGrid.DefaultCellStyle = styEstilo;

Listado 2

Figura 1. Creación de un primer estilo

// obtención de datosSqlConnection cnConexion;cnConexion = new SqlConnection();cnConexion.ConnectionString = “Data Source=localhost;” +“Initial Catalog=AdventureWorksDW;”+“Integrated Security=True”;

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”);

Listado 1.

dnm.plataforma.net<<

dotN

etM

anía

<<

26

al resto. Gracias a la propiedad WrapMo-de del estilo, conseguimos que su textose divida en varias líneas, de forma queencaje adecuadamente en la celda. Estopodemos comprobarlo aumentandomanualmente la altura de algunas filasen la cuadrícula.

Finalmente, nos encontramos conel caso de registros conteniendo cam-pos con valores nulos, como ocurre enla columna EndDate, para la que utiliza-mos una cadena con un literal infor-mativo de tal situación en la propiedadNullValue del estilo.

Como puede comprobar el lector,establecer un estilo básico en un con-trol DataGridView resulta una operaciónmuy sencilla de realizar.

Aplicación de estilos por regionesAcabamos de ver que el área de actua-ción de un estilo, cuando es asignado ala propiedad DefaultCellStyle de unDataGridView, abarca todas las celdas dedatos del control. Pero podemos sermás selectivos en el uso de un estilo,haciendo que éste afecte a una zona másconcreta, por ejemplo, las cabeceras decolumna.

Esta funcionalidad la conseguire-mos asignando el estilo a la propiedadColumnHeadersDefaultCellStyle del con-trol, como vemos en el listado 3, don-de empleamos un tipo de letra distintodel resto de celdas y establecemos unaalineación a la derecha usando la pro-piedad Alignment del estilo, de formaque 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 lacabecera del control con toda segu-ridad no se mostrarán, permanecien-do la combinación predeterminadaoriginal.

La respuesta a este aparentementeanómalo comportamiento la encontra-mos en la propiedad DataGridView.Ena-

bleHeadersVi-

sualStyles, lacual tiene pordefecto el valortrue, significandoesto que las cabe-ceras del controlutilizarán la com-binación de colo-res del temaa c t u a l m e n t eseleccionado enel sistema operativo.

Asignando false a esta propiedadlograremos que las cabeceras se mues-tren con los colores establecidos ennuestro estilo. Adicionalmente, paracomprobar que la alineación del textoen la cabecera se realiza en la parte infe-rior derecha de sus celdas, configura-remos el control para establecer porcódigo la altura de las mismas, utili-zando para ello las propiedades Column-HeadersHeightSizeMode y ColumnHeaders-Height, como vemos en el listado 4.

El control resultante lo vemos en lafigura 2.

Para establecer estilos en el restode regiones del DataGridView, tendre-mos que asignar el objeto de estilo ala propiedad adecuada del control. Latabla 2 relaciona las propiedades conlas que tendremos que trabajar paraaplicar estilos a las diferentes regionesde la cuadrícula.

En el caso de las colecciones Columnsy Rows, el estilo se aplica por separadoa la propiedad DefaultCellStyle de cada

// creación de estilo para las cabeceras del DataGridViewDataGridViewCellStyle styEstilo;styEstilo = new DataGridViewCellStyle();styEstilo.BackColor = Color.LightBlue;styEstilo.ForeColor = Color.DarkOliveGreen;styEstilo.Font = new Font(“Bradley Hand ITC”, 10, FontStyle.Bold);styEstilo.Alignment = DataGridViewContentAlignment.BottomRight;

// asignar estilo a las cabeceras del controlthis.dgvGrid.ColumnHeadersDefaultCellStyle = styEstilo;

Listado 3

//....// establecer altura para las // cabeceras de columnathis.dgvGrid.ColumnHeadersHeightSizeMode =

DataGridViewColumnHeadersHeightSizeMode.EnableResizing;this.dgvGrid.ColumnHeadersHeight = 75;

// deshabilitar el uso de estilos // del tema actualthis.dgvGrid.EnableHeadersVisualStyles = false;

Listado 4

Figura 2. Estilo aplicado a las cabeceras del control

dnm.plataforma.net<<

dotN

etM

anía

<<

2727

uno de los objetos integrantes de lacolección que necesiten el estilo.

Si, por ejemplo, además de los esti-los que ya hemos establecido previa-mente sobre las celdas de datos ycolumnas, necesitamos facilitar la legi-bilidad de las filas, aplicaremos un nue-vo estilo mediante la propiedad Alter-natingRowsDefaultCellStyle, lo que semuestra en el listado 5, donde además,también creamos y asignamos un esti-lo para la columna ListPrice.

El resultado queda palpable en lafigura 3.

El mecanismo que controla elorden de asignación de los estilos a lasregiones de la cuadrícula se encuentragobernado por el propio control. Deesta forma, independientemente delorden que en nuestro código utilice-mos para establecer los estilos, estosserán aplicados según el orden mos-trado por la tabla 3.

Un estilo y un formato paracada tipo de datoGracias a la propiedad DataGridViewCo-lumn.ValueType, podemos conocer eltipo de datos que internamente mani-pula una columna determinada del con-trol, lo cual resulta de gran ayuda sinuestra intención se basa en utilizar unestilo distinto para las columnas del

DataGridView, en función del tipo dedatos con el que deban trabajar.

Este es el objetivo que perseguimosen el listado 6, donde en primer lugar cre-amos un estilo para cada tipo de datos.Recorriendo a continuación la colecciónColumns del control, comprobaremos eltipo de datos de cada columna y asigna-remos el estilo según cuál sea dicho tipo.

Dado que estamos manejando datosde fecha y numéricos, los cuales se pres-tan amablemente a ser formateados, enesta ocasión haremos uso de la propie-dad Format, existente en la clase Data-GridViewCellStyle, para adaptar la pre-sentación de las columnas correspon-dientes a estos valores.

// estilo para las filas alternasDataGridViewCellStyle styAlterno;styAlterno = new DataGridViewCellStyle();styAlterno.BackColor = Color.DarkViolet;styAlterno.ForeColor = Color.LightYellow;styAlterno.NullValue = “SIN VALOR”;this.dgvGrid.AlternatingRowsDefaultCellStyle = styAlterno;

// estilo para una columna independienteDataGridViewCellStyle styColumna;styColumna = new DataGridViewCellStyle();styColumna.BackColor = Color.LightSeaGreen;styColumna.ForeColor = Color.FloralWhite;styColumna.Font = new Font(“Tahoma”, 12, FontStyle.Bold);styColumna.Alignment = DataGridViewContentAlignment.MiddleCenter;this.dgvGrid.Columns[“ListPrice”].DefaultCellStyle = styColumna;

Listado 5

Figura 3. Estilos aplicados a diversas regiones del control DataGridView

Tabla 2. Propiedades para aplicar estilos por regiones del DataGridView

Propiedad Región de DataGridView afectada

DefaultCellStyle Todas las celdas del control excepto las cabe-ceras de columna y fila

Columns. Colección de objetos DataGridViewColumn

Una o varias columnas del control

ColumnHeadersDefaultCellStyle Cabeceras de columna

Rows. Colección de objetos DataGridViewRow

Una o varias filas del control

RowsDefaultCellStyle Todas las filas del control

AlternatingRowsDefaultCellStyle Filas alternas del control

RowHeadersDefaultCellStyle Cabeceras de fila

dnm.plataforma.net<<

dotN

etM

anía

<<

28

Observe el lector que al manipularla columna correspondiente al valor defecha, establecemos el ajuste detamaño de la misma mediante la pro-piedad AutoSizeMode, para que suanchura se adapte al valor que debemostrar y no quede éste truncado. Porotro lado, al final de este listado tam-bién establecemos el ajuste de tamaño,en este caso para la altura de las filasdel control, empleando su propiedadAutoSizeRowsMode. Con ello consegui-mos que el texto del campo Spanish-ProductName se muestre en sutotalidad, en aquellas celdascuyo contenido sea másextenso.

La figura 4 muestra este ejemploen ejecución, donde podemos apreciarlas diferentes configuraciones de colo-res, formato y alineación, dependien-do del tipo de datos de cada columna.La excepción la representa la combi-nación de colores para las columnasen estado seleccionado, donde hemosutilizado los mismos valores en laspropiedades SelectionBackColor ySelectionForeColor para todos losestilos.

Modificación dinámica de estilos durante la navegación Cuando manipulamos un control Data-GridView, existen situaciones en las queresultaría deseable que al efectuar unainteracción determinada sobre el con-trol, este respondiera mediante algúncambio en su estado visual.

Pongamos como ejemplo unrequerimiento bastante típico: cuan-do el usuario desplaza el cursor delratón sobre las celdas del control,debemos cambiar las propiedades depresentación de la celda sobre la quese encuentre el cursor, o bien la filaentera.

Tal funcionalidad la lograremosutilizando los eventos CellMouseEn-

Región de control Propiedad

Conjunto general de todas las celdas de datos excepto las cabeceras DefaultCellStyle

de columna y filas

Columnas (se asignan de forma independiente) DataGridView.Columns[IndiceColumna].DefaultCellStyle

Filas RowsDefaultCellStyle

Filas alternas AlternatingRowsDefaultCellStyle

Tabla 3. Orden de asignación de estilos a las regiones del DataGridView

Figura 4. Aplicando diferentes estilos según el tipo de datos de cada columna

dnm.plataforma.net<<

dotN

etM

anía

<<

29

ter y CellMouseLeave del controlDataGridView, que como indican susrespectivos nombres se producencuando el cursor del ratón entra ysale de la superficie ocupada por unacelda.

Estos eventos reciben como pará-metro un objeto DataGridViewCellEven-tArgs, cuyas propiedades ColumnIndex yRowIndex, utilizadas en combinación conla colección DataGridView.Cells, nos ser-virán para averiguar la celda sobre laque deberemos aplicar el cambio deestilo.

El listado 7 muestra el caso descri-to, donde primeramente declaramosuna variable con ámbito para la clasedel formulario, que contendrá el nom-bre del campo/columna sobre el quevamos a actuar, ListPrice. A conti-nuación, en el evento Load del formu-lario, creamos un estilo para el controly deshabilitamos la visualización de lasetiquetas flotantes en las celdas, parapoder apreciar mejor el resultado enejecución.

Seguidamente, escribimos losmétodos manipuladores de los even-tos antes mencionados. En CellMou-seEnter, en lugar de instanciar un

// crear un estilo para cada tipo de datos de las columnas del gridDataGridViewCellStyle 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 |FontStyle.Bold);styTexto.WrapMode = DataGridViewTriState.True;

DataGridViewCellStyle styFecha = new DataGridViewCellStyle();styFecha.BackColor = Color.LightYellow;styFecha.ForeColor = Color.Olive;styFecha.SelectionBackColor = Color.Lime;styFecha.SelectionForeColor = Color.MediumBlue;styFecha.Format = “dddd, dd \\de MMMM \\de yyyy”;styFecha.NullValue = “SIN FECHA”;

DataGridViewCellStyle styInt = new DataGridViewCellStyle();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;styDec.SelectionForeColor = Color.MediumBlue;styDec.Alignment = DataGridViewContentAlignment.MiddleRight;styDec.Format = “#,#.#0”;

// recorrer la colección de columnas, // en función del tipo de datos, asignar un estiloforeach (DataGridViewColumn dgvcColumna in this.dgvGrid.Columns){if (dgvcColumna.ValueType == typeof(string)){dgvcColumna.DefaultCellStyle = styTexto;

}

if (dgvcColumna.ValueType == typeof(DateTime)){dgvcColumna.DefaultCellStyle = styFecha;

// ajustar automáticamente el tamaño de la columna de fechadgvcColumna.AutoSizeMode =

DataGridViewAutoSizeColumnMode.DisplayedCells;}

if (dgvcColumna.ValueType == typeof(int)){dgvcColumna.DefaultCellStyle = styInt;

}if (dgvcColumna.ValueType == typeof(decimal)){dgvcColumna.DefaultCellStyle = styDec;

}}

// ajustar automáticamente el tamaño de las filasthis.dgvGrid.AutoSizeRowsMode =

DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders;

Listado 6

Gracias a la propiedadWrapMode del estilo, con-seguimos que su texto sedivida en varias líneas, de

forma que encaje adecuada-mente en la celda

dnm.plataforma.net<<

dotN

etM

anía

<<

30

objeto DataGridViewCellStyle, mani-pulamos directamente las propieda-des del estilo ya existente en la celdapara obtener el resultado deseado;mientras que CellMouseLeave esmucho más simple: asignamos a la cel-da el estilo predeterminado (original)del control.

La figura 5 muestra este ejemplo enejecución, donde podemos apreciar lacelda sobre la que está posicionadoactualmente el cursor.

Si queremos hacer extensiva estafuncionalidad a la totalidad de la fila,recorreremos todas sus celdas emple-

public partial class Form1 : Form{// asignar el nombre de columnastring sNombreColumna = “ListPrice”;

private void Form1_Load(object sender, EventArgs e){//....// desactivar la visualización de tooltips en las celdasthis.dgvGrid.ShowCellToolTips = false;

// crear y aplicar un estilo al gridDataGridViewCellStyle styTexto = new DataGridViewCellStyle();styTexto.BackColor = Color.Wheat;styTexto.ForeColor = Color.DarkMagenta;this.dgvGrid.DefaultCellStyle = styTexto;

}

// al entrar el cursor del ratón en la celdaprivate void dgvGrid_CellMouseEnter( object sender,

DataGridViewCellEventArgs e){// si el cursor está en una celda de datosif (e.RowIndex >= 0){// comprobar el nombre de la columnaif (this.dgvGrid.Columns[e.ColumnIndex].Name == sNombreColumna){// modificar propiedades de estilo de la celda en la // que estamos situadosthis.dgvGrid.Rows[e.RowIndex].Cells[sNombreColumna].Style.BackColor=

Color.MediumPurple;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;}

}}

// al salir el cursor del ratón en la celdaprivate void dgvGrid_CellMouseLeave( object sender,

DataGridViewCellEventArgs e){

// si el cursor está en una celda de datosif (e.RowIndex >= 0){// devolver el estilo de la celda a su valor originalthis.dgvGrid.Rows[e.RowIndex].Cells[sNombreColumna].Style =

this.dgvGrid.DefaultCellStyle;}

}}

Listado 7

La propiedad Format deDataGridViewCellStyle

permite adaptar la presentación de las

columnas que contienenvalores de fecha y

numéricos

Figura 5. Modificación dinámica de estilo en celda al pasar el cursor del ratón

dnm.plataforma.net<<

dotN

etM

anía

<<

32

ando la colección Cells del objeto DataGridView-Row actual. Nótese que para las celdas en las quedebemos aplicar formato hacemos uso de la pro-piedad DataGridViewCell.OwningColumn, que nosdevuelve un objeto DataGridViewColumn, mediante

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

Articulo.Style.Estado = Terminando;

A lo largo de este artículo, hemosabordado los estilos del DataGrid-View, como medio para realzar losdatos expuestos mediante este con-trol, de manera que la información

exhibida resulte al usuario atractiva a la par que útil.Esperamos que todo este conjunto de característi-cas sirvan para allanar el camino a los lectores quenecesiten desarrollar aplicaciones utilizando estecontrol.

Figura 6. Modificación dinámica de estilo en fila al pasar el cursor del ratón

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

dotN

etM

anía

<<

33

dnm.servidores.sql<<

IntroducciónEn la primera entrega sobre Service Broker mos-tramos cómo usar los nuevos mecanismos de asin-cronía dentro de SQL Server. Si nos paramos a pen-sar, estamos ante una arquitectura muy desacopla-da: cada pieza de código se encarga de su tarea o delservicio que tiene que ofrecer y eso es bueno, muybueno, puesto que nos permite una versatilidad enor-me a la hora de enviar y procesar mensajes de for-ma asíncrona.

Sin embargo, en la entrega anterior no vimosnada sobre la distribución de la información basadaen Service Broker. ¿Acaso éste solamente propor-ciona mensajes asíncronos que han de ser entrega-dos y consumidos en la misma máquina? La res-puesta es, obviamente, no.

La clave para enviar mensajes que puedan serconsumidos en otro servidor y otra base de datos latenemos en la sintaxis de la instrucción BEGIN DIA-LOG, que podemos ver en el listado 1.

El servicio de destino viene entrecomillado, yeso es simplemente porque ese servicio no tienepor qué estar en la base de datos actual, sino quepuede estar en cualquier base de datos de cualquierservidor que esté conectado a nuestro servidor SQLServer 2005.

Pero vayamos por partes: antes de poder enviarmensajes a otros servidores, habremos de configu-

rar cuanto sea necesario para que esos servidoresestén accesibles; es decir, tendremos que construirtoda la estrategia de enrutado y seguridad para quelos mensajes puedan ser entregados.

Service Broker y las comunicacionesEl proceso de comunicación se basará en TCP, ybásicamente podremos, mediante endpoints, con-

Arquitecturas distribuidas con Service Broker (y II)

servidores.sql

Miguel Egeaes un Mentor Asocia-

do de Solid QualityLearning Iberoameri-cana, Ingeniero Técni-co en Informática deSistemas con más de16 años de experien-cia. MVP en SQL Ser-

ver, ejerce comoDBA para importan-

tes empresas del Sec-tor. Miguel es, además,

ponente asiduo eneventos relacionadas

con tecnologíasMicrosoft.

Lanzar procesos asíncronos, o usar la base de datos como sustento paraconseguir asincronía es sin duda interesante; ahora bien, lo es más aún queesa arquitectura permita, de forma transparente al que la programa, distri -buir los componentes en distintos servidores e incluso balancear la cargaque pueda suponer la operación en destino. En esto invertiremos lossiguientes párrafos, veremos cuál es la arquitectura que sustenta todasestas operaciones dentro de Service Broker.

Miguel Egea

BEGIN DIALOG [ CONVERSATION ] @dialog_handleFROM SERVICE initiator_service_nameTO SERVICE 'target_service_name'

[ , { 'service_broker_guid' | 'CURRENT DATABASE' } ]

[ ON CONTRACT contract_name ][ WITH[ { RELATED_CONVERSATION =

related_conversation_handle | RELATED_CONVERSATION_GROUP =

related_conversation_group_id } ] [ [ , ] LIFETIME = dialog_lifetime ] [ [ , ] ENCRYPTION = { ON | OFF } ] ]

[ ; ]

Listado 1

dotN

etM

anía

<<

34

dnm.servidores.sql<<

figurar SQL Service Broker para que entreguemensajes entre distintos servidores. Una vez quehayamos visto cómo se configuran esos endpoints,indagaremos sobre los protocolos que se utilizan ylos mecanismos de seguridad que podemos imple-mentar. Finalmente, veremos cómo implementarreenvío de mensajes (forwarding) y la arquitecturaresultante una vez tenidos en cuenta todos estosaspectos.

Endpoints

Los endpoints son el mecanismo que utiliza SQLServer 2005 para comunicarse con el exterior. Dehecho, los usa no solo para Service Broker sino paracualquier petición que le llega del exterior, incluyen-do las tradicionales peticiones TDS por el puerto enel que escuche el servicio SQL.

Los endpoints no son, por tanto, exclusivos de Ser-vice Broker; el mismo mecanismo se usa para otrostipos de puertos, como SOAP, a través de los quepodemos publicar procedimientos almacenados comoservicios Web; mirroring, mecanismo que sirve paradotar a SQL Server de alta disponibilidad incluso confailover automático sin necesidad de clustering, y porsupuesto, para Service Broker, que será de lo que tra-taremos en este artículo.

Un ejemplo de creación de un endpoint podría serel que se muestra en el listado 2.

Si nos fijamos, veremos que en esta sentenciaespecificamos su estado, es decir, si desde el princi-pio está o no escuchando; el puerto, que por supues-to ha de ser un puerto libre, y además identificamosel mecanismo de autenticación, en el que profundi-zaremos cuando hablemos de Service Broker y laseguridad.

Existen vistas de metadatos que proporcionaninformación sobre los endpoints instalados y su confi-guración, como sys.endpoints, sys.tcp_endpoints ysys.service_broker_endpoints. Estas vistas pueden ayu-darnos a administrarlos, aunque naturalmente SQLServer Management Studio nos será también de ayu-da en esta labor.

En resumen, un endpoint de Service Broker no essino un puerto en el que Service Broker estará espe-rando mensajes para ser procesados en cuanto lleguen.

Todos estos objetos pertenecen a la arquitectu-ra interna de Service Broker, y no será necesariotenerlos en mente más allá de la primera vez que losmontemos.

Protocolos

La aproximación que Service Broker utiliza encuanto a protocolos es una aproximación basada encapas; esto es lo que le permite operar sin necesidadde conocer el servicio de destino ni el tipo de trans-porte físico que se va a usar. Estos protocolos sontransparentes a la aplicación que los usa, pero estábien conocerlos para entender los mecanismos defuncionamiento de Service Broker.

Las capas que usa Service Broker son las llama-das Dialog Protocol (protocolo de diálogo), AdjacentBroker Protocol (protocolo de broker adyacente), y Trans-port Protocol (protocolo de transporte).

La capa superior es el llamado protocolo de diá-logo, que es el encargado de garantizar que losmensajes se entregan una vez y solo una vez, y ade-más también se encarga de garantizar el orden deentrega de los mensajes. La vista del sistemasys.conversation_endpoints nos muestra la infor-mación que maneja esta capa.

CREATE ENDPOINT SBServer1EndPointSTATE=STARTED

AS TCP (LISTENER_PORT =4025)FOR SERVICE_BROKER

(AUTHENTICATION = WINDOWS,ENCRYPTION =SUPPORTED)

Listado 2

Los endpoints son el mecanismoque utiliza SQL Server 2005 paracomunicarse con el exterior, nosolo para Service Broker sino para cualquier petición que le

llega del exterior, incluyendo lastradicionales peticiones TDS

dotN

etM

anía

<<

35

dnm.servidores.sql<<

La capa intermedia, creada de acuerdo al pro-tocolo de transporte a utilizar, es la que sirve paraque el protocolo de diálogo no tenga que conocernada sobre el transporte. Esta capa se encarga dedividir los mensajes de la forma necesaria para queviajen adecuadamente por el protocolo de trans-porte. La vista del sistema sys.dm_broker_connec-tions contiene información acerca del trabajo queestá realizando esta capa.

Por último, el protocolo de transporte (por ejem-plo, TCP-IP) se encarga de la transmisión del men-saje, y cae fuera de los límites de Service Broker.

Todas estas capas se encargan de procesos tanimportantes como el envío de reconocimientos (ACK),particionado de mensajes, chequeos de integridad…Resultan por tanto imprescindibles para el correctofuncionamiento de Service Broker.

Mensajes especiales

Hay algunos tipos especiales de mensajes que soninsertados por los protocolos. Estos mensajes tienenque ver con la lógica propia de tratamiento de men-sajes y son tres: mensajes de temporizador de diálogo(dialog timer), que se producirán si establecemos untimer para la entrada de mensajes en una cola, los men-sajes de error, que se enviarán en caso de que se pro-duzca cualquier tipo de error y contendrán informa-ción relativa a ese error, y los mensajes de fin de diá-logo, que sirven para acabar la conversación en los dosextremos del servicio.

Estos mensajes son realmente importantes y ade-más tienen utilidad no solo a nivel de infraestructurasino en muchos otros ámbitos. Por ejemplo, los men-sajes de temporizador podrían usarse para levantaralertas por falta de tráfico, y que un servicio se encar-gase de mandar mensajes “de sonda” para comprobarque realmente toda la infraestructura sigue funcio-nando.

Routing

Un servicio como Service Broker, cuya utilidadfundamental será implementar arquitecturas distri-buidas basadas en conversaciones (ya no decimos men-sajes: es un paso más allá de esto), quedaría incom-pleta sin un sistema que permita enrutar mensajeshacia distintos servicios. Más aún, es muy posible quenuestro servidor de back-end no vaya a estar directa-mente expuesto a Internet, pero que sí sea Internetel mecanismo de envío, transporte y recepción deinformación.

La infraestructura de routing se basa en la tabla derutas y en un algoritmo de elección de la ruta que vere-mos un poco más adelante. En la tabla de rutas(sys.routes) siempre existe una ruta llamada AutoCre-atedLocal, tal y como puede verse en la tabla 1.

Esa ruta será la usada para cualquier serviciocuyo nombre no se encuentre en el campo remo-te_service_name. En esta tabla, lo más importanteel campo Address, que en el caso de la ruta auto-creada apunta a la base de datos local. Si usted haleído nuestro artículo anterior, seguramente aca-

Name Remote_service_name Broker_instance Address Mirror_adress

AutoCreatedLocal NULL NULL LOCAL NULL

Name Remote_service_name Broker_instance Address Mirror_adress

AutoCreatedLocal NULL NULL LOCAL NULL

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

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

489D897C6429

Tabla 2

Tabla 1

La infraestructura de routing se basa enla tabla de rutas y en un algoritmo de

elección de la ruta, y ofrece una impresionante versatilidad

dotN

etM

anía

<<

36

dnm.servidores.sql<<

bará de comprender por qué sin poner ni una solaruta el código que publicamos simplemente fun-ciona. Nada como las cosas “por defecto” para quetodo funcione mágicamente.

Sin embargo, este mecanismo de rutas da unaimpresionante versatilidad, como vamos a ver conalgunos ejemplos.

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-cia específica de Service Broker en el servidor de des-tino; aquella cuyo código de instancia se correspon-da con el GUID que ahí figura.

Ese GUID se buscará en la tabla sys.databasesque existe en master. Uno de los nuevos campos incor-porados en SQL Server 2005 es el identificador de labase de datos para Service Broker. Este identificadorpuede cambiarse con la instrucción ALTER DATABASE xxxSET NEW_BROKER, comando, que obviamente, habrá deser usado con mucho cuidado, puesto que hará quetodas las conversaciones a medias acaben sin mandarel mensaje de tipo END DIALOG. La direcciónMirror_Address se utiliza para escenarios de mirroring;en este caso, Service Broker será capaz de enviar datosa la dirección de la base de datos que esté activa encada momento.

Basado en el mismo mecanismo podremos inclu-so gestionar escenarios de balance de carga (load balan-cing). La forma de implementarlo es insertando unanueva ruta a otra dirección para un mismo nombrede servicio remoto. Cuando se envíe un mensaje a unservicio, Service Broker buscará en la tabla de rutas yaleatoriamente enviará datos a una u otra dirección.Si estuviésemos utilizando una estrategia “dispara yolvida”, es decir, de enviar un mensaje y simplemen-te tener garantizada su entrega, esta forma de hacer

balance de carga no supondría ningún problema; sinembargo, una vez comenzada una conversación, en elmensaje ACK viene la información de destino, y enadelante el resto de conversación irá al mismo servi-dor de destino.

Además, puede configurarse un servicio para quesimplemente ejerza tareas de forwarding; es decir, quecuando llegue un mensaje a su dirección, simplementeenvíe ese mensaje al servidor de destino real. El ser-vidor estará en este caso haciendo meramente depuente entre el servidor de origen y el servidor dedestino. Esto es muy útil, por ejemplo, para no expo-ner un servidor de front-end a Internet. La forma deimplementar esto es incluir esa ruta en la tabla MSDB.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-warding de mensajes no tiene la necesidad de alma-cenar ningún mensaje en disco. Esto es debido a queel ú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 ymensajes ACK generados automáticamente.

La sintaxis completa de la instrucción para crearuna ruta es la que puede verse en el listado 3.

En algunas ocasiones puede resultar interesan-te implementar enrutado dinámico —hasta elmomento solo hemos visto enrutado estático—, esdecir, un enrutado en el que la ruta de destino estáescrita en la tabla sys.routes. La forma de escribirrutas dinámicas es leer un mensaje de tipo Missin-gRoute de la cola y reaccionar creando en esemomento la ruta adecuada. En el mensaje Missin-gRoute viene la información del nombre del servi-cio para el que no se conoce ruta, y sería posible portanto preguntar a una aplicación externa o a unatabla de configuración la dirección actual válida para

CREATE ROUTE route_name[ AUTHORIZATION owner_name ]WITH

[ SERVICE_NAME = ‘service_name’, ][ BROKER_INSTANCE =

‘broker_instance_identifier’,][ LIFETIME = route_lifetime , ]ADDRESS = ‘next_hop_address’[ ,MIRROR_ADDRESS = ‘next_hop_mirror_address’]

[ ; ]

Listado 3

La seguridad basada en certificadospermite garantizar la seguridad sinnecesidad de que los intervinientes

pertenezcan a ningún dominio, tenganentre sí una relación de confianza

ni nada que se le parezca

dotN

etM

anía

<<

37

dnm.servidores.sql<<

enrutar el mensaje. No hay que confundir el routingdinámico con el uso de la cláusula TRANSPORT que sepuede especificar en la instrucción CREATE ROUTE yque lo que hará es enrutar en base al nombre del ser-vicio. No profundizaremos más aquí en el enrutadodinámico —creo que con esta pincelada el lectorpodrá hacerse una idea bastante aproximada de cómoimplementar esta técnica, si es adecuada, en sus sis-temas—.

Seguridad

Service Broker ofrece seguridad de transporte yseguridad de diálogo. La seguridad de diálogo esimplementada mediante la encriptación de los men-sajes que se intercambian, mientras que la seguridadde transporte previene de que conexiones no autori-zadas envíen mensajes a Service Broker.

A la hora de crear endpoints pueden especificarsecredenciales Windows; esas credenciales con los per-misos necesarios dentro de Service Broker son unade las opciones de seguridad. Sin embargo, para elartículo vamos a centrarnos en la seguridad basadaen certificados.

La seguridad basada en certificados nos permitegarantizar la seguridad sin necesidad de que todos losintervinientes pertenezcan a ningún dominio, ni ten-gan entre sí una relación de confianza ni nada que sele parezca. En este sentido, nos ofrece la versatilidadque necesitamos en entornos complejos de arquitec-turas realmente distribuidas.

Adicionalmente podemos crear un Remote Servi-ce Binding, de tal forma que podemos especificar el“principal”, es decir, la identidad propietaria del cer-tificado con el servicio; de esta forma garantizaremosque el transporte se hace encriptado, como veremosmás adelante.

Un ejemplo práctico

Crearemos una ruta para nuestro servicio, comopuede verse en el listado 4. El código tiene algunasparticularidades; por ejemplo, usa el nombre en cua-tro partes, lo que hará necesario que el servidor dedestino esté añadido como servidor vinculado (linkedserver). El único motivo para hacer esto es determi-nar el GUID de la instancia de broker en destino; noobstante, esta rutina podría sustituirse, evitando tam-bién el código dinámico, simplemente copiando elidentificador de instancia de broker y quitando todareferencia al servidor vinculado.

Recordemos que ya hay un endpoint creado, cuyocódigo puede verse en el listado 2. Un endpoint habráde ser creado en cada uno de los servidores que entrenen conversación.

El mecanismo elegido para la autenticación seráel de certificados. Lo que hacemos es crear un certi-ficado y crear un usuario basado en ese certificado quetenga los permisos necesarios para poder enviar y reci-bir mensajes. Para ello, primero obviamente hay quecrear el certificado; en el listado 5 puede verse cómose crean esos certificados.

Listado 4

Listado 5

DECLARE @brokIns uniqueidentifier

SELECT @brokIns=service_broker_guidFROM [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);

USE MASTERGOCREATE MASTER KEY ENCRYPTION BYPASSWORD=’Pa$$w0rd1234567890’GOCREATE CERTIFICATE CertificadoServer1

WITH SUBJECT =’servidor5.sqlint.com’,START_DATE=’20060101’,EXPIRY_DATE=’21000101’ACTIVE FOR BEGIN_DIALOG=ON;

El crear la clave maestra es una necesidad a la horade poder crear un certificado, de ahí que incluyamosel comando en el listado anterior.

Este certificado lo vamos a llevar al servidor dedestino, y aunque para recibir mensajes cifrados nosbastaría por supuesto con llevar solamente la clavepública, lo vamos a llevar entero para simplificar elmecanismo, para ello le haremos una copia de segu-ridad usando la instrucción BACKUP CERTIFICATE. A con-tinuación, lo que deberíamos hacer es copiar ese cer-tificado al servidor desde el que queremos conectar-nos, y una vez en ese otro servidor habremos de lan-zar los comandos de restauración del certificado, cre-ación del login asociado a ese certificado y de los per-misos de acceso correspondientes, como puede com-probarse en el listado 6.

La parte de encriptación va asociada no solamenteal endpoint, sino también a la conversación. Como hemoscomentado anteriormente, en la instrucción que hemosejecutado hemos indicado que este endpoint va a sercapaz de recibir mensajes tanto encriptados como noencriptados. Yo recomendaría leer este documento:http://blogs.msdn.com/remusrusanu/archi-

ve/2006/07/07/659319.aspx para ampliar la informa-ción al respecto.

La tabla 3 nos indica también cuándo la conver-sación fluye en texto claro por la red y cuándo estácifrada. Las conversaciones diferidas lo que indicanes que los mensajes quedarán en las tablas desys.transmission_queue, es decir, en el estado de listaspara ser transportadas, hasta que la encriptación pue-da ser garantizada.

Algunas herramientasEn el blog de Resmu Rusanu puedes encontrar un enla-ce a una joyita que él mismo ha desarrollado:http://www.codeplex.com/slm. Se trata de una aplica-ción que con una interfaz gráfica más amigable ayuda acrear todo lo necesario para disponer de rutas, endpointsy seguridad. Lo cierto es que buena parte de la com-plejidad asociada con la sintaxis y los conceptos quedanbastante simplificados con esta interfaz.

ResumenService Broker es una herramienta muy interesante

para crear aplicaciones que necesiten establecer conver-saciones completas, aportando una infraestructura espec-tacular para soportar esas aplicaciones. No solamente porla conversación; la disponibilidad, escalabilidad y versa-tilidad de la plataforma, además de la robustez transac-cional que le da estar en la base de datos hacen de Servi-ce Broker un producto que merece la pena tener en cuen-ta para crear aplicaciones distribuidas complejas.

dotN

etM

anía

<<

38

dnm.servidores.sql<<

Listado 6

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

Con Remote Service Binding Sin Remote Service BindingENCRYPTION = ON Conversación cifrada Conversación diferidaENCRYPTION = OFF Conversación cifrada Conversación en texto claro

(sin cláusula ENCRYPTION) Conversación cifrada Conversación diferida

Tabla 3

Uno de los primeros consejos que recibimos a lahora de optimizar el rendimiento de cualquier apli-cación es que sigamos el principio básico de cre-ar los objetos solo cuando vayamos a utilizarlos yliberarlos lo antes posible. Sin embargo, nadieduda de la efectividad de utilizar cachés en segúnqué casos.

En .NET Framework disponemos de una cla-se llamada WeakReference (referencia débil) para obte-ner una solución intermedia a la duda planteada alinicio. Esta clase está disponible desde la primeraversión de .NET, aunque su uso no está muy exten-dido en desarrollos convencionales. La clase Wea-kReference nos permite mantener la referencia a unobjeto y al mismo tiempo dejar dicho objeto a dis-posición del recolector de basura para que lo reco-lecte cuando sea necesario. Veamos cómo es posi-ble hacer esto y el comportamiento de este meca-nismo ante distintas situaciones.

Supongamos que disponemos de la clase BigS-tuff que vemos en el listado 1. En el código queva continuación vemos cómo se crea un objeto deltipo anterior y cómo, encapsulando la instanciacreada dentro de una WeakReference, podemos recu-perarlo a través de la propiedad Target a pesar dehaber asignado el valor null a la variable big quelo contenía (listado 2).

Lo que hemos hecho ha sido crear una WeakRe-ference “corta”, gracias a la cual podremos recu-perar la referencia siempre y cuando el recolectorde basura no haya finalizado el objeto, en cuyo casoobtendríamos null al acceder a la propiedad Tar-get. Para comprobarlo, aún sabiendo que se trata

de una muy mala práctica, podemos forzar una lla-mada al recolector (listado 3).

Referencias débiles en .NET Framework

plataforma.netJosé Francisco Bonnín

Seguramente en alguna ocasión se le ha presentado una situación en la que tieneque crear un objeto que ocupa bastante memoria y que tarda en crearse. En talescasos, 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?

class BigStuff{private int id;

public BigStuff(int identifier){id = identifier;Console.Out.WriteLine(string.Format(“Creating BigStuff {0} on thread {1}.”,id, System.Threading.Thread.

CurrentThread.ManagedThreadId));}

public void PrintId(){Console.Out.WriteLine(string.Format(“BigStuff Id: {0}”,id));

}

~BigStuff(){

Console.Out.WriteLine(string.Format(“Finalizing BigStuff {0} on thread {1}.”,id, System.Threading.Thread.CurrentThread.

ManagedThreadId));}

}

Listado 1

José Francisco Bonnín esProduct Development

Manager en Payvision ycoordinador del grupo

de usuarios BBaleares on.NET.

http://blogs.clearscreen.com/jfbonnin

dotN

etM

anía

<<

41

dnm.plataforma.net<<

La variación introducida en el código anterior tansolo fuerza la llamada al recolector de basura, y espe-ra a que todos los finalizadores acaben de ejecutarseantes de continuar. Verá que esta vez no podemos recu-perar la referencia a la instancia creada e imprimir porpantalla el id que le habíamos asignado, sino que, porel contrario, se ejecuta el finalizador. Al haber elimi-nado todas las referencias a nuestro objeto, el reco-lector, haciendo honor a su nombre, lo considera basu-ra y lo recolecta.

Si anteriormente hemos utilizado una WeakRefe-rence que hemos denominado “corta”, supongo quehabrá imaginado que también existe una WeakRefe-rence “larga”. La diferencia entre ambas radica encuándo la propiedad Target se convierte en null ypor tanto, cuándo nuestro objeto deja de ser accesi-ble. Ya hemos visto que en las referencias débiles cor-tas esto sucede cuando el recolector de basura reco-lecta el objeto después de que, en nuestro programa,se hayan eliminado todas las referencias a él. En unareferencia débil “larga” podemos conseguir que, aunhabiendo eliminado todas las referencias, el reco-lector de basura resucite el objeto al ejecutar el fina-lizador, promoviéndolo a la siguiente generación ypor tanto otorgándole un tiempo de vida más largo.Puede comprobarlo asignando true a la propiedadTrackResurrection o utilizando la sobrecarga delconstructor:

public WeakReference (Object target, bool trackResurrection);

De esta manera verá, que a pesar de asignar nulla la variable big y haber llamado al recolector de basu-ra, seguimos siendo capaces de obtener una referen-cia, lo que será posible hasta que el recolector se encar-gue de limpiarlo en la próxima recolección.

Es importante destacar que sólo podemos utilizareste último tipo de WeakReference con objetos cuya cla-se implemente un finalizador, dado que es ahí dondese “resucitará” el objeto; de no ser así, la referenciadébil “larga” tendría el mismo comportamiento quelas anteriores, puesto que no habría manera de sabercuándo se está eliminando el objeto.

Por último, si consulta las propiedades de la claseWeakReference verá que dispone de una propiedad lla-mada IsAlive, la cual nos permite saber si podemos recu-perar el objeto encapsulado en la referencia débil. El usode esta propiedad presenta un problema importante y esque —como sabrá— el recolector de basura utiliza supropio hilo para llamar a los finalizadores. Para verlo másfácilmente, en los mensajes que se muestran durante lacreación y destrucción del objeto de la clase BigStuffhemos añadido el ManagedThreadId. Imagine por unmomento que tenemos el siguiente código:

Después de haber visto los ejemplos anteriores,seguro que ya ha deducido que al ejecutarlo se lanzaráuna excepción indicando que big es igual a null. Coneste ejemplo comprobamos que, aunque IsAlivedevuelva true, puede darse el caso de que el recolec-tor de basura haya recolectado el objeto justo antes deque vayamos a recuperar la referencia, por lo que esnecesario realizar siempre la comprobación de que lapropiedad Target no devuelva null, haciéndose total-mente superfluo el uso de la propiedad IsAlive.

ConclusiónComo hemos visto, las referencias débiles nos pro-porcionan una forma distinta de gestionar el tiempode vida de nuestros objetos que puede resultarnos muyútil en algunos casos.

BigStuff big = new BigStuff(1);WeakReference weakRef=new WeakReference(big);big = null;big = weakRef.Target as BigStuff;if (big != null){

big.PrintId();}

big = null;GC.Collect();GC.WaitForFinalizers();big = weakRef.Target as BigStuff;if (big != null){

big.PrintId();}

BigStuff big = new BigStuff(1);WeakReference weakRef=new WeakReference(big);big = null;if (weakRef.IsAlive){

GC.Collect();GC.WaitForPendingFinalizers();big = weakRef.Target as BigStuff;big.PrintId();

}

Listado 2

Listado 3

Listado 4

dnm.inicio.taller

Agregar ayuda a nuestras aplicaciones

En la mayoría de las aplicaciones actuales, salvo excep-ciones, el formato de ayuda utilizado es el conocidocomo ayuda HTML 1.0 o también ayuda CHM, porla extensión que tienen estos ficheros de ayuda (.chm).El aspecto de este tipo de ayuda es el que podemosver en la figura 1.

Como podemos suponer, el formato de losdocumentos usados para crear este tipo de ayuda

es HTML; es decir, se crean como páginas Web,se le añaden algunos aditivos, se compilan y tene-mos nuestro fichero de ayuda con la extensión .chm.Una vez que hemos creado un fichero de este tipo,lo podemos asociar con nuestra aplicación y usar-lo por medio de las clases definidas en .NET Fra-mework. El mayor problema seguramente se pue-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 tipode ayudas usando la utilidad HTMLHelp Workshop que se incluye conVisual Studio.

Básicamente, hay dos formas deusar este tipo de ayuda desde nues-tras aplicaciones de Visual Studio2005. Por un lado, tenemos la cla-se Help, que expone ciertos méto-dos estáticos (compartidos) que nospermiten mostrar la ayuda conteni-da en un fichero CHM. Tambiénexiste un componente llamado Help-Provider el cual, además de pro-porcionar una forma de acceder aesos tipos de ficheros de ayuda, nospermite agregar ayuda emergente a

cualquier control que tengamos ennuestro formulario. Veamos cómo

usar estas dos clases para proporcionar ayuda ennuestras aplicaciones.

Ayuda en las aplicaciones .NETEl ayudador que nos ayude… seguramente será HelpProvider

inicio

Guillermo “Guille”Som es Microsoft MVP

de Visual Basic desde1997. Es redactor de

dotNetManía, mentorde Solid Quality Iberoa-mericana, tutor de cam-

pusMVP, miembro deIneta Speakers BureauLatin America, y autorde los libros “Manual

Imprescindible de VisualBasic .NET” y “Visual

Basic 2005”.http://www.elguille.info

Un sistema de ayuda es algo que siempre deberíamos implementar en nuestrasaplicaciones. 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.

Guillermo «Guille» Som

Figura 1. Aspecto de la ayuda HTML

dotN

etM

anía

<<

43

dnm.inicio.taller<<

Añadir ayuda con HelpProvider

El componente HelpProvider nos ofrece una formamuy sencilla de añadir ayuda a nuestras aplicacio-nes. Cuando agregamos un componente de este tipoa nuestro formulario, se añaden unas propiedadesadicionales a cada control que tenga dicho formula-rio. Dos de esas propiedades sirven para acceder alcontenido de un fichero de ayuda compilada (.chm);otra simplemente sirve para indicar si se debe mos-trar o no la ayuda proporcionada por este compo-nente (ShowHelp), y la cuarta propiedad agregada(HelpString) sirve para mostrar una ayuda emergentecuando el usuario pulse la tecla [F1] mientras el con-trol tenga el foco. Sabiendo esto, podemos utilizaresa propiedad (HelpString) para que nuestras apli-caciones muestren ayuda a los usuarios. La ventajade usar la propiedad HelpString es que el texto deayuda que queremos mostrar no es necesario queesté en un fichero de ayuda, sino que lo indicamosnosotros de forma directa en cada uno de los con-troles que queremos que ofrezcan esa funcionalidadcada vez que se pulse la tecla [F1].

Como podemos imaginar, esa forma de mostrarayudas no es la que el usuario preferirá, pero a faltade otra cosa mejor, al menos nuestra aplicación reac-cionará al pulsar esa tecla, lo que nos puede sacar deapuros en algún momento en el que no tenemos muyclaro 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íael usuario si pulsara la tecla de ayuda al estar posicio-nado en la primera caja de textos del formulario.

Como podemos apreciar en la figura 2, esta ayu-da es “para salir del paso” y seguramente no sería lo

que nuestros usuarios desearían ver cuando pulsaranla tecla [F1] en la aplicación.

Mejorar la ayuda proporcionada con HelpProvider

Una forma de mejorar la ayuda mostrada por nues-tra aplicación es mostrar un fichero HTML en lugardel texto emergente proporcionado por la propiedadHelpString.

Para indicar qué fichero HTML queremos usarcomo ayuda, tenemos que indicar el path (la ruta com-pleta, incluyendo el nombre del fichero) a la propie-dad HelpNamespace del componente HelpProvider.Cuando asignamos un valor a esa propiedad, lo quehayamos asignado a la propiedad HelpString no se tie-ne en cuenta, y lo que ocurre cuando el usuario pul-sa la tecla [F1] es que se muestra el contenido del fiche-ro HTML que hemos indicado en la propiedad Help-Namespace. Esto es un “adelanto” con respecto al tex-

to emergente, pero no es la solución “deseada”, yaque ese mismo fichero es el que se usará para todoslos controles que tengamos en nuestro formulario.

Si queremos usar varios ficheros de ayuda, conidea de asociar cada uno de ellos a un control dife-rente, la única forma de hacerlo es agregando varioscomponentes HelpProvider, de forma que cada unode esos componentes esté asociado con un ficheroHTML diferente, según el valor que hayamos asig-nado a la propiedad HelpNamespace. Después asigna-mos un valor verdadero a la propiedad ShowHelp delcomponente con la ayuda a mostrar en ese control;de esta forma, cuando el usuario pulse la tecla de ayu-da se mostrará el fichero correspondiente al “prove-

Figura 2. La ayuda emergente con eltexto asignado a HelpString

Figura 3. Usar la ayuda de un componente

dotN

etM

anía

<<

44

dnm.inicio.taller<<

edor” de ayuda que hemos decididousar con ese control. En la figura 3podemos ver cómo el control seleccio-nado utiliza la ayuda de uno de los com-ponentes HelpProvider que tenemos enel formulario.

Como podemos suponer, esto seríabastante tedioso de hacer en una apli-cación con muchos controles, al menossi para cada uno de esos controles que-remos usar un fichero de ayuda dife-

rente, sin contar que tendríamos queagregar tantos componentes del tipoHelpProvider como ficheros HTMLdiferentes queramos utilizar.

Una mejor solución es usar un fiche-ro de ayuda compilada. Veamos cómola podríamos usar por medio del com-ponente HelpProvider.

Una solución más elegante

Si tenemos creado un fichero deayuda HTML, podemos asociarlo conun componente HelpProvider de formaque sea ese fichero de ayuda el que seutilice en lugar del texto proporciona-do por la propiedad HelpString o de unfichero HTML.

Cuando decidimos usar un ficherode ayuda HTML, el nombre de esefichero CHM será el que indiquemosen la propiedad HelpNamespace del com-ponente HelpProvider. De forma prede-terminada, al pulsar [F1] en uno de loscontroles del formulario, se mostrará elfichero de ayuda que hemos indicado.Aunque al hacerlo, lo que se muestra esla “página” predeterminada de dichofichero de ayuda. Lo deseado no es pre-cisamente que siempre se muestre lamisma página, sino que según el con-trol en el que el usuario pulse [F1] semuestre la información referente a ese“tópico”. Esto último es lo más intere-sante y es también lo deseado, pero paraque eso sea posible, debemos tener pre-parado el fichero de ayuda, ahora vere-mos cómo, aunque antes de continuarleyendo, es necesario saber las distintasopciones que podemos configurar en unfichero de ayuda HTML, y eso es lo queexplico en los recuadros “Estructura deun fichero de ayuda HTML” y “Creaciónde un fichero de ayuda HTML”.

Para utilizar de forma más eficienteel fichero de ayuda HTML que tenemosasociado al componente HelpProvider,tendremos que usar la propiedad Help-Navigator que el componente agrega acada control del formulario. Según elvalor que indiquemos en esa propiedad,podremos acceder a las diferentes par-tes de que se compone un fichero de ayu-da HTML. Por ejemplo, si al pulsar [F1]en un control queremos que se muestrela ficha de contenido de la ayuda, el valorde la propiedad HelpNavigator debe serTableOfContents. De la misma forma, alasignar un valor Index se mostrará la ayu-da con la ficha del índice seleccionada,y si asignamos Find, la ficha que se mos-trará será la de búsqueda.

Pero, como comentaba antes, laopción que más usaremos es asignandoel valor TopicId. En este caso, debemosasignar a la propiedad HelpKeyword elvalor del “tópico” que queremos mos-trar. Ese valor debe estar asociado conun elemento del fichero de ayuda; portanto, es importante crear de forma ade-cuada el fichero de ayuda para poderusarlo correctamente en nuestras apli-caciones. Tal como comento en el recua-

dro “Creación de un fichero de ayudaHTML”, los valores que podemos usaren la propiedad TopicId son valoresnuméricos que previamente hemos aso-ciado en la ayuda HTML con páginasde contenido de ese fichero de ayuda,aunque también podemos asociar esostópicos con marcadores dentro de unapágina; todo dependerá de cómo haya-mos creado el fichero de ayuda.

Mostrar ayuda usando la claseHelpAdemás del componente HelpProvider,.NET Framework también proporcionala clase Help para mostrar el contenidode un fichero de ayuda compilado o biende páginas HTML independientes.

La clase Help no es instanciable,por tanto, la ayuda la mostraremosusando los métodos estáticos (o com-partidos) que expone. Estos métodosson ShowHelpIndex, que muestra elíndice de la ayuda, ShowPopup, quemuestra un texto emergente y Show-Help, que permite indicar el fichero deayuda compilada o una páginaHTML. En el caso de usar un fiche-ro CHM, podemos indicar si quere-mos mostrar la ficha de contenido, delíndice o de la búsqueda, además depoder indicar el valor del tópico amostrar; esos valores los indicaremospor medio de la enumeración HelpNa-vigator. En todos estos métodos, el

La clase Help no es instanciable, por tanto, laayuda la mostraremosusando los métodos

estáticos (o comparti-dos) que expone

Como podemos comprobar, altener que indicar el nombre delfichero al llamar a cada méto-do de la clase Help, con estaclase podemos crear un siste-ma de ayuda para nuestras apli-caciones de una forma muyfácil, ya que podemos usarvarios ficheros con la extensión.htm, sin necesidad de crear unfichero de ayuda compilada.

NOTA

[ ]

dotN

etM

anía

<<

45

dnm.inicio.taller<<

primer parámetro será la ventana propietaria (normalmenteusaremos una referencia a la instancia actual del formula-rio, Me en Visual Basic o this en C#), y en caso de los méto-dos ShowHelp y ShowHelpIndex, en el segundo parámetroindicaremos el fichero de ayuda a utilizar, que puede serde tipo .chm o .htm; en el último caso, solo será aplicableal método ShowHelp y, por supuesto, no tendrá sentido mos-trar el contenido, el índice ni ningún otro valor que soloes aplicable a los ficheros de ayuda compilada.

Por ejemplo, si queremos mostrar el contenido de la ayu-da de un fichero indicado en la variable hlp, usaremos el méto-do ShowHelp de la siguiente forma:

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étodoShowHelp de la siguiente forma:

Help.ShowHelp(Me, hlp, HelpNavigator.TopicId, “1001”)

Como vemos, el valor del tópico lo tenemos que indicarcomo 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ónen la que queremos que se muestre el texto emergente, el cualse mostrará al estilo de cómo vimos en la figura 2.

Dim p As New Point( Button2.Left + Left, _Button2.Top + Top + Button2.Height)

Help.ShowPopup(Me, “El botón 2”, p)

¿Cómo saber que debemos mostrar la ayuda?

Con el componente HelpProvider estaba claro que el propiocomponente se encargaba de detectar la pulsación de la tecla deayuda y de mostrar la ayuda según lo hubiésemos definido encada control, pero con la clase Help tendremos que detectar noso-tros esa pulsación de la tecla [F1]. Seguramente lo primero quese nos vendrá a la cabeza es detectar la pulsación de la tecla [F1]mediante un evento del tipo KeyDown o KeyUp, pero existe otra for-ma más práctica y simple, que es usando el evento HelpReques-ted. Este evento se produce cuando se pulsa la tecla [F1] , y esaplicable a cualquier control (incluso el formulario); por lo tan-to, podemos crear un evento en cada uno de los controles en los

que queramos proporcionar ayuda y llamar a los métodos de laclase Help que en cada ocasión queramos usar.

ConclusionesEn este artículo hemos comprobado que proporcionar ayuda ennuestras aplicaciones es relativamente fácil gracias a las dos cla-ses que proporciona .NET Framework, aunque el mayor rendi-miento lo sacaremos usando ficheros de ayuda HTML (en for-mato CHM). Si bien la clase Help nos permite usar ficheros deltipo .htmde una forma mucho más fácil que el componente Help-Provider, el uso de los ficheros de ayuda compilada ofrecerá mayorfuncionalidad que los “simples” ficheros HTM, ya que permitiráal usuario buscar en la ayuda, crear marcadores (favoritos) y unanavegación más cómoda por el contenido de la ayuda.

Como de costumbre, en el ZIP que acompaña a este artícu-lo están los proyectos tanto para Visual Basic como para C#, enlos que se muestra cómo usar las dos clases con todas las combi-naciones explicadas en el artículo.

El evento HelpRequested se produce tanto al pulsar latecla [F1] como al usar el botón de ayuda (indicado enel formulario con una interrogación) y pulsar con elcursor sobre un control.

Para mostrar el botón de la interrogación en un for-mulario, debemos asignar un valor verdadero a la pro-piedad HelpButton del formulario, además de que tan-to MaximizeBox como MinimizeBox deben tener unvalor falso (para que no se muestren). El aspecto delformulario sería el mostrado en la siguiente figura:[ ]

NOTA

El botón de ayuda en los formularios

dotN

etM

anía

<<

46

dnm.inicio.taller<<

Tal como vimos en la figura 1, un fichero de ayudaHTML 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 deayuda, y no los favoritos que tenemos en el navega-dor o en el explorador de Windows.

Cuando seleccionamos la ficha de contenido, semuestran las distintas partes o grupos de tópicos quehayamos definido. Por regla general, esos elementosse muestran como libros y hojas. Los libros son losnodos principales o secciones dentro de la ayuda y lashojas representan a cada uno de los tópicos o ele-mentos de la ayuda.

El índice representa una serie de elementos, quehabitualmente mostramos de forma ordenada; en lafigura 4 se muestra el índice de la ayuda del compila-dor de ayudas HTML.

La ficha de búsqueda será la que el usuario usarápara realizar búsquedas dentro del contenido de laayuda. En las figuras 5 y 6 vemos cómo realizar bús-quedas usando varias palabras y el resultado de dichabú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-gar enlaces a elementos (tópicos) de la ayuda. Cadavez que seleccionemos un tópico, el título del mismose mostrará en la parte inferior de esa ficha y por medio

del botón “Add” podremos agregarlo a la lista de favo-ritos, tal como vemos en la figura 7.

Estructura de un fichero de ayuda HTML

Figura 4. El índice de la ayuda

Figura 5. Buscar en la ayuda

Figura 6. Resultado de la búsqueda

Figura 7. Agregar a favoritos

En el panel de la derecha se mostrará el elemen-to que hemos seleccionado. Este panel es configura-ble en cuanto al aspecto y tamaño, incluso podemoscrear diferentes “ventanas” para poder mostrar lostópicos de forma diferente, con idea de poder llamarla atención del usuario o bien para que distintos ele-mentos de la ayuda se muestren en ventanas diferen-tes o con un aspecto y tamaño diferente.

Además de estos dos paneles, en la parte supe-rior tenemos una serie de botones que nos permi-

ten navegar entre los distintos tópicos mostrados,ir a la página de inicio, ocultar el panel de laizquierda, imprimir, etc. Todos estos botones, asícomo las diferentes fichas del panel de la izquier-da son configurables desde el compilador de ayu-da HTML, pudiendo indicar los que queremosmostrar.

En el recuadro “Creación de un fichero de ayudaHTML” explico los conceptos más importantes paracrear un fichero de ayuda.

dotN

etM

anía

<<

47

dnm.inicio.taller<<

Creación de un fichero de ayuda HTML

La creación de ayuda HTML la haremos con la uti-lidad hhw.exe (HTML Help Workshop). Esta herra-mienta se incluye con Visual Studio 2005, además deque está disponible para descarga desde el centro dedescargas de Microsoft.

Antes de utilizar esta utilidad, tendremos que cre-ar los ficheros HTML que queremos usar como “tópi-cos” de nuestra ayuda; es decir, debemos crear los dife-rentes apartados como si se tratara de un sitio Webbasado en HTML. Podemos agregar imágenes, docu-mentos para descargar, poner enlaces entre las distin-tas secciones o tópicos, etc.

Una vez que tenemos creado el contenido en for-mato HTML es cuando usamos el compilador de ayu-das, ya que básicamente eso es lo que hace la utilidadhhw.exe, compilar todo ese contenido HTML en unfichero con la extensión .chm.

Para no hacer demasiado extenso este artículo, lospasos para crear un fichero de ayuda HTML lo puededescargar desde el sitio Web de dotNetManía, dondeexplico, con todo lujo de detalles, cómo crear el propiofichero de ayuda con la explicación, incluyendo cómoagregar el contenido, el índice, cómo definir las venta-nas, cómo seleccionar las diferentes fichas que queremosmostrar, etc. Lo que sí explicaré aquí es cómo agregarcierta funcionalidad para que la podamos asociar a losdiferentes controles o apartados de nuestra aplicación.

Asociar contenido de la ayuda a valoresutilizables desde las aplicaciones

Si queremos mostrar cierto contenido de la ayudaHTML cuando el usuario pulse la tecla [F1], ese conte-nido lo tenemos que asociar a lo que se conoce como untópico de la ayuda. En realidad, consiste en asociar cual-quier parte de la ayuda con un valor numérico; ese valornumérico será el que se utilice desde la aplicación. En elcaso del componente HelpProvider, en las propiedadesque ese componente agrega a los controles del formula-

rio tendremos que asignar un valor TopicId a la propie-dad HelpNavigator, y a la propiedad HelpKeyword asocia-mos el valor numérico; de esa forma, al pulsar la tecla deayuda se mostrará la parte de la ayuda que está asociadaa ese tópico.

Para crear los tópicos debemos hacer lo siguienteen la utilidad HTML Help Workshop: en la barra debotones de la derecha de la utilidad debemos pulsaren el cuarto botón (“HmlHelp API Information”), loque nos mostrará un cuadro de diálogo con variasfichas; seleccionamos la segunda (“Alias”) y pulsamosen el botón “Add”. Nos pedirá que indiquemos unaconstante o un número, que se usará para hacer refe-rencia a una página HTML de las que tenemos agre-gadas al proyecto. Además de una página, podemosindicar un marcador dentro de una página, lo cual nospermite tener varias asociaciones dentro de una mis-ma página HTML.

Una vez que hemos agregado las palabras y lashemos asociado con ficheros HTML, tenemos quecrear un fichero include (sí, al estilo de los ficheros decabecera de C/C++; de hecho, ese fichero deberá tenerla extensión .h, que es la que la utilidad usará para bus-car el fichero cuando lo queramos agregar). En esefichero definiremos constantes numéricas que estaránasociadas a las constantes o palabras que hemos defi-nido en el paso anterior.

El contenido de ese fichero estará formado porlíneas que usan el formato:

#define <constante> <valor numérico>

Siendo <constante> la constante que hemos agre-gado en la ficha “Alias” y <valor numérico> un valorque usaremos en la propiedad HelpKeyword.

Una vez hemos creado ese fichero include, tene-mos que agregarlo al proyecto de ayuda HTML pormedio de la ficha “Map” del cuadro de diálogo mos-trado por la opción “HtmlHelp API Information”.

La sobrecarga de operadores es un viejo concep-to de la programación y nació, primero, y cobróimportancia después, debido a la programaciónorientada a objetos (POO). En sí misma, la sobre-carga de operadores, es sencillamente una varian-te del polimorfismo; uno de los tres pilares de laPOO junto con la herencia y la encapsulación.¿Pero qué es realmente el polimorfismo?

El polimorfismo indica la capacidad de unmétodo para suministrar distintos comporta-mientos cuando es llamado por clases distintas. Elmétodo tiene el mismo nombre y requiere la mis-ma signatura, pero la implementación interna esdiferente para clases diferentes. El ejemplo canó-nico comienza con la clase base Persona, de la quepuedes heredar clases como Español o Inglés. Laclase base tiene un método Hablar() cuya imple-mentación produce las salidas “Hola” y “Hi” res-pectivamente.

Hablando lógicamente, un operador como +,= o == no es más que un método. En este sentido,están sujetos al polimorfismo. Tú estableces quetales operadores tienen diferentes implementa-ciones dependiendo de los tipos de sus argumen-tos. Sumar dos enteros es distinto de sumar dosdecimales o dos fechas. En general, hay situacio-

nes en las que las sobrecargas están definidas porel lenguaje. En otros casos, el programador imple-menta el soporte para nuevos operadores con nue-vos tipos.

Visual Basic 2005 soporta operadores per-sonalizados, lo que significa que puedes sobre-cargar un operador existente para especializarsu comportamiento. Al mismo tiempo, es posi-ble definir nuevos operadores que pueden ope-rar sobre nuevos tipos de datos. En general, losoperadores sobrecargados simplifican el traba-jo con tipos complejos y permiten especificartu propia implementación para operaciones fun-damentales.

Como, por ejemplo, restar dos fechas, o sumaruna hora dada a una fecha. Cualquier framework quesoporte fechas como tipo nativo ofrecerá métodosen la clase Date para ejecutar esas operaciones. Diga-mos que quieres restar dos fechas. Tendrás que recu-rrir a un código como el siguiente:

Date d1, d2;

int diff = Date.Subtract(d1, d2);

¿No sería más natural y más claro escribir, ensu lugar, éste código?

El propósito de algunas características de .NET

Dino Esposito

Dino Espositoes mentor de SolidQuality Learning. Esponente habitual en

los eventos de laindustria a nivel

mundial. Visite sublog en: http://weblogs.

asp.net/despos.(todotNet.QA@

dotnetmania.com)

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

todonet@qa

Las tecnologías del software se renuevan constantemente, y algunas veces el pobre desarrolladorno 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 variasde las preguntas que empiezan con la frase “Cuál es el propósito”. Trataremos de mostrar cuálfue la idea central en cada uno de los casos.

tod

otN

et.q

a@

dot

netm

ania.c

om

Date d1, d2;

int diff = d1 – d2;

Sin embargo, para poder hacerlo, se necesitasobrecarga de operadores. .NET Framework sumi-nistra exactamente este tipo de soporte mediante eltipo System.DateTime. Puedes sumar y restar fechasusando los operadores matemáticos clásicos. Es algoincluido por defecto. El siguiente código muestra unfragmento de la implementación real del operador +para la clase System.DateTime.

public static DateTime operator +(DateTime d,TimeSpan t)

{

long internalTicks = d.InternalTicks;

long toAdd = t._ticks;

return new DateTime( (ulong) (internalTicks+toAdd) );

}

La misma sintaxis se requiere para sobrecargar ope-radores estándar de forma que trabajen con tipos per-sonalizados. Se vincula un método existente o fragmen-to de código a un símbolo. La definición de un opera-dor no es diferente de la definición de un método excep-to por el empleo de una sintaxis ligeramente diferente.

¿Deberías usar operadores en lugar de crear méto-dos? Pues es una cuestión de preferencias, pero, engeneral, los operadores hacen que el código sea nota-blemente más claro cuando se utilizan tipos persona-lizados. Ahora bien, no cualquier tipo personalizado,sino aquellos cuya lógica y comportamiento encajencon la semántica del operador. La claridad y legibili-dad del código es el mejor valor añadido que yo veoen los operadores personalizados. No depende de nin-guna otra cosa. Es una característica presente en loslenguajes .NET, y la usas si te sientes confortable conella. Y punto.

dotN

etM

anía

<<

49

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

dnm.todonet@qa<<

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

En ASP.NET 2.0, las páginas no compiladas sonpáginas especiales que no se compilan nunca. Secrea una página no compilada estableciendo el atri-buto CompilationMode de la directiva @Page a su valor“Never”. Alternativamente, si no se sabe bien quéhacer, este valor puede dejarse como “Auto” en lasección <pages> del fichero de configuración. Enese caso, ASP.NET deducirá si la página debe decompilarse o no.

¿Cuál es el propósito, entonces, de las páginas nocompiladas? Y, más importante aún, ¿cuál es la dife-rencia entre las páginas no compiladas y las páginasHTML estáticas?

Mi abuela solía decir que no porque algo puedahacerse tú tienes que hacerlo. De forma similar, laspáginas no compiladas, no son para todas las aplica-ciones. Si tienes un sitio Web pequeño con unas pocaspáginas, ¿qué sentido tiene complicarse con páginasno compiladas?

Las páginas no compiladas están diseñadas paramejorar la escalabilidad de sitios Web de gran tamaño,digamos de varios miles de páginas. En ese tipo desitios, las páginas no compiladas evitan la necesidadde compilar miles de páginas. ¿Es esto un problema?¿Y cuándo?

El sistema operativo Windows impone un límiteal número de DLLs que pueden ser cargadas simultá-neamente por una aplicación. Cuando se alcanza ese

límite, el rendimiento del sistema se degrada signifi-cativamente. En otras palabras, para un sitio Web con-siderable en tamaño, las páginas no compiladas habi-litan un sistema adecuado para descargar de la memo-ria páginas concretas. Si se compilan regularmente enun ensamblado, no podrían ser descargadas sin des-cargar el propio dominio de aplicación (AppDomain).Después de todo, un sitio web no compilado puedeservir un número infinito de páginas, sin necesidad dereiniciar el dominio de aplicación. Las páginas no com-piladas son una característica de escalabilidad y noespecíficamente de rendimiento. Entonces, ¿por quéno usar páginas HTML planas?

Una página no compilada se escribe como cual-quier otra página ASP.NET y está, realmente, hechade controles de servidor. No obstante, no pueden con-tener código. Pero, en una página no compilada pue-des utilizar numerosos controles ricos de ASP.NET2.0 y otras características, como Páginas Maestras(Master Pages), controles Login, Gridview y DataSour-ce. Todas las maravillas que puedes haber oído res-pecto a las páginas no compiladas en ASP.NET 2.0son ciertas, y es una página de ese tipo la que marcaclaramente la diferencia entre las páginas ASP.NETno compiladas y las páginas estáticas HTML.

Pero una página no compilada no puede enla-zarse a un fichero de código, y no puede contenerun bloque <script> de servidor. La única parte de

Al objeto de utilizar el ancho de banda de forma máseficiente, puedes habilitar la compresión HTTP anivel de IIS. Se pueden comprimir tanto ficheros está-ticos como respuestas generadas dinámicamente. Yse puede habilitar la compresión para toda la aplica-ción o solo para un directorio concreto. En el admi-nistrador de IIS, seleccionas la carpeta “Sitios Web”,y luego, “Propiedades”. A continuación activas la sola-pa “Servicio” y en la sección “Compresión HTTP”seleccionas la casilla “Comprimir ficheros de la apli-cación”, para habilitar la compresión de ficheros diná-micos. También puedes personalizar los tipos de fiche-ro a comprimir, siguiendo las instrucciones que apa-recen en la siguiente dirección Web:

http://www.microsoft.com/technet/prodtechnol/

WindowsServer2003/Library/IIS/d52ff289-94d3-4085-bc4e-

24eb4f312e0e.mspx?mfr=true

Sin embargo, esto es simplemente una opción. Siexisten condicionantes en tiempo de ejecución, o sola-mente se quiere comprimir un recurso dado, puedesoptar por la vía del software y escribir código que lohaga. En este caso, yo sugeriría escribir un maneja-dor HTTP, para servir el recurso y usar internamen-te la clase GzipStream para comprimir los contenidos.A continuación muestro algo de código para ilustrareste punto.

using System;

using System.Drawing;

using System.Web;

using System.Web.UI;

using System.IO.Compression;

using System.IO;

public class CompressorHandler : IHttpHandler

{

void IHttpHandler.ProcessRequest(HttpContext context)

{

using (MemoryStream stm = new MemoryStream())

{

using (Stream stmCompressed = new GZipStream(stm,

CompressionMode.Compress))

{

// Escribe datos comprimidos

using (StreamWriter writer = new

StreamWriter(stmCompressed))

{

StreamReader reader = new

StreamReader(context.Server.MapPath("..."));

writer.Write(reader.ReadToEnd());

}

// Escribe datos comprimidos

// al stream de salida

byte[] tmp = stm.ToArray();

context.Response.AddHeader("Content-encoding",

"gzip");

context.Response.OutputStream.Write(tmp,0,

tmp.Length);

return;

}

}

}

bool IHttpHandler.IsReusable

{

get { return true; }

}

}

Puedes copiar este código entero a un fichero C#en la carpeta App_Code y vincularlo a un recurso demanejador HTTP, ya sea con la extensión .AXD o.ASHX. A continuación, te refieres al recurso utilizan-do su manejador. Si hay que comprimir múltiplesrecursos, puedes utilizar parámetros en la cadena deconsulta para indicar un fichero concreto a cargar ycomprimir. Como puedes ver, la estructura del mane-jador es bastante simple; todo lo que hace es usar unstream para leer el recurso y un writer para añadirloa la pila de streams: uno en memoria y un GZip. Lacompresión sucede de forma natural según va reco-rriéndose el stream Gzip.

dotN

etM

anía

<<

50

dnm.todonet@qa<<T

odot

Net.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

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

código ejecutable admitida en una página así, es unaexpresión $.

Desde el punto de vista del rendimiento, nodeberías esperar un beneficio tangible por la utiliza-ción de páginas no compiladas. De hecho, probable-mente es algo más lento. Como ya he mencionado,las páginas no compiladas tienen sentido para aliviarel trabajo de compilación en sitios de gran tamaño, y

disminuir el número de ensamblados guardados enmemoria.

Así que la clave consiste en que no hay ensambladosguardados ni almacenados en disco. En su lugar, el cons-tructor de la página se guarda en memoria y se reutili-za para crear la página para cada petición. Este caché esactualizado siempre que, por cualquier razón, se reini-cia la aplicación.

Traducido al castellano por Marino Posadas

dotN

etM

anía

<<

51

Introducción

Guidance Automation Toolkit (en lo adelante GAT)ha sido desarrollado conjuntamente por Microsoft y laempresa Clarius Consulting (www.clariusconsul-ting.net), y es, del mismo modo que DSL Tools(Domain Specific Language Tools), uno de los componentesbásicos de las iniciativas que están teniendo lugar alre-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 deun entorno de desarrollo configurado para facilitar almáximo el desarrollo rápido, siguiendo guías arqui-tectónicas bien definidas y prácticas recomendadas, deciertos tipos de aplicaciones. GAT también ha sido uti-lizado en la implementación de la recién aparecida ver-sión 3.0 de Enterprise Library, lo que deja entrever quela herramienta ha alcanzado un alto grado de madurezy está preparada para dar el salto al prime time, por ejem-plo, como parte del SDK de Visual Studio.

GAT es un kit de herramientas concebido paraque los arquitectos de software desarrollen paque-tes de orientación (guidance packages) que ayuden alos desarrolladores en su trabajo. Se ha implemen-tado como un vía “ligera” para extender Visual Stu-dio, de un modo que permita simplificar la integra-ción en las aplicaciones de los activos de código reu-tilizable (tanto propios como de terceros) y promo-ver el uso de patrones y prácticas recomendados, asícomo automatizar tareas que generalmente se eje-cutan de forma manual y realizar de una manera con-sistente labores repetitivas o propensas a error; obje-tivos que redundan en definitiva en un incrementode la productividad y calidad del desarrollo.

Conceptos fundamentales

GAT puede considerarse como una evolución de losadd-ins, el mecanismo de extensibilidad de Visual Stu-dio al que hemos dedicado varios artículos de dotNet-Manía, más notablemente los de Carlos Quintero [1]y del Grupo WebOO de la Universidad de La Haba-na [2]. Para desarrollar este tipo de extensiones hay quelidiar con EnvDTE (Environment Developer Tools Exten-sibility), una librería COM extensa y compleja que apor-ta el modelo de objetos necesario para interactuar conel entorno integrado. Solo el mero hecho de que GATencapsula muchas de las complejidades de EnvDTE(eso sí, permitiendo acceder a él si fuera necesario) yaes un gran plus; pero GAT aporta mucho más que eso,especialmente en el aspecto conceptual, ámbito en eldefine que toda una serie de conceptos que simplificany dan consistencia y sistematicidad a la creación de exten-siones de Visual Studio.

La arquitectura sobre la que se apoya GAT semuestra en la figura 1. Se apoya directamente en unalibrería llamada GAX (Guidance Automation Exten-sions), que se descarga e instala independientemente.GAX es el motor de ejecución de GAT, y deberá ins-

Guidance Application Toolkit

Octavio Hernández

Octavio Hernándezes Development

Advisor de PlainConcepts, editor

técnico dedotNetManía y tutor

de campusMVP.Es MVP de C# desde2004, MCSD y MCT.

Nombre: Guidance Automation Toolkit

Fabricante: Microsoft/Clarius Consulting

Web: www.guidanceautomation.net

Categoría: Extensiones de Visual Studio

Precio: Gratuita

Valoración: ****o

Ficha técnica

Este mes no dedicamos nuestra columna a un producto comercial, sino a GuidanceAutomation Toolkit, una extensión de Visual Studio 2005 que permite a losarquitectos de software crear experiencias de usuario ricas e integradas para lautilización dentro del entorno integrado, de una forma consistente con las guíasde arquitectura, de diversos activos de software, como pueden ser marcos detrabajo, librerías, componentes o patrones.

Laboratorio.net

dotN

etM

anía

<<

52

dnm.laboratorio.net<<

talarse tanto en los equipos de los arqui-tectos (como prerrequisito de GAX),como en los de los desarrolladores queharán uso de los paquetes de orientaciónque los arquitectos desarrollen.

GAT permite a los arquitectos desoftware crear toda una serie de ele-mentos que podrán luego utilizarse con-juntamente para automatizar la ejecu-ción de diferentes tareas:

• Recetas (recipes). Las recetas per-miten automatizar tareas que losdesarrolladores normalmente rea-lizan manualmente, frecuente-mente siguiendo una serie de ins-trucciones. Pueden utilizarse paragarantizar que las actividades repe-titivas y propensas a error se reali-zan de una manera consistente, ypara simplificar las tareas de desa-rrollo complejas o repetitivas. Lasrecetas se pueden aplicar a ele-mentos específicos de una solución,o a un grupo de elementos de unasolución con una cierta caracterís-tica común (por ejemplo, todos losproyectos C#).

• Acciones (actions). Las acciones sonunidades atómicas de trabajo queson llamadas en un orden específi-co por las recetas. Este orden seespecifica precisamente en la defi-nición de una receta. Una acciónpuede operar sobre argumentos quele envía la receta que la llama o sobreel resultado de una acción ejecuta-da con anterioridad.

• Asistentes (wizards). Los asistentesincorporan estrategias de obtenciónde datos que serán utilizados comoargumentos de las recetas. Cual-quier receta puede terne asociadoun asistente. Los asistentes guían aldesarrollador a lo largo de una seriede pasos, que se presentan en for-ma de páginas (pages).

• Conversores de tipos (type conver-ters). Los conversores de tipos vali-dan los datos introducidos en los asis-tentes y los transforman de su repre-sentación visual a su representaciónen el tipo de datos de destino.

• Proveedores de valores (valueproviders). Los proveedores devalores son clases que pueden serutilizadas por las recetas para cal-cular los valores que necesitanpasar a las acciones.

• Editores (editors). Los editores sonclases utilizadas por los asistentespara mejorar la experiencia deusuario a la hora de introducir losdatos que utilizan las recetas.

• Plantillas de transformación deplantillas de texto (Text TemplateTransformation Templates). Estasplantillas, conocidas coloquialmen-te como “plantillas T4”, son la basepara la generación automática decódigo desde los paquetes GAT.Durante la generación de código,estas plantillas son expandidas porel motor de transformación corres-pondiente, y el resultado es inser-tado directamente en el flujo de sali-da de la plantilla. Se componen deuna combinación de texto y scrip-tlets, que son expresiones de C# oVisual Basic que, al ser ejecutadas,devuelven una cadena de caracteresque es enviada a la salida.

• Fragmentos de código (Snippets):Se trata de trozos de código fre-cuentemente utilizados que pue-den reproducirse con la simplepulsación de una combinación deteclas. Los snippets que incorpore-mos a un paquete de orientaciónse añadirán a los que ya tenga defi-nidos Visual Studio.

• Plantillas de Visual Studio (VisualStudio templates). A partir de estasplantillas, Visual Studio crea solu-ciones o agrega uno o más proyec-tos o elementos a una solución exis-tente. Las plantillas, que se definenen XML, son expandidas por elmotor de plantillas de Visual Stu-dio. Mediante GAT, es posible aso-ciar recetas a las plantillas de VisualStudio. Esta asociación implica quecuando una plantilla es ejecutada, elmotor llamará a la receta para reco-ger valores de argumentos para laejecución, y que una vez que la plan-tilla haya sido aplicada, ejecutará lasacciones indicadas por la receta paratransformar aún más los ficheroscreados por la plantilla.

• Referencias (references). Por últi-mo, las referencias son clases queimplementan la lógica que se uti-liza para determinar si una planti-lla o receta debe aparecer o nocuando se seleccione cualquier ele-mento de la solución activa.

Todos estos elementos se recopilan,conjuntamente con un fichero de confi-guración, en paquetes de orientación, quese empaquetan y despliegan como un todoúnico. Para la gestión de estos paquetes,GAX integra a Visual Studio 2005 dos ven-tanas especiales, el Gestor de Paquetes deOrientación (Guidance Package Manager)y el Navegador de Orientación (GuidanceNavigator). Una vez que un paquete deorientación es activado para una soluciónespecífica, el desarrollador podrá ejecutarlas recetas que el paquete incorpora parallevar a cabo las tareas.

La plantilla de paquetes de orientaciónPara facilitar el desarrollo de paquetes deorientación, GAT incluye una plantillade Visual Studio que genera una solu-ción orientada a la creación de un paque-te de orientación. Esta plantilla, muycompleta, define elementos de práctica-mente todos los tipos posibles, de modoque podamos utilizarlos como ejemplos

Figura 1. Arquitectura y escenario deuso de GAT

dotN

etM

anía

<<

53

dnm.laboratorio.net<<

para nuestras propias definiciones omodificarlos directamente.

Una vez instalados GAX y GATsobre Visual Studio, tendremos instala-da, como es típico de las herramientasde extensibilidad, una nueva plantilladentro de Visual Studio, la plantilla depaquetes de orientación (figura 2).

Después de introducir la informa-ción básica sobre el proyecto (figura 3),obtendremos una solución compuestapor tres proyectos (figura 4):

• El proyecto de paquete de orien-tación en sí. Como puede verse enla figura 4, en el proyecto que segenera automáticamente los dife-rentes elementos se organizan encarpetas diferentes para su mejororganización.

• Un proyecto de librería de clasesque incluye una clase instaladora.

• Un proyecto de instalación, que seencarga de recopilar todos los ele-mentos de los otros dos proyectos,más todos los recursos de los queéstos dependen, para crear unSetup.exe que permita el desplieguedel paquete en los equipos de losdesarrolladores.

Es en este punto donde se haceimprescindible consultar la documenta-ción en línea de GAT para conocer losdetalles relacionados con la implemen-tación de los diferentes elementos quese pueden incorporar a un paquete. Enlo fundamental, son técnicas familiaresde orientación a objetos; por ejemplo,las acciones se programan como clases

que implementan la interfaz Micro-soft.Practices.RecipeFramework.IAction; las páginas de los asistentes, comoclases que heredan de Microsoft.Prac-tices.WizardFramework.CustomWi-zardPage; etc. El proyecto que generael asistente ofrece ejemplos básicos paracada tipo de elemento. Por ejemplo, ellistado 1 muestra el código de la acciónHelloWorldAction.

La puesta a punto de un paquete deinstalación es similar a la de los add-ins.Lo primero que hay que hacer es regis-

trar el paquete de instalación, de modosimilar a como lo hará automáticamen-te el instalador en los puestos de los desa-rrolladores; para ello, los proyectos depaquete de orientación ofrecen un acce-so directo (figura 5). Entonces podremoslanzar una segunda instancia de VisualStudio, que ya tendrá instalado el paque-te. Si en esta segunda instancia seleccio-namos “Archivo” | “Nuevo…”, veremosque tenemos en el área de Paquetes deOrientación una nueva plantilla (figura6). Lo que restará es crear un nuevo pro-yecto a partir de esa plantilla, y probar silos elementos que componen nuestropaquete funcionan como es debido, posi-blemente ayudándonos del Navegadorde Orientación (figura 7), que instalaaccesos directos para que los desarrolla-dores tengan a mano las recetas, accio-nes y plantillas.

Figura 2. La plantilla de paquetes de orientación

Figura 3. Datos básicos del paquete de instalación

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

Figura 5

dotN

etM

anía

<<

54

dnm.laboratorio.net<<

Conclusión

GAT abre ante los arquitectos un amplioabanico de posibilidades a la hora de exten-der Visual Studio con nuevas posibilida-des que faciliten a los desarrolladores latarea de crear aplicaciones y librerías conmenor esfuerzo y respetando al máximolos estándares requeridos por la organiza-ción. Esperamos que este breve artículoayude a atraer la atención hacia este kit deherramientas y los temas relacionados conla arquitectura del software en general.

Referencias

Sobre los add-ins de Visual Studio

[1] Quintero C., “Creación de asis-tentes en Visual Studio”, en dot-NetManía Nº 30, octubre de 2006

[2] Hernández Y., Katrib M., “Atribu-tos, aspectos y cómo entretejer códi-go desde Visual Studio para hacerAOP en .NET” (partes I y II), en

dotNetManía Nº 33 y 34, enero yfebrero de 2007.

Sobre GAT

[1] Introduction to Guidance Automa-tion Toolkit, http://msdn2.micro-soft.com/en-us/teamsystem/aa718950.aspx

[2] Documentación de GAT, incluidacon la herramienta.

[3]GuidanceAutomation.net, http://www.guidanceautomation.net.

Descargas

[1] Descarga de GAT y GAX, http://msdn2.microsoft.com/en-us/teamsystem/bb229214.aspx.

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{

get{

return helloMessage;}set{

helloMessage = value;}

}

private string helloMessage;

#endregion

#region IAction Members

public override void Execute(){

IUIService uiService = GetService<IUIService>(true);if (uiService != null){

uiService.ShowMessage(helloMessage, “Hello Action”);}else{

System.Windows.Forms.MessageBox.Show(helloMessage,“Hello Action”);

}}

public override void Undo(){}

#endregion}

}

Figura 7. El Navegador de orientación en acción

Figura 6. Registrando un paquete

Essential Windows Presentation FoundationChris AndersonEditorial: Addison-Wesley ProfessionalPáginas: 512Publicado: 2007ISBN: 978-0321374479Idioma: inglés

El hecho de que Don Box y Chris Sells sean los prologuistas de esta obra no la hacemejor, 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 deWPF, 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 losmejor valorados por sus lectores en este tema y se lo recomendaría a los que –como yo- nosgusta 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óndel 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 forReusable .NET LibrariesKrzysztof Cwalina y Brad AbramsEditorial: Addison-Wesley ProfessionalPáginas: 384Publicado: 2006ISBN: 978-0321246752Idioma: 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 sidoresponsable 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ásde haber participado en el proyecto FxCop en sus inicios). A Abrams ya lo conocen nuestroslectores 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 desdesus 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 undocumento Word, se hubiera pasado el documento al resto de “gurús” (hay comentariosde Richter, Brumme y Hejlsberg), para que completaran la obra con su propia visión. Unarareza en su género, más que interesante.

biblioteca.net

nove

dad

es Embedded Programming with the Microsoft .NET Micro Framework

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

dotN

etM

anía

<<

56

“Baleares on .NET, comunidad surgida de la ilusiónde un grupo de apasionados a la tecnología .NET deMicrosoft, que colaboran voluntariamente en difun-dir dicha tecnología y a compartir sus conocimientosy experiencias a los desarrolladores .NET de las IslasBaleares”.

Con este mensaje damos la bienvenida a los inter-nautas que visitan nuestra Web y ahora también a loslectores de dotNetManía gracias a la oportunidadque nos ha brindado Paco Marín.

La historia de Baleares on .NET no es muy dis-tinta de la de otros grupos, tal vez la principal parti-cularidad radica en que uno de sus coordinadores, unservidor, no reside en la misma provincia que el gru-po sino en Madrid. Fue en esta ciudad donde me acer-qué por primera vez a los grupos de usuarios .NET.

Cuando vivía en Mallorca veía con gran envidiacomo en otros lugares de España y del mundo se rea-lizaban eventos de todo tipo con muchísima fre-cuencia, algo que en Baleares no sucede. Los costesadicionales que suponen para las empresas los pro-blemas de insularidad son, sin duda, un aspecto deter-

minante. Estos mismos problemas impiden que losdesarrolladores de Baleares puedan asistir a eventosde otras ciudades.

Al conocer que el grupo de usuarios de Madridestaba compuesto por voluntarios, me empezó a sur-gir la idea de que modestamente podía contribuir aque la situación de Mallorca mejorase un poco, aun-que fue un post en el blog de David Carmona, el querealmente me dio la energía que necesitaba para deci-dirme a moverlo todo.

Lo primero que hice fue contactar con JavierJofre, al cual le entusiasmó la idea desde el primermomento 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 lasala donde realizar los eventos; así que hablamos conMiguel Jiménez que a su vez nos presentó a Alfon-so Rodríguez, gracias al cual pudimos encaminarmejor nuestros esfuerzos aclarándonos tantas cosasy proporcionándonos el apoyo necesario para elregistro a eventos y publicidad del grupo.

El siguiente paso era crear el portalhttp://www.baleareson.net, que pudimos poner enmarcha muy rápido a través de la colaboración desin-teresada de varias empresas para las licencias y hos-ting necesarios. Encontrar ponentes para las charlasfue sencillísimo, tan solo hubo que hablar con otrosdos grandes amigos, Salvador de la Rosa y JuanManuel Servera, los cuales al igual que Javier Jofrese ofrecieron de inmediato a preparar alguna de lascharlas. Eso fue todo, con el entusiasmo de unospocos teníamos creado el grupo y cubierto cuatromeses con eventos.

No sabíamos muy bien la acogida que iba a tener elprimer evento, tan solo se había publicitado a través delboletín MSDN Flash y de nuestro sitio web, ademásnos encontrábamos con el hándicap de que en Mallor-ca el .NET Framework, al igual que otros productos

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

comunidad.net

baleares on.Net• Ubicación: Palma de Mallorca• Fecha de fundación: 24-01-2007• Fundador: José Francisco Bonnín• Número de miembros: 57• Página Web: www.baleareson.net• Email de contacto:

[email protected]

de Microsoft, no se utiliza tanto comociertas tecnologías de otras empresas.

El primer evento fue el 30 de mar-zo y el tema “Novedades en C# 3.0”,que realicé yo mismo. Increíblementetuvo una respuesta fantástica: a las dossemanas de abrir el registro el aforoestaba completo. Sin duda, fue algototalmente inesperado y nos sirvió paradarnos la fuerza necesaria para seguiradelante. La segunda charla acerca deWCF la realizó Salvador de la Rosa yuna vez más tuvimos que colgar el car-tel de aforo completo. Debido al éxitode las dos primeras charlas decidimosprobar con una sala más grande para elevento realizado por Javier Jofre sobrela Web 2.0, la gente no defraudó.

El número de usuarios registrados,aunque poco a poco, no para de creceren la Web y, debido a la estupenda par-ticipación que estamos teniendo en cadaevento, tras varias gestiones finalmen-te hemos conseguido una nueva sala conmuchísima más capacidad, gracias a lacolaboración de la empresa SM2 Bale-ares, de manera que podremos dar cabi-da a toda la gente que hasta ahora noha podido asistir.

Todavía tenemos grandes retos pordelante, como poder formar parte deIneta o conseguir que ponentes con másexperiencia que nosotros vengan aMallorca a realizar alguna charla. Sinembargo, creo que hasta ahora hemosavanzado mucho en nuestro sueño decrear Baleares on .NET.

Desde estas líneas me gustaría daránimos a todos aquellos que hayáis pen-sado en crear un grupo de usuarios,veréis que la gente estupenda que rodeaeste mundo hace que todo sea mucho

más sencillo de lo que parece. En mi casolo más difícil fue lanzarme a dar el pri-mer paso, superar la barrera psicológi-ca de aquellos que no comprendían quefuera a invertir tanto dinero en viajes yno obtener otro beneficio que la satis-facción personal de ver que lo que hacía-mos era útil para los demás.

Para finalizar, tan solo invitaros aque asistáis a alguno de los próximoseventos que vamos a realizar:

• Aplicaciones de la Web 2.0 conMicrosoft AJAX Extensions,Miguel Jiménez.

• Desarrollo con Sharepoint 2007,Juan Manuel Servera.

Y sobre todo informar que los even-tos siempre los realizamos los viernesde 19:00 a 21:00, así que todos aquellosque se animen a viajar a Mallorca comoponentes, podrán aprovechar para que-darse el fin de semana y conocer la islacon guía incluido. Miguel Jiménez, alcual estamos enormemente agradeci-dos, será el pionero en aventurarse conBaleares on .NET.

dnm.comunidad.net<<

José Francisco Bonnín

Evento CatDotNet de Manresa

El pasado 14 de junio tuvo lugar en la sala de conferencias delCentro Microsoft de Innovación en Productividad de Manre-sa la segunda reunión de CatDotNet, un mes después de hacerlo propio en Igualada.

De entrada, y después de una pequeña presentación del gru-po, Diego Gómez, Business Advisor del Centro, nos mostró lascaracterísticas de la tecnología Unified Communications, con lasnuevas propuestas en el campo como son MS Office Communi-cator 2007, MS Office Communications Server 2007 y Outlook2007, finalizando con una demostración en directo de las capa-cidades de reconocimiento de voz a través de clientes móviles.

Por otro lado, contamos también con la colaboración de Benjamín Adell, de grupo de usua-rios BCN.DEV, que nos explicó las novedades relacionadas con LINQ en todas sus vertientes ynos deleitó con una batería de ejemplos de aplicaciones.

Como punto final, además de recomendar unos libros y en nuestro ya habitual apartado, “Herra-mientas indispensables”, mostramos la utilización de Microsoft SandCastle con un ejemplo en vivo.

En definitiva, que pese a que la asistencia fue menor que en Igualada, nos fuimos con un buensabor de boca; una reunión más realizada y otra nueva en preparación, para el mes que viene.

Santi Balboa y José Miguel Torres

eventos.eventos.eventos.eventos

Me gustaría dar ánimos a todosaquellos que hayáis pensado en cre-ar un grupo de usuarios, veréis quela gente estupenda que rodea estemundo hace que todo sea mucho

más sencillo de lo que parece

dotN

etM

anía

<<

58

desvánAparatos sin cables y con un menor

gasto en baterías

Ese es el anuncio que un grupo de científicos de una de mis ins-tituciones de investigación favoritas (Instituto Tecnológico deMassachusetts o M.I.T.), ha realizado recientemente. Se trata detransmitir potencia eléctrica a varios metros de distancia sin unaconexión física entre la fuente de potencia y el aparato de que setrate, y ya se han inventado el término witricity, para describirla.

El fenómeno, bien usadoy conocido desde hace tiem-po, tiene la característica deque –en vez de dispersar laenergía en todas direcciones–focaliza la transmisión a undestino y permite alcanzar másde dos metros de distancia enlas primeras pruebas. Los

investigadores liderados por Marin Soljacic (a la izquierda, en lafoto adjunta) utilizan principios de resonancia magnética, y talcomo reza la noticia original: “podría iluminar bombillas, hacerfuncionar radios y tocadiscos, e incluso dispositivos médicosimplantados. De hecho, ni siquiera sería necesaria una batería paraque funcionaran dentro de una habitación dotada de este siste-ma", comenta Peter Fisher, uno de los autores de los experi-mentos, en los que se ha logrado encender una bombilla de 60vatios desde una distancia de dos metros, y que han sido publica-dos en la prestigiosa revista Science. La financiación ha corridopor parte del Ejército, el Ministerio de Energía y la FundaciónNacional de Ciencia de Estados Unidos.

En el proceso, la informática ha tenido un papel crucial, yaque ha sido necesario un gran número de simulaciones por orde-nador para poder afinar los experimentos y abandonar opcionesinviables. Los experimentadores esperan tener en la calle el des-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-tro de emisión de energía por cada habitación de la casa, por ejem-plo. “Los usos industriales en la alimentación de robots para plan-tas de producción y similares también podrían estar disponiblesen cuanto los materiales nos permitan un control todavía más finodel fenómeno”, afirmaba Soljacic en una conferencia impartidaen el Instituto Americano de Física.

Marino Posadas

Trucos para acelerar Windows Vista. Deb Shinder, en elsitio Web de ZDNet en Australia, publica sus hallazgossobre varias formas en las que podemos conseguir que el ren-dimiento de Vista sea similar al de XP. Disponible enhttp://www.zdnet.com.au/insight/software/soa/Tips-to-boost-Vis-ta-performance/0,139023769,339278888,00.htm?feed=rss, rea-mente merece la pena, abarcando desde pistas para la moni-torización del rendimiento, hasta políticas de mantenimien-to de discos o indexación de archivos.

Por otra parte, parece que ya es oficial la aparición –parafinales del presente año– del primer service pack para Vista,que parece que incluirá varios cambios específicos: primero,tanto usuarios como OEM tendrán la posibilidad de selec-cionar por defecto un motor de búsqueda diferente, y ensegundo término, parece que la funcionalidad deberá serextendida en los otros buscadores/indexadores de igual for-ma a como funciona actualmente, para lo cual Microsoftdeberá informar a los ISV y OEM sobre la forma correcta derealizarlo.

Blogs de los gurús de Silverlight. En la páginahttp://msdn2.microsoft.com/en-us/asp.net/bb187358.aspx, se encuen-tran referencias a algunos de los blogs más interesantes relacio-nados con Silverlight que se encuentran disponibles en la actua-lidad, y muy especialmente, los de Scott Guthrie, Mike Harsh,Joe Stegman y Lawrence Moroney. En el mismo sitio, tam-bién podemos encontrar varios vídeos con charlas sobre el temade algunos de los integrantes del equipo de desarrollo de esteproducto.

Moreplus. Otro sitio Web dedicado a la programacióncon .NET Framework. En él participa un grupo muy acti-vo de desarrolladores, y ofrecen –de momento– noticias yartículos relacionados. Visitarlo en http://www.moreplus.es/index.aspx.

Driver Max es una interesantísima herra-mienta que nos permite instalar/desins-talar los drivers de nuestros sistemas sintener que preocuparnos por versiones,ubicación, sitios Web especializados ydemás problemas relacionados con estosprocesos. Es gratuita y se encuentra dis-ponible en (http://www.innovative-sol.com/drivermax/index.htm).

REVO Uninstaller 1.2. Se trata de una herra-mienta de desinstalación de programas,claro, pero con una serie de característi-cas adicionales que le hacen bastante útil,a la par que gratuita, ya que la descarga esdesde el sitio FreeFiles, del que ya hemosapuntado otras utilidades en esta revista.(http://www.freewarefiles.com/pro-gram_9_104_32751.html) .

Microsoft Network Monitor 3 es un analiza-dor de tráfico y protocolos de red, dispo-nible desde el centro de descargas de lacompañía, en la dirección http://www.microsoft.com/downloads/details.aspx?FamilyID=aa8be06d-4a6a-4b69-b861-2043b665cb53&DisplayLang=en. Ocupasolamente 2,5 Mb, y está disponible paraversiones de 32 y 64 bits.

documentos en la red

utilidades del mes

sitios del mes

noticias.noticias.noticias