dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic...

60
Tablet PC SDK (y II). Reconocimiento de escritura manual • Más sobre seguridad de acceso a código • Herramientas genéricas para los componentes: ficheros y recursos Depuración en .NET. El depurador que lo depure... recibirá ayuda del CLR entrevista Catherine Heller Technical Evangelist Microsoft Corporation Vía libre a la creatividad El evento CellPainting del control DataGridView nº 43 diciembre 2007 6,50 Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows System eventos TechEd Europe 2007 Lanzamiento de Biztalk 2006 R2 CEUS 2007 www.dotnetmania.com dedicada a los profesionales de la plataforma .NET dotNetManía www.dotnetmania.com dotNetManía Laboratorio ILOG Diagrammer for .NET TodotNet@QA Silverlight. Presente y futuro Opinión Documentos o ejecutables

Transcript of dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic...

Page 1: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Tablet PC SDK (y II). Reconocimiento de escrituramanual • Más sobre seguridad de acceso a código •Herramientas genéricas para los componentes:

ficheros y recursos • Depuración en .NET. El depuradorque lo depure... recibirá ayuda del CLR

entrevistaCatherine HellerTechnical EvangelistMicrosoft Corporation

Vía libre a la creatividadEl evento CellPainting del control DataGridView

nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows System

eventosTechEd Europe 2007Lanzamiento de Biztalk 2006 R2CEUS 2007

www.

dotne

tman

ia.co

m

dedicada a los profesionales de la plataforma .NET

dotNetManíawww.

dotne

tman

ia.co

m

dotNetManía

LaboratorioILOG Diagrammer for .NET

TodotNet@QASilverlight. Presente y futuro

OpiniónDocumentos o ejecutables

Page 2: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones
Page 3: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Bienvenido al número 43, de diciembre de2007, de dotNetManía.

La cuenta atrás terminó y Visual Studio2008 está listo para su fabricación (Ready ToManufacture, que dicen los anglosajones).Ésta es ya la versión final, descargable porlos suscriptores de MSDN, aunque tambiénexisten versiones de evaluación y Expresspara el resto de clientes. Ahora toca rumo-rear sobre la próxima versión, de la que que-da la duda de si tendrá finalmente el codena-me Hawaii, como se dijo en un principio.Aunque aún nos queda lejos —supuesta-mente hasta 2010 ó 2011—, nos podrían darun codename fiable pronto, porque si no ¿dequé vamos a hablar?, ¿de la innombrablenueva versión de Visual Studio? Una isla olo que prefieran, pero ¡dennos un codename,por favor!

Lo que sí tiene nombre fiable es lanueva editorial de tecnologías Microsoftque acaba de nacer en España: KrasisPress. Esto es una magnífica noticia paratodos los lectores castellano-hablantes.En nombre de todo el equipo de dot-NetManía quiero desearles la mejor delas suertes. Ya tienen tres libros y pron-to aparecerán más. Los tres han sidoescritos por amigos de esta casa: JoséManuel Alarcón (el padre de la criatu-ra), Octavio Hernández, editor técnicode dotNetManía y Unai Zorrilla, cola-borar habitual de esta revista.

Este mes entrevistamos a una viejaconocida nuestra: Catherine Heller,Technical Evangelist de Microsoft Corp.,a la que Marino Posadas ya entrevistó en2003 en el Ave Fénix (www.elavefenix.com).Medio española, medio americana, Cat-herine empezó su carrera profesional enMicrosoft Ibérica y lleva ya unos cuantosaños desarrollando su actividad en Red-mond. Actualmente está trabajando jun-to al equipo de Windows Live.

El artículo de portada de este mes setitula “El evento CellPainting del controlDataGridView. Vía libre a la creatividad”.Si quiere lograr efectos avanzados y unmayor control sobre el proceso de dibu-jo de las celdas, debe utilizar de formaconjunta el evento CellPainting y las cla-ses de GDI+. Luis Miguel Blanco se loexplica con todo lujo de detalles, comosiempre.

Entre nuestros asuntos pendientes,Javier Roldán termina la miniserie deartículos dedicada al reconocimiento deescritura manual con Tablet PC SDK,mientras que Alberto Población publi-ca el artículo “Más sobre seguridad deacceso a código”, una extensión de suartículo “Seguridad de acceso a código”,publicado en el número 41, de octubrede 2007.

Y aún hay más, por supuesto. Esperoque le guste.

dotN

etM

anía

<<

3

Un codename, por favor

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 43 • Diciembre 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

Krasis

Plain Concepts

Raona

Solid Quality Learning

Además colaboran en este númeroAlberto Población, Daniel Seara, JavierRoldán y Rodrigo Corral.

Corresponsal para América LatinaPablo Tilotta

IlustracionesMascota (Clico): Yamil HernándezPortada: Javier Roldán

FotografíaRoberto Mariscal

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

Edición, suscripciones y publicidad.netalia

c/ Thomas Edison, 4, 1406Parque empresarial Rivas Futura

28521 - 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

Page 4: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

sumario 43Documentos o ejecutables 10-11

La documentación siempre es un aspecto que exige nuestra atención en los proyectos de software. Amenudo tendemos a pensar que la mejor manera de lograr que nuestros proye ctos avancen y podermostrar ese avance es realizando la documentación adecuada, buscando el ciclo adecuado para esadocumen tación y estableciendo una serie de documentos como estándares. Incluso hay meto dologíasbastante populares que se centran en definir qué documentos se deben generar, quién es el respon -sable de cada documento y por qué manos debe pasar cada uno de ellos. ¿Nos olvi damos de que losdocumen tos no se pueden ejecutar? ¿Nos olvidamos de que el propósito final de todo proceso dedesarrollo es conseguir software que funciona?

Entrevista a Catherine Heller 12-14Catherine Heller es española (nacida en Madrid), de padre norteamericano, y con muchos años deestancia en los dos países. En la actualidad, trabaja como evangelista en el grupo de divulgación deWindows Live, en Redmond, y anteriormente lo había hecho en el de Visual Studio Tools for Office.Eso fue antes de pasar en Microsoft Ibérica otra buena parte de su carrera…

Eventos 16-19TechEd 2007: expectación ante un año pleno de novedades, Lanzamiento de Biztalk 2006 R2 yCEUS 2007

Tablet PC SDK (y II). Reconocimiento de escritura manual 20-26En la primera parte de este artículo indicamos el modo de preparar el entorno de desarrollonecesario para la programación de aplicaciones capaces de aceptar tinta digital para más tardereconocerla como escritura manuscrita. Asimismo, utilizamos los principales elementos que para estefin proporciona el Microsoft Windows XP Tablet PC Edition Software Development Kit.

El evento CellPainting del control DataGridView. Vía libre a la creatividad 27-35Cuando presentamos a nuestros usuarios un conjunto de datos mediante el control DataGridView,podemos mejorar la apariencia visual del mismo recurriendo al uso de estilos. No obstante, la merautilización de estilos resulta escasa si nuestras pretensiones pasan por lograr efectos avanzados y unmayor control sobre el proceso de dibujo de las celdas. Es por ello que el empleo combinado del eventoCellPainting, perteneciente a este control, junto al conjunto de clases de GDI+ se va a convertir enun poderoso recurso a nuestro alcance.

Más sobre seguridad de acceso a código 36-39En una entrega anterior (dotNetManía nº 41) presentamos los fundamentos de la Seguridad deacceso a código (Code Access Security, CAS) en .NET Framework, y describimos cómo el CLRdetermina los permisos del código y cómo se pueden manipular desde las herramientasadministrativas los permisos concedidos a cada ensamblado. En esta entrega veremos cómo se puedensolicitar, manipular y limitar estos permisos desde dentro de nuestro código.

Herramientas genéricas para los componentes: ficheros y recursos 40-42Siguiendo con la idea de las generalizaciones en componentes expuesta en el número anterior, en esteartículo veremos algunos otros ejemplos que pueden resultarle interesantes.

Depuración en .NET. El depurador que lo depure... recibirá ayuda del CLR 43-49La depuración es una de esas cosas que todos hacemos, o deberíamos hacer, y que a nadie le gustatener que hacer; no porque no sea necesaria, sino porque al final terminabas fatal de los nervioscuando la depuración la realizabas con versiones anteriores de Visual Studio para .NET; por suerte,esto ya no es así con Visual Studio 2005. En esta serie de dos artículos mostraremos las principalesposibilidades que este último entorno pone a nuestro alcance para facilitarnos la depuración denuestros programas.

dnm.todotnet.qa 50-52Silverlight. Presente y futuro.

dnm.laboratorio.net 53-55ILOG Diagrammer for .NET

dnm.comunidad.net 56

dnm.biblioteca.net 57Microsoft Expression Web Plain & SimpleC# 3.0 y LINQ

dnm.desvan 58

Page 5: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones
Page 6: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

6

noticiasnoticias

noticias

noticias

noticias

Con más de 250 nuevas característi-cas, Visual Studio 2008 incluye mejo-ras significativas en cada una de susediciones, desde Visual StudioExpress hasta Visual Studio TeamSystem. Los desarrolladores de todoslos niveles podrán disponer de unentorno integrado consistente, segu-ro y confiable para desarrollar apli-caciones para las plataformas másactuales: la Web, Windows Vista,Windows Server 2008 y 2007 Offi-ce System.

Visual Studio 2008 habilita lavisión de Microsoft acerca de lasaplicaciones cliente inteligentes,permitiendo a los desarrolladorescrear de manera rápida aplicacio-nes conectadas que ofrezcan lasexperiencias de usuario más ricas yde más alta calidad. Con Visual Stu-

dio 2008, las empresas encontraránmás fácil que nunca capturar y ana-lizar la información para tomardecisiones de negocio correctas.Visual Studio 2008 permitirá a lasempresas de cualquier tamañodesarrollar con una alta producti-vidad aplicaciones más seguras yconfiables que aprovechen las bon-dades de Windows Vista y 2007Office System.

Visual Studio 2008 introduceavances significativos para los desa-rrolladores en tres áreas fundamen-tales:

• Desarrollo rápido de aplica-ciones.

• Colaboración efectiva deequipos.

• Experiencias de usuario avan-zadas.

Visual Studio 2008 ofrece herra-mientas de desarrollo, posibilidadesde depuración y funcionalidades detrabajo con bases de datos avanza-das e innovadoras para facilitar lacreación de aplicaciones de las apli-caciones del mañana para unaamplia variedad de plataformas.Incluye mejoras tales como diseña-dores visuales para un desarrollomás rápido para .NET Framework3.5, mejoras sustanciales en lasherramientas para el desarrollo deaplicaciones Web potenciadas porla tecnología AJAX, y mejoras en loslenguajes de programación (con-cretamente las Consultas integradasen los lenguajes —LINQ—) queaceleran el desarrollo de aplicacio-nes que accedan a datos de cualquiernaturaleza.

Visual Studio 2008 listo para fabricarseEl lunes 19 de noviembre, Microsoft anunció que Visual Studio 2008 y .NET Framework3.5 han pasado a fabricación. Al mismo tiempo, la versión definitiva ha sido puesta adisposición de los suscriptores MSDN para su descarga.

Microsoft ha anunciado reciente-mente una versión actualizada de Sil-verlight 1.1 Tools Alpha que trabajacon la versión final de Visual Studio2008. Éste es un add-on para desa-rrollar aplicaciones Silverlight usan-do los lenguajes de .NET.

Esta versión tiene las mismas carac-terísticas que el add-on de SilverlightTools Alpha que estaba disponible pre-viamente para la beta 2 de Visual Stu-dio 2008; simplemente ha sido actua-lizada para trabajar con la versión finalde Visual Studio 2008. Estas carac-terísticas incluyen plantillas para loslenguajes .NET, así como intellisenseen code-behind, edición y generaciónde código XAML, soporte de depura-

ción y compatibilidad eintegración con pro-yectos ExpressionBlend.

La próxima previewde Silverlight sí incluirámuchas nuevas carac-terísticas, así como sig-nificativas mejoras.

Puede encontrartutoriales quickstartque detallan cómo uti-lizar estas característi-cas aquí: http://silver-light.net/QuickStarts/Start.

Puede descargar el add-on desde:http://www.microsoft.com/downlo-ads/details.aspx?FamilyId=25144C27-

6514-4AD4-8BCB-E2E051416E03&displaylang=en.

Más información : http://weblogs.asp.net/scottgu.

Silverlight 1.1 Tools Alpha para Visual Studio 2008 disponible para descarga

Page 7: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Los desarrolladores podrán aprove-char todos esos marcos de trabajo tantopara el lado del cliente como para el ladodel servidor para crear aplicaciones Webcentradas en el cliente que se integren concualquier proveedor de datos en el servi-dor, se ejecuten bajo cualquier navegadory tengan acceso total a los servicios deASP.NET y a la plataforma Microsoft.

Desarrollo rápido de aplicaciones

Para ayudar a los desarrolladores a crearsoftware moderno, Visual Studio 2008ofrece nuevas características de acceso adatos como LINQ, que harán más senci-llo el desarrollo de aplicaciones capacesde analizar información y tomar decisio-nes a los programadores individuales.

Visual Studio 2008 ofrece además laposibilidad de generar código para dife-rentes versiones de .NET Frameworkdesde dentro del propio entorno. Losdesarrolladores podrán crear aplicacionespara .NET Framework 2.0, 3.0 ó 3.5, porlo que podrán dar soporte a una amplia

gama de proyectos desde el mismo entor-no integrado.

Experiencia de usuario revolucionaria

Visual Studio 2008 ofrece a los desarro-lladores nuevas herramientas que acele-ran la creación de aplicaciones conecta-das que funcionen sobre las plataformasmás reciente, incluyendo la Web, Win-dows Vista, Office 2007, SQL Server 2008y Windows Server 2008. Para la Web,ASP.NET AJAX y otras nuevas tecno-logías permitirán a los desarrolladores cre-ar una nueva generación de experienciaseficientes, interactivas y personalizadas.

Colaboración efectiva de equipos

Visual Studio 2008 ofrece característicasexpandidas que ayudan a mejorar la cola-boración en los equipos de desarrollo,incluyendo herramientas que ayudan aintegrar a los profesionales de bases dedatos y los diseñadores gráficos en el pro-ceso de desarrollo.

Utilizar Microsoft .NET Framework 3.5

.NET Framework 3.5 habilita el desa-rrollo de aplicaciones conectadas queofrezcan experiencias de usuarioimpactantes, ofreciendo los bloquesprefabricados para resolver problemasde programación comunes. .NET Fra-mework 3.5 ha sido creado incremen-talmente a partir de .NET Framework3.0, incluyendo múltiples novedadesy mejoras en áreas como la librería declases base, Windows WorkflowFoundation, Windows Communica-tion Foundation, Windows Presenta-tion Foundation y Windows Card -Space.

Conjuntamente, Visual Studio y.NET Framework reducen la necesi-dad de escribir código de bajo nivel,reduciendo el tiempo de desarrollo ypermitiendo a los desarrolladores con-centrarse en resolver sus problemasde negocio.

Puede descargarlo desde: http://msdn.microsoft.com/subscriptions.

dotN

etM

anía

<<

7

El SDK de Visual Studio 2008 (versión 1.0)incluye herramientas, documentación y ejem-plos para permitir a los desarrolladores crear,probar y desplegar extensiones de Visual Stu-dio 2008. También se puede utilizar el SDKpara crear entornos integrados personalizadosbasados en el nuevo Visual Studio 2008 Shell.

Estos productos abren una nueva era en laextensibilidad de Visual Studio. Los desarro-lladores podrán a partir de ahora utilizar elSDK no solo para crear aplicaciones que extien-dan a Visual Studio, sino además para distri-buir herramientas y aplicaciones libres de royal-ties.

El modo aislado de VS 2008 ShellEl modo aislado de Visual Studio Shell ofrecelos fundamentos sobre los cuales los desarro-

lladores pueden crear sus propios entornosintegrados que funcionen en paralelo conVisual Studio. Utilizar este modo permitiráacelerar el desarrollo de herramientas de desa-rrollo propias, ya que será posible aprovecharel núcleo del entorno integrado de Visual Stu-dio y concentrarse en los problemas específi-cos de la herramienta en desarrollo.

El modo integrado de VS 2008 ShellEl modo integrado de Visual Studio Shell ofre-ce los fundamentos sobre los cuales los desa-rrolladores pueden integrar sus propias herra-mientas y lenguajes de programación dentro deVisual Studio. El shell de modo integrado nocontiene ningún lenguaje de programación, porlo que constituye la base perfecta para desple-gar un entorno de desarrollo para un lenguaje

propio. Cualquier herramienta o lenguaje quese ejecute dentro de Visual Studio Shell enmodo integrado ejecutará conjuntamente conVisual Studio 2008 (Estándar o superior) si ésteestá instalado en la misma máquina. Utilizareste modo hará posible que Visual Studio nosea un prerrequisito en las máquinas de los usua-rios que utilicen la herramienta o lenguaje.

Novedades clave en el VS 2008 SDK• Soporte de desarrollo para VS Shell.• Mejoras en DSL Tools.• Soporte de desarrollo y pruebas para

paquetes de extensión de Visual Studio enC++, C# y Visual Basic.

• Nuevos ejemplos y documentación endiversas áreas.

• Soporte para Windows Vista.

Liberado Microsoft Visual Studio 2008 SDK 1.0Conjuntamente con la salida de Visual Studio 2008, Microsoft ha puesto a disposición de los usuariosel SDK de Visual Studio 2008, así como los redistribuibles del nuevo Visual Studio 2008 Shell.

Page 8: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Feed your brain (alimenta tu cerebro)es la frase elegida como eslogan de unanueva editorial: Krasis Press, querecientemente presentó su nuevo pro-yecto especializado en tecnologíasMicrosoft en la sede de Microsoft Ibé-rica, en Madrid, sumándose así a Neta-lia –editora de esta revista– en la edi-ción de este tipo de contenidos.

Nacida hace siete años, Krasis es unpartner de Microsoft en desarrollo deproductos Web y formación. La edito-rial nace a raíz de una de sus áreas deactividad, campusMVP, iniciativa enformación online cuyo factor diferenciales que todos los cursos son creados ytutelados por MVP (Most Valuable Pro-fessional). MVP es un galardón queMicrosoft concede anualmente a losprofesionales más destacados de cada

país. Actualmente hay 12 MVP españo-les integrados en este proyecto.

Krasis Press nace para paliar la fal-ta de información sobre tecnologías muynuevas y el exceso en las más maduras,y como alternativa a la poca variedad delibros especializados.

Con distribución nacional, ventadirecta a través de www.krasis.com ywww.dotnetmania.com y venta cruzadacon los cursos, Krasis está en nego-ciaciones para la comercialización enLationoamérica y EEUU en castella-no. La compañía prepara además tra-ducciones al inglés para la venta enEEUU a través de Amazon. En laactualidad cuenta con tres obras en elmercado: “Modelando procesos denegocio con Workflow Foundation”,de Unai Zorrilla Castro; “C# 3.0 y

LINQ”, de Octavio Hernández Lealy “Programación Web con Visual Stu-dio y ASP.NET 2.0”, de José ManuelAlarcón Aguín.

Dirigidas a programadores, personasinteresadas en la tecnología, centros acadé-micos o de formación y universidades, sepresentan en edición de lujo, en tapa duray con distintivas frutas en sus portadas,que se corresponden con el lema de suproyecto educativo: Feed your brain.

dotN

etM

anía

<<

8

dnm.directo.noticias<<

Alhambra-Eidos lanza sus cursosde diciembreAlhambra-Eidos, empresa especializada enfacilitar soluciones a las necesidades empresa-riales en el ámbito de las Tecnologías de laInformación y las Comunicaciones, lanza paradiciembre su calendario de formación técni-ca dirigida a profesionales.

En formato blended, que combina la for-mación presencial tradicional con los avancesde la variedad online, Alhambra-Eidos ha pro-gramado las siguientes sesiones formativas parael mes de noviembre:

Del 10 al 19 de diciembre de 2007• Sharepoint Services y MOSS 2007• Seguridad en redes Cisco

Del 11 al 20 de diciembre de 2007• MCTS SQL 2005

Las horas presenciales se impartirán en lasaulas de:

Alhambra-Eidos

c/Albasanz, 16 (Madrid)

Para más información, contacte conAlhambra-Eidos en el teléfono 902 313 505o visite la Web: www.alhambra-eidos.es

Cursos diciembre 2007

Esta edición de SQL Server 2008 traeuna cantidad significativa de nuevasfuncionalidades, incluyendo compati-bilidad con Windows Vista y Win-dows Server 2008, así como nuevascaracterísticas como Resource Gover-nor, Backup Compression y Transpa-rent Data Encryption. Esta CTP tam-bién incluye nuevas mejoras en el áreade Business Intelligence tales comoDesign Alerts, Block Computation,Enhaced Report Designer con nuevasvisualizaciones e integración con 2007Microsoft Office System.

Ésta también es la primera CTP queayuda a los clientes a cargar y consumircualquier tipo de datos, incluyendo elnuevo tipo FileStream para documen-tos no estructurados, y que ofrecesoporte para el almacenamiento de datosgeoespaciales, que puedan ser utiliza-dos por aplicaciones de localización enel espacio.

Compañías como Barrodale Compu-ting Services (BCS) Ltd., EnvironmentalSystems Research Institute Inc., I.S. Con-sulting Inc., Manifold y SpatialPoint hananunciado su intención de sacar aplica-ciones con el soporte de datos geoespa-ciales en SQL Server 2008.

Para recibir recursos de SQL Server2008 específicamente seleccionados paraprofesionales TI, vaya a http://go.micro-soft.com/fwlink/?LinkID=103187 y paradesarrolladores, vaya a http://go.micro-soft.com/fwlink/?LinkIsD=103186.

Puede probar también la versión CTPde SQL Server 2008 Express Edition. Esuna edición de SQL Server 2008 gratui-ta y totalmente funcional. SQL Server2008 Express soporta 1 CPU, 1 Gb deRAM y bases de datos de hasta 4Gb.

Puede descargarse desde: http://www.microsoft.com/downloads/details.aspx?Famil-yId=3BF4C5CA-B905-4EBC-8901-1D4C1D1DA884&displaylang=en.

Microsoft SQL Server 2008 CTP de noviembreMicrosoft anunció en el pasado TechEd IT de Barcelona la nuevaCTP (Community Technical Preview) de noviembre de SQLServer 2008, la penúltima antes de la versión RTM (Ready ToManufacture).

Feed your brain

Page 9: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones
Page 10: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

de la documentación que mantenemos durante el desa-rrollo solo un pequeño porcentaje tiene valor para el cliente. Es cier-to que habitualmente hemos de entregar cierta documentación, manua-les de operación, de administración o de usuario; esta documentacióntiene un claro valor. Este tipo de documentación se debe tratar comocualquier otro entregable. En el fondo, ésta es la única documentaciónque es realmente imprescindible, la que el destinatario del softwarenecesita, aquella por la que, hipotéticamente, estaría dispuesto a pagar.Minimizar la documentación que no aporta nada a nuestros clientes,que solo sirve para soportar nuestro proceso de desarrollo, y sobretodo el coste de mantenerla, debe ser uno de nuestros objetivos.

El avance de los proyectos de software es algo que siempre ha preo-cupado a todos los implicados en los mismos. Es algo sobre los que nues-tros clientes centran su interés y algo que, como gestores de proyectos,necesitamos comunicar. Tradicionalmente hemos abordado esta necesi-dad de mostrar el progreso mediante el uso de diferentes documentos oartefactos. Todos los que hemos tenido que mantener actualizado “el pro-ject” del proyecto sabemos lo difícil que esto es. Es tan difícil, que rara vezse hace con la disciplina que requiere, de tal modo que habitualmente estetipo de aproximación no proporciona los resultados esperados.

El enfoque tradicional de mostrar el avance de los proyectos median-te documentos es algo que no funciona bien. Nuestros clientes han des-cubierto que los documentos rara vez nos muestran el avance real de unproyecto. Es muy posible haber trabajado mucho y tener una gran canti-dad de documentación sobre un proyecto y estar a años luz de que quienfinancia el proyecto pueda obtener valor. ¿Quién no conoce algún pro-yecto en el que tras muchos meses de desarrollo lo único que había es unmontón de documentos? Los documentos por sí mismos no aportan ningúnretorno de la inversión. No se puede hacer nada para obtener valorpara tu negocio solamente con la documentación relacionada con unproyecto de software. Solo el software que pueden ejecutar y utili-zar es susceptible de crear valor para nuestros clientes. Solo el soft-ware que funciona debe ser la medida del progreso de los proyectosde desarrollo. Asumir esto nos obliga a asumir que tendremos que entre-

Documentos o ejecutables

<< A menudo,

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. Además,

Rodrigo es tutor decampusMVP. Su blog es

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

La documentación siempre esun aspecto que exige nuestraatención en los proyectos desoftware. A menudotendemos a pensar que lamejor manera de lograr quenuestros proye ctos avancen ypoder mostrar ese avance esrealizando la documentaciónadecuada, buscando el cicloadecuado para esa documen -tación y estableciendo unaserie de documentos comoestándares. Incluso hay meto -dologías bastante popularesque se centran en definir quédocumentos se debengenerar, quién es el respon -sable de cada documento ypor qué manos debe pasarcada uno de ellos. ¿Nos olvi -damos de que los documen -tos no se pueden ejecutar?¿Nos olvidamos de que elpropósito final de todoproceso de desarrollo esconseguir software quefunciona?

opinión

Rodrigo Corral

Page 11: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

gar software con frecuencia a nuestros clientes,que tendremos que reaccionar de manera ágil alfeedback que nos proporcionen y que a cambio ellosobtendrán de manera temprana un retorno parasu inversión.

Debemos ser muy tacaños con el esfuerzo queponemos en nuestra documentación; si no, corre-mos el riesgo de ver que todos aquellos requisi-tos, por poner un ejemplo, que tan detalladamentedocumentamos sobre el sistema de gestión quenuestro cliente quiere, son papel mojado porquehan comprado una nueva unidad de negocios. Ynosotros ya hemos hecho un gasto del que difí-cilmente obtendremos algún retorno. La docu-mentación en los proyectos de software pierde su relevancia yse queda obsoleta muy rápidamente, haciendo que mantener-la actualizada sea muy costoso. A menudo cometemos el errorde tratar de sustituir la comunicación fluida por documenta-ción, y cuando hacemos esto, estamos introduciendo costes einflexibilidades en nuestro proceso de desarrollo.

Otro aspecto del desarrollo de software que nos lleva agenerar documentación es la necesidad de mantener los siste-mas que desarrollamos. Se suele pensar que la documentacióndetallada del sistema nos va a evitar un montón de quebrade-ros de cabeza. Pero esto solo es cierto si esa documentacióncumple la premisa de estar actualizada. Cuando un desarro-llador encuentra una línea en la documentación que no escorrecta o no está actualizada, rápidamente pierde la confian-za y vuelve su vista a la única fuente de verdad absoluta: el códi-go fuente. Esto nos lleva a la situación de que solo la docu-mentación que se genera directamente desde el código fuen-te de manera automatizada tiene verdadero valor.

El código es la única fuente de verdad absoluta sobre unproyecto de software a nivel de detalle, y el nivel de detalle esel único útil para modificar, extender o mantener un sistema enproducción. La documentación directamente asociada al códi-go fuente o embebida en él (comentarios que permitan gene-rar documentación, por ejemplo, con NDoc, JDoc o simila-res) o aquella que se genera de manera automática desde el mis-mo (por ejemplo, diagramas de clases que solo son otra vistadel código) es la que más valor tiene, pues evoluciona y se man-tiene en paralelo al código fuente y siempre está actualizada.

Otra documentación que no está directamente relaciona-da con el código fuente y que es de gran utilidad, si no impres-cindible, es la relativa a arquitectura. Es necesario que un nue-vo desarrollador o aquel que resucita el proyecto tras un tiem-po puedan comprender qué decisiones de alto nivel guiaronel desarrollo. Esta documentación sirve para comprender porqué se tomaron determinadas decisiones que no se cambiancon facilidad a lo largo del proyecto y proporciona una pri-mera aproximación de alto nivel. La arquitectura de una apli-cación no suele cambiar a menudo; lo que cambia más fre-cuentemente es la implementación, el código. Esta documen-tación es simple de mantener, porque es mucho más estáticaque la de diseño detallado.

A menudo nos centramos en documentar olvidando quela principal fuente de información sobre qué hace una piezade software está en el nombre de los componentes, de las cla-ses y de las funciones. La principal documentación con laque contamos es el estilo de nomenclatura, la coherenciaa la hora de nombrar cosas y una arquitectura generalcoherente. Establecer un lenguaje común, la nomencla-tura y el estilo que va a guiar del desarrollo es más valio-so que cualquier documentación. Mucha documentaciónpuede emanar de una serie de patrones que se repiten a lo lar-go del proyecto, tanto a nivel arquitectónico como de diseño,y estos patrones donde viven es en el código.

Buscando valor para el cliente, cada vez más proyectosdeciden mantener una base de conocimiento sobre nuestroproyecto, basada en artículos cortos y con ejemplos, tipoknowledge base, sobre los que se pueda realizar búsquedasfácilmente. Por eso se están popularizando tanto como repo-sitorios de información sobre proyectos los wikis: no impo-nen una estructura, son ágiles de mantener, fácilmente actua-lizables, fácilmente buscables y soportan muchos tipos dife-rentes de contenido.

También se tiende cada vez más a sustituir la docu-mentación por la refactorización: si una pieza de softwarees compleja, tenemos dos posibles estrategias a la hora dehacerla entendible. La primera es documentarla; la segun-da es, a base de refactorización y de mejorar el diseño, sim-plificarla para hacerla más clara. Se puede ganar mucho enla legibilidad de nuestro software simplemente eligiendobuenos nombres, evitando las funciones enormes, limpian-do las variables no utilizadas… La ventaja de este enfoquees que mejora objetivamente el software, haciéndolo másmantenible y más claro, sin necesidad de un artefacto exter-no que puede fácilmente quedar desactualizado.

Antes de escribir cualquier documentación debemospreguntarnos varias cosas: ¿Es realmente imprescindible?¿Será fácil de mantener? ¿Aporta algún valor claro paranuestro cliente?

El manifiesto ágil resume lo aquí expuesto de la siguien-te manera: “El software que funciona es más importante quela documentación exhaustiva”. El desarrollo de software vasobre código fuente y ejecutables, no sobre documentos.

dotN

etM

anía

<<

11

dnm.opinión<<

Solo el software que pueden ejecutar y utilizares susceptible de crear valor para nuestros clientes.Solo el software que funciona debe ser la medida delprogreso de los proyectos de desarrollo

Page 12: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Marino Posadas

Marino Posadases director de tec-nologías de desa-

rrollo para Españay Portugal de Solid

Quality Learning.Puedes leer su blog

en http://www.elavefenix.net.

entrevista

entrevista a Catherine HellerCatherine Heller es española (nacida en Madrid)de padre norteamericano, y con muchos añosde estancia en los dos países. En la actualidad,trabaja como evangelista de Windows Live, enRedmond, y anteriormente, de Visual StudioTools for Office. Eso fue después de pasar enMicrosoft Ibérica otra buena parte de sucarrera…

Cuéntanos tu trayectoria anterior enMicrosoft Ibérica y –para los que yate conocemos y te vimos marchar-,qué haces ahora en EE.UU.

Yo empecé en Microsoft, en España,en el año 2000, como Aplication Deve-lopment Consultant, y trabajaba con losISV en España y les ayudaba a crear suplanificación y arquitectura usando tec-nologías de Microsoft. En el 2003 mesalió la oportunidad de ir como Tech-nical Evangelist a un grupo en Micro-soft Corporation en Redmond. Mi pri-mer TechEd aquí en Barcelona fue jus-to antes de trasladarme a Redmond.

Page 13: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

He seguido todo este tiempo comoevangelista, pero cambiando entre pro-ductos. Me pasé dos años enfocada enWhidbey (concretamente en el área deVisual Studio Tools for Office), lo quefue muy interesante, porque anterior-mente había sido especialista en servi-cios Web, en middle tier, en remoting,COM+…

Especialmente sabiendo que vie-nes de un background de C++…

Sí, había sido desarrolladora de C++10 años antes de venir a Microsoft…Fue muy interesante ver el desarrollo

desde el punto de vista del desarrolla-dor de Office y la posibilidad de escri-bir código para Office desde .NET enC# y Visual Basic. Con Visual Studio2005 en el mercado, me cambié a Win-dows Vista. En esa época todo el mun-do hablaba de Indigo y Avalon, pero yome puse a mirar las API nativas, querealmente es lo que venía como partedel sistema operativo. Fue un año ymedio interesante, volviendo a mis orí-genes de C++ y COM, pero tambiénanalizando cómo se podían aprovecharesas API nativas desde .NET, y los retospara acceder a ellas. Ya en enero, cuan-do lanzamos Windows Vista, me cam-bié a un mundo totalmente diferente,como es Windows Live.

Respecto a ese año y medio deanálisis de las API nativas de Vista,

¿qué resumen das a los lectores dela revista de cara a aprovechar esepotencial?

En el TechEd de noviembre del añopasado di una charla sobre Windows Vis-ta y las áreas en las que yo me centré,sobre todo Desktop Search. Hay unamanera muy sencilla de poder incorpo-rar búsquedas utilizando el índice deldesktop, utilizando OLE DB Provider forWindows Search, y eso se utiliza muyfácilmente desde ADO.NET y está biendocumentado. Es un proveedor algoespecial, dado que es de solo lectura.

Pero hay toda una infraestructura paraquienes quieran integrar sus datos den-tro del índice, algo más complicada, yaque hablamos de tener que implemen-tar interfaces COM desde C++.

Pero el 99,9% de las veces lo quenecesitas es leer, no escribir…

Sí, leer es muy fácil. Cuando es máscomplicado y se requiere un nivel téc-nico mayor es, por ejemplo, cuandotenemos un formato de archivo propioy queremos indexar su contenido, o siqueremos que el contenido del archivoo de ese tipo de archivos se integren enla experiencia visual del explorador. Porejemplo, los Live Icons: ver la imagenallí, o poderla ver en la vista de pre-sentación preliminar, o poder permitirque el usuario le asigne propiedades alarchivo… todo esto requiere imple-

mentar interfaces COM. Pero es facti-ble, y también me dediqué a ayudar alos ISV en ese aspecto.

También me centré en cosas comoayudar a los desarrolladores a conocer elimpacto de User Account Control (UAC)sobre sus aplicaciones, porque es una penaver cuántos lo deshabilitan cuando es unmecanismo muy importante para el usua-rio. Y realmente tampoco es tan compli-cado tener una aplicación que funcionebien con UAC. Es más bien conocer unpoco el manifiesto que hay que embebery resulta sencillo.

Y de ahí pasaste a Windows Livey su parte programática…

La primera cosa importante aentender sobre Windows Live es quees una oferta para el consumidor, notanto para la empresa, salvo si ésta quie-re integrarlo en sus portales Web diri-gidos a usuarios finales. Gran parte dela oferta hoy sí va dirigida al usuariofinal. Estamos empezando a evolucio-nar hacia una plataforma, y tenemosuna serie de ofertas para el desarrolla-dor que, si bien no abarcan todavía elabanico de ofertas para el usuario final,son muy interesantes.

Uno de los nuevos servicios quesacamos en versión alfa en abril se lla-ma Silverlight Streaming by Win-dows Live. Es interesante porque esun servicio que hemos introducido

dotN

etM

anía

<<

13

dnm.directo.entrevista<<

Catherine Heller junto a Marino Posadas

Page 14: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

14

dnm.directo.entrevista<<

directamente a nivel de plataforma, nohay una oferta correspondiente para elusuario final. Se entiende que esto vadirigido al desarrollador. Es un servi-cio que complementa las aplicacionesSilverlight. Cuando vayamos creandoaplicaciones Silverlight que sean muyricas en elementos multimedia, que ten-gan vídeo, que tengan fotos, imágenes,esas aplicaciones podrán hacer uso delservicio de Silverlight Streaming.

O sea, lo que es ahora la ofertade Silverlight 1.0, porque en la 1.1cambian muchas cosas…

Sí, pero esto vale tanto para Silver-light 1.0 como para 1.1, porque no afec-ta directamente esa API de programa-ción sino que se crea un paquete, seincluyen todos los archivos de la apli-cación, se crea un ZIP y se publica, ose sube ese paquete al servicio. Una vezallí, lo que se hace es proporcionar unaexperiencia de reproducción en unapágina Web, con la ventaja que esa apli-cación se distribuye a lo largo de todanuestra red de entrega de contenido(CDN, Content Delivery Network). Conesto, los elementos pesados están en ellímite más cercano al usuario y no nece-sariamente en servidores centrales quepueden estar ubicados muy lejos.Además, tareas como el streaming devídeo suelen requerir muchos recursosde hardware. Todo este trabajo duro lohace el propio servicio. Y es una ofer-ta muy interesante porque damos has-ta 4Gb de espacio totalmente gratuito,y hasta que la versión definitiva del ser-vicio salga a la luz (mientras estemos enalfa y beta), no hay ningún tipo de lími-te en el uso que se haga de él, es total-mente gratuito. Una vez que lo ponga-mos en producción pues sí se cobrará,pero solo a partir de un millón de minu-tos de streaming al mes. Tenemos elumbral muy alto, muy generoso…

Para evitar excesos, simplemen-te, pero para que los usuarios “nor-males” puedan usarlo sin pagar…

Bueno, esto refleja el objetivo quetenemos con los términos de uso engeneral para los servicios de Silver-

light de plataforma. Queremos defi-nir unos umbrales de uso muy gene-rosos y permitir que por debajo de eseumbral el uso sea gratuito. Y en algúnmomento financiaremos eso a travésde anuncios. Luego queremos tam-bién ofrecer un modelo para que porencima de ese umbral se pueda pagar,bien por usuario, o por transacción,o por minuto, dependiendo del ser-vicio o por algún tipo de comparti-ción de ingresos por anuncios; esa esla idea que tenemos detrás de estosservicios.

También estamos haciendo unaapuesta muy importante respecto a lasfotografías almacenadas en WindowsLive Spaces. Ahora mismo hay 4 milmillones de fotografías almacenadas.Baste pensar que los usuarios –demedia– suben unos 8 millones de foto-grafías todos los días en todo el mun-do. Vemos dónde se está haciendo unuso muy importante de Spaces: publi-car y compartir fotografías. Lo buenoque tiene Spaces es que se puede cre-ar un space y limitar a que solo tu fami-lia, tus amigos o quien tú decidas acce-da a él. Estamos invirtiendo muchopara hacer que Spaces sea un sitio idó-neo para guardar fotografías, para cre-ar experiencias de usuario como Win-dows Live Photo Gallery, que acaba-mos de sacar y que tiene una expe-riencia rica en el cliente para manipu-

lar, personalizar tus fotos, etc. y desdeallí subirlas directamente a tu space.Una vez en el space, el desarrolladorpuede integrar esas fotografías o expe-riencias que los usuarios ya han subi-do a su space, pues hay muchos tiposde experiencias que incorporan esasfotografías de manera muy interesan-te. Allí estamos potenciando manerasfáciles de acceso, como puede ser conun control Javascript que pongas enuna página y permita al usuario selec-cionar fotos o feeds RSS, o una API quepermite subir fotos, borrarlas, etc.Queremos extender la experiencia deesas fotografías a otros sitios Web, aotras aplicaciones.

Bueno, para finalizar, para el quequiera programar alguna cosa conWindows Live ¿cuáles serían los pri-meros pasos a dar?

Lo primero, desde luego, es ir alsitio Web, que es http://dev.live.com.Ese es el sitio para toda la informa-ción relacionada con el desarrollo uti-lizando los servicios de Windows Live.Allí se enlaza a la documentaciónMSDN y se ofrecen aplicaciones (lasQuick Applications) que demuestrancómo combinar varios servicios. EnCodePlex está el código fuente dis-ponible y se puede participar en esacomunidad para extender esas aplica-ciones, y hay muchas más ofertas paradesarrolladores.

Page 15: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

si no lo tienes claro...

La revista para la Gestión del Rendimiento www.gestiondelrendimiento.com

GRGestión del Rendimiento

La revista de la

d

Cuando tomamos decisiones,necesitamos información; esainformación nos ayuda a ges-tionar mejor los procesos denuestras organizaciones y a sermás competitivos, dándonosmejores posibilidades de super-vivencia en el corto, medio ylargo plazo. Aproximadamenteel noventa por ciento de lainformación que necesitamosestá dentro de nuestra propiaorganización, pero por desgra-cia la dispersión de la informa-ción (múltiples fuentes dedatos, múltiples formatos, cali-dad del dato mostrado, etc.)hace que solo el treinta porciento esté accesible en el for-mato y en el tiempo adecuado;el resto son datos por tratar oinformación no estructurada...

Page 16: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Quien más quien menos tenía la idea de que larecién concluida edición del TechEd 2007 en Bar-celona iba a ser la antesala de las innovaciones quese esperan para el 2008: Windows Server 2008,Visual Studio 2008 (cuya disponibilidad final seanunció durante el evento), SQL Server 2008, Sil-verlight, etc. Y así fue. Tuvimos ocasión de asistira excelentes sesiones (las hubo de todas clases), abrirlos ojos a nuevas tecnologías y como siempre, com-partir con una comunidad cada vez más activa.

Fue Soma Somasegar (vicepresidente corpo-rativo de la División de Desarrollo) el encargadoeste año de abrir las sesiones con una keynote enla que fue introduciendo la mayor parte de lasnovedades que se espera vayan apareciendo des-de ahora hasta finales de 2008 (o hasta el siguien-te TechEd, que repetirá ubicación en Barcelona).Ayudado por Tony Goodhew y Dan Fernandezen las presentaciones, fue desglosando uno a unolos elementos clave de cada producto y presen-tando un ecosistema cada vez más integrado, máscolaborador con su entorno, más fácil de usar: elmantra habitual que oímos en muchas presenta-ciones y que Gates trata por todos los medios de

mantener, como clave del éxito de la compañía.A partir de ahí, la marabunta… ¡hasta 15

sesiones simultáneas! Siendo grande el foro quealojó el evento, se tuvieron que habilitar doszonas exteriores cubiertas para dar cabida a lagran cantidad de ponentes que se dieron cita esteaño. Y además de las sesiones estándar, estabanlas interactivas (en las que el usuario puede inte-rrumpir al ponente con sus preguntas desde elprincipio), que en esta edición tuvieron más éxi-

to que nunca. Se presenta un tema (normalmen-te el mismo que el ponente ha expuesto en unasesión estándar), y se debate en profundidad dis-cutiendo y aportando cada espectador sus mie-dos o experiencias en la implementación. En lafoto adjunta, vemos a Francisco González deSolid Quality Mentors, único ponente españoljunto a Catherine Heller, atender al público alfinal de su sesión interactiva.

Afortunadamente, los asistentes al evento reci-biremos un “post-conference DVD” con todo elcontenido de las ponencias grabado en vídeo jun-to a las presentaciones PowerPoint y código fuen-te. Por suerte, otra novedad de este TechEd con-

TechEd 2007: expectaciónante un año pleno de novedades

eventos

<<

Marino Posadas

Marino Posadas es director de tec-

nologías de desarro-llo para España yPortugal de SolidQuality Learning.

Puedes leer su blogen http://www.elavefenix.net.

Somasegar, durante la keynote

Page 17: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

sistió en que desde la semana poste-rior al evento no tenemos que esperarla llegada del DVD para ver las sesio-nes que nos perdimos, ya que puedenverse online desde la página Web deTechEd Europa (http://www.msevent-seurope.com/TechEd/Developers).

Pero había muchas otras formas decolaboración: la sección Ask The Expertscontaba con mucha más presencia (elpúblico votó masivamente a favor de estainiciativa), se habilitaron –como siem-pre– zonas wireless (Delegate Work Areay Communications Network) donde elpersonal podía atender sus urgencias cor-porativas, y la zona de Exhibitors esta-ba como siempre, llena de curiosos porver las ofertas de compañías de terceros,que este año contaban incluso con unatienda de ropa con distintos logos deproductos Microsoft.

Hubo muchos confe-renciantes distinguidos,pero lo mejor es que tuvi-mos oportunidad de entre-vistar a 8 de ellos para dot-NetManía. Ha blamos conauténticos clásicos de la tec-nología Microsoft, comoTed Pattison (Presidentede Ted Pattison Group yconocido autor del mundoCOM), Pat Helland(coautor de MTS y arqui-

tecto de SQL Server 2000/2005, quedio un auténtico espectáculo en sus pre-sentaciones sobre filosofía del softwa-re), o Jesse Liberty, quien, reciente-mente fichado por la compañía, se haconvertido en el alma evangelizado-ra de Silverlight en Redmond. Tam-bién estuvimos con otros evangelis-tas, como la española (de padre nor-teamericano) Catherine Heller, quededica sus esfuerzos actuales a ladivulgación de Windows Live, JoeMarini, Program Manager del equi-po de extensibilidad de Visual Studio,Dan Fernandez, Lead ProductManager de herramientas comoPopFly o Visual Studio Express y jefede Arturo Toledo, otro de nuestrosentrevistados (ver dotNetManía nº40) y Damir Tomicic, Presidente deINETA Group Europe.

¿Falta uno? Sí. Falta mencionar laque fue –quizás– mi entrevista favoritade este año, con Don Syme, de Micro-soft Research (Cambridge), arquitectoprincipal del lenguaje funcional F#, quese incorpora de pleno derecho a la fami-lia de lenguajes soportados por VisualStudio en la siguiente versión, y que ofre-ce unas características para el cálculomatemático como no habíamos visto has-ta ahora. Don es un tipo muy accesible,y nos estuvo enseñando in situ, con supropio portátil, algunas de las carac-

terísticas más sobresalientes de este nue-vo miembro de la familia .NET.

Iremos publicando estas entrevistasen los próximos números de la revista.

También hubo lugar para el espar-cimiento, tanto en la zona XBox comodespués de las jornadas, con cenas parala comunidad MVP española, dirigidapor Cristina González Herrero, paralas comunidades nacionales por países,y para certificados Microsoft, dondehizo de anfitriona Karen Young,EMEA MVP Regional Manager.

Un TechEd, en suma, más intimista(sin la super-fiesta final del jueves), máscentrado en el trabajo, con un altísimonivel de sesiones, y donde pudimos con-tactar más directamente que nunca conaquellos que están haciendo y presen-tando el software que todos queremos uti-lizar en el inmediato futuro.

dotN

etM

anía

<<

17

dnm.directo.eventos<<

Francisco González, único ponente de una compañíaespañola (Solid Quality Mentors)

Hall principal de expositores y zonas comunes Don Syme nos explica -en su demo de F#– la potencia del lenguajeen cálculo matricial

Page 18: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

18

dnm.directo.eventos<<

La verdad es que desde el principio lacosa prometía. Pónganse en situación:Museo Thyssen de Madrid, un eventode todo un día dedicado exclusivamen-te a Biztalk, un montón de buenas refe-rencias de implantaciones Biztalk ver-ticalizadas en 3 grupos (banca y segu-ros, industria y sector público), charlastécnicas focalizadas en las novedades deesta revisión de Biztalk, raona comoPartner Platinum presentando un casode éxito implantado en Catalana Occi-dente y una difusión del evento a la basede datos de Microsoft, formada porunos 6000 contactos.

La primera de las ponencias quefiguraban en la agenda tras la bienve-nida a los asistentes por parte de Fer-nando Bocigas, responsable del pro-ducto en España, corría a cargo deFernando García, director de Ventasde Soluciones de Aplicación en Micro-soft, que bajo el título “Seis tenden-cias tecnológicas que marcarán la pró-xima década” contextualizó de mane-ra general el estado actual de la tec-nología, y auguró los principales retosa los que tendremos que hacer frenteen un futuro inmediato como respon-sables de IT y como usuarios que con-viven en el día a día con la informa-ción. La verdad es que aquí, como enotros ámbitos, Microsoft marca ten-dencias, así que no es arriesgado aven-turar que darán en el clavo y que, efec-tivamente, la evolución lógica que senos presentó (¿les suena “mundo inter-conectado”?) será acertada.

Tras Fernando García, de nuevo fueel turno de Fernando Bocigas, con unaponencia llamada “Extendiendo el nego-cio conectado”, en la que se hizo un repa-so de cuál ha sido la evolución del pro-ducto desde sus orígenes (cómo han cam-

biado las cosas, afortunadamente, desdeaquel Biztalk 2000 “intratable”) hasta laactual versión 2006 R2. Sorprende vercómo progresivamente se va ganando laaceptación de las compañías, pasando de500 clientes en la primera versión hastaaproximadamente 7000 con la, hasta lafecha, última versión con datos fiables,Biztalk 2006. En este caso, Microsoft fueprudente y se reservó el dar una fecha esti-mada de la previsión de calado de R2 paracuando alcance la etapa de madurez, aun-que nada hace indicar que la tendencia alalza se frene.

Y, por fin, el plato fuerte del día:casos de éxito de implantaciones rea-les de Biztalk 2006. Los hubo paracada una de las verticales que, por par-te de Microsoft, acudían al evento:industria, sector público y banca-seguros. Por este orden, los diferen-tes partners que acudieron al eventofueron exponiendo sus desarrollos,presentando 2 casos de éxito para cadavertical. Pudimos ver un sinfín deproblemáticas diferentes con undenominador común: Biztalk. Entrelos casos destacados se mostraron un

Biztalk como integrador de una cade-na de fabricación de componentespara el interior del automóvil; unaimplantación en un centro de saludpara la comunicación de diferentesáreas y departamentos; un caso realde utilización del adaptador SWIFTpara transacciones seguras dentro delentorno de banca… El caso de éxitopor el que raona fue invitado al even-to consistía en la comunicación de lacompañía de seguros Catalana Occi-dente con el Ministerio de Justicia conla finalidad de hacerle llegar datos

requeridos de las pólizas de vida, envirtud de la ley 20/2005 sobre la cre-ación del Registro de Contratos deSeguros de Cobertura de Falleci-miento.

La verdad es que las exposicionesno defraudaron y nos mostraron Biz-talk como una realidad que funcionay que goza de un merecido respeto enlas compañías en las que ha sidoimplantado. Déjenme hacerles unaconfesión: en los numerosos años quellevo haciendo implantaciones de Biz-talk, jamás me he encontrado con un

Lanzamiento de Biztalk 2006 R2

Las exposiciones no defraudaron y nos mostraronBiztalk como una realidad que funciona y que

goza de un merecido respeto en las compañías en las que ha sido implantado

Page 19: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

El pasado 30 de octubre, cerca de 320 personas asis-tieron a la tercera edición de CEUS 2007, la III Con-ferencia de Usuarios de SharePoint, en Madrid. Estaedición sirve para consolidar dichas conferencias entrela comunidad y confirma el éxito de la plataforma demoda de Microsoft. Prueba de ello fue el número deasistentes, que superó al del año pasado, confirman-do el interés de la plataforma SharePoint. El día sedividió en dos formatos totalmente diferentes de pre-sentaciones.

La mañana estuvo presidida por presentaciones deempresas usuarias de SharePoint, que junto al clientefinal, nos mostraron casos de éxito con SharePoint; enla presentación daban a conocer a todo el aforo su expe-riencia, implementación y sensaciones con el produc-to. Entre estas empresas se encontraban raona junto asu cliente Criteria Caixa Corp, Getronics con Ancerty K2, Renacimiento con el Ministerio de Presidenciae Informática el Corte Inglés con Caja Mediterráneo.Todas estas presentaciones fueron de carácter práctico,con la puesta en marcha del proyecto y las peculiarida-des de cada uno. Enmedio, y después del descanso, inter-vinieron distintos responsables de Microsoft, que nosdieron algunos detalles del futuro de SharePoint, enfo-cado en las búsquedas, lo que anuncia la salida del nue-vo SharePoint Search Server. Por parte de Microsoft,contamos con la presencia de Rafael Sánchez, jefe deproducto de SharePoint, y con Sarah Hammon, res-ponsable de producto SharePoint en Europa.

Las sesiones de la tarde, en cambio, fueron sesio-nes mucho más técnicas, más enfocadas hacia untema específico. Se contó con un total de siete salas,y en cada una de ellas tuvieron lugar tres presenta-ciones de unos 55 minutos cada una. Con este for-mato de presentaciones y con la disponibilidad desalas, los asistentes se dividieron entre las sesionesmás interesantes para cada uno de ellos. Se trata-ton temas muy diversos, desde migraciones de Sha-rePoint 2003 y CMS 2001 a SharePoint 2007, has-ta integraciones de BI, Microsoft Dynamics, Busi-ness Data Catalog, workflows con SharePoint Desig-ner y definición de arquitecturas de alta disponibi-lidad. Los ponentes de estas presentaciones perte-necían a las distintas empresas patrocinadoras delevento y otros voluntarios, así como personal deMicrosoft. Todas las presentaciones estarán dispo-nibles públicamente en breve para las personas queno puedieron asistir al evento.

Entre las novedades, la nueva versión de Micro-soft Search Server 2008. Esta versión del nuevo bus-cador para SharePoint ya se encuentra liberada en suversión release candidate para que cualquiera de losusuarios pueda descargarla y probarla.

Sergio HolgadoSoftware Engineer de Raona

cliente que se haya sentido defraudado por el resul-tado final, ni en cuanto a expectativas de rendi-miento ni en cuanto a capacidad de integración.

Llegó el momento de recobrar fuerzas con elcóctel programado para afrontar la recta final delevento con las energías renovadas. Respecto a loacontecido por la tarde, poco tenemos que comen-tar: tres diferentes charlas, eminentemente técni-cas, en las que sin grandes pretensiones se nosdetalló el funcionamiento de los adaptadores RFIDy EDI mejorados para esta última versión, y unaúltima charla que cerraba el día y que rezaba algoasí como “Extendiendo SOA desde la Empresa alMundo” (previsible, muy previsible…).

Y esto fue todo. Al final, menos asistencia de laprevista: 75 participantes entre partners, clientes einvitados. Una impecable organización, en la quelos tiempos se cumplieron rigurosamente, y unbuen sabor de boca respecto a los incrementalesesfuerzos por parte de Microsoft por situar Biztalken el lugar que le corresponde como herramientade integración de primer nivel.

Suriel HilarioProject Manager de Raona

CEUS 2007

dnm.directo.eventos<<

Page 20: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Estos elementos, flexibles y de sencilla incorpo-ración a nuestros proyectos, eran el control InkE-dit y el control InkPicture. El primero permitía lacaptura de trazos de tinta digital y su reconoci-miento de manera automática, todo ello sin escri-bir una sola línea de código. Por otro lado, el con-trol InkPicture permitía la captura automática detrazos de tinta digital; sin embargo, para el reco-nocimiento de los trazos como escritura era nece-sario un poco de programación.

En el presente artículo iremos más allá y estu-diaremos la manera de hacer que cualquier control(como por ejemplo un Panel, un RichTextBox o unListBox, por solo poner unos ejemplos) sea capaz deaceptar trazos de tinta digital y reconocerlos comoescritura manual. Asimismo, veremos los principa-les métodos existentes para mejorar la efectividad delreconocimiento, tales como el uso de los factoids (cade-nas predefinidas que proporcionan al reconocedorinformación sobre el tipo de texto a reconocer) ywordlists (listas predefinidas de palabras).

Para finalizar, analizaremos el uso de lo que seconoce como gestures, gestos especiales no reco-nocidos como palabras y que permiten la ejecu-ción de acciones a medida.

La clase InkOverlayLa clase InkOverlay nos permite añadir caracterís-ticas de tinta digital a cualquier control que deci-

damos. Al igual que el control InkPicture, la cla-se InkOverlay no proporciona por defecto méto-dos automáticos para el reconocimiento de la escri-tura manual; sin embargo, del mismo modo podre-mos suplir esta ausencia mediante la clase Recog-nizers y un poco de programación.

Pasemos por tanto a ver cómo usar la claseInkOverlay. Para ello, crearemos un nuevo for-mulario a imagen y semejanza del formulario usa-do en la primera parte de este artículo, con la dife-rencia de que sustituiremos el control InkPicturepor un simple Panel. Para aquellos que no hayanpodido leer esa primera parte, el formulario secompone básicamente de un control Panel sobreel que escribiremos trazos de tinta digital, un Text-Box en el que mostraremos el resultado de inten-

Reconocimiento de escritura manualTablet PC SDK (y II)

plataforma.net

En la primera parte de este artículo indicamos el modo de preparar elentorno de desarrollo necesario para la programación de aplicacionescapaces de aceptar tinta digital para más tarde reconocerla como escri-tura manuscrita. Asimismo, utilizamos los principales elementos que paraeste fin proporciona el Microsoft Windows XP Tablet PC Edition Soft-ware Development Kit.

Figura 1. Formulario InkOverlay.

Javier Roldán

Fco. Javier RoldánHuecas

es ingeniero superiorinformático. Con una

experiencia laboral deocho años como pro-fesional del sector delas TI, en la actualidadtrabaja como ingenie-ro de sistemas y res-

ponsable de proyectosen una importante

empresa industrial deámbito nacional.

[email protected]

Page 21: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

tar reconocer los trazos como texto yuna serie de cuatro botones que nospermitirán escribir trazos, modificarlosy borrarlos. Por último, dispondremosde un botón que lanzará el evento dereconocimiento de escritura. Puede ver-se como queda dicho formulario en lafigura 1.

Si ejecutamos la aplicación e inten-tamos realizar algunos trazos sobre elPanel, veremos que (como era de espe-rar) nada sucede. Esto es debido a queel control Panel, al contrario de lo queocurría con el control InkEdit o Ink-Picture, no espera que sobre él se dibu-jen trazos de tinta digital, por lo quedetecta los eventos del ratón (o punte-ro) como simples eventos de pulsacióny arrastre.

La solución pasa por “superponer”sobre el control Panel (o cualquier otrosobre el que queramos escribir) un con-trol que es capaz de capturar y mostrartrazos de tinta digital. Dicho control seimplementa a través de la clase InkOver-lay. Para ello, añadimos el siguiente códi-go al evento Load del formulario:

Como podemos observar, en la pri-mera línea de código simplemente cre-amos una instancia de la clase InkOver-lay, a la que le pasamos en el construc-tor el control con el que queremos aso-ciarlo. En la segunda línea activamosdicha instancia.

Si ejecutamos la aplicación de nue-vo, observaremos que hemos conver-tido el Panel en un control capaz derecibir trazos de tinta digital; pero que(al igual que ocurría con el controlInkPicture) éste no es capaz de reco-nocerlos como texto de maneraautomática. Utilizando el mismo códi-go que el usado en el artículo anteriorpara el control InkPicture, pero susti-tuyendo la referencia a la clase InkPic-ture por la clase InkOverlay, haremosposible que el texto manuscrito sobreel control Panel sea reconocido y mos-

trado en el cuadro de texto. Del mismomodo, podremos borrar, seleccionar, esca-lar y mover cada trazo dibujado con solo

añadir el código necesario a los botonesde la interfaz de usuario. Puede verse elcódigo completo en el listado 1.

dotN

etM

anía

<<

21

dnm.plataforma.net<<

this.inkOverlay = newInkOverlay(this.panelEscritura);

this.inkOverlay.Enabled = true;

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Microsoft.Ink;

namespace InkOverlayTest{public partial class FormInkOverlay : Form{

private InkOverlay inkOverlay;public FormInkOverlay(){

InitializeComponent();}

private void FormInkOverlay_Load(object sender, EventArgs e){

this.inkOverlay = new InkOverlay(this.panelEscritura);this.inkOverlay.Enabled = true;

}

private void buttonEscribir_Click(object sender, EventArgs e){

this.inkOverlay.EditingMode = InkOverlayEditingMode.Ink;}

private void buttonBorrarTrazo_Click(object sender, EventArgs e){

this.inkOverlay.EraserMode = InkOverlayEraserMode.StrokeErase;this.inkOverlay.EditingMode = InkOverlayEditingMode.Delete;

}

private void buttonBorrarPunto_Click(object sender, EventArgs e){

this.inkOverlay.EraserMode = InkOverlayEraserMode.PointErase;this.inkOverlay.EditingMode = InkOverlayEditingMode.Delete;

}

private void buttonSeleccionar_Click(object sender, EventArgs e){

this.inkOverlay.EditingMode = InkOverlayEditingMode.Select;}

private void buttonReconocimiento_Click(object sender, EventArgs e){

Recognizers reconocedores = new Recognizers();if (reconocedores.Count != 0){Recognizer reconocedor = reconocedores.GetDefaultRecognizer();RecognizerContext contextoReconocedor =

reconocedor.CreateRecognizerContext();

Page 22: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

22

dnm.plataforma.net<<

Mejorando el reconocimientoA estas alturas, si ha seguido de mane-ra práctica el artículo, con total seguri-dad ya habrá probado la sorprendenteeficacia del reconocedor implementa-do en el Microsoft Windows XP TabletPC Edition 2005 Recognizer Pack. Sinembargo, existen situaciones en las quees muy difícil para cualquier reconoce-dor automático de texto averiguar quées lo que el usuario exactamente ha que-rido escribir.

Pensemos, por solo poner un par deejemplos, en aquellos casos en los quees necesario que la aplicación reconoz-ca letras sueltas, o palabras sin ningúnsentido en cualquier idioma, comonombres de usuario o contraseñas. Parapoder enfrentarnos con éxito a este tipode casuísticas, el Microsoft WindowsXP Tablet PC Edition Software Deve-lopment Kit pone a nuestra disposición

varias herramientas, entre las que seencuentran los factoids y las wordlists.

Factoids

Los factoids son constantes de tipostring que asignadas a la propiedad Fac-toid de la clase RecognizerContext queproporcionan información contextualal reconocedor que permite mejorar laefectividad de reconocimiento.

Para entenderlo mejor, veamos unsencillo ejemplo. Supongamos que en laaplicación de ejemplo del apartado ante-rior quisiéramos reconocer únicamentecifras numéricas introducidas por el usua-rio. Pues bien, si ejecutamos la aplicacióne intentamos escribir el número 51 perode un modo un tanto simplificado, elreconocedor lo interpretará como lacadena de texto “si” (ver figura 2).

Para solucionar este contratiempo,añadimos la siguiente línea de códigodentro del evento buttonReconocimien-

to_Click, justo tras la línea donde cre-amos el RecognizerContext:

contextoReconocedor.Factoid = Factoid.Number;

O bien esta otra línea, totalmenteequivalente a la anterior:

contextoReconocedor.Factoid = “NUMBER”;

Si ahora ejecutamos la aplicación yescribimos de nuevo el número 51, noslo reconocerá sin problemas. Sinembargo, si probamos a escribir elcarácter ‘1’ de un tamaño considera-blemente mayor que el ‘5’, es posibleque el reconocedor nos interprete eltexto como la cadena “s1” (figura 3).

Hemos mejorado el reconocimien-to, sin embargo no hemos alcanzado el

RecognitionResult resultadoReconocedor;RecognitionStatus estatusReconocimiento;

contextoReconocedor.Strokes = inkOverlay.Ink.Strokes;

if (contextoReconocedor.Strokes.Count > 0){

resultadoReconocedor = contextoReconocedor.Recognize(out estatusReconocimiento);

if (estatusReconocimiento == RecognitionStatus.NoError &&resultadoReconocedor != null)

{String resultado = resultadoReconocedor.TopString;if (resultado != null && resultado.Length > 0){

this.textBoxTextoReconocido.Text = resultado;}

}}

}else{

MessageBox.Show(“No existen reconocedores instalados”);}

}}

}

Listado 1. Código de reconocimiento de escritura con InkOverlay.

Figura 2. Reconocimiento sin factoids.

Figura 3. Reconocimiento usando factoids.

Page 23: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

23

dnm.plataforma.net<<

objetivo de que la aplicación reconoz-ca todo el texto introducido por elusuario exclusivamente como núme-ros. Para forzar al reconocedor a queinterprete los trazos introducidos úni-camente dentro del contexto especifi-cado por la propiedad Factoid, debe-mos incorporar la siguiente línea decódigo a nuestra aplicación:

Sin embargo, debemos usar con cui-dado la combinación de la propiedad Fac-toid y el modo de reconocimiento Coer-ce, ya que tal y como hemos comentado,el modo Coerce fuerza a reconocer úni-camente aquellas cadenas de texto queconcuerden exactamente con la definicióndel factoid. Así por ejemplo, el factoid Emailen modo Coerce solo reconocerá cuentasde correo electrónico completas; es decir,que contengan el carácter @ y un dominiototalmente cualificado (por [email protected]), no permitien-do el reconocimiento de textos que nocumplan estrictamente estos requeri-mientos, como por ejemplo aliases (Javie-rRoldan) o cuentas de correo sin dominiostotalmente cualificados, comunes en algu-nas implementaciones de mensajería inter-na (javier.roldan@midominio).

Es importante señalar que mientrasalgunos factoids, como por ejemplo Emaily Web, son idénticos en cualquier idio-ma, otros, como por ejemplo Telepho-ne y PostalCode dependen del idiomautilizado. Es fundamental por tanto exa-

minar el formato de cada factoid en fun-ción del idioma que estemos utilizan-do. Asimismo, debemos tener en cuen-ta que no todos los factoids existen entodos los idiomas, por lo que es reco-mendable tener muy claro en qué idio-ma estamos trabajando y usar los fac-toids que correspondan.

En la tabla 1 se presentan los prin-cipales factoids, divididos en dos gran-des grupos: dependientes e indepen-dientes de idioma. No se han incluido,por encontrase fuera del alcance de esteartículo, los factoids de idiomas orien-tales (japonés, chino y coreano).

Wordlists

Existen situaciones en las que el usode factoids es del todo inadecuado, y sinembargo el reconocimiento por defec-to sigue siendo deficiente. Pensemospor ejemplo aquellos casos en los quela aplicación deba reconocer palabrassin sentido que combinen letras ynúmeros, como por ejemplo nombresde usuario y contraseñas.

Si volvemos al ejemplo inicial eintentamos reconocer por ejemplo lacadena “ss5lo10”, pero además nohaciendo distinción alguna mientras

Figura 4. Forzando el uso de factoids.

Factoids independientes de idioma

Digit Dígito simple.

Email Direcciones de correo electrónico.

Web Diferentes tipos de URL. Los valores por defecto del reconocedorincluyen el factoid Web, por lo que no existe mayor diferencia entreusar este factoid y no usarlo.

Default Devuelve al reconocedor a sus valores por defecto. En idiomas occidentales, esto incluye el diccionario de sistema, eldiccionario de usuario, los signos de puntuación y los factoids Weby Number.En idiomas orientales, incluye todos los caracteres soportados por elreconocedor.

None Desactiva todos los factoids y diccionarios. No debe usarse el modo Coerce con este factoid.

Factoids dependientes de idioma

Filename Rutas de fichero de Microsoft Windows. No incluye los caracteres / “ < > |.

SystemDictionary Activa en exclusiva el diccionario de sistema.

Wordlist Activa en exclusive la lista de palabras.Currency Cantidades monetarias en libras, euros, dólares y yenes, escritos en

función del idioma.Date Fechas escritas en función del idioma.Number Todos los números, incluyendo ordinales, símbolos matemáticos y uni-

dades de medida (mm, kg,…), todos ellos en función del idioma. Tam-bién están incluidos los factoids Date, Time, Telephone y Currency.

OneChar Un carácter ANSI.

Percent Un número seguido del símbolo %. Existirá un espacio entre el núme-ro y el símbolo de porcentaje en función del idioma.

PostalCode Códigos postales en función del idioma.

Telephone Números de teléfono en función del idioma.

Time Horas y minutos escritos en función del idioma.

UpperChar Una letra mayúscula.

Tabla 1. Principales factoids

contextoReconocedor.RecognitionFlags=RecognitionModes.Coerce;

Page 24: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

24

dnm.plataforma.net<<

escribimos entre el ‘5’ y la ‘s’, el ‘1’ y la‘l’ y el ‘0’ y la ‘o’, parece imposible queninguna aplicación (o incluso persona)pueda reconocer ese texto (figura 5).

Sin embargo, existe un modo dehacer que este reconocimiento funcio-ne, y es proporcionando al reconocedoruna lista de palabras posibles a introdu-cir por el usuario. Es lo que se conocecomo el uso de wordlists.

Añadiremos el siguiente códigodentro del evento buttonReconocimien-to_Click, justo tras la línea donde crea-mos el RecognizerContext y en sustitu-ción del código añadido en el apartadoanterior (ver listado 2):

Podremos comprobar que la apli-cación es capaz de reconocer los tra-zos introducidos sin mayor problema(figura 6).

Teniendo en cuenta que es posibleañadir en tiempo de ejecución tantaspalabras como deseemos a la propiedadWordList, esto convierte su utilización enprácticamente obligada en todos aque-llos casos en los que sea factible su uso.

Gestures

Finalizaremos el artículo haciendoun breve recorrido por el uso de los ges-tures. Los gestures son gestos o trazosespeciales que no son reconocidos comopalabras y que permiten la ejecución deacciones a medida.

El Microsoft Gesture Recognizersoporta dos tipos de gestures: de sistema(SystemGesture) y de aplicación (Appli-cationGesture).

Los SystemGesture son gestos defini-dos y soportados por defecto y que en sumayoría son mapeados a eventos de ratón;como por ejemplo el gesto Tap, que es

contextoReconocedor.Factoid = Factoid.WordList;

WordList wordList = new WordList();

wordList.Add(“ss5lo10”);contextoReconocedor.WordList =

wordList;contextoReconocedor.RecognitionFlags=

RecognitionModes.Coerce;

private void buttonReconocimiento_Click(object sender, EventArgs e){

Recognizers reconocedores = new Recognizers();if (reconocedores.Count != 0){

Recognizer reconocedor = reconocedores.GetDefaultRecognizer();RecognizerContext contextoReconocedor =

reconocedor.CreateRecognizerContext();

contextoReconocedor.Factoid = Factoid.WordList;

WordList wordList = new WordList();wordList.Add(“ss5lo10”);

contextoReconocedor.WordList = wordList;contextoReconocedor.RecognitionFlags = RecognitionModes.Coerce;

RecognitionResult resultadoReconocedor;RecognitionStatus estatusReconocimiento;

contextoReconocedor.Strokes = inkOverlay.Ink.Strokes;

if (contextoReconocedor.Strokes.Count > 0){

resultadoReconocedor = contextoReconocedor.Recognize(out estatusReconocimiento);

if (estatusReconocimiento == RecognitionStatus.NoError &&resultadoReconocedor != null)

{String resultado = resultadoReconocedor.TopString;if (resultado != null && resultado.Length > 0){

this.textBoxTextoReconocido.Text = resultado;}

}}

}else{

MessageBox.Show(“No existen reconocedores instalados”);}

}

Figura 5. ¿Reconocimiento imposible?

Figura 6. Reconocimiento mediante wordlists

Listado 2. Usando wordlists para el reconocimiento de palabras complejas.

Page 25: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

25

dnm.plataforma.net<<

mapeado a un clic de ratón. La lista deSystemGesture disponibles y su mapeo aeventos de ratón se presenta en la tabla 2.

Por otra parte, los ApplicationGes-ture son gestos que podemos incluir (ono) libremente en nuestra aplicación.Para implementar este tipo de gestures,debemos añadir el siguiente código alevento Load del formulario:

Como puede observarse en el códi-go, inicialmente creamos un InkOverlayasociado al panel sobre el que deseamosescribir, para luego establecer su pro-piedad CollectionMode al valor Collec-tionMode.InkAndGesture. Esto nos per-mite indicar que tanto los trazos de tin-ta como los gestos deben ser reconoci-dos como tal.

A continuación, el código establecequé tipo de gestures deseamos que seanreconocidos mediante el uso del méto-do SetGestureStatus de la clase InkOver-lay. En el ejemplo activamos el reco-nocimiento de todos los gestures. Esposible activar el reconocimiento desolamente ciertos gestures; para ello, sus-tituiríamos la línea de código anteriorpor una o más líneas equivalentes a lasque vemos a continuación:

Por último, asociamos el métodoinkOverlay_Gesture al evento Gesture delobjeto inkOverlay y lo activamos. Elmétodo inkOverlay_Gesture, que sim-plemente muestra en el cuadro de tex-to el texto asociado al gesture reconoci-do, se muestra a continuación:

Podemos ver el código completo enel listado 3. No se ha incluido el códi-go asociado a los botones de edición detrazos ni de reconocimiento de escritu-ra, ya que éste se muestra íntegramen-te en el listado 1.

this.inkOverlay = newInkOverlay(this.panelEscritura);

this.inkOverlay.CollectionMode = CollectionMode.InkAndGesture;

this.inkOverlay.SetGestureStatus(ApplicationGesture.AllGestures,true);

this.inkOverlay.Gesture += newInkCollectorGestureEventHandler(inkOverlay_Gesture);

this.inkOverlay.Enabled = true;

this.inkOverlay.SetGestureStatus(ApplicationGesture.ChevronDown, true);this.inkOverlay.SetGestureStatus(ApplicationGesture.ChevronUp, true);this.inkOverlay.SetGestureStatus(ApplicationGesture.Check, true);

void inkOverlay_Gesture(object sender, InkCollectorGestureEventArgs e){

this.textBoxTextoReconocido.Text = e.Gestures[0].Id.ToString();}

Digit Dígito simple.

Tap Clic de ratón.

DoubleTap Doble clic de ratón.

RightTap Clic con el botón derecho del ratón.

Drag Arrastre con el botón izquierdo del ratón.

RightDrag Arrastre con el botón derecho del ratón. Se consigue haciendo un taplargo y luego arrastrando sin levantar el puntero de la pantalla.

HoldEnter Sin equivalente en el ratón.

HoldLeave No implementado.

HoverEnter Equivalente a pasar el ratón por encima.

HoverLeave Equivalente a dejar de pasar el ratón por encima.

Tabla 2. SystemGesture disponibles

Los gestures songestos o trazos

especiales que noson reconocidoscomo palabras y que permiten la

ejecución de acciones a medida

Page 26: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

26

dnm.plataforma.net<<

Si ejecutamos la aplicación y probamos a trazargestos reconocidos como ApplicationGesture, vere-mos cómo de manera inmediata el texto asociado algesture será mostrado en el cuadro de texto habilita-do al efecto.

ConclusiónCon esta segunda parte damos conclusión a nuestroartículo relacionado con el desarrollo de aplicacio-nes capaces de aceptar tinta digital y de reconocer laescritura manuscrita, que esperamos haya resultadoútil e informativo para los lectores.

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Microsoft.Ink;

namespace InkGestureTest{

public partial class FormGestures : Form{

private InkOverlay inkOverlay;

public FormGestures(){

InitializeComponent();}

private void FormGestures_Load(object sender, EventArgs e){

this.inkOverlay = new InkOverlay(this.panelEscritura);this.inkOverlay.CollectionMode = CollectionMode.InkAndGesture;this.inkOverlay.SetGestureStatus(ApplicationGesture.AllGestures, true);this.inkOverlay.Gesture += new InkCollectorGestureEventHandler(inkOverlay_Gesture);this.inkOverlay.Enabled = true;

}

void inkOverlay_Gesture(object sender, InkCollectorGestureEventArgs e){

this.textBoxTextoReconocido.Text = e.Gestures[0].Id.ToString();

}}

}

Listado 3. Implementación de los gestures.

Figura 7. Gesture DoubleCurlicue.

Page 27: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

CellPainting. Control total del dibujo de celdasSe trata de un evento que se produce para cadacelda que va a dibujarse, con la particularidad deque el desarrolladordispone de plenocontrol sobre toda laoperación de dibujode la celda, siendoposible aplicarle efec-tos gráficos tales comodegradados (fundidos)de colores, texturas,imágenes, etc.

CellPainting reci-be como parámetroun objeto DataGridViewCellPainting

EventArgs, que nosservirá para obtener lainformación principalsobre la columna, filay valor de celda.Además, entre sus

propiedades encontraremos también aquellas quenos permitirán realizar todo el dibujo de la celday su contenido al completo. La tabla 1 muestra laspropiedades más destacables de esta clase.

El evento CellPainting del control DataGridView

Vía libre a la creatividad

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)

Cuando presentamos a nuestros usuarios un conjunto de datos mediante elcontrol DataGridView, podemos mejorar la apariencia visual del mismo recu-rriendo al uso de estilos. No obstante, la mera utilización de estilos resultaescasa si nuestras pretensiones pasan por lograr efectos avanzados y un mayorcontrol sobre el proceso de dibujo de las celdas. Es por ello que el empleocombinado del evento CellPainting, perteneciente a este control, junto al con-junto de clases de GDI+ (la API de programación gráfica de .NET Framework),se va a convertir en un poderoso recurso a nuestro alcance, que nos permi-tirá aplicar ese “toque especial” al dibujo de las celdas, para que luzcan contodo su esplendor. Porque ellas lo valen.

Luis Miguel Blanco

Propiedad Descripción

ColumnIndex Índice de la colección de columnas del control, que indica la colum-na sobre la que se produce el evento.

RowIndex Índice de la colección de filas del control, que indica la fila sobre laque se produce el evento.

CellBounds Objeto Rectangle con la posición y dimensiones de la celda a pintar.

State Estado de la celda: seleccionada, visible, solo lectura, etc.

Graphics Objeto Graphics conteniendo el contexto de dispositivo gráfico sobreel que realizar la operación de dibujo.

Value Valor para pintar en la celda.

FormattedValue Valor formateado para pintar en la celda.

CellStyle Estilo de la celda.

Handled Propiedad booleana que permite informar al control si la operación de dibu-jo ha sido realizada manualmente mediante el código suministrado por elprogramador, o deberá ser el control quien realice este proceso.

Tabla 1. Propiedades de la clase DataGridViewCellPaintingEventArgs

Page 28: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dnm.plataforma.net<<

dotN

etM

anía

<<

28

Es momento, por lo tanto, deponernos manos a la obra y crear unnuevo formulario, al que añadiremosun DataGridView que nos sirva para expe-rimentar con esta característica. Comoes habitual, todos los ejemplos de esteartículo se encuentran disponibles enel sitio Web de la revista.

En este ejemplo aplicaremos la ope-ración de dibujo manual a los camposListPrice y Color, pertenecientes a laconsulta SQL que mostraremos en elcontrol de cuadrícula. Como paso pre-vio, en el evento Load del formulario,después de asignar el DataSet con losdatos al DataGridView, crearemos paralos mencionados campos sendos estiloscon un tipo de letra que destaque nota-blemente del resto de columnas, lo quevemos en el listado 1, donde adicional-mente se configura el ajuste de tamañoautomático para filas y columnas, demodo que el contenido de estos cam-pos se muestre correctamente.

A continuación pasamos a escribirel código de CellPainting, donde nues-tro objetivo consistirá en pintar lasmencionadas celdas, dotándolas de unefecto de fundido de colores que con-seguiremos gracias al uso de un objetode la clase PathGradientBrush, que seencuentra ubicada en el espacio denombres System.Drawing.Drawing2D. Unobjeto PathGradientBrush, brevementedescrito, rellena una porción de lasuperficie del formulario tomandocomo base a una figura (por ejemplo,el rectángulo correspondiente a una cel-da del control), y le aplica un color cen-tral que será rodeado por otro conjun-to de colores situados en un array. Laforma en que los colores se distribuirány fundirán al aplicar este objeto sedetermina gracias a un array de coor-denadas (objetos Point), que en este casoestará compuesto por los mismos pun-tos de coordenadas que el rectángulode la celda a pintar.

Entre los diversos estados que pue-de tomar una celda se encuentran loscorrespondientes a normal y seleccio-nado. El estado actual de una celda se

obtiene consultando la propiedad Data-GridViewCellPaintingEventArgs.State; ala hora de pintar la celda, podremosasignarle un conjunto de colores dis-tinto según el mencionado estado.

En el momento de pintar la celda,necesitaremos un objeto de la claseGraphics, que representa el contexto dedispositivo gráfico o superficie sobre laque vamos a dibujar. El acceso a esteobjeto lo conseguimos gracias a la pro-

piedad DataGridViewCellPaintingEven-tArgs.Graphics, realizando el dibujo dela celda mediante una llamada a sumétodo FillRectangle, que recibe comoparámetros el objeto PathGradientBrushpara aplicar el fundido de colores, y elrectángulo de la celda, que está en lapropiedad DataGridViewCellPaintingE-ventArgs.CellBounds. El contorno olínea delimitadora de los bordes de lacelda será dibujado utilizando el méto-

// obtención de datosSqlConnection cnConexion = new SqlConnection();cnConexion.ConnectionString = “Data Source=localhost;” +

“Initial Catalog=AdventureWorksDW;” +“Integrated Security=True”;

//....string sSQL;sSQL = “SELECT ProductKey, SpanishProductName, ListPrice, EndDate, Color “;sSQL += “FROM DimProduct “;sSQL += “WHERE ListPrice IS NOT NULL”;

SqlCommand cmdComando = new SqlCommand(sSQL, cnConexion);SqlDataAdapter daAdaptador = new SqlDataAdapter(cmdComando);DataSet dsAdvWorks = new DataSet();daAdaptador.Fill(dsAdvWorks, “DimProduct”);

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

// cambiar el tipo de letra a las columnas// que vamos a usar en el evento CellPaintingDataGridViewCellStyle styListPrice = new DataGridViewCellStyle();styListPrice.Font = new Font(“Comic Sans MS”, 16, FontStyle.Bold);styListPrice.Format = “C”;this.dgvGrid.Columns[“ListPrice”].DefaultCellStyle = styListPrice;

DataGridViewCellStyle styColor = new DataGridViewCellStyle();styColor.Font = new Font(“Papyrus”, 16, FontStyle.Bold);this.dgvGrid.Columns[“Color”].DefaultCellStyle = styColor;

// establecer ajuste de altura automático para las filasthis.dgvGrid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

// establecer ajuste de anchura automático para las columnasthis.dgvGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

// ocultar la primera columna del controlthis.dgvGrid.Columns[“ProductKey”].Visible = false;

Listado 1

Page 29: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dnm.plataforma.net<<

dotN

etM

anía

<<

29

do Graphics.DrawRectangle, aplicandoun color al borde sobre el rectángulode la celda.

Pero esto no es suficiente, ya quesolamente hemos dibujado el borde ycolores de fondo de la celda. Aún nosqueda el texto que representa el valorde la celda, que obtenemos de la pro-piedad Value o FormattedValue, perte-necientes al parámetro DataGridView-CellPaintingEventArgs del evento. Sinembargo, no podemos utilizar directa-mente esta propiedad; recordemos queel evento CellPainting nos obliga a rea-lizar manualmente todas las operacio-nes de dibujo, por lo que deberemosconvertir a modo gráfico la cadena adibujar siguiendo estos pasos:• Tras comprobar que existe realmen-

te un valor a dibujar, tenemos que cal-cular las dimensiones del texto (detipo Size) utilizando el método está-tico TextRenderer.MeasureText, al quepasaremos como parámetro el valorde la celda y el tipo de letra que usa-remos para dibujarlo. Para este últi-mo, emplearemos el objeto Font situa-do en el estilo de la columna corres-pondiente a la celda.

• A continuación, empleando el tambiénmétodo estático TextRenderer.Draw-Text, será cuando realmente dibuje-mos el texto, pasando como paráme-tro aquellas propiedades del objetoDataGridViewCellPaintingEventArgs

necesarias para esta operación: el obje-to Graphics; la propiedad FormattedVa-lue, más recomendable que su homó-loga Value, fundamentalmente paraaquellos casos de columnas con valo-res numéricos o de fecha formateados;CellBounds, como superficie o rectán-gulo sobre la que dibujar el texto; yfinalmente los valores del estilo –pro-piedad CellStyle–, que contienen eltipo de letra y su color.

• Como última acción en el código deeste evento, tenemos que asignar elvalor true a la propiedad DataGrid-ViewCellPaintingEventArgs.Handled,puesto que es necesario informar alcontrol de que nosotros hemos sido

private void dgvGrid_CellPainting(object sender,DataGridViewCellPaintingEventArgs e)

{// comprobar que la fila y columna están dentro del rango// y que la columna corresponde a una de las que vamos// a pintarif (e.ColumnIndex > 0 && e.RowIndex >= 0 &&

(this.dgvGrid.Columns[e.ColumnIndex].Name == “Color” |this.dgvGrid.Columns[e.ColumnIndex].Name == “ListPrice”))

{// crear un array con las coordenadas// sobre las que aplicaremos los colores con fundido// basadas en la posición y dimensión de la celdaPoint[] aPuntos = new Point[] {

new Point(e.CellBounds.X,e.CellBounds.Y),new Point(e.CellBounds.X, e.CellBounds.Y +

e.CellBounds.Height),new Point(e.CellBounds.X + e.CellBounds.Width,

e.CellBounds.Y + e.CellBounds.Height),new Point(e.CellBounds.X + e.CellBounds.Width,

e.CellBounds.Y)};

PathGradientBrush pgbBrush;Color[] aColores;

// crear el objeto brush con efecto de fundido// utilizando una combinación de colores diferente// en función de si la celda está o no seleccionadaif ((e.State & DataGridViewElementStates.Selected) ==

DataGridViewElementStates.Selected){

aColores = new Color[] {Color.LightYellow,Color.DarkTurquoise,Color.MediumSpringGreen,Color.LightSteelBlue};

pgbBrush = new PathGradientBrush(aPuntos);pgbBrush.CenterColor = Color.Lavender;pgbBrush.SurroundColors = aColores;

}else{

aColores = new Color[] {Color.BlanchedAlmond,Color.LightSalmon,Color.LightYellow,Color.DarkOrange};

pgbBrush = new PathGradientBrush(aPuntos);pgbBrush.CenterColor = Color.LawnGreen;pgbBrush.SurroundColors = aColores;

}

// aplicar el objeto brush con el efecto de colores fundidos// y dibujar un borde para el rectángulo de la celdae.Graphics.FillRectangle(pgbBrush, e.CellBounds);

Page 30: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dnm.plataforma.net<<

dotN

etM

anía

<<

30

los encargados de realizar la opera-ción de dibujo de la celda; de lo con-trario, el control hará caso omiso denuestro código, realizando él solito lasoperaciones de dibujo.

El listado 2 muestra el código delevento CellPainting que acabamos deexplicar en los párrafos anteriores.

La figura 1 muestra la rejilla resul-tante de la aplicación de este proceso dedibujo personalizado con CellPainting,donde podemos observar las celdas quehemos pintado tanto en estado normalcomo seleccionado.

Cambiando la alineación en el contenido de las celdasEl método TextRenderer.DrawText, comoacabamos de comprobar, dibuja el tex-to centrado en la celda de manera pre-determinada, pero supongamos que esnecesaria una alineación diferente. Paraconseguir dicho objetivo, añadiremos

a DrawText como último parámetro eltipo enumerado TextFormatFlags, cuyosvalores podemos utilizar de forma com-binada para crear diferentes efectos deformato, alineación, recorte de fuente,etc. Por ejemplo, si queremos que eltexto de la celda quede alineado a laparte superior de la misma, utilizare-mos el código del listado 3.

Pero en el DataGridView que estamosdesarrollando para este ejemplo esta-

mos dibujando celdas para dos colum-nas diferentes mediante CellPainting.Supongamos que es necesario aplicaruna alineación distinta para cada una deellas. Esta es una situación que pode-mos solventar en el evento Load del for-mulario, asignando a la propiedad Tagde los estilos creados para estas colum-nas el valor o combinación de valoresde TextFormatFlags que necesitemos paraestablecer la alineación o efectos para eltexto.

La propiedad DataGridViewCellSty-le.Tag es de tipo object, lo cual la con-vierte en un estupendo “cajón de sas-

tre” para almacenar valores de cualquiertipo, en función del problema a resol-ver en las más diversas situaciones.

Por lo tanto, como hemos dicho, sipara cada estilo asignamos por separa-do los valores de alineación a la propie-dad Tag, posteriormente la aplicación dedichos valores en CellPainting se sim-plifica enormemente cuando dibujamosel texto con el método DrawText, comovemos en el listado 4.

Figura 1. Celdas pintadas mediante el evento CellPainting.

e.Graphics.DrawRectangle(new Pen(Color.DarkMagenta, 3), e.CellBounds);

// si la celda tiene valorif (e.Value != null){

// calcular el tamaño del textoSize szTexto;szTexto = TextRenderer.MeasureText(

e.Value.ToString(), e.CellStyle.Font);

// dibujar el textoTextRenderer.DrawText(e.Graphics,

e.FormattedValue.ToString(),e.CellStyle.Font,e.CellBounds,e.CellStyle.ForeColor);

}

e.Handled = true;}

}

TextRenderer.DrawText(e.Graphics,e.FormattedValue.ToString(),e.CellStyle.Font,e.CellBounds,e.CellStyle.ForeColor,TextFormatFlags.Top);

Listado 2

Listado 3

Page 31: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones
Page 32: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dnm.plataforma.net<<

dotN

etM

anía

<<

32

En la figura 2 podemos apreciar el resultado deesta técnica para alinear los valores.

Otros efectos sobre el contenidoVamos a continuación a introducir una nueva varian-te en este escenario de trabajo. Imaginemos que no uti-lizamos el ajuste automático de anchura de columnaspara el control, por lo que borramos la línea de códi-go que hace uso de la propiedad DataGridView.AutoSi-

zeColumnsMode. Esta acción tiene como efecto que elusuario pueda cambiar el ancho de las columnas, y alreducir su tamaño, el texto de estas quede oculto enalgunos casos. El efecto conseguido por el recorte deltexto puede no resultar muy agradable, por lo que siaplicamos el valor TextFormatFlags.WordEllipsis, agre-gando este efecto a los demás ya existentes que se uti-lizan en el método DrawText, el resultado será la visua-lización de puntos suspensivos en aquellas celdas queno puedan mostrar su contenido al completo. Este efec-to lo podemos ver en la figura 3.

Y ya para terminar con el tipo TextFormatFlags,vamos a comentar otro efecto realmente curioso. El

valor NoClipping de esta enumeración tie-ne como finalidad no recortar los extre-mos del texto cuando reducimos eltamaño de la celda. Si combinamos estevalor con HorizontalCenter, como mues-tra el listado 5, obtendremos el intere-sante efecto de la figura 4, donde losextremos de texto de la celda “invaden”las celdas adyacentes.

Figura 2. Pintando celdas con distinta alineación desde CellPainting.

Figura 3. Puntos suspensivos en las celdas que no muestran su texto al completo.

private void Form1_Load(object sender, Even-tArgs e){

//....styListPrice.Tag = TextFormatFlags.Right |

TextFormatFlags.VerticalCenter;//....styColor.Tag = TextFormatFlags.Left |

TextFormatFlags.VerticalCenter;//....

}

private void dgvGrid_CellPainting(objectsender, DataGridViewCellPaintingEventArgs e){

//....TextRenderer.DrawText(e.Graphics,

e.FormattedValue.ToString(),e.CellStyle.Font,e.CellBounds,e.CellStyle.ForeColor,(TextFormatFlags)e.CellStyle.Tag);

//....}

Listado 4

TextRenderer.DrawText(e.Graphics,

e.FormattedValue.ToString(),

e.CellStyle.Font,

e.CellBounds,

e.CellStyle.ForeColor,

TextFormatFlags.HorizontalCenter |

TextFormatFlags.NoClipping);

Listado 5

Page 33: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dnm.plataforma.net<<

dotN

etM

anía

<<

33

CellPainting en las cabeceras de colum-na. Indicando el orden de los registroscon una imagen propia

Para aplicar el evento CellPainting en las cabecerasdel control, emplearemos la misma lógica que en lasceldas de datos, pero debemos tener en cuenta que elcomportamiento de una cabecera, cuando el usuariohace clic sobre ella, consiste en ordenar sus celdasmostrando además un pequeño icono queindica el orden establecido.

Si aplicamos una operación de dibu-jo personalizado a la celda de cabeceracon CellPainting, al hacer clic en ella paraordenar sus datos éstos efectivamente seordenarán, pero el icono informativo deltipo de orden no se mostrará, ya quecuando realizamos el dibujo de una cel-da con este evento, como ya sabemos, laresponsabilidad de pintar hasta el últimoelemento necesario recae sobre el pro-gramador.

Dado que el código a utilizar para pin-tar una celda de cabecera es muy pareci-do al de una celda normal de datos, den-tro del listado 6, en lo que se refiere alcódigo del evento CellPainting, nos cen-traremos sólo en aquellos aspectos apli-cables para este caso concreto.

Podemos ver, en primer lugar, lanecesidad de comprobar que el índice dela columna sea mayor o igual a cero, elde la fila menor de cero, y el nombre dela columna a dibujar corresponda a laque necesitamos pintar de forma perso-nalizada.

A continuación, debemos averiguar el nombre de lacolumna pulsada, disponible en la variable sCabecera-Pulsada, que hemos declarado con ámbito a nivel de laclase del formulario. Dicha variable la asignamos en otroevento: ColumnHeaderMouseClick, provocado cuando elusuario hace clic en una cabecera de columna.

Después de dibujar el título de la celda alineado ala izquierda, comprobaremos si la columna va a orde-narse en alguna dirección. En caso afirmativo, dispo-nemos de dos imágenes agregadas al proyecto comorecursos incrustados (este valor lo establecemos en laventana de propiedades de la imagen, dentro de la pro-piedad “Acción de generación”). Según el orden, obten-dremos la imagen correspondiente, asignándola a unavariable de tipo Bitmap.

No obstante, es posible que la celda necesite dibu-jarse, pero no porque se haya pulsado la cabecera, encuyo caso la propiedad DataGridView.SortOrder con-tendrá el valor None, y la variable Bitmap estará a null.Por dicho motivo, tenemos que comprobar que exis-ta realmente una imagen a dibujar, y en ese caso, dibu-jarla en la parte derecha de la celda utilizando el méto-do Graphics.DrawImage, calculando la posición en lacual dibujar a partir del tamaño de la propia imageny las propiedades del rectángulo de la cabecera.

Figura 4. Los extremos del texto en las celdas no se recortan.

Page 34: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dnm.plataforma.net<<

dotN

etM

anía

<<

34

La figura 5 muestra el control en eje-cución, donde podemos observar la cel-da de cabecera con las operaciones queacabamos de describir.

CellPainting en las cabecerasde fila. Indicando el número defila a todo color

Y si hemos podido pintar con alegres ygráciles colorines una cabecera del con-trol, las cabeceras de las filas no van aser menos, ni se van a librar de nuestroarrebato artístico, así que tomando nues-tros botes de pintura y pinceles digita-les, pongámonos a trabajar.

La técnica que vamos a emplear,como puede intuir el lector, será muysimilar a los otros casos anteriores, conla salvedad de que ahora vamos a dibu-

string sCabeceraPulsada = string.Empty;//....private void Form1_Load(object sender, EventArgs e){

//....this.dgvGrid.EnableHeadersVisualStyles = false;

// crear un estilo para las cabeceras del controlDataGridViewCellStyle styCabecera = new DataGridViewCellStyle();styCabecera.BackColor = Color.BlanchedAlmond;styCabecera.ForeColor = Color.DarkBlue;styCabecera.Alignment = DataGridViewContentAlignment.MiddleLeft;styCabecera.Font = new Font(“Century Schoolbook”, 10,

FontStyle.Bold);styCabecera.Padding = new Padding(10);

this.dgvGrid.ColumnHeadersDefaultCellStyle = styCabecera;

// ampliar la anchura de la columna// sobre la que vamos a dibujar la cabecerathis.dgvGrid.Columns[“ProductKey”].Width += 40;

}

// cada vez que hacemos clic en la cabecera// guardamos el nombre de la columna pulsadaprivate void dgvGrid_ColumnHeaderMouseClick(object sender,

DataGridViewCellMouseEventArgs e){

sCabeceraPulsada = this.dgvGrid.Columns[e.ColumnIndex].Name;}

private void dgvGrid_CellPainting(object sender,DataGridViewCellPaintingEventArgs e)

{// comprobar si la cabecera a pintar es la que necesitamosif (e.ColumnIndex >= 0 &&

e.RowIndex < 0 &&this.dgvGrid.Columns[e.ColumnIndex].Name == “ProductKey”)

{//....// dibujar el título de la cabecera// alineado a la izquierdaTextRenderer.DrawText(e.Graphics,

e.FormattedValue.ToString(),e.CellStyle.Font,e.CellBounds,e.CellStyle.ForeColor,TextFormatFlags.Left | TextFormatFlags.VerticalCenter);

// si la cabecera pulsada es la que necesitamos,// en función del tipo de ordenación,// obtener la imagen del recurso incrustado en el proyectoBitmap bmpImagen = null;

if (sCabeceraPulsada == “ProductKey”){

switch (this.dgvGrid.SortOrder){

case SortOrder.Ascending:bmpImagen =

Figura 5. Cabecera de columna con dibujo personalizado de icono

de orden y fundido de colores.

Al realizar el dibujo de una celda

mediante CellPainting, la responsabilidad de pintar hasta el último detalle recae sobre

el programador

Page 35: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dnm.plataforma.net<<

dotN

etM

anía

<<

35

jar el número de cada fila, por lo quetendremos que calcular dicho valorbasándonos en la propiedad DataGrid-ViewCellPaintingEventArgs.RowIndex, ycomprobar que la celda sobre la quevamos a realizar las operaciones perte-nece a una fila; o lo que es lo mismo, altomar el parámetro DataGridViewCell-PaintingEventArgs del evento CellPain-ting, la propiedad ColumnIndex deberáser menor que cero, y la propiedadRowIndex mayor o igual que cero.

Los efectos de colores fundidos ycálculo de coordenadas para pintar elobjeto PathGradientBrush serán los mis-mos que en los anteriores ejemplos, porlo que el cambio en este caso concretoconsistirá en crear un tipo de letra explí-citamente para dibujar el número en lacelda. Por este motivo, en el listado 7se exponen aquellas instrucciones querepresentan cambios con respecto a losanteriores ejemplos.

Para comprobar la aplicación de esteefecto sobre esta parte del control, vea-mos la figura 6.

Acabando la pintura

Llegamos al punto final de este artícu-lo, en el que hemos realizado un repa-so del evento CellPainting del controlDataGridView, como medio para aplicarciertos efectos avanzados de presenta-ción sobre las celdas del control a fin delograr un resultado más agradable a lavista de nuestros usuarios.

Que ustedes lo disfruten.

new Bitmap(GetType(), “FlechaArriba.png”);break;

case SortOrder.Descending:bmpImagen =

new Bitmap(GetType(), “FlechaAbajo.png”);break;

}}

// pintar la imagen en la celda de la cabecera// si realmente se ha establecido un ordenif (bmpImagen != null){

e.Graphics.DrawImage(bmpImagen,e.CellBounds.Right –

(bmpImagen.Width + e.CellStyle.Padding.Left),e.CellBounds.Y + e.CellStyle.Padding.Top);

}

e.Handled = true;}

}

Listado 6

private void dgvGrid_CellPainting(object sender,

DataGridViewCellPaintingEventArgs e)

{

// si la celda a pintar es cabecera de fila

if (e.ColumnIndex < 0 && e.RowIndex >= 0)

{

// calcular el número a pintar en la celda

int nNumeroFila = e.RowIndex + 1;

//....

// crear la fuente a usar para dibujar el número

Font oFont = new Font(“Comic Sans MS”, 12, FontStyle.Italic);

// calcular el tamaño del texto

Size szTexto =

TextRenderer.MeasureText(nNumeroFila.ToString(), oFont);

// dibujar el número

TextRenderer.DrawText(e.Graphics,

nNumeroFila.ToString(),

oFont,

e.CellBounds,

e.CellStyle.ForeColor);

e.Handled = true;

}

}

Listado 7

Figura 6. Personalizando el dibujo de las cabeceras de fila.

Page 36: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Atributos para solicitud y rechazo de permisosUn primer paso que podemos dar en nuestrosprogramas es el de “decorar” el código fuentecon una serie de atributos en los que se especifi-can los requisitos que tiene el ensamblado encuanto a los permisos que necesita para poderfuncionar. Cuando especificamos los requisitosde seguridad mediante atributos, se dice que esta-mos haciendo operaciones de seguridad declara-tivas, en contraposición a las que se realizanmediante sentencias de código ejecutable, que sedenominan imperativas.

En su modalidad más simple, la solicitud depermisos puede tener este aspecto:

Estos atributos, que afectan a todo el ensam-blado, se pueden introducir en cualquiera de losfuentes que se compilan para formar dicho ensam-blado; pero es costumbre, para facilitar su locali-

zación, agruparlos dentro del archivo AssemblyIn-fo.cs (o .vb).

En el ejemplo anterior hemos utilizado unpermiso del tipo UIPermission, es decir, una soli-citud de permiso de interfaz de usuario. En losargumentos hemos especificado SecurityAc-tion.RequestMinimum, indicando que el programanecesita como mínimo este permiso para poderfuncionar. Si las políticas de seguridad del siste-ma no concediesen a este ensamblado los per-misos que hemos señalado como “mínimos”, elensamblado no llegaría a cargarse, y el sistemamostraría directamente un error de seguridad,sin siquiera arrancar el programa.

El parámetro Window=UIPermissionWindow.All-Windows especifica en mayor detalle el tipo concre-to de UIPermission que estamos solicitando. Paracada subtipo de Permission, los argumentos dispo-nibles son diferentes y permiten matizar las carac-terísticas y alcance del permiso correspondiente.

Cabe señalar que también es posible solicitarde golpe un conjunto de permisos completo. Porejemplo, para solicitar el conjunto “Full Trust”:

Más sobre seguridad de acceso a código

plataforma.net

Alberto Población lleva27 años desarrollando

software. Cuenta entreotras con las certificacio-

nes MCSE, MCDBA,MCITP, MCSD, MCPD y

MCT, además de serMVP de C#. En la actua-lidad trabaja como con-

sultor independiente,dedicándose principal-mente a la formación,

asesoramiento y desarro-llo de aplicaciones.

En una entrega anterior (dotNetManía nº 41) presentamos los funda-mentos de la Seguridad de acceso a código (Code Access Security, CAS)en .NET Framework, y describimos cómo el CLR determina los per-misos del código y cómo se pueden manipular desde las herramientasadministrativas los permisos concedidos a cada ensamblado. En estaentrega veremos cómo se pueden solicitar, manipular y limitar estospermisos desde dentro de nuestro código.

Alberto Población

using System.Security.Permissions;...[assembly:UIPermission(SecurityAction.RequestMinimum,

Window=UIPermissionWindow.AllWindows)]

[assembly: RegistryPermission(SecurityAction.RequestMinimum,

Name=”FullTrust”)]

Page 37: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

De forma similar a la solicitud depermisos mínimos, se pueden añadirsolicitudes de permisos Opcionales yRechazados:

Con el primero de estos atributosestamos indicando al sistema de segu-ridad que deseamos utilizar el permi-so de FileIO si las políticas de segu-ridad lo permiten para este ensam-blado, pero que el programa puedefuncionar sin este permiso. Esto pue-de ser útil, por ejemplo, para un pro-grama que grabe una bitácora (log) desus operaciones en un archivo en dis-co, pero que en caso de no tener esepermiso puede seguir funcionando;eso sí, sin grabar el log.

El segundo atributo expresa queno deseamos disponer de permiso deacceso al Registro de Windows,incluso aunque las políticas de segu-ridad lo consientan para nuestroensamblado. De esta forma garanti-zamos que el programa nunca puedamodificar el Registro, incluso aun-que presente un mal funcionamien-to o un uso indebido de alguna fun-ción de librería que pudiera realizarese tipo de operación.

La asignación final de permisos querecibe el ensamblado consiste en losMínimos, más los Opcionales que per-mita la política de seguridad, menos losRechazados.

Hay que señalar que, en caso de queno se solicite ningún permiso opcional,el sistema interpreta que se solicita “FullTrust” como permiso opcional, y portanto se conceden todos los permisosque permita la política, salvo los recha-zados expresamente. Por este motivo,es buena costumbre incluir un atribu-to como el siguiente:

Con esto indicamos que solicita-mos como Opcional “ningún permi-so”, con lo que ya no se aplica lo indi-cado en el párrafo anterior, y los úni-cos permisos concedidos son los quesolicitemos expresamente medianteel resto de los atributos. De esta for-ma, el programa no recibe ningúnpermiso superfluo.

Solicitud de permisos(“Demand”)

Hemos visto que un ensambladopuede solicitar y recibir una serie depermisos. Los permisos que ha reci-bido el ensamblado entrarán en jue-go en el momento en que el códigoque se ejecuta realice una operaciónque requiera dichos permisos. ¿Cómose determinan y se controlan estasoperaciones? Veámoslo, apoyándonosen la figura 1.

Supongamos que tenemos un pro-grama ejecutable, que en la figuradenominamos “Ensamblado 1”, queconforme con las políticas del sistemaha recibido permiso de ejecución perono de escritura en disco. Este progra-ma realiza una llamada a una DLL

(“Ensamblado 2”) que graba ciertosdatos en disco. Este ensamblado, aligual que el anterior, habrá recibidolos permisos que le correspondan; porejemplo, podría tener permiso de escri-tura en disco. Para realizar físicamen-te la grabación, esta DLL utiliza lasrutinas contenidas en el espacio denombres System.IO, que se encuentrancompiladas dentro de una de las DLLque se suministran con .NET Frame-work, y que en la figura hemos llama-do “Ensamblado 3”.

Esta librería, en última instancia,tendrá que utilizar los servicios de invo-cación a la plataforma (P/Invoke) para

dotN

etM

anía

<<

37

dnm.plataforma.net<<

Figura 1

[assembly: FileIOPermission(SecurityAction.RequestOptional,Unrestricted=true)]

[assembly: RegistryPermission(SecurityAction.RequestRefuse,Unrestricted = true)]

[assembly: FileIOPermission(SecurityAction.RequestOptional,Unrestricted=false)]

Instrucciones de control de seguridad

Solicitar permisos Demand

Afirmar permisos Assert

Restricción de permisos DenyPermitOnly

Desactivar llamadas en la pila RevertAssertRevertDenyRevertPermitOnlyRevertAll

Comparar permisos IsSubsetOf

Combinación de permisos UnionIntersect

Page 38: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

38

dnm.plataforma.net<<

llamar a las API de Windows que rea-lizan la grabación mediante código nomanejado. Antes de hacer el salto adicho código no manejado, el progra-ma hace una llamada al código de segu-ridad de .NET que se denomina “soli-citud de permiso” (“Demand”). En ellistado 1 tenemos un ejemplo que mues-tra una solicitud de este tipo.

Cuando se ejecuta el Demand(), elmotor de seguridad realiza un recorri-do por la pila de llamadas (stack walk),comprobando si todos los llamantes deesta rutina tienen el permiso solicita-do. En el ejemplo de la figura 1, la soli-citud sube en primer lugar al Ensam-blado 2, que efectivamente tenía per-miso de escritura, con lo que la solici-tud continúa subiendo por la pila. Alllegar al Ensamblado 1, el CLR deter-mina que dicho ensamblado no tienepermiso de escritura, por lo que se pro-duce una excepción de seguridad y laescritura no llega a realizarse.

El resultado final es que no se pro-duce ninguna escritura en disco, a pesarde que las DLL que contienen instruc-ciones de grabación tienen permiso paraello, debido a que el llamante inicial tie-ne prohibida dicha escritura por laspolíticas de seguridad de .NET.

Estas solicitudes también se pue-den hacer de forma declarativa en lugarde imperativa, a nivel de clase o demétodo:

Afirmación de permisos(“Assert”)Vayamos más allá y supongamos querealmente sí que deseamos realizar lagrabación anterior. Por ejemplo, elEnsamblado 2 podría contener unasrutinas de registro en bitácora (logging)que graben en un archivo una traza delas operaciones realizadas, y deseamosque esa traza quede grabada siempreque un ejecutable llame a esta librería,aunque el ejecutable en sí no tenga per-miso para escribir en disco. Esto selogra mediante la operación llamada“Assert”, tal como muestra el ejemplodel listado 2.

Volviendo al ejemplo de la figura 1,y suponiendo que el Assert() se haintroducido en el Ensamblado 2, cuan-do se produce el Demand() en el Ensam-blado 3 y “sube” a la trama anterior dela pila, se encuentra que en dicha tra-ma se ha realizado una afirmación delpermiso solicitado, y en consecuenciase da dicho permiso por concedido,teniendo éxito el Demand() sin llegar asubir hasta el Ensamblado 1.

Lógicamente, este proceso solotendrá éxito si la política de seguridadconcede el permiso solicitado al ensam-blado que realiza el Assert.

Solo puede haber un único Assertactivo por cada trama de la pila. Unavez que el Assert ya no se necesita, sedesactiva mediante RevertAssert(),como se ve en el ejemplo del listado 2.

Hay que actuar con precaución alescribir ensamblados que utilicen elAssert, ya que por esta vía se pueden abriragujeros de seguridad. Por ejemplo, en ellistado 2 hemos especificado como conststring el nombre del fichero en el que segraba el log. Si en lugar de eso hubiéra-mos aceptado este fichero como pará-metro del método, el programa llaman-te (que, recordemos, no tiene permisospara grabar en disco) podría pasar por estavía una ruta cualquiera y “engañar” al sis-tema de seguridad consiguiendo grabaren disco un archivo de su elección, apro-vechándose de los permisos que tieneconcedidos el Ensamblado 2.

Rechazo de permisos(“Deny”)La operación “Deny” funciona delmodo contrario que Assert. Cuandoejecutamos un Deny(), estamos for-zando que se produzca una excepcióncuando el código más abajo en la pilarealice un Demand() del permiso obje-to del Deny, incluso aunque el ensam-

using System.Security.Permissions;// ...public void Escribir(string fichero){

FileIOPermission permiso = new FileIOPermission(FileIOPermissionAccess.Write, fichero);

try{

permiso.Demand();// Aquí, si la solicitud tiene éxito,// usamos P/Invoke para llamar a la API

}catch (SecurityException ex){

// Si falla el Demand(), se produce esta excepción}

}

[FileIOPermission(SecurityAction.Demand,Write = “C:\\Fichero”)]

public class ClaseConPermiso{...}

private void GrabarTraza(){const string fichero = C:\\log.txt”;

FileIOPermission permiso = newFileIOPermission(FileIOPermissionAccess.Write,fichero);

permiso.Assert();

// Aquí se hace la grabaciónFileIOPermission.RevertAssert();}

Listado 1

Listado 2

Page 39: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

39

dnm.plataforma.net<<

blado llamante sí que tenga el permi-so en cuestión. El ejemplo del lista-do 3 rechaza el permiso de utilizarreflexión sobre miembros no visiblesde un tipo.

Si este código se introdujera en elEnsamblado 2 de la figura 1, y detrásdel Deny se llamara a una subrutina delEnsamblado 3 que tratara de usar refle-xión sobre miembros privados de unaclase, se produciría una excepción deseguridad, aún en el caso de que tantoel Ensamblado 3 como el 2 tuvieranconcedido dicho permiso.

“LinkDemand”La operación “LinkDemand” opera deforma similar al Demand que hemosmencionado más arriba, con la dife-rencia de que LinkDemand() solo com-prueba el llamante inmediato, en lugarde recorrer toda la pila comprobandosi la totalidad de los llamantes tienen elpermiso solicitado.

Por ejemplo, para comprobar queel llamante tiene “Full Trust”:

Adicionalmente, el Demand reco-rre la pila cada vez que es invocado,debido a que los llamantes podrían serdistintos, mientras que el LinkDemandse resuelve en tiempo de compilaciónJust-In-Time (JIT), por lo que solo secomprueba una vez.

El atributo AllowPartiallyTrus-tedCallersTodo ensamblado que tiene un nom-bre fuerte (strong name) recibe implí-citamente un LinkDemand del con-junto de permisos Full Trust. Estoprovoca el que dichos ensambladosno puedan ser llamados desde pro-gramas que no tengan confianza com-pleta. Si el programador ha tenido encuenta al desarrollar el ensambladolas implicaciones de seguridad de losentornos que tienen confianza par-cial, puede declarar expresamente la

validez de su código en dichos entor-nos mediante el atributo AllowPar-tiallyTrustedCallers:

La consecuencia de aplicar este atri-buto es que se elimina el mencionadoLinkDemand y el ensamblado deja derequerir que sus llamantes tengan per-misos Full Trust.

ConclusiónCuando escribamos librerías que utilicenllamadas a código no gestionado, y seaprevisible que éstas puedan ser llamadasdesde código que no tenga confianza com-pleta, es recomendable que introduzca-mos dentro las peticiones de permisos (con“Demand”) que sean oportunas de con-formidad con las operaciones que realicedicho código no manejado, a fin de evitarque los programas que llamen a nuestralibrería y no tengan confianza completapuedan aprovecharse de ella para saltarselas políticas de seguridad.

public void Metodo(){ReflectionPermission permiso =new ReflectionPermission(

ReflectionPermissionFlag.TypeInformation);

permiso.Deny();// Usar reflexión para acceder a // miembros públicosReflectionPermission.RevertDeny();}

[PermissionSet(SecurityAction.LinkDemand,Name = “FullTrust”)]

public void Metodo(...){...}

[assembly: AllowPartiallyTrustedCallers]Listado 3

DocumentaciónLa librería de MSDN contiene la referencia completa de las clases que manejan la Seguridad de acceso a código. Véan-se estos enlaces:

http://msdn.microsoft.com/library/SPA/cpguide/html/cpconsecurecodingguidelines.asp

http://msdn2.microsoft.com/es-es/library/system.security(VS.80).aspx

Prueba de los programas bajo condiciones de seguridad restringida

Cuando estamos desarrollando programas, normalmente los ejecutables se crean sobre nuestrodisco local y desde ahí los ejecutamos. La política de seguridad predeterminada les otorga enton-ces el conjunto de permisos “Full Trust”. Por lo tanto, al ejecutarlos no ejercitamos las distintaslimitaciones de seguridad a las que se refiere este artículo.

Si deseamos probar y depurar nuestros programas bajo condiciones de seguridad limitada,podemos crear una carpeta en nuestro disco y asignar a los archivos cargados desde esa car-peta una política restrictiva, añadiendo el atributo “Exclusive”, para que no reciban además lospermisos predeterminados. Una forma de asignar estos permisos consiste en utilizar el coman-do CASPOL:

md c:\pruebascaspol -ag 1 -url file:///C:/pruebas/* Internet -n Pruebas -exclusive on

Para probar nuestro programa, copiaremos el ejecutable a esta carpeta y lo ejecutaremosdesde ahí, con lo cual se verá limitado a los permisos asignados, que en el ejemplo anterior sonlos de la Zona Internet.

Page 40: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Manipulando archivos (o ficheros)

Más tarde o más temprano, nuestros componen-tes necesitarán acceder a archivos físicos en disco.Consideremos entonces una clase que encapsuledichas acciones: FileIO.

En este caso, las acciones serán inmediatas, sinmucha cosa que hacer más que la tarea específica.Para facilitar el acceso, hagamos que los métodos deesta clase sean accesibles directamente, sin necesi-dad de instanciar la misma. Para ello, nos asegura-remos de que la clase no sea heredable, utilizandoNotInheritable como modificador en la declaraciónde la clase, y tenga un único constructor privado,para que no se puedan crear instancias.

Leyendo contenido del disco

Lo importante en este caso es:1. Asegurarse de que el usuario tiene derechos

de lectura sobre el elemento requerido.2. Disponer adecuadamente del recurso de

acceso a disco.

Es muy útil disponer de métodos para recu-perar y almacenar información privada del usua-rio para cada aplicación. Para ello, es más seguroutilizar IsolatedStorage.

Y de una forma muy similar, implementamosescrituras (listado 2).

Herramientas genéricas para loscomponentes: ficheros y recursos

plataforma.net

Siguiendo con la idea de las generalizaciones en componentes expues-ta en el número anterior, en este artículo veremos algunos otros ejem-plos que pueden resultarle interesantes.

Public NotInheritable Class FileIOPrivate Sub New()

End SubEnd Class

Public Shared Function GetFileContent( _ByVal path As String) As StringTry‘ Se evalúa si el usuario tiene permiso de accesoDim permission As New _System.Security.Permissions.FileIOPermission(_System.Security.Permissions.FileIOPermissionAccess.Read,_path)

permission.Demand()‘ Mediante using, nos aseguramos de que se libere ‘ adecuadamente el recursoUsing fi As New System.IO.StreamReader(path, _

System.Text.Encoding.Default)Dim s As String = fi.ReadToEndfi.Close()Return s

End UsingCatch ex As ExceptionThrow

FinallyEnd TryEnd Function

Daniel Seara

Daniel Seara es mentorde Solid Quality Mentors

y director del área dedesarrollo .NET. Es MVP

desde 2003 y ponentehabitual de INETA y

Microsoft.

Listado 1

Page 41: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Recursos

Otro elemento interesante a gene-ralizar es la obtención de recursos, tan-

to sean textos como de formato bina-rio. En muchas oportunidades necesi-taremos de ellos y, cosa aún más com-

pleja, puede que sean del componenteque se está ejecutando o del proceso quelanza la ejecución.

Definamos un enumerador que nospermita identificar de dónde queremosextraer los recursos:

Y, nuevamente, una clase que per-mita acceder directamente los métodos,sin necesidad de instanciarla.

Utilizando el enumerador podre-mos identificar de dónde obtener elrecurso. Necesitamos entonces el nom-bre del mismo y ya podremos hacerlo(siempre, los recursos se obtienen comoun stream) (listado 4).

Una vez que obtenemos el stream,convertirlo a texto es simplementetransformarlo de acuerdo a la codifica-ción, que en general es la predetermi-nada en el proceso (listado 5). do

tNet

Man

ía<<

41

dnm.plataforma.net<<

Public Enum SourceAssemblyEnum_As Integer

CallerAssemblyInitialAssembly

End Enum

Public NotInheritable Class_Resources

Shared Sub New()

End SubEnd Class

Public Shared Sub WritePrivateContent( _ByVal name As String, ByVal content As String)Using isoFile As IO.IsolatedStorage.IsolatedStorageFile = _

IsolatedStorageFile.GetStore( _IsolatedStorageScope.User _

Or IsolatedStorageScope.Assembly _Or IsolatedStorageScope.Domain, _Nothing, Nothing)

Using isoStream As New IsolatedStorageFileStream( _name, IO.FileMode.Create, isoFile)Using writer As New IO.StreamWriter(isoStream)

writer.Write(content)writer.Close()isoStream.Close()isoFile.Close()

End UsingEnd Using

End UsingEnd Sub

Public Shared Function GetPrivateContent( ByVal name As String) _As String

TryUsing isoFile As _IO.IsolatedStorage.IsolatedStorageFile = _IsolatedStorageFile.GetStore(IsolatedStorageScope.User _

Or IsolatedStorageScope.Assembly _Or IsolatedStorageScope.Domain, Nothing, Nothing)

Using isoStream As New IsolatedStorageFileStream( _name, IO.FileMode.Open, isoFile)

Using Reader As New IO.StreamReader(isoStream)Dim sReturn As String = Reader.ReadToEndReader.Close()isoStream.Close()isoFile.Close()Return sReturn

End UsingEnd Using

End UsingCatch ex As Exception

ThrowEnd Try

End Function

El código importa el espacioSystem.IO.IsolatedStorage

para facilitar el acceso a losobjetos definidos en él.[ ]

NOTAEs importante tener en cuentaque se pueden duplicar estasfunciones para que utilicenarrays de bytes u objetosMemoryStream para manipulardatos binarios.

[ ]NOTA

Listado 2

Listado 3

En este caso, el constructores Shared. La diferencia esque, si necesitáramos haceralgo la primera vez que se uti-liza un método de esta clase,podríamos hacerlo allí. No eseste el caso, pero quería dejarclaro cómo se hace.

[ ]NOTA

Page 42: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

42

dnm.plataforma.net<<

¿Y qué pasa con My?

Sí, claro, obviamente puede utilizarse sin problemas, pero lasfunciones anteriores sirven para obtener cualquier recurso,no solo los incluidos en el proyecto actual (ensamblado actual).

Y hablando de My, les dejo un pequeño procedimiento paracargar los iconos que necesite un formulario en controles Ima-geList desde los recursos de la aplicación. En el ejemplo seasume que toda imagen cuyo nombre termine en “16” es paraun determinado ImageList (podría repetirse para “32”, etc.para cargar distintos ImageList).

Y basta por ahora. Espero en la próxima comenzar conalgunas cosas algo más complejas.

¡Saludos!

Public Shared Function GetResourceString( _ByVal name As String, _Optional ByVal source As SourceAssemblyEnum = _

SourceAssemblyEnum.CallerAssembly) As String

‘ Utiliza GetResourceStream para obtener el recursoDim str As System.IO.Stream = _

GetResourceStream(name, source)With str

‘ Se obtienen todos los bytesDim bytes(CInt(.Length)) As Byte.Read(bytes, 0, CInt(.Length - 1))Dim textConverter As System.Text.Encoding = _

System.Text.Encoding.DefaultTry‘ Se transforman a cadena de caracteresReturn textConverter.GetString(bytes)

Catch ex As Exception‘ Hereda de ‘ Solid.Tools.ExceptionHandler.BaseExceptionThrow New ResourceNotFoundException(ex)End Try

End WithEnd Function

Sub LoadImageLists()Dim myRes As Resources.ResourceSet = _My.Resources.ResourceManager.GetResourceSet( _System.Threading.Thread.CurrentThread.CurrentUICulture,_False, _True)Dim myEnum As IDictionaryEnumerator = _

myRes.GetEnumerator()Do While myEnum.MoveNextIf myEnum.Key.ToString.EndsWith(“16”) Then

img16.Images.Add( _myEnum.Key.ToString.ToUpper.Replace(“16”, “”), _System.Drawing.Icon.FromHandle( _

CType(myEnum.Value, Drawing.Bitmap).GetHicon))End If

LoopEnd Sub

Es muy útil disponer de métodos pararecuperar y almacenar información

privada del usuario para cada aplicación. Para ello, es más seguro

utilizar IsolatedStorage

Public Shared Function GetResourceStream( _ByVal name As String, _Optional ByVal Source As SourceAssemblyEnum = _

SourceAssemblyEnum.CallerAssembly) _As System.IO.Stream

Dim ass As System.Reflection.Assembly = NothingSelect Case SourceCase SourceAssemblyEnum.CallerAssemblyass = System.Reflection.Assembly.GetCallingAssembly

Case SourceAssemblyEnum.InitialAssemblyass = System.Reflection.Assembly.GetEntryAssembly

End Select‘ La propiedad FullName retorna varios datos. ‘ De ellos, el primero es el nombre del ensamblado, ‘ que es lo que necesitamosDim sName As String = ass.FullName.Split(“,”c)(0)Dim str As System.IO.Stream = _

ass.GetManifestResourceStream( _String.Format(“{0}.{1}”, sName, name))

‘ Si el recurso no existe no se obtiene nada‘ Por lo tanto, sigue siendo NothingIf str Is Nothing Then

‘ Esta excepción hereda de‘ Solid.Tools.ExceptionHandler.BaseExceptionThrow New KeyNotExistException

End IfReturn strEnd Function

Listado 4

Listado 5

Listado 5

Page 43: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

43

dnm.inicio<<

La crispación a la que me refería antes se debe a quecon las primeras dos versiones de Visual Studio para.NET, cuando depurábamos una aplicación y detenía-mos (o se detenía) la ejecución del programa, nor-malmente porque se producía un error, lo primeroque querías hacer era solucionar la causa del error, ypara solucionarlo lo habitual era que modificaras elcódigo. Y aquí es cuando empezaban los problemas.Con la versión inicial (llamémosla Visual Studio 2002),no podías modificar nada del código durante la depu-ración. Si tus antecedentes de programador eran por-que usabas Visual Basic 6.0, esa crispación llevabaimplícita una implementación de ICabreante (ver dot-NetManía nº 16 y 18 para saber más sobre las inter-faces), y es que en Visual Basic 6.0 la depuración eramuy cómoda; éste permitía modificar el código, cam-biar por dónde debía continuar la ejecución y otrasfacilidades que resultaban útiles a la hora de realizaresa tarea tan, digamos, desagradable.

La excusa que nosotros mismos nos poníamos eraque “bueno, lo acepto, ya que en Visual Basic 6.0 laejecución es sobre código casi interpretado y .NETdebe hacerlo sobre código compilado, por tanto...acepto pulpo como animal de compañía”, y... ¡te teníasque aguantar! ¡Qué remedio!

Después llegó Visual Studio 2003, y la cosa cam-bió un poco; no mucho, la verdad, pero al menos per-mitía (y sigue permitiendo) modificar el código. El

problema es que esos cambios no serían tenidos encuenta hasta la próxima vez; es decir, para que fuesenaplicados esos cambios tenías que detener la depura-ción (o parar la ejecución, que para el caso es lo mis-mo) y empezar de nuevo. La interfaz que definía estasegunda versión de Visual Studio era IDesesperante;pero ya casi te habías acostumbrado y casi no la imple-mentabas.

Y entonces empezaron los rumores: Visual Stu-dio 2005 (por entonces conocido como Whidbey)tendría algo que los programadores de Visual Basicpre-.NET ya tenían desde hacía años: Edit & Con-tinue (editar y continuar). ¡Bien! ¡Una buena noticia!Pero la noticia no solo era buena, sino fabulosa. Esacaracterística de editar y continuar estaría imple-mentada en el propio corazón de .NET: el CLR. Estosuponía que todos los lenguajes de .NET se benefi-ciarían de esa característica. Y lo mejor de todo es quesi el motor de ejecución permitiría detener la ejecu-ción, hacer cambios y seguir ejecutando la aplicación,lo haríamos sobre código compilado; es decir, todoel proceso sería más fiable que si fuese interpretadoo simulado por el entorno de desarrollo, que era loque en un principio parecía que iba a ocurrir (ini-cialmente se rumoreaba que solo iba a ser posibleusarlo en Visual Basic).

Por fin salió a la calle Visual Studio 2005, y pudi-mos comprobar que era cierto: podemos detener la

Depuración en .NETEl depurador que lo depure... recibirá ayuda del CLR

inicio

Guillermo “Guille”Som

Es Microsoft MVP deVisual Basic desde 1997.Es redactor de dotNet-Manía, mentor de SolidQuality Iberoamericana,

tutor de campusMVP,miembro de Ineta Spea-kers Bureau Latin Ame-

rica, y autor de los libros“Manual Imprescindiblede Visual Basic .NET” y

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

La depuración es una de esas cosas que todos hacemos, o deberíamos hacer,y que a nadie le gusta tener que hacer; no porque no sea necesaria, sino por-que al final terminabas fatal de los nervios cuando la depuración la realiza-bas con versiones anteriores de Visual Studio para .NET; por suerte, esto yano es así con Visual Studio 2005. En esta serie de dos artículos mostraremoslas principales posibilidades que este último entorno pone a nuestro alcan-ce para facilitarnos la depuración de nuestros programas.

Guillermo «Guille» Som

Page 44: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

44

dnm.inicio<<

ejecución de la aplicación, hacer cambios en el códi-go fuente y seguir ejecutando sin tener que volver aempezar de cero. Y los que habitualmente usábamosVisual Basic 6.0 incluso vimos muchas mejoras, ya queel entorno de Visual Studio 2005 nos permite hacerciertos cambios en el código que no podíamos hacercon VB6. Pero no voy a seguir haciendo compara-ciones con Visual Basic 6.0; me voy a centrar en quées lo que podemos hacer y también en lo que no pode-mos hacer (ya que no podemos hacer todo lo que senos podría antojar: debemos tener en cuenta que todoel proceso se realiza en tiempo de ejecución y duran-te ese tiempo, el CLR debe almacenar el estado de laejecución, almacenar en la pila lo que está ejecutan-do y otras muchas comprobaciones más, sobre todocuando se produce una excepción y hay un bloquetry/catch de por medio). Pero no empecemos con laspegas, veamos los beneficios y ya iremos encontrán-donos con las cosas que podemos y no podemos haceren nuestro camino hacia la tarea tediosa, pero nece-saria de conseguir que nuestras aplicaciones esténlibres de fallos.

Los previos para la depuraciónCuando vamos a depurar aplicaciones con Visual Stu-dio 2005, en realidad no tenemos que hacer casi nadaantes, pero al menos debemos permitir la depura-ción. Para permitir la depuración debemos ejecutarnuestro código en modo Debug, ya que, (salvo queusemos la versión Express) todos los proyectos deVisual Studio 2005 permiten dos modos de compi-lación y ejecución: Debug y Release. Por regla gene-ral, (salvo que la hayamos ocultado), esas opcionesestán en la barra de herramientas (botonera) de laparte superior del entorno integrado, como podemosver en la figura 1.

Puntos de interrupción

Cuando estamos en “modo de depuración”, si seproduce una excepción (error) en tiempo de ejecución,la ejecución (valga la redundancia) se detiene en el lugarque se produce dicha excepción. Si tenemos un bloquetry/catch, dicha ejecución no se detendrá, al menos si

hemos incluido código de gestión de la excepción enel bloque correspondiente a la parte catch. Pero elincluir un try con su correspondiente catch cuandoestamos depurando puede que no nos permita hacertodo lo que nos gustaría hacer, ya que si tenemos unbloque try/catch el error será interceptado y no sabre-mos a ciencia cierta dónde se produjo... o casi; al menosen un proyecto grande, ya que ese bloque try/catchque detecte el error puede que no esté donde a noso-tros nos hubiera gustado que estuviera. Pero esta esotra historia a la que volveré más tarde.

Si sabemos dónde se puede producir el error, pode-mos agregar un punto de interrupción antes del lugardonde ocurrirá (ese lugar seguramente lo habremosdescubierto en una ejecución anterior). Podemos agre-gar un punto de interrupción pulsando la tecla [F9]sobre la línea en la que queremos que se detenga la eje-cución del programa. Al llegar a un punto de inte-rrupción, la ejecución del programa se detiene, y pode-mos inspeccionar los valores de las variables, cambiardichos valores, ejecutar el código línea a línea (o ins-trucción a instrucción) y hacer muchas cosas más. Esas“muchas cosas más” son las que en realidad son nove-dades en la forma de depurar de Visual Studio 2005,ya que en las versiones anteriores también podemosponer puntos de interrupción, inspeccionar las varia-bles, etc. Ahora iremos viendo esas nuevas posibilida-des de depuración con más detalle.

Sólo mi código

Cuando estamos depurando y ejecutando paso apaso la aplicación (ahora veremos cómo), lo lógico esque solo queramos inspeccionar nuestro código, esdecir, el código que nosotros hemos escrito. Esto loharemos marcando la opción “Habilitar Sólo mi códi-go” en las opciones de depuración (“Herramientas”> “Opciones” > “Depuración”, ver figura 2). De esta

forma, el depurador no tendrá en cuenta el códigoque no esté considerado como “mi código”.

Según la documentación de Visual Studio, éste esel proceso que se sigue para determinar qué se con-sidera como “mi código” (transcribo literalmente):

En una versión de depuración estándar, se desactivala optimización y se crean símbolos de depuración paratodos los módulos. Cuando se ejecuta una versión de depu-

Figura 1. Opciones de inicio en modo Debug en Visual Studio 2005

Page 45: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

45

dnm.inicio<<

ración, se considera que esosmódulos pertenecen a “micódigo”. Si se llama a una fun-ción de biblioteca que se opti-miza y no tiene símbolos dedepuración, se considera queno es “mi código”. “Solo micódigo” le impide detenerse enel código de biblioteca, opciónque puede desear en la mayoríade los casos.

Ahora veremos qué significa esto y cómo pode-mos definir parte de “nuestro código” como si no fue-ra “mi código” con idea de no detenernos en él cuan-do estemos depurando.

Como veremos, (y tal como nos indica la ayudade Visual Studio), tener habilitada la opción de “Solomi código” nos permite centrarnos en el código quenosotros hemos escrito y que es el que en rea-lidad nos interesa depurar. También nos aho-rraremos mensajes extras del entorno de desa-rrollo cuando lo que se va a ejecutar está enlibrerías externas o en librerías que no estángeneradas con la opción de depuración.

Excluir código para la depuración

Como hemos visto en la sección anterior,podemos indicar al depurador de Visual Studioque solo ejecute el código considerado como“nuestro”.

¿Qué se considera como código nuestro? Talcomo nos indica la documentación de Visual Stu-dio, cualquier código que tengamos referencia-do en nuestro proyecto y no tenga símbolos dedepuración se considera que no es nuestro; todolo demás sí se considerará como nuestro código.

Aunque esto no es totalmente cierto, al menos si lo toma-mos al pie de la letra; ya que podemos añadir un pro-yecto a nuestra solución, indicar que no se generen lossímbolos de depuración (normalmente creando el fiche-ro con la extensión .pdb) e incluso generarlo en modooptimizado y aún así se considera que es parte de “micódigo”. Bueno, en realidad no se considera como “nues-tro”, pero el IDE de Visual Studio nos advierte de quesi realmente no queremos que sea nuestro, pues... quelo indiquemos, tal como vemos en la figura 3.

El aviso mostrado en la figura 3 nos indica queen nuestro proyecto tenemos código que no está mar-cado para depurar o que está marcado para ser opti-mizado, pero en realidad ese aviso solo se mostrarási no generamos los símbolos de depuración. La selec-ción de la casilla de optimización no afecta y no serácausante de que se muestre ese mensaje.

¿Cómo configurar el proyecto para generar o no los sím-bolos de depuración?

Si no queremos generar el fichero con la exten-sión .pdb, que es el causante de que se pueda depurarel código, tendremos que indicarlo en las opcionesavanzadas de generación del código. Según trabaje-mos con Visual Basic o con C#, el nombre de esa

Figura 3. Advertencia de que si queremos hacer ciertas cosas, que lo indiquemos decuadamente

Figura 4. Opción de generación de símbolos de depuración en C#

Figura 2. Opciones de depuración: “Habilitar Sólo mi código”

Page 46: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

46

dnm.inicio<<

opción será diferente, pero ambas están en el mismositio, o casi, al menos si tenemos en cuenta de que enVisual Basic las opciones de generación está en la ficha“Compilar”, mientras que en C#, esa ficha se llama“Generar”.

Independientemente de cómo se llamen las opcio-nes o dónde se encuentren, si no queremos que segeneren esos ficheros de depuración, lo que tenemosque hacer es indicar el valor none en las opciones degeneración. En la figura 4 se muestra esa opción paraC# y en la figura 5 para Visual Basic.

Indicar partes del código para excluirlode la depuraciónSi dejamos seleccionada la opción de generación desímbolos de depuración y queremos excluir parte delcódigo del proceso de depuración, podemos usar cier-tos atributos definidos en el espacio de nombres Sys-tem.Diagnostics. Dependiendo de qué comporta-miento queramos, podremos usar uno de estos tresatributos:

• DebuggerNonUserCode. Este atributo le indica a VisualStudio de que el elemento al que se aplica no se con-sidere como código del usuario, es decir, no se tengaen cuenta como “mi código”. Si el atributo lo aplica-mos a una clase, la clase completa se excluirá del pro-ceso de depuración. Si lo aplicamos a un procedi-miento (método, constructor, etc.), solo ese procedi-

miento se excluirá. Hay que tener en cuenta que esteatributo solo se tendrá en cuenta si hemos seleccio-nado la opción “Habilitar Sólo mi código”.

• DebuggerHidden. Este atributo solo se puede indicara nivel de procedimiento (ver el comentario ante-rior para saber qué se considera un procedimien-to) y nos servirá para ocultarlo al depurador; de esaforma, no podremos navegar por él en el procesode depuración, independientemente del valor quehayamos asignado a la opción “Habilitar Sólo micódigo”.

• Por último, el atributo DebuggerStepThrough impe-dirá que Visual Studio tenga en cuenta el elemen-to al que se aplica el atributo (que puede ser una cla-se o un procedimiento), pero en el sentido de queno podremos ir paso a paso por el código al que estáaplicado. A diferencia de DebuggerHidden, podemosponer puntos de interrupción, por ejemplo, en elcuerpo del procedimiento, y en ese caso se detendrála ejecución al llegar a ese punto de interrupción;pero no nos permitirá la “navegación” paso a paso(ahora veremos cómo podemos ejecutar el códigopaso a paso). En realidad, ese punto de interrupciónsolo se tendrá en cuenta si no tenemos habilitada laopción “Habilitar Sólo mi código”.

De los tres atributos de ocultación de código aldepurador, DebuggerHidden es el único que siempreoculta el código.

Ejecución paso a pasoCuando estamos depurando una aplicación, usare-mos los puntos de interrupción para que la ejecu-ción se detenga al llegar a ellos. Una vez que haya-mos detenido la ejecución del programa, podremosir navegando línea a línea o procedimiento a proce-dimiento, esto es lo que se conoce como ejecuciónpaso a paso.

Figura 5. Opción de generación de símbolos de depuración en C#

De los tres atributos de ocultación decódigo al depurador, DebuggerHidden es

el único que siempre oculta el código

Page 47: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

47

dnm.inicio<<

Cuando seleccionamos la opción “Paso a pasopor instrucciones” del menú “Depurar” o usamos latecla [F11], iremos “navegando” por cada una de lasinstrucciones del código; si una de esas instruccio-nes es un procedimiento, entraremos en el proce-dimiento y podremos ir inspeccionando cada unade las instrucciones que haya. Como ya comentéantes, por procedimiento se entiende cualquier cosaque no sea una clase (o tipo); es decir, una propie-dad también es un procedimiento, y por tanto hayveces que se hace tedioso este tipo de navegaciónpor el código, ya que se ejecutarán todas y cada unade las instrucciones que tengamosen “nuestro código”. Si no quere-mos entrar en los procedimientos,es decir, ejecutarlos, pero no ir pasoa paso por cada una de las instruc-ciones incluidas en él, podemosusar la opción “Paso a paso porprocedimientos” o bien usar la tecla[F10]. Si estamos usando esta últi-ma forma de navegar por el códi-go, siempre podremos usar la otraopción para entrar en el procedi-miento que nos interese.

Recordemos los atributos men-cionados antes, ya que si hemos usa-do el atributo DebuggerStepThroughsolo podremos detenernos en esecódigo si hemos puesto un punto deinterrupción; y aunque hayamos pues-to ese punto de interrupción, una vezen él, no podremos utilizar ninguna de las dos formasde navegar por el código, ya que el IDE se saltará todoel código que haya a continuación (saltar en el sentidode no ir paso a paso), y seguirá por el código en el quehayamos permitido la navegación.

Cambiar las combinaciones de tecla

Tal como he comentado en la nota, las teclas usa-das para ejecutar en modo depuración son las prede-terminadas de cada configuración de Visual Studio.De todas formas, si preferimos usar otras combina-ciones de teclas, siempre podremos modificarlas y ele-gir las que más nos gusten. Esto lo haremos cambiandolas combinaciones de las teclas desde las opciones deconfiguración de Visual Studio. Si la tecla elegida yaestá asignada a otra opción, el propio entorno nos avi-sará, tal como vemos en la figura 6.

Siguiente instrucción a ejecutar

Mientras estamos ejecutando paso a paso, lasiguiente instrucción (o línea) a ejecutar estará resal-tada en amarillo y con una flecha en la parte izquier-

Figura 6. Al elegir una combinación de teclas, si ya se está usando, nos avisará

Las teclas de depuración paso a paso cambian según la configuración de Visual Studio

Es importante resaltar que las teclas [F10] y [F11] son las predeterminadas para la configuración delentorno de desarrollo para Visual C#, Visual Web Developer o la conocida como Configuración generalde desarrollo. Sin embargo si hemos seleccionado la configuración del entorno de desarrollo para VisualBasic, esas teclas serán [Mayús]+[F8] y [F8], respectivamente.

Es importante saber que la configuración del entorno no depende del lenguaje, es decir, si trabajamoscon proyectos de Visual Basic y de C# las teclas siempre serán las mismas, ya que es el tipo de configuraciónelegido el que asignará las teclas de depuración no el lenguaje usado.

La tecla [F9] se usa siempre, independientemente de la configuración seleccionada.Como truco, comentar que yo (que normalmente uso Visual Basic para desarrollar) siempre suelo con-

figurar el entorno de trabajo usando la configuración general, de esa forma uso siempre las teclas [F10] y[F11] para navegar por el código.

NOTA

[ ]

Page 48: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

48

dnm.inicio<<

da, tal como vemos en la figura 7. En esa misma figu-ra vemos en rojo los puntos de interrupción.

En la figura 7 también podemos apreciar que losdos puntos de interrupción del método Saludo tienenuna marca de advertencia y no están en rojo en la barrade la izquierda; esto es así porque ese método estámarcado con el atributo DebuggerHidden.

La flecha amarilla indica qué es lo que se ejecutaráa continuación, es decir, que el código que se resaltaaún no se ha ejecutado, y si necesitamos cambiar lalocalización de la siguiente instrucción a ejecutar, pode-mos cambiarla moviendo esa flecha a otra posicióndentro del código. Por supuesto, no podemos moverese indicador a cualquier parte, solo donde esté per-mitido; por ejemplo, si quisiéramos cambiarlo a otrométodo, no nos lo permitiría: el cursor cambiará a unsigno de prohibido, tal como vemos en la figura 8.

Cuando cambiamos la siguiente instrucción a eje-cutar a una línea anterior a la que se está ejecutandoactualmente, todo el código que ya se haya ejecutadose volverá a ejecutar. Esto es lógico, pero si en ese códi-go tenemos declaraciones de variables o instanciamosalgún objeto, esas declaraciones volverán a ejecutarseo el objeto volverá a instanciarse. Lo de la instancia-

ción a lo mejor no es tan importante, pero lo de la decla-ración sí que lo es, ya que no nos dará ningún error deduplicidad de declaración. Esto es bastante útil, ya quenos permite deshacer todo lo que hemos hecho paraprobar nuevamente a ver por qué ese código no fun-ciona como esperamos.

Inspeccionar el contenido de las variablesMientras estamos en modo depuración, con el códigodetenido, podemos ver los valores que tienen todas lasvariables que están en el ámbito actual. Es decir, si esta-mos en un método, podremos ver qué valores tienenlas variables que tengamos declaradas y que estén acce-sibles en ese punto del programa. Esos valores los pode-mos ver de dos formas distintas: una de ellas es selec-cionando la variable a inspeccionar; si es una variablesimple, por ejemplo, una cadena, automáticamente semostrará una ventana emergente (tooltip) con el valor.Esa ventana permite editar el valor, de forma que pode-mos cambiarlo in situ. Si la variable a inspeccionar tie-ne aplicado algún método o propiedad, entonces noveremos el valor; bueno, sí que lo veremos, pero ten-dremos que ser finos a la hora de posicionar el cursordel ratón en la variable. En cualquier caso, siempre nosquedará la opción de seleccionar la variable al com-pleto para poder mostrar el valor que contiene.

Figura 7. La línea de ejecución actual se resalta en amarillo y los puntos de interrupción en rojo

Figura 9. La ventana de inspección de variables

Figura 8. El indicador de la siguiente instrucción a ejecutar no nos permitirá cambiar de método

Page 49: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

49

dnm.inicio<<

Por fortuna para los que tenemos poco pulso, estánlas ventanas de inspección de variables, en las que (talcomo podemos apreciar en la figura 9), tenemos dosfichas en las que el propio entorno de desarrollo va agre-gando las variables que estén actualmente en un ámbi-to más próximo a la ejecución del programa. En el mon-taje de la figura 9 vemos esas dos fichas de la ventana deinspección. En la ventana “Automático” se mostraránlas variables que estén más cercanas a la posición de lainstrucción que se está ejecutando (habitualmente seránlas variables de la línea actual y la anterior), mientrasque en la ficha “Variables locales” se mostrarán todaslas variables del procedimiento actual. Como vemos enesa figura, se muestran los valores de las variables, ademásde que en esas ventanas también podemos cambiar losvalores de las variables.

Si en lugar de inspeccionar una variable simplequeremos ver el contenido de un objeto por referen-cia, por ejemplo, de un array, en ese caso se nos mos-trará la información de una forma diferente, ya queel contenido no es un solo valor. En la figura 10 pode-mos apreciar cómo se muestra el contenido de un arrayde tipo string; en este caso, podemos acceder a losvalores individuales tanto de forma directa como des-de la ventana de inspección.

Inspección personalizada de variables

Como vemos en las figuras 9 y 10, además de lasdos ventanas de inspección mencionadas, tambiénpodemos utilizar otras con las variables u objetos que

nos interesen. Por ejemplo, si en una variable usamosel método ToString() no se mostrará el valor de for-ma automática: para ver ese valor tendremos que cre-ar lo que se conoce como una inspección rápida; laforma de hacerlo (además de usando el menú con-textual) es seleccionando la variable y pulsando[Mayús]+[F9]. Esa acción hará que se abra un cuadro dediálogo en el que se mostrará el resultado de la lla-mada a ese método además de permitirnos agregarese código a una ventana de inspección. En la figura11 vemos ese cuadro de diálogo y los botones que nospermiten agregar lo que estamos inspeccionando a laventana de inspección personalizada. También vemosque hay un botón para actualizar el valor; esto es útilsi en lugar de mostrar lo que inicialmente habíamosseleccionado queremos cambiar de idea y ver otraspropiedades u otros métodos, ya que en esa ventanatendremos acceso a los elementos del objeto que esta-mos inspeccionando (en este ejemplo es una variablede tipo entero, pero esa variable puede ser cualquie-ra de las que tengamos definidas en el procedimien-to que actualmente se está ejecutando, e incluso deotros procedimientos, al menos si están en ámbito).

ConclusionesCon lo explicado en este artículo, tendremos una visióngeneral de parte de lo que la depuración con VisualStudio 2005 (o superior) nos ofrece, aunque aún que-dan cosas importantes de las que hablar. Pero eso seráen el próximo número de dotNetManía, en el queveremos cómo utilizar todo lo relacionado con editary continuar y otras cosas relacionadas con la depura-ción y detección de errores, mientras tanto... ¡que lodepure bien!

Figura 10. La inspección de los arrays nos permite acceder a los elementos individuales

Figura 11. Ventana de inspección rápida

Page 50: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Silverlight 1.0 no es producto para desarrolladoresWeb. Sí que es, no obstante, un producto que jue-ga un papel estratégico en la lucha y esperamos quederrocamiento del ya vetusto Adobe Flash. Puedesimaginártelo como una cabeza de puente lanzada enel campo de batalla para proporcionar beneficios enun futuro, pero no precisamente en este momento.Más concretamente, la funcionalidad que Silverlightpuede ofrecer hoy –versión 1.0, como hemos dicho–se limita a las capacidades multimedia y a mostrardocumentos WPF muy simples.

El fin último es decirle al mundo que Microsoftha sacado un anti-Flash, que cuenta, al menos, conalgunas pocas ventajas sobre éste. Primero, la des-carga de documentos WPF no es una caja negra parabuscadores como Google u otros. Segundo, puedereproducir formatos de creación pública, incluyen-do WMV, WMA, MP3 y cualquier formato codifi-cado en VC-1, la forma de codificación de la mayoríade las películas en DVD. Y, finalmente, puede pro-gramarse utilizando un lenguaje estándar, no pro-pietario, como Javascript. Para reproducir una pelí-cula desde una página Web, ahora podemos olvi-darnos de cualquier reproductor externo (como

Media Player) y usar solo Silverlight. Y Silverlightes multiplataforma, soporta varios navegadores y seinserta mediante una etiqueta <OBJECT>.

Para preparar un documento Silverlight, no senecesitan obligatoriamente herramientas ad hoc.Todo lo que hay que crear es un fichero XAML,que no es más que un fichero con sintaxis XML.Puedes usar las herramientas de la suite Expressiono incluso Visual Studio 2008. Pero en muchos casossencillos, el Bloc de notas es suficiente. Un fiche-ro XAML describe su salida mediante un subcon-junto de elementos de Windows PresentationFoundation. Pero este subconjunto soportado esextremadamente limitado, y no incluye campos deentrada, elementos ubicables, estilos o enlace adatos. Las capacidades limitadas de Silverlight 1.0se derivan de estas características.

Silverlight se presenta en ocasiones, y se perci-be a menudo, como la herramienta que hará posi-ble a los desarrolladores construir aplicaciones ricaspara Internet (Rich Internet Applications, RIA) queserán distribuidas vía Web, pero con característicasprácticamente idénticas a las aplicaciones de escri-torio Windows. Este es el destino final donde nos

Silverlight. Presente y futuro

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)

Parece que la mayoría de desarrolladores se centra en lo que Silverlight no puede hacer todavía,en lugar de hacerlo en lo que sí puede hacerse con la versión 1.0 ya liberada. Así que mi pregun-ta es lógica: ¿cuál es el propósito de Silverlight 1.0? Soporta una pequeña porción de WPF y nodispone de utilidades para desarrolladores, tales como controles o librerías de ayuda. Yo inclusome preguntaría si es realmente utilizable… ¿nos puede dar su visión sobre esto?

todonet@qa

Demasiadas promesas alrededor de Silverlight 1.0. La comunidad de desarrolladores esperaba muchode esta versión, pero existen muchas cosas para las que producto no ha sido diseñado y que hoy díano pueden realizarse. Muchas de las expectativas generadas acerca de Silverlight se harán realidadsolamente cuando la próxima versión –en preparación para el verano de 2008– esté disponible. Enesta columna responderé a preguntas frecuentes sobre Silverlight y su relación con otras tecnologíasricas para aplicaciones Web.

tod

otN

et.q

a@

dot

netm

ania.c

om

Page 51: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

llevará Silverlight, pero todavía está lejos de donde nosencontramos hoy. La siguiente versión, actualmente eti-quetada como Silverlight 1.1 y en fase alfa, probable-mente nos lleve donde esperamos. Pero Silverlight 1.1se espera para después del verano, y probablemente no

exista una versión beta hasta primavera. Esta versión dis-pondrá de una gran cantidad de potentes característicasprogramables para capacitar la creación de una auténti-ca capa de presentación basada en lenguajes adminis-trados y objetos. Esta es la situación actual.

dotN

etM

anía

<<

51

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

dnm.todonet@qa<<

No es algo tan descabellado. Sin embargo, yo creo fir-memente que los dos mundos, Windows y Web, van apermanecer separados durante la mayor parte del futu-ro predecible. Al mismo tiempo, eso sí, la llegada de WPFy Silverlight genera posibilidades de interacción entre laWeb y Windows que ahora mismo son impracticables osencillamente imposibles.

Una vez que la próxima versión deSilverlight esté disponible, podrás desa-rrollar para la Web con la mayoría delas facilidades que tenemos hoy día enel escritorio. Podrías incluso llegar alpunto de utilizar el mismo documen-to WPF para alimentar aplicacionesWeb y Windows en un sistema multi-capa. Tengamos en cuenta, no obstan-te, que esto no sucede gratis, pero esun escenario que el uso de patrones dediseño adecuados (p.e., el modelo Vis-ta-Presentador) puede hacer posible.

No estoy seguro de que la llegadade Silverlight vaya a revolucionar elmundo del desarrollo Web en la pla-taforma Microsoft hasta el punto deeliminar a ASP.NET. Como Adobe Flash, se puede usarSilverlight de dos formas: como el entorno o contextoentero de una aplicación Web, o como un reproductorde contenidos especiales en una página ASP.NET están-dar. Según mi criterio, es esta segunda opción la queserá más ampliamente adoptada. En otras palabras,todavía veo la Web del futuro cercano hecha de páginasHTML con algunas islas WPF en su interior.

Silverlight 1.1 (o cual sea su nombre/número final)va a ser una plataforma mucho más potente para la Web.Basado en el conjunto de características conocido hoy,con el añadido de un rico conjunto de etiquetas WPF,Silverlight 1.1 incorporará un CLR muy ligero en elnavegador (en modo multiplataforma) para procesar len-guajes administrados (como C#, Visual Basic .NET, Javas-cript administrado o IronPython), una versión reducida

de .NET Framework –que incluirá extensiones LINQ–,manejo de excepciones y clases ad hoc para manejar lla-madas remotas a servicios. Al final, WPF y Silverlightforman un poderoso dúo, pero tengo la sensación de quela adopción amplia del producto estará condicionada alas herramientas de programación que los equipos deMicrosoft pongan a nuestra disposición.

Probablemente, necesitaremos Silverlight para con-tinuar con la exitosa programación basada en ASP.NETcon controles de servidor y extensiones del lado del clien-te. Si Microsoft puede llegar a ofrecer esto, mi predic-ción es que la mayoría de los desarrolladores adoptaránSilverlight como una poderosa herramienta para cons-truir aplicaciones Web todavía más potentes. Por otrolado, estamos en esta situación debido a una extraña con-junción astral: casi todos los navegadores soportan unmismo (y potente) conjunto de características progra-mables. Para que WPF y Silverlight destronaran aASP.NET y AJAX, todos los desarrolladores de todas lasplataformas deberían estar de acuerdo. Tecnológicamentehablando, no hay nada que lo impida, pero, en la prác-tica, yo no apostaría por ello. Aunque sí veo un montónde interacción entre ambos tipos de aplicaciones.

Asumiendo que he comprendido bien el rol y las perspectivas de Silverlight, yo diría queWPF y Silverlight podrían eventualmente convertir las aplicaciones ASP.NET y AJAX enobsoletas. ¿Qué le parece esa predicción?

Todavía veo la Web del futuro cercanohecha de páginas HTML con algunas

islas WPF en su interior

Page 52: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Desde luego que sí, ya empiezan a aparecer los pri-meros sitios que utilizan Silverlight 1.0 para los anun-cios o contenidos multimedia1. De todos ellos, me gus-taría señalar que http://www.tafiti.com es un ejemplode sitio potenciado mediante Silverlight. Tafiti seme-ja el comportamiento de Google y utiliza el motor deLive Search para recoger información a partir de una

cadena de consulta. Su interfaz de usuario está ente-ramente basada en Silverlight, aunque en este momen-to contiene un montón de código de script. Así que,después de todo, deberías considerar Tafiti como unarepresentación de las funciones que obtienes hoy deSilverlight, pero no todavía del código que escribiráscuando la versión siguiente esté disponible.

dotN

etM

anía

<<

52

dnm.todonet@qa<<T

odot

Net.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

¿Hay algún sitio Web público que utilice Silverlight?

Silverlight no es una aplicación preparada para consu-mir cualquier contenido XAML servido a un navegador.Si apuntas tu navegador a una URL que proporciona unstream XAML, no deberías esperar ningún comporta-miento especial en el navegador. La manera de usar Sil-verlight es ligeramente diferente.

Lo primero, inyectas una etiqueta <OBJECT> en unapágina Web que apunte al motor de Silverlight para laplataforma del navegador. El motor de Silverlight estáactualmente disponible para plataformas Mac y Win-dows y está siendo desarrollado para sistemas Linux porel grupo Mono, en el marco de un proyecto que se cono-ce como Moonlight.

El motor de Silverlight se define en un script llamadoSilverlight.js, que debes enlazar a la página. Este fiche-ro es parte del SDK de Silverlight. Contiene objetos deayuda, que pueden ser instanciados e inicializados paraque todo funcione como se espera. En una página WebASP.NET AJAX, usaríamos el siguiente código:

<script type="text/javascript">function pageLoad(){

var parent = $get("host");createSilverlightHost(parent);

}</script>

En una página HTML, simplemente ejecutas el códi-go en el manejador del evento onLoad de esa página opuedes situar un bloque <script> dentro de la etiqueta<body>. La función CreateSilverlightHost() es una fun-ción definida por el usuario que inicializa la ventana Sil-verlight. Esta función debe ser vinculada a la página de

alguna forma. Normalmente, situamos el cuerpo de lafunción en un script separado. A continuación iniciali-zamos una ventana Silverlight:

function createSilverlightHost(parentElement){

Silverlight.createObject("xaml/customerview.xaml",parentElement,"SilverlightControl1",{

width:'350',height:'120',background:'#111111',version:'1.0'

},{

onError:null,onLoad:null

},null);

}

El parámetro indica el contenedor de la ventana Sil-verlight, donde el contenido Silverlight será mostrado, enla página. La ventana Silverlight recibe un ID –que es Sil-verlightControl1 en el código– para poder comunicar conel resto de la página vía Javascript. Finalmente, se definenel tamaño y la apariencia de la ventana. El contenido XAMLse identifica mediante una URL. El fichero es descargadoy procesado en forma local en el navegador del cliente.Como el XAML se referencia mediante URL, nada impi-de que una aplicación ASP.NET genere dinámicamente elcontenido utilizando un manejador HTTP.

Traducido al castellano por Marino Posadas1 Un sitio Web con tales características es http://www.mlb.com. Pero Dino seguramente no es aficionado al béisbol (N. del E. T.)

Intenté insertar un documento XAML en una página ASP.NET y no sucedió nada incluso enmáquinas equipadas con la última versión de Silverlight. ¿De qué forma puedo consumircontenido XAML desde una página ASP.NET?

Page 53: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

53

dnm.laboratorio.net<<

ILOG Diagrammer for .NET es un potente con-junto de herramientas, componentes y librerías parael desarrollo de aplicaciones de edición gráfica,visualización, supervisión y monitorización para laplataforma .NET, que simplifican sensiblementetareas como crear diagramas que permitan esta-blecer o mostrar la relación entre objetos o moni-torizar los parámetros de negocios o sistemas diná-micos de la más diversa índole. Las figuras 1 y 2muestran ejemplos de tales actividades: mientrasque en la figura 1 se presenta una aplicación quepermite crear y manipular gráficamente diagramasBPM (Business Process Management), en la figura 2se muestra una aplicación que simula la monito-rización en tiempo real del comportamiento deltráfico en túneles subterráneos al estilo de losrecientemente inaugurados en Madrid. Estas dosaplicaciones forman parte de los ejemplos que seentregan con el producto.

Como complemento de las librerías que compo-nen el SDK de ILOG Diagrammer for .NET, desa-rrollado al 100% en C#, la instalación del producto

integra dentro de Visual Studio 2005 dos nuevos tiposde proyectos, las Aplicaciones ILOG Diagrammer ylas Librerías de Símbolos ILOG Diagrammer. Median-te el primer tipo de proyectos es posible crear de unamanera visual e interactiva proyectos que incluyan dia-gramas de los más diversos tipos; al estilo de como haceVisual Studio cuando diseñamos un formulario Win-dows Forms, en la medida en que vamos arrastrandoelementos desde el Cuadro de herramientas hasta ellienzo de diseño el add-in de ILOG Diagrammer vagenerando el código fuente necesario para reproducirel diagrama en tiempo de ejecución. Durante el diseñode los diagramas, el Cuadro de herramientas de Visual

Studio (figura 3) se enriquece con un amplio conjun-to de símbolos gráficos pre-programados que están anuestra disposición desde el primer momento. Estossímbolos no representan otra cosa que clases, por loque podemos aplicar sobre ellos los patrones familia-res de desarrollo basados en el modelo PEM (Propie-

ILOG Diagrammer for .NET

Laboratorio.netOctavio Hernández

Octavio Hernández esDevelopment Advisor

de Plain Concepts,editor técnico de

dotNetManía y tutorde campusMVP.

Es MVP de C# desde2004, MCSD y MCT.

Este mes presentamos ILOG Diagrammer for .NET, un marco de trabajo para laedición y visualización de diagramas y cuadros de mando sacado recientementeal mercado por la multinacional ILOG (http://www.ilog.com), que permite crearsofisticadas y atractivas interfaces visuales para las aplicaciones Windows y Webbasadas en .NET Framework.

Nombre: ILOG Diagrammer for .NETVersión: 1.0Fabricante: ILOG Sitio Web: http://www.ilog.com/Categoría: Componentes de interfaz deusuarioPrecios:

• Licencia de desarrollo: 2.500 EUR.

• Licencia de despliegue: contactar conILOG

Ficha técnica

Figura 1. Editor BPM

Page 54: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

54

dnm.laboratorio.net<<

dades-Eventos-Métodos). El resto ya segu-ramente lo imagina el lector: los símbo-los de la librería de ILOG Diagrammersiguen un modelo de arquitectura abier-ta, y el segundo tipo de proyectos antesmencionado permite precisamente desa-rrollar nuevas librerías de símbolos parareutilizar en nuestros propios proyectoso distribuir a terceros.

Características principalesA continuación se enumeran las princi-pales características del producto quepodrían ser de interés para los lectores:

• Amplia gama de controles listos parasu uso. El amplio conjunto de contro-les gráficos incluidos de serie en ILOGDiagrammer for .NET permite satis-facer un amplio rango de necesidadesde los diseñadores gráficos en muchosdominios de aplicación diferentes. Estoscontroles incorporan un conjunto decomportamientos e interacciones pre-determinadas; en todos los casos, esposible redefinir las propiedades ymétodos virtuales correspondientespara crear nuevas variaciones. Los con-troles incorporados de serie en ILOGDiagrammer for .NET se orientan alos siguientes tipos de aplicaciones:

• Modelado y monitorización de proce-sos de negocio: se ofrece el conjuntocompleto de símbolos de la nota-ción BPMN (Business Process Mode-ling Notation).

• Monitorización de negocios: el produc-to incluye múltiples tipos de con-troles para el desarrollo de cuadrosde mando y paneles de monitoriza-ción para negocios, incluyendobarras de progreso, relojes, visoresde gráficos comerciales y botones.

• Modelado de diagramas de clases UML:también se ofrecen controles pararepresentar los elementos y conecto-res típicos de la notación UML (Uni-fied Modeling Language).

• Facilidad de creación de nuevoscontroles gráficos. ILOG Diagram-mer for .NET incluye un amplio con-junto de primitivas (rectángulos, elip-ses, rutas, líneas, curvas, arcos, textos,imágenes, escalas y otros) y de conte-nedores comunes (lienzos, panelesapilados o adosados, visores con des-plazamiento) que pueden ser utiliza-dos directamente o en combinacióncon otros gráficos para crear nuevasvariaciones. El producto también per-mite importar gráficos en formatoSVG.

• Representación avanzada de gra-fos. El núcleo de la implementación

de ILOG Diagrammer for .NETincluye una implementación eficien-te de una estructura de datos pararepresentar grafos, entidades com-plejas que constan de nodos y enla-ces que los interconectan. Esta estruc-tura de datos es ideal para represen-tar redes, procesos, flujos y cualquiertipo de diagramas técnicos o de nego-cio. Cualquier control gráfico puedeservir como nodo de un grafo, y elproducto ofrece una amplia variedad

Figura 2. Monitor de tráfico en túneles

Figura 3. El Cuadro de herramientas de VS2005 durante la edición de diagramas

Page 55: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

55

dnm.laboratorio.net<<

de tipos de conectores: rectos, cur-vilíneos, ortogonales, etc. para enla-zar los nodos entre sí. Adicional-mente, el producto incluye toda unaserie de servicios avanzados como ladetección de intersecciones entreconectores o la interconexión entrediferentes grafos.

• Distribución automática de grafos.ILOG Diagrammer for .NET ofre-ce un conjunto sofisticado de algo-ritmos para la distribución automáti-ca de los nodos y los conectores, quea la vez que intentan satisfacer obje-tivos generales como la minimizacióndel área de dibujo necesaria, la mini-mización de la cantidad de intersec-ciones entre conectores, entre otros,permiten al usuario de una manerarápida distribuir los nodos del grafoen dependencia del tipo de diagramaque desea crear. Entre los algoritmosde distribución disponibles están:• Jerárquico. Generalmente utilizado

en aplicaciones de ingeniería eléc-trica (diagramas de circuitos), inge-niería industrial (diagramas de pro-cesos), gestión de software (dia-gramas UML, diagramas de flujo).

• Arbóreo. Ideal para la representa-ción de diagramas organizativos,diagramas de bases de datos omapas de sitios Web.

• Guiado por fuerza (force directed).Utilizado en diagramas de redes detelecomunicaciones o redes semán-ticas, entre otras aplicaciones.

• De rejilla. Caracterizado por elhecho de que no se dibujan losconectores; puede utilizarse encualquier caso en que se desee sim-plemente disponer gráficamente unconjunto de elementos.

• Editores personalizables. Entre susejemplos, el producto incluye tres edi-tores independientes completos y concódigo fuente incluido: un editor de

diagramas, un editor dediagramas de clases UMLy el ya mencionado editorde diagramas BPMN. • Despliegue para elescritorio o para elnavegador. Las aplica-ciones creadas con ILOGDiagrammer for .NETpueden ser desplegadascomo aplicaciones Win-dows Forms o (con míni-mos cambios) como apli-caciones ASP.NET consoporte Ajax (basado enlas extensiones de Micro-soft e independientes deotro proveedor específi-

co). Este nivel de flexibilidad es espe-cialmente útil si una misma aplicacióndebe ejecutarse en diferentes platafor-mas. La figura 4 muestra al editor dediagramas de clases UML ejecutándo-se como una aplicación Web.

ConclusiónEn este artículo hemos descrito las prin-cipales posibilidades que ofrece ILOGDiagrammer for .NET, un potente mar-co de trabajo en código manejado parael desarrollo de interfaces gráficas inte-ractivas para Windows y la Web. El altoprecio de salida del producto está sinduda más que justificado por la calidad ylas prestaciones que ofrece; invito al lec-tor a descargar la versión de evaluación[1] y comprobarlas por sí mismo.

ReferenciasSitio Web del producto:http://www.ilog.com/products/diagrammernet.

[1]

Figura 4. Editor de diagramas UML como aplicación Web.

Noticias

• Infragistics (www.infragistics.com) acaba de sacar al mercado NetAdvantage for.NET volumen 3, una nueva edición de la popular suite de herramientas de interfazde usuario para Windows y la Web. Entre las novedades más significativas de esta edi-ción están la inclusión de nuevas metáforas de navegación asociadas a la experienciade usuario de Windows Vista y la adición de nuevas posibilidades de exportación aXPS y PDF para permitir nuevos escenarios de compartición de documentos y gene-ración de informes, en lo que respecta a NetAdvantage for ASP.NET. Asimismo, laempresa ha presentado la CTP (Community Technology Preview) de Aikido, un nuevomarco de trabajo para ASP.NET basado en AJAX.

• Iron Speed (www.ironspeed.com) ha puesto a disposición del público Iron SpeedDesigner v. 5.0, una nueva versión de este potente generador de generación automá-tica de aplicaciones Web, que incorpora una cantidad realmente impresionante denovedades que harán el producto aún más útil y productivo para sus usuarios.

• Business Objects (www.businessobjects.com) acaba de anunciar Crystal Reports2008, nueva versión (la duodécima) de la conocida herramienta de creación y ejecu-ción de informes que permitirá a los usuarios alcanzar una mayor productividad, con-densar una mayor cantidad de información en un informe evitando así la proliferaciónde éstos, aumentar la interactividad de los informes e integrar objetos de Flash, Flexy Xcelsius para producir informes más impactantes.

En el marco de esta sección, dotNetManía describirá en próximas ediciones las característicasprincipales de estos productos.

Page 56: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

comunidad.net

3º Aniversario GUSE.NETDurante los días 23, 24 y 25 de noviem-bre se celebró el III Aniversario deGusenet, en Santa Pola (Alicante). Comoya viene siendo habitual en este evento,intentamos combinar las sesiones técni-cas con un poquito de ocio que ademáspueda ser compartido por nuestras pare-jas, con el objetivo de pasar un fin de sema -na completo, con diversas cenas, comidas,visitas organizadas por la ciudad, etc.

Tuvimos una agenda interesante, en la que pudimos contar con excelentes ponentes,y compuesta por dos sesiones sobre novedades que vamos a encontrar en Visual Stu-dio 2008 y una mesa redonda sobre el pasado, presente y futuro del grupo, con aporta-ciones interesantes que empezaremos a poner en práctica en próximos eventos.

Centrándonos en las sesiones técnicas, comenzamos con una charla de nuestroamigo “Guille”, que nos habló de las novedades de VB9, consiguiendo, además detransmitir de forma muy clara dichas novedades, hacer una sesión muy amena, car-gada de bromas y risas. Y cómo no, aprovechó para vender algún libro, camisetascuyo importe será donado a DotNetSolidario, y hacer algunos regalos.

A continuación pudimos contar con David Salgado, de Microsoft Ibérica, quiennos habló principalmente de AJAX, haciendo una sesión muy interesante y participa-tiva, donde invitó al público a hacerle todo tipo de preguntas, incluidas aquellas que noiban directamente relacionadas con el tema en cuestión, consiguiendo así una exce-lente comunicación con el público, que pudo resolver cualquier duda que planteó.

El concurso de desarrollo de Silverlight se ha ampliado a toda Europa, aumen-tando también los premios. INETA Europa (http://europe.ineta.org), en colabo-ración con Microsoft, ha preparado esta competición que ya ha empezado y quefinalizará el día 31 de enero de 2008.

La competición se realizará en dos fases:1. Competiciones Nacionales. Estas se realizarán de forma local en cada país

bajo la supervisión y apoyo del equipo de INETA. 2. Competición Europea (Gran Final). En ella participarán solo los partici-

pantes que hayan obtenido el primer premio con su aplicación ganadora.

Si crees en tu talento, apúntate y participa en la competición “European Sil-verlight Challenge” y gana, además del reconocimiento de la comunidad, fabu-losos premios por un valor total de 160.000€ (según precio de mercado), inclu-yendo tickets para el MIX 2008 (con viaje y estancia incluidos), suscripcionesMSDN, etc.

El objetivo de la competición es desarrollar una aplicación, módulo o com-ponente .NET en la que su interfaz de usuario esté desarrollada con la tecno-logía Silverlight. Esta participación deberá acatar la licencia MS-PL para poderser distribuida y utilizada gratuitamente por grupos de usuarios de INETA o decualquier otra comunidad en sus sitios Web y comunidades técnicas online.

Más información en http://silverlightchallenge.eu. Para participar en la com-petición española: http://desafiosilverlight.bcndev.net.

European Silverlight Challenge

Yo, RobotSi desarrollas con tecnología Microsoft, debes saber que nosolo puedes crear aplicaciones comerciales con Visual Stu-dio, también puedes divertirte y mucho. En esta charla vere-mos algunas aplicaciones de Microsoft Robotics Studio yLEGO Mindstorm, cómo trabajar con Visual Studio .NETy un WiiMote, cómo controlar un helicóptero utilizandoVisual Studio y alguna sorpresita más.

El viernes 14 de diciembre tendrá lugar en el salón deactos del Hospital Juan Ramón Jiménez de Huelva elevento "Yo, Robot".

Registro: http://msevents.microsoft.com/CUI/EventDe-tail.aspx?EventID=1032358807&Culture=es-ES.

Como siempre, después del evento colgaremos losmateriales disponibles en nuestra sección de eventos(http://www.onobanet.com/eventos/eventos.aspx).

CSLA.NET: introducción al frame-work de desarrollo CSLA.NET 3.0

El pasado 21 de noviem-bre tuvimos la enorme for-tuna de poder contar conla presencia de uno de losgrandes del mundo .NET,Rockford Lhotka, queaprovechando una estan-cia en Barcelona nos hahonrado con una charla enla que pudimos ver lanueva arquitectura CSLA3.5 (en desarrollo actualmente), con lo que fuimos hon-rados doblemente: con el gran speaker que es (además deun gran escritor y arquitecto de software), así como conla posibilidad de echar un vistazo al nuevo CSLA 3.5.La sesión transcurrió sin problemas, totalmente en inglésy con asistencia de público internacional vía Live Mee-ting. Por último, se regalaron dos de los últimos librossobre CSLA por parte de Lhotka al público, todo undetalle por su parte. La sesión de firma de libros destapómás de un fan de Lhotka oculto entre el público.

La experiencia se podría calificar de genial. Ademásde que desde los inicios de la vida de BcnDev, sobre prin-cipios del 2006, teníamos muchas ganas de realizar unasesión sobre CSLA, al final la ha realizado el mismísimoLhotka. Si tenéis la oportunidad de asistir a alguna sesiónsuya, online o presencial, recomendamos altamente laasistencia.

Page 57: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

Microsoft Expression Web Plain & SimpleKatherine MurrayEditorial: Microsoft PressPáginas: 256Publicado: octubre de 2007ISBN: 978-0735625198Idioma: inglés

Estamos trabajando con Expression Web desde su aparición, y la impresión es posi-tiva, así que una obra sobre este tema (una de las primeras) merece la pena citarse, espe-cialmente cuando viene directamente “de la casa”.

Es una obra cortita, que se lee –casi- del tirón, y decimos casi, porque merece la penaperderse un poco en algunos de los ejercicios prácticos que presenta, para adquirir sol-tura con un producto que, una vez controlado, puede ser muy productivo. Que nadieespere análisis en profundidad, pero es una obra idónea para los que se están iniciandocon las capacidades de la herramienta (que son bastantes). Cubre todas las tareas funda-mentales para la creación de sitios profesionales y se deja ver la experiencia de la autora(a más de la de usuario): tiene más de 40 libros publicados. Su lectura resulta didáctica ydivertida.

C# 3.0 y LINQOctavio Hernández LealEditorial: Krasis PressPáginas: 290Publicado: noviembre de 2007ISBN: 978-8493548919Idioma: castellano

Es un placer comentar esta obra por varias razones (algunas personales): es una de lasprimeras en su género que se publican en castellano; algunas partes de su contenido lashabrá podido leer el lector en esta revista; y –además– se trata del Editor Técnico de dot-NetManía. Una obra corta, pero, a diferencia de la anterior, intensa. Hay que decir tam-bién que, debido al formato de publicación que utiliza Krasis –con muy cuidada encua-dernación en cartoné–, las casi 300 páginas del libro dan para bastante más de lo que sepodría adivinar detrás de esa cifra.

Octavio Hernández repasa en los primeros cuatro capítulos las novedades apor-tadas por el lenguaje a partir de la versión 2.0 (especialmente los tipos genéricos),para pasar, a continuación, a abordar los fundamentos de LINQ y su reflejo en el len-guaje C# 3.0 y su librería básica de apoyo (LINQ to Objects). La última parte dellibro describe las posibilidades que ofrecen los principales proveedores de LINQcontenidos en .NET 3.5, junto a abundantes ejemplos, probados hasta la última coma(perdón, punto y coma).

biblioteca.net

nove

dad

es Introducing Microsoft Expression Design

Greg Holden. Editorial: Course Technology PTR. Páginas: 600. Disponible: enero de 2008.

ISBN: 978-1598631562. Idioma: inglés.

Microsoft Expression Blend Unleashed Brennon Williams. Editorial: SAMS. Páginas: 500. Disponible: junio de 2008. ISBN: 978-

0672329319. Idioma: inglés.

TEXTO: MARINO POSADAS

Page 58: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones

dotN

etM

anía

<<

58

desvánEl ADN como lenguaje de programación

Se había intentado antes, pero el pro-yecto de investigación dirigido por ErikWinfree, profesor de ciencias de lacomputación en el Instituto de Tecno-logía de California, puede considerar-se el primer intento serio de reunir bio-química e informática. “Podemosdiseñar una serie de estructuras capacesde crear patrones complejos, circuitos,y motores”, afirmó respecto a las prue-bas obtenidas creando patrones y estruc-turas de ADN en tubos de ensayo, Win-

free, quien además se define como un ferviente creyente deque la anunciada (pero todavía no producida) comunión entrelas dos disciplinas científicas está a punto de producirse, añadía:“No se trata de quedarnos en el mero ensamblado de formasgeométricas utilizando ADN. Si entendemos el lenguaje,podríamos diseñar respuestas biológicas a través de la re-pro-gramación, para terminar con virus reales”.

De cualquier forma, Winfree no es el único que investiga seria-mente con esta posibilidad. Hace ya algún tiempo, la doctora LilaKari de la University of Western Ontario (Canada), especializadaen lenguajes formales, ganó el premio Florence Bucke por sus tra-bajos de recombinación genética del ADN, en los que demostra-ba que, teóricamente, se podría utilizar este tipo de combinaciónpara simular cualquier operación de las realizadas habitualmentepor un ordenador. La forma de plantear los problemas sería lo máscomplejo y duradero, mientras que el tiempo de cálculo se redu-ciría de forma tan drástica, que proposiciones que ahora escapanal cálculo de la mayoría de los ordenadores (o sea, que tardaríanaños en realizarse) podrían resolverse en cuestión de horas.

Y es que las conexiones entrebioquímica e informática son cadavez más numerosas. Lo último enconexiones directas lo presentabahace poco un grupo de científicosde la Universidad de Arizona, diri-gidos por Charles M. Higgins,quienes han construido un robotcuyo movimiento está vinculado alcerebro de una polilla (como looyen). El dispositivo (ver foto adjun-ta) conecta el cerebro de la polilla(inmovilizada en un tubo de ensayoespecial, y rodeada de dibujos que –al moverse– le sugieren movi-miento) con el robot, y cuando el escenario de control genera lasensación de movimiento el robot responde de varias formas. Hig-gins afirma haber construido el dispositivo como medio de estu-dio neuronal, pero otros colegas afirman que podría utilizarse ensentido inverso; esto es, sugiriendo reacciones en el cerebromediante movimientos robotizados. Para más información sobreeste último experimento, ver el artículo de Physics.org:http://www.physorg.com/news114715561.html.

Marino Posadas

¿Utiliza Captchas comoWebmaster? Si cree que sonseguros, no se pierda este artí-culo sobre las vulnerabilidadesde estos gráficos que supuestamente permiten diferenciar lapercepción humana de las acciones de los bots en la red. En elartículo Has CAPTCHA Been "Broken"? (http://www.coding-horror.com/blog/archives/001001.html), Jeff Atwood (CodingHorror) analiza las vulnerabilidades de estos mecanismos eincluso indica la página Web de un hacker chino que consigueromper la mayoría de ellos.

¡SQL Server 2008 podrá ser administrado mediantePowerShell! Jeffrey Snover (Microsoft) anunciaba recien-temente en el blog del equipo de desarrollo de WindowsPowerShell esta noticia que –sin duda– merece la pena leertanto si se está en el mundo de IT, como en el de desa-rrollo o se es un DBA. Para más datos, visitar:http://blogs.msdn.com/powershell/archive/2007/11/13/sql-server-support-for-powershell.aspx.

La propia MSDN recoge laactividad de los bloggers másdestacados (no conocemos elcriterio que siguen), y los agru-pa en páginas para los intere-

sados en un lenguaje o tecnología determinados. Este es elcaso de Visual Basic Blogs (http://msdn2.microsoft.com/en-us/vbasic/ms789067.aspx#mvp) donde aparecen algunos delos autores habituales de esta revista.

Recover Keys. Una más que útil herramienta ahora quetodos los programas tienen claves, y no siempre hemosprestado atención a dónde las guardábamos. Es capaz derecuperar claves de más de 140 productos. Una tranqui-lidad y solo un 1 Mb de descarga (el programa costará20$ en el futuro, pero es gratuito en la actualidad portiempo limitado, otra razón para descargarlo pronto…)El sitio: http://www.giveawayoftheday.com/recover-keys.

bCheck: un sitio de utilidades. Se trata de pequeñas utilida-des –algunas no ocupan más de 12K–, pero son gratuitasy algunas pueden resultar extremadamente útiles. ComoHoeKey, que permite configurar el teclado como se quie-ra (cualquier combinación, cualquier programa), o Caps-ter, que ejecuta cualquier programa al inicio de Windowssolo si la tecla de control está pulsada, o Reso, que lanzauna aplicación en la resolución favorita del usuario devol-viendo el sistema al estado en que se encontraba al salirde ésta. Por cierto, si alguna vez podemos decir de un sitioque es minimalista al máximo, es éste: http://www.bcheck.net.

documentos en la red

utilidades del mes

sitios del mes

noticias.noticias.noticias

Page 59: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones
Page 60: dotNetManía - sergiogonzalezc.files.wordpress.com · nº 43 diciembre 2007 6,50 € Visual Basic • C# • ASP.NET • ADO ... como se dijo en un ... del servidor para crear aplicaciones