Vous êtes sur la page 1sur 60

www.dotnetmania.

com

n 43 diciembre 2007 6,50

Visual Basic C# ASP.NET ADO.NET SQL Server Windows System

dotNetMana
dedicada a los profesionales de la plataforma .NET

Va libre a la creatividad
El evento CellPainting del control DataGridView
entrevista

Catherine Heller
Technical Evangelist
Microsoft Corporation

eventos
TechEd Europe 2007
Lanzamiento de Biztalk 2006 R2
CEUS 2007

Tablet PC SDK (y II). Reconocimiento de escritura


manual Ms sobre seguridad de acceso a cdigo
Herramientas genricas para los componentes:
ficheros y recursos Depuracin en .NET. El depurador
que lo depure... recibir ayuda del CLR

Laboratorio
ILOG Diagrammer for .NET
TodotNet@QA
Silverlight. Presente y futuro

Opinin
Documentos o ejecutables

editorial

dotNetMana
Dedicada a los profesionales de la plataforma .NET
Vol. III Nmero 43 Diciembre 2007
Precio: 6,50

Un codename, por favor

Editor
Paco Marn
(paco.marin@netalia.es)
Redactor jefe
Marino Posadas
(marino.posadas@netalia.es)
Editor tcnico
Octavio Hernndez
(octavio.hernandez@netalia.es)
Redaccin
Dino Esposito, Guillermo 'Guille' Som, Jos
Manuel Alarcn, Luis Miguel Blanco y Miguel
Katrib (Grupo Weboo)
Empresas Colaboradoras
Alhambra-Eidos
Krasis
Plain Concepts
Raona
Solid Quality Learning
Adems colaboran en este nmero
Alberto Poblacin, Daniel Seara, Javier
Roldn y Rodrigo Corral.
Corresponsal para Amrica Latina
Pablo Tilotta
Ilustraciones
Mascota (Clico): Yamil Hernndez
Portada: Javier Roldn
Fotografa
Roberto Mariscal
Atencin al suscriptor
Pilar Prez
(pilar.perez@netalia.es)

Edicin, suscripciones y publicidad

.netalia
c/ Thomas Edison, 4, 1406
Parque empresarial Rivas Futura
28521 - Rivas Vaciamadrid (Madrid)
www.dotnetmania.com

Tf. (34) 91 666 74 77


Fax (34) 91 499 13 64

Bienvenido al nmero 43, de diciembre de


2007, de dotNetMana.
La cuenta atrs termin y Visual Studio
2008 est listo para su fabricacin (Ready To
Manufacture, que dicen los anglosajones).
sta es ya la versin final, descargable por
los suscriptores de MSDN, aunque tambin
existen versiones de evaluacin y Express
para el resto de clientes. Ahora toca rumorear sobre la prxima versin, de la que queda la duda de si tendr finalmente el codename Hawaii, como se dijo en un principio.
Aunque an nos queda lejos supuestamente hasta 2010 2011, nos podran dar
un codename fiable pronto, porque si no de
qu vamos a hablar?, de la innombrable
nueva versin de Visual Studio? Una isla o
lo que prefieran, pero dennos un codename,
por favor!
Lo que s tiene nombre fiable es la
nueva editorial de tecnologas Microsoft
que acaba de nacer en Espaa: Krasis
Press. Esto es una magnfica noticia para
todos los lectores castellano-hablantes.
En nombre de todo el equipo de dotNetMana quiero desearles la mejor de
las suertes. Ya tienen tres libros y pronto aparecern ms. Los tres han sido
escritos por amigos de esta casa: Jos
Manuel Alarcn (el padre de la criatura), Octavio Hernndez, editor tcnico
de dotNetMana y Unai Zorrilla, colaborar habitual de esta revista.

Este mes entrevistamos a una vieja


conocida nuestra: Catherine Heller,
Technical Evangelist de Microsoft Corp.,
a la que Marino Posadas ya entrevist en
2003 en el Ave Fnix (www.elavefenix.com).
Medio espaola, medio americana, Catherine empez su carrera profesional en
Microsoft Ibrica y lleva ya unos cuantos
aos desarrollando su actividad en Redmond. Actualmente est trabajando junto al equipo de Windows Live.
El artculo de portada de este mes se
titula El evento CellPainting del control
DataGridView. Va libre a la creatividad.
Si quiere lograr efectos avanzados y un
mayor control sobre el proceso de dibujo de las celdas, debe utilizar de forma
conjunta el evento CellPainting y las clases de GDI+. Luis Miguel Blanco se lo
explica con todo lujo de detalles, como
siempre.
Entre nuestros asuntos pendientes,
Javier Roldn termina la miniserie de
artculos dedicada al reconocimiento de
escritura manual con Tablet PC SDK,
mientras que Alberto Poblacin publica el artculo Ms sobre seguridad de
acceso a cdigo, una extensin de su
artculo Seguridad de acceso a cdigo,
publicado en el nmero 41, de octubre
de 2007.
Y an hay ms, por supuesto. Espero
que le guste.

Imprime
Grficas MARTE
ISSN
1698-5451

Paco Marn

<< dotNetMana

Depsito Legal
M-3.075-2004

sumario 43
Documentos o ejecutables

10-11

La documentacin siempre es un aspecto que exige nuestra atencin en los proyectos de software. A
menudo tendemos a pensar que la mejor manera de lograr que nuestros proyectos avancen y poder
mostrar ese avance es realizando la documentacin adecuada, buscando el ciclo adecuado para esa
documentacin y estableciendo una serie de documentos como estndares. Incluso hay metodologas
bastante populares que se centran en definir qu documentos se deben generar, quin es el responsable de cada documento y por qu manos debe pasar cada uno de ellos. Nos olvidamos de que los
documentos no se pueden ejecutar? Nos olvidamos de que el propsito final de todo proceso de
desarrollo es conseguir software que funciona?

Entrevista a Catherine Heller

12-14

Catherine Heller es espaola (nacida en Madrid), de padre norteamericano, y con muchos aos de
estancia en los dos pases. En la actualidad, trabaja como evangelista en el grupo de divulgacin de
Windows Live, en Redmond, y anteriormente lo haba hecho en el de Visual Studio Tools for Office.
Eso fue antes de pasar en Microsoft Ibrica otra buena parte de su carrera

Eventos

16-19

TechEd 2007: expectacin ante un ao pleno de novedades, Lanzamiento de Biztalk 2006 R2 y


CEUS 2007

Tablet PC SDK (y II). Reconocimiento de escritura manual

20-26

En la primera parte de este artculo indicamos el modo de preparar el entorno de desarrollo


necesario para la programacin de aplicaciones capaces de aceptar tinta digital para ms tarde
reconocerla como escritura manuscrita. Asimismo, utilizamos los principales elementos que para este
fin proporciona el Microsoft Windows XP Tablet PC Edition Software Development Kit.

El evento CellPainting del control DataGridView.Va libre a la creatividad

27-35

Cuando 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 mera
utilizacin de estilos resulta escasa si nuestras pretensiones pasan por lograr efectos avanzados y un
mayor control sobre el proceso de dibujo de las celdas. Es por ello que el empleo combinado del evento
CellPainting, perteneciente a este control, junto al conjunto de clases de GDI+ se va a convertir en
un poderoso recurso a nuestro alcance.

Ms sobre seguridad de acceso a cdigo

36-39

En una entrega anterior (dotNetMana n 41) presentamos los fundamentos de la Seguridad de


acceso a cdigo (Code Access Security, CAS) en .NET Framework, y describimos cmo el CLR
determina los permisos del cdigo y cmo se pueden manipular desde las herramientas
administrativas los permisos concedidos a cada ensamblado. En esta entrega veremos cmo se pueden
solicitar, manipular y limitar estos permisos desde dentro de nuestro cdigo.

Herramientas genricas para los componentes: ficheros y recursos

40-42

Siguiendo con la idea de las generalizaciones en componentes expuesta en el nmero anterior, en este
artculo veremos algunos otros ejemplos que pueden resultarle interesantes.

Depuracin en .NET. El depurador que lo depure... recibir ayuda del CLR

43-49

La depuracin es una de esas cosas que todos hacemos, o deberamos hacer, y que a nadie le gusta
tener que hacer; no porque no sea necesaria, sino porque al final terminabas fatal de los nervios
cuando la depuracin 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 artculos mostraremos las principales
posibilidades que este ltimo entorno pone a nuestro alcance para facilitarnos la depuracin de
nuestros programas.

dnm.todotnet.qa

50-52

Silverlight. Presente y futuro.

dnm.laboratorio.net

53-55

ILOG Diagrammer for .NET

dnm.comunidad.net

56

dnm.biblioteca.net

57

Microsoft Expression Web Plain & Simple


C# 3.0 y LINQ

dnm.desvan

58

<<dotNetMana

noticias noticias noticias noticias

noticias

Visual Studio 2008 listo para fabricarse


El lunes 19 de noviembre, Microsoft anunci que Visual Studio 2008 y .NET Framework
3.5 han pasado a fabricacin. Al mismo tiempo, la versin definitiva ha sido puesta a
disposicin de los suscriptores MSDN para su descarga.
Con ms de 250 nuevas caractersticas, Visual Studio 2008 incluye mejoras significativas en cada una de sus
ediciones, desde Visual Studio
Express hasta Visual Studio Team
System. Los desarrolladores de todos
los niveles podrn disponer de un
entorno integrado consistente, seguro y confiable para desarrollar aplicaciones para las plataformas ms
actuales: la Web, Windows Vista,
Windows Server 2008 y 2007 Office System.
Visual Studio 2008 habilita la
visin de Microsoft acerca de las
aplicaciones cliente inteligentes,
permitiendo a los desarrolladores
crear de manera rpida aplicaciones conectadas que ofrezcan las
experiencias de usuario ms ricas y
de ms alta calidad. Con Visual Stu-

dio 2008, las empresas encontrarn


ms fcil que nunca capturar y analizar la informacin para tomar
decisiones de negocio correctas.
Visual Studio 2008 permitir a las
empresas de cualquier tamao
desarrollar con una alta productividad aplicaciones ms seguras y
confiables que aprovechen las bondades de Windows Vista y 2007
Office System.
Visual Studio 2008 introduce
avances significativos para los desarrolladores en tres reas fundamentales:
Desarrollo rpido de aplicaciones.
Colaboracin efectiva de
equipos.
Experiencias de usuario avanzadas.

Visual Studio 2008 ofrece herramientas de desarrollo, posibilidades


de depuracin y funcionalidades de
trabajo con bases de datos avanzadas e innovadoras para facilitar la
creacin de aplicaciones de las aplicaciones del maana para una
amplia variedad de plataformas.
Incluye mejoras tales como diseadores visuales para un desarrollo
ms rpido para .NET Framework
3.5, mejoras sustanciales en las
herramientas para el desarrollo de
aplicaciones Web potenciadas por
la tecnologa AJAX, y mejoras en los
lenguajes de programacin (concretamente las Consultas integradas
en los lenguajes LINQ) que
aceleran el desarrollo de aplicaciones que accedan a datos de cualquier
naturaleza.

Silverlight 1.1 Tools Alpha para Visual Studio 2008


disponible para descarga
Microsoft ha anunciado recientemente una versin actualizada de Silverlight 1.1 Tools Alpha que trabaja
con la versin nal de Visual Studio
2008. ste es un add-on para desarrollar aplicaciones Silverlight usando los lenguajes de .NET.
Esta versin tiene las mismas caractersticas que el add-on de Silverlight
Tools Alpha que estaba disponible previamente para la beta 2 de Visual Studio 2008; simplemente ha sido actualizada para trabajar con la versin nal
de Visual Studio 2008. Estas caractersticas incluyen plantillas para los
lenguajes .NET, as como intellisense
en code-behind, edicin y generacin
de cdigo XAML, soporte de depura-

cin y compatibilidad e
integracin con proyectos Expression
Blend.
La prxima preview
de Silverlight s incluir
muchas nuevas caractersticas, as como signicativas mejoras.
Puede encontrar
tutoriales quickstart
que detallan cmo utilizar estas caractersticas aqu: http://silverlight.net/QuickStarts/Start.
Puede descargar el add-on desde:
http://www.microsoft.com/downloads/details.aspx?FamilyId=25144C27-

6514-4AD4-8BCB-E2E051416E03&
displaylang=en.
Ms informacin : http://weblogs.
asp.net/scottgu.

Los desarrolladores podrn aprovechar todos esos marcos de trabajo tanto


para el lado del cliente como para el lado
del servidor para crear aplicaciones Web
centradas en el cliente que se integren con
cualquier proveedor de datos en el servidor, se ejecuten bajo cualquier navegador
y tengan acceso total a los servicios de
ASP.NET y a la plataforma Microsoft.

Desarrollo rpido de aplicaciones


Para ayudar a los desarrolladores a crear
software moderno, Visual Studio 2008
ofrece nuevas caractersticas de acceso a
datos como LINQ, que harn ms sencillo el desarrollo de aplicaciones capaces
de analizar informacin y tomar decisiones a los programadores individuales.
Visual Studio 2008 ofrece adems la
posibilidad de generar cdigo para diferentes versiones de .NET Framework
desde dentro del propio entorno. Los
desarrolladores podrn crear aplicaciones
para .NET Framework 2.0, 3.0 3.5, por
lo que podrn dar soporte a una amplia

gama de proyectos desde el mismo entorno integrado.

Experiencia de usuario revolucionaria


Visual Studio 2008 ofrece a los desarrolladores nuevas herramientas que aceleran la creacin de aplicaciones conectadas que funcionen sobre las plataformas
ms reciente, incluyendo la Web, Windows Vista, Office 2007, SQL Server 2008
y Windows Server 2008. Para la Web,
ASP.NET AJAX y otras nuevas tecnologas permitirn a los desarrolladores crear una nueva generacin de experiencias
eficientes, interactivas y personalizadas.

Colaboracin efectiva de equipos


Visual Studio 2008 ofrece caractersticas
expandidas que ayudan a mejorar la colaboracin en los equipos de desarrollo,
incluyendo herramientas que ayudan a
integrar a los profesionales de bases de
datos y los diseadores grficos en el proceso de desarrollo.

Utilizar Microsoft .NET Framework 3.5


.NET Framework 3.5 habilita el desarrollo de aplicaciones conectadas que
ofrezcan experiencias de usuario
impactantes, ofreciendo los bloques
prefabricados para resolver problemas
de programacin comunes. .NET Framework 3.5 ha sido creado incrementalmente a partir de .NET Framework
3.0, incluyendo mltiples novedades
y mejoras en reas como la librera de
clases base, Windows Workflow
Foundation, Windows Communication Foundation, Windows Presentation Foundation y Windows Card Space.
Conjuntamente, Visual Studio y
.NET Framework reducen la necesidad de escribir cdigo de bajo nivel,
reduciendo el tiempo de desarrollo y
permitiendo a los desarrolladores concentrarse en resolver sus problemas
de negocio.
Puede descargarlo desde: http://msdn.
microsoft.com/subscriptions.

Liberado Microsoft Visual Studio 2008 SDK 1.0

El SDK de Visual Studio 2008 (versin 1.0)


incluye herramientas, documentacin y ejemplos para permitir a los desarrolladores crear,
probar y desplegar extensiones de Visual Studio 2008. Tambin se puede utilizar el SDK
para crear entornos integrados personalizados
basados en el nuevo Visual Studio 2008 Shell.
Estos productos abren una nueva era en la
extensibilidad de Visual Studio. Los desarrolladores podrn a partir de ahora utilizar el
SDK no solo para crear aplicaciones que extiendan a Visual Studio, sino adems para distribuir herramientas y aplicaciones libres de royalties.

El modo aislado de VS 2008 Shell


El modo aislado de Visual Studio Shell ofrece
los fundamentos sobre los cuales los desarro-

lladores pueden crear sus propios entornos


integrados que funcionen en paralelo con
Visual Studio. Utilizar este modo permitir
acelerar el desarrollo de herramientas de desarrollo propias, ya que ser posible aprovechar
el ncleo del entorno integrado de Visual Studio y concentrarse en los problemas especcos de la herramienta en desarrollo.

propio. Cualquier herramienta o lenguaje que


se ejecute dentro de Visual Studio Shell en
modo integrado ejecutar conjuntamente con
Visual Studio 2008 (Estndar o superior) si ste
est instalado en la misma mquina. Utilizar
este modo har posible que Visual Studio no
sea un prerrequisito en las mquinas de los usuarios que utilicen la herramienta o lenguaje.

El modo integrado de VS 2008 Shell

Novedades clave en el VS 2008 SDK

El modo integrado de Visual Studio Shell ofrece los fundamentos sobre los cuales los desarrolladores pueden integrar sus propias herramientas y lenguajes de programacin dentro de
Visual Studio. El shell de modo integrado no
contiene ningn lenguaje de programacin, por
lo que constituye la base perfecta para desplegar un entorno de desarrollo para un lenguaje

Soporte de desarrollo para VS Shell.


Mejoras en DSL Tools.
Soporte de desarrollo y pruebas para
paquetes de extensin de Visual Studio en
C++, C# y Visual Basic.
Nuevos ejemplos y documentacin en
diversas reas.
Soporte para Windows Vista.

<<dotNetMana

Conjuntamente con la salida deVisual Studio 2008, Microsoft ha puesto a disposicin de los usuarios
el SDK de Visual Studio 2008, as como los redistribuibles del nuevo Visual Studio 2008 Shell.

<< dnm.directo.noticias
Microsoft SQL Server 2008 CTP de noviembre

Cursos diciembre 2007

Microsoft anunci en el pasadoTechEd IT de Barcelona la nueva


CTP (Community Technical Preview) de noviembre de SQL
Server 2008, la penltima antes de la versin RTM (Ready To
Manufacture).

Alhambra-Eidos lanza sus cursos


de diciembre

Esta edicin de SQL Server 2008 trae


una cantidad significativa de nuevas
funcionalidades, incluyendo compatibilidad con Windows Vista y Windows Server 2008, as como nuevas
caractersticas como Resource Governor, Backup Compression y Transparent Data Encryption. Esta CTP tambin incluye nuevas mejoras en el rea
de Business Intelligence tales como
Design Alerts, Block Computation,
Enhaced Report Designer con nuevas
visualizaciones e integracin con 2007
Microsoft Office System.
sta tambin es la primera CTP que
ayuda a los clientes a cargar y consumir
cualquier tipo de datos, incluyendo el
nuevo tipo FileStream para documentos no estructurados, y que ofrece
soporte para el almacenamiento de datos
geoespaciales, que puedan ser utilizados por aplicaciones de localizacin en
el espacio.

Compaas como Barrodale Computing Services (BCS) Ltd., Environmental


Systems Research Institute Inc., I.S. Consulting Inc., Manifold y SpatialPoint han
anunciado su intencin de sacar aplicaciones con el soporte de datos geoespaciales en SQL Server 2008.
Para recibir recursos de SQL Server
2008 especcamente seleccionados para
profesionales TI, vaya a http://go.microsoft.com/fwlink/?LinkID=103187 y para
desarrolladores, vaya a http://go.microsoft.com/fwlink/?LinkIsD=103186.
Puede probar tambin la versin CTP
de SQL Server 2008 Express Edition. Es
una edicin de SQL Server 2008 gratuita y totalmente funcional. SQL Server
2008 Express soporta 1 CPU, 1 Gb de
RAM y bases de datos de hasta 4Gb.
Puede descargarse desde: http://www.
microsoft.com/downloads/details.aspx?FamilyId=3BF4C5CA-B905-4EBC-89011D4C1D1DA884&displaylang=en.

Alhambra-Eidos, empresa especializada en


facilitar soluciones a las necesidades empresariales en el mbito de las Tecnologas de la
Informacin y las Comunicaciones, lanza para
diciembre su calendario de formacin tcnica dirigida a profesionales.
En formato blended, que combina la formacin presencial tradicional con los avances
de la variedad online, Alhambra-Eidos ha programado las siguientes sesiones formativas para
el 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 impartirn en las
aulas de:
Alhambra-Eidos
c/Albasanz, 16 (Madrid)

Para ms informacin, contacte con


Alhambra-Eidos en el telfono 902 313 505
o visite la Web: www.alhambra-eidos.es

<<dotNetMana

Feed your brain

Feed your brain (alimenta tu cerebro)


es la frase elegida como eslogan de una
nueva editorial: Krasis Press, que
recientemente present su nuevo proyecto especializado en tecnologas
Microsoft en la sede de Microsoft Ibrica, en Madrid, sumndose as a Netalia editora de esta revista en la edicin de este tipo de contenidos.
Nacida hace siete aos, Krasis es un
partner de Microsoft en desarrollo de
productos Web y formacin. La editorial nace a raz de una de sus reas de
actividad, campusMVP, iniciativa en
formacin online cuyo factor diferencial
es que todos los cursos son creados y
tutelados por MVP (Most Valuable Professional). MVP es un galardn que
Microsoft concede anualmente a los
profesionales ms destacados de cada

pas. Actualmente hay 12 MVP espaoles integrados en este proyecto.


Krasis Press nace para paliar la falta de informacin sobre tecnologas muy
nuevas y el exceso en las ms maduras,
y como alternativa a la poca variedad de
libros especializados.
Con distribucin nacional, venta
directa a travs de www.krasis.com y
www.dotnetmania.com y venta cruzada
con los cursos, Krasis est en negociaciones para la comercializacin en
Lationoamrica y EEUU en castellano. La compaa prepara adems traducciones al ingls para la venta en
EEUU a travs de Amazon. En la
actualidad cuenta con tres obras en el
mercado: Modelando procesos de
negocio con Workflow Foundation,
de Unai Zorrilla Castro; C# 3.0 y

LINQ, de Octavio Hernndez Leal


y Programacin Web con Visual Studio y ASP.NET 2.0, de Jos Manuel
Alarcn Agun.
Dirigidas a programadores, personas
interesadas en la tecnologa, centros acadmicos o de formacin y universidades, se
presentan en edicin de lujo, en tapa dura
y con distintivas frutas en sus portadas,
que se corresponden con el lema de su
proyecto educativo: Feed your brain.

opinin
Rodrigo Corral

Documentos o ejecutables

Rodrigo Corral es MVP


y MCPD y uno de los
fundadores de Plain
Concepts, donde colabora como arquitecto
de software. Adems
trabaja en Sisteplant
como lder tcnico en
un proyecto desarrollado sobre .NET 3.0 utilizando Scrum como
metodologa de desarrollo. Tambin administra Geeks.ms. Adems,
Rodrigo es tutor de
campusMVP. Su blog es
http://geeks.ms/blog/
rcorral.

La documentacin siempre es
un aspecto que exige nuestra
atencin en los proyectos de
software. A menudo
tendemos a pensar que la
mejor manera de lograr que
nuestros proyectos avancen y
poder mostrar ese avance es
realizando la documentacin
adecuada, buscando el ciclo
adecuado para esa documentacin y estableciendo una
serie de documentos como
estndares. Incluso hay metodologas bastante populares
que se centran en definir qu
documentos se deben
generar, quin es el responsable de cada documento y
por qu manos debe pasar
cada uno de ellos. Nos olvidamos de que los documentos no se pueden ejecutar?
Nos olvidamos de que el
propsito final de todo
proceso de desarrollo es
conseguir software que
funciona?

<< A menudo, de la documentacin que mantenemos durante el desarrollo solo un pequeo porcentaje tiene valor para el cliente. Es cierto que habitualmente hemos de entregar cierta documentacin, manuales de operacin, de administracin o de usuario; esta documentacin
tiene un claro valor. Este tipo de documentacin se debe tratar como
cualquier otro entregable. En el fondo, sta es la nica documentacin
que es realmente imprescindible, la que el destinatario del software
necesita, aquella por la que, hipotticamente, estara dispuesto a pagar.
Minimizar la documentacin que no aporta nada a nuestros clientes,
que solo sirve para soportar nuestro proceso de desarrollo, y sobre
todo el coste de mantenerla, debe ser uno de nuestros objetivos.
El avance de los proyectos de software es algo que siempre ha preocupado a todos los implicados en los mismos. Es algo sobre los que nuestros clientes centran su inters y algo que, como gestores de proyectos,
necesitamos comunicar. Tradicionalmente hemos abordado esta necesidad de mostrar el progreso mediante el uso de diferentes documentos o
artefactos. Todos los que hemos tenido que mantener actualizado el project del proyecto sabemos lo difcil que esto es. Es tan difcil, que rara vez
se hace con la disciplina que requiere, de tal modo que habitualmente este
tipo de aproximacin no proporciona los resultados esperados.
El enfoque tradicional de mostrar el avance de los proyectos mediante documentos es algo que no funciona bien. Nuestros clientes han descubierto que los documentos rara vez nos muestran el avance real de un
proyecto. Es muy posible haber trabajado mucho y tener una gran cantidad de documentacin sobre un proyecto y estar a aos luz de que quien
financia el proyecto pueda obtener valor. Quin no conoce algn proyecto en el que tras muchos meses de desarrollo lo nico que haba es un
montn de documentos? Los documentos por s mismos no aportan ningn
retorno de la inversin. No se puede hacer nada para obtener valor
para tu negocio solamente con la documentacin relacionada con un
proyecto de software. Solo el software que pueden ejecutar y utilizar es susceptible de crear valor para nuestros clientes. Solo el software que funciona debe ser la medida del progreso de los proyectos
de desarrollo. Asumir esto nos obliga a asumir que tendremos que entre-

<< dnm.opinin

gar software con frecuencia a nuestros clientes,


que tendremos que reaccionar de manera gil al
feedback que nos proporcionen y que a cambio ellos
obtendrn de manera temprana un retorno para
su inversin.
Debemos ser muy tacaos con el esfuerzo que
ponemos en nuestra documentacin; si no, corremos el riesgo de ver que todos aquellos requisitos, por poner un ejemplo, que tan detalladamente
documentamos sobre el sistema de gestin que
nuestro cliente quiere, son papel mojado porque
han comprado una nueva unidad de negocios. Y
nosotros ya hemos hecho un gasto del que difcilmente obtendremos algn retorno. La documentacin en los proyectos de software pierde su relevancia y
se queda obsoleta muy rpidamente, haciendo que mantenerla actualizada sea muy costoso. A menudo cometemos el error
de tratar de sustituir la comunicacin fluida por documentacin, y cuando hacemos esto, estamos introduciendo costes e
inflexibilidades en nuestro proceso de desarrollo.
Otro aspecto del desarrollo de software que nos lleva a
generar documentacin es la necesidad de mantener los sistemas que desarrollamos. Se suele pensar que la documentacin
detallada del sistema nos va a evitar un montn de quebraderos de cabeza. Pero esto solo es cierto si esa documentacin
cumple la premisa de estar actualizada. Cuando un desarrollador encuentra una lnea en la documentacin que no es
correcta o no est actualizada, rpidamente pierde la confianza y vuelve su vista a la nica fuente de verdad absoluta: el cdigo fuente. Esto nos lleva a la situacin de que solo la documentacin que se genera directamente desde el cdigo fuente de manera automatizada tiene verdadero valor.
El cdigo es la nica fuente de verdad absoluta sobre un
proyecto de software a nivel de detalle, y el nivel de detalle es
el nico til para modificar, extender o mantener un sistema en
produccin. La documentacin directamente asociada al cdigo fuente o embebida en l (comentarios que permitan generar documentacin, por ejemplo, con NDoc, JDoc o similares) o aquella que se genera de manera automtica desde el mismo (por ejemplo, diagramas de clases que solo son otra vista
del cdigo) es la que ms valor tiene, pues evoluciona y se mantiene en paralelo al cdigo fuente y siempre est actualizada.
Otra documentacin que no est directamente relacionada con el cdigo fuente y que es de gran utilidad, si no imprescindible, es la relativa a arquitectura. Es necesario que un nuevo desarrollador o aquel que resucita el proyecto tras un tiempo puedan comprender qu decisiones de alto nivel guiaron
el desarrollo. Esta documentacin sirve para comprender por
qu se tomaron determinadas decisiones que no se cambian
con facilidad a lo largo del proyecto y proporciona una primera aproximacin de alto nivel. La arquitectura de una aplicacin no suele cambiar a menudo; lo que cambia ms frecuentemente es la implementacin, el cdigo. Esta documentacin es simple de mantener, porque es mucho ms esttica
que la de diseo detallado.

A menudo nos centramos en documentar olvidando que


la principal fuente de informacin sobre qu hace una pieza
de software est en el nombre de los componentes, de las clases y de las funciones. La principal documentacin con la
que contamos es el estilo de nomenclatura, la coherencia
a la hora de nombrar cosas y una arquitectura general
coherente. Establecer un lenguaje comn, la nomenclatura y el estilo que va a guiar del desarrollo es ms valioso que cualquier documentacin. Mucha documentacin
puede emanar de una serie de patrones que se repiten a lo largo del proyecto, tanto a nivel arquitectnico como de diseo,
y estos patrones donde viven es en el cdigo.
Buscando valor para el cliente, cada vez ms proyectos
deciden mantener una base de conocimiento sobre nuestro
proyecto, basada en artculos cortos y con ejemplos, tipo
knowledge base, sobre los que se pueda realizar bsquedas
fcilmente. Por eso se estn popularizando tanto como repositorios de informacin sobre proyectos los wikis: no imponen una estructura, son giles de mantener, fcilmente actualizables, fcilmente buscables y soportan muchos tipos diferentes de contenido.
Tambin se tiende cada vez ms a sustituir la documentacin por la refactorizacin: si una pieza de software
es compleja, tenemos dos posibles estrategias a la hora de
hacerla entendible. La primera es documentarla; la segunda es, a base de refactorizacin y de mejorar el diseo, simplificarla para hacerla ms clara. Se puede ganar mucho en
la legibilidad de nuestro software simplemente eligiendo
buenos nombres, evitando las funciones enormes, limpiando las variables no utilizadas La ventaja de este enfoque
es que mejora objetivamente el software, hacindolo ms
mantenible y ms claro, sin necesidad de un artefacto externo que puede fcilmente quedar desactualizado.
Antes de escribir cualquier documentacin debemos
preguntarnos varias cosas: Es realmente imprescindible?
Ser fcil de mantener? Aporta algn valor claro para
nuestro cliente?
El manifiesto gil resume lo aqu expuesto de la siguiente manera: El software que funciona es ms importante que
la documentacin exhaustiva. El desarrollo de software va
sobre cdigo fuente y ejecutables, no sobre documentos.

<<dotNetMana

Solo el software que pueden ejecutar y utilizar


es susceptible de crear valor para nuestros clientes.
Solo el software que funciona debe ser la medida del
progreso de los proyectos de desarrollo

11

entrevista

Marino Posadas

entrevista a

Marino Posadas
es director de tecnologas de desarrollo para Espaa
y Portugal de Solid
Quality Learning.
Puedes leer su blog
en http://www.
elavefenix.net.

Catherine Heller

Catherine Heller es espaola (nacida en Madrid)


de padre norteamericano, y con muchos aos
de estancia en los dos pases. En la actualidad,
trabaja como evangelista de Windows Live, en
Redmond, y anteriormente, de Visual Studio
Tools for Office. Eso fue despus de pasar en
Microsoft Ibrica otra buena parte de su
carrera

Cuntanos tu trayectoria anterior en


Microsoft Ibrica y para los que ya
te conocemos y te vimos marchar-,
qu haces ahora en EE.UU.
Yo empec en Microsoft, en Espaa,
en el ao 2000, como Aplication Development Consultant, y trabajaba con los
ISV en Espaa y les ayudaba a crear su
planificacin y arquitectura usando tecnologas de Microsoft. En el 2003 me
sali la oportunidad de ir como Technical Evangelist a un grupo en Microsoft Corporation en Redmond. Mi primer TechEd aqu en Barcelona fue justo antes de trasladarme a Redmond.

<< dnm.directo.entrevista
He seguido todo este tiempo como
evangelista, pero cambiando entre productos. Me pas dos aos enfocada en
Whidbey (concretamente en el rea de
Visual Studio Tools for Office), lo que
fue muy interesante, porque anteriormente haba sido especialista en servicios Web, en middle tier, en remoting,
COM+
Especialmente sabiendo que vienes de un background de C++
S, haba sido desarrolladora de C++
10 aos antes de venir a Microsoft
Fue muy interesante ver el desarrollo

qu resumen das a los lectores de


la revista de cara a aprovechar ese
potencial?
En el TechEd de noviembre del ao
pasado di una charla sobre Windows Vista y las reas en las que yo me centr,
sobre todo Desktop Search. Hay una
manera muy sencilla de poder incorporar bsquedas utilizando el ndice del
desktop, utilizando OLE DB Provider for
Windows Search, y eso se utiliza muy
fcilmente desde ADO.NET y est bien
documentado. Es un proveedor algo
especial, dado que es de solo lectura.

mentar interfaces COM. Pero es factible, y tambin me dediqu a ayudar a


los ISV en ese aspecto.
Tambin me centr en cosas como
ayudar a los desarrolladores a conocer el
impacto de User Account Control (UAC)
sobre sus aplicaciones, porque es una pena
ver cuntos lo deshabilitan cuando es un
mecanismo muy importante para el usuario. Y realmente tampoco es tan complicado tener una aplicacin que funcione
bien con UAC. Es ms bien conocer un
poco el manifiesto que hay que embeber
y resulta sencillo.

desde el punto de vista del desarrollador de Office y la posibilidad de escribir cdigo para Office desde .NET en
C# y Visual Basic. Con Visual Studio
2005 en el mercado, me cambi a Windows Vista. En esa poca todo el mundo hablaba de Indigo y Avalon, pero yo
me puse a mirar las API nativas, que
realmente es lo que vena como parte
del sistema operativo. Fue un ao y
medio interesante, volviendo a mis orgenes de C++ y COM, pero tambin
analizando cmo se podan aprovechar
esas API nativas desde .NET, y los retos
para acceder a ellas. Ya en enero, cuando lanzamos Windows Vista, me cambi a un mundo totalmente diferente,
como es Windows Live.
Respecto a ese ao y medio de
anlisis de las API nativas de Vista,

Pero hay toda una infraestructura para


quienes quieran integrar sus datos dentro del ndice, algo ms complicada, ya
que hablamos de tener que implementar interfaces COM desde C++.
Pero el 99,9% de las veces lo que
necesitas es leer, no escribir
S, leer es muy fcil. Cuando es ms
complicado y se requiere un nivel tcnico mayor es, por ejemplo, cuando
tenemos un formato de archivo propio
y queremos indexar su contenido, o si
queremos que el contenido del archivo
o de ese tipo de archivos se integren en
la experiencia visual del explorador. Por
ejemplo, los Live Icons: ver la imagen
all, o poderla ver en la vista de presentacin preliminar, o poder permitir
que el usuario le asigne propiedades al
archivo todo esto requiere imple-

Y de ah pasaste a Windows Live


y su parte programtica
La primera cosa importante a
entender sobre Windows Live es que
es una oferta para el consumidor, no
tanto para la empresa, salvo si sta quiere integrarlo en sus portales Web dirigidos a usuarios finales. Gran parte de
la oferta hoy s va dirigida al usuario
final. Estamos empezando a evolucionar hacia una plataforma, y tenemos
una serie de ofertas para el desarrollador que, si bien no abarcan todava el
abanico de ofertas para el usuario final,
son muy interesantes.
Uno de los nuevos servicios que
sacamos en versin alfa en abril se llama Silverlight Streaming by Windows Live. Es interesante porque es
un servicio que hemos introducido

<<dotNetMana

Catherine Heller junto a Marino Posadas

13

<<dotNetMana

<< dnm.directo.entrevista

14

directamente a nivel de plataforma, no


hay una oferta correspondiente para el
usuario final. Se entiende que esto va
dirigido al desarrollador. Es un servicio que complementa las aplicaciones
Silverlight. Cuando vayamos creando
aplicaciones Silverlight que sean muy
ricas en elementos multimedia, que tengan vdeo, que tengan fotos, imgenes,
esas aplicaciones podrn hacer uso del
servicio de Silverlight Streaming.
O sea, lo que es ahora la oferta
de Silverlight 1.0, porque en la 1.1
cambian muchas cosas
S, pero esto vale tanto para Silverlight 1.0 como para 1.1, porque no afecta directamente esa API de programacin sino que se crea un paquete, se
incluyen todos los archivos de la aplicacin, se crea un ZIP y se publica, o
se sube ese paquete al servicio. Una vez
all, lo que se hace es proporcionar una
experiencia de reproduccin en una
pgina Web, con la ventaja que esa aplicacin se distribuye a lo largo de toda
nuestra red de entrega de contenido
(CDN, Content Delivery Network). Con
esto, los elementos pesados estn en el
lmite ms cercano al usuario y no necesariamente en servidores centrales que
pueden estar ubicados muy lejos.
Adems, tareas como el streaming de
vdeo suelen requerir muchos recursos
de hardware. Todo este trabajo duro lo
hace el propio servicio. Y es una oferta muy interesante porque damos hasta 4Gb de espacio totalmente gratuito,
y hasta que la versin definitiva del servicio salga a la luz (mientras estemos en
alfa y beta), no hay ningn tipo de lmite en el uso que se haga de l, es totalmente gratuito. Una vez que lo pongamos en produccin pues s se cobrar,
pero solo a partir de un milln de minutos de streaming al mes. Tenemos el
umbral muy alto, muy generoso
Para evitar excesos, simplemente, pero para que los usuarios normales puedan usarlo sin pagar
Bueno, esto refleja el objetivo que
tenemos con los trminos de uso en
general para los servicios de Silver-

light de plataforma. Queremos definir unos umbrales de uso muy generosos y permitir que por debajo de ese
umbral el uso sea gratuito. Y en algn
momento financiaremos eso a travs
de anuncios. Luego queremos tambin ofrecer un modelo para que por
encima de ese umbral se pueda pagar,
bien por usuario, o por transaccin,
o por minuto, dependiendo del servicio o por algn tipo de comparticin de ingresos por anuncios; esa es
la idea que tenemos detrs de estos
servicios.
Tambin estamos haciendo una
apuesta muy importante respecto a las
fotografas almacenadas en Windows
Live Spaces. Ahora mismo hay 4 mil
millones de fotografas almacenadas.
Baste pensar que los usuarios de
media suben unos 8 millones de fotografas todos los das en todo el mundo. Vemos dnde se est haciendo un
uso muy importante de Spaces: publicar y compartir fotografas. Lo bueno
que tiene Spaces es que se puede crear un space y limitar a que solo tu familia, tus amigos o quien t decidas acceda a l. Estamos invirtiendo mucho
para hacer que Spaces sea un sitio idneo para guardar fotografas, para crear experiencias de usuario como Windows Live Photo Gallery, que acabamos de sacar y que tiene una experiencia rica en el cliente para manipu-

lar, personalizar tus fotos, etc. y desde


all subirlas directamente a tu space.
Una vez en el space, el desarrollador
puede integrar esas fotografas o experiencias que los usuarios ya han subido a su space, pues hay muchos tipos
de experiencias que incorporan esas
fotografas de manera muy interesante. All estamos potenciando maneras
fciles de acceso, como puede ser con
un control Javascript que pongas en
una pgina y permita al usuario seleccionar fotos o feeds RSS, o una API que
permite subir fotos, borrarlas, etc.
Queremos extender la experiencia de
esas fotografas a otros sitios Web, a
otras aplicaciones.
Bueno, para finalizar, para el que
quiera programar alguna cosa con
Windows Live cules seran los primeros pasos a dar?
Lo primero, desde luego, es ir al
sitio Web, que es http://dev.live.com.
Ese es el sitio para toda la informacin relacionada con el desarrollo utilizando los servicios de Windows Live.
All se enlaza a la documentacin
MSDN y se ofrecen aplicaciones (las
Quick Applications) que demuestran
cmo combinar varios servicios. En
CodePlex est el cdigo fuente disponible y se puede participar en esa
comunidad para extender esas aplicaciones, y hay muchas ms ofertas para
desarrolladores.

Cuando tomamos decisiones,


necesitamos informacin; esa
informacin nos ayuda a gestionar mejor los procesos de
nuestras organizaciones y a ser
ms competitivos, dndonos
mejores posibilidades de supervivencia en el corto, medio y
largo plazo. Aproximadamente
el noventa por ciento de la
informacin que necesitamos
est dentro de nuestra propia
organizacin, pero por desgracia la dispersin de la informacin (mltiples fuentes de
datos, mltiples formatos, calidad del dato mostrado, etc.)
hace que solo el treinta por
ciento est accesible en el formato y en el tiempo adecuado;
el resto son datos por tratar o
informacin no estructurada...

si no lo tienes claro...

GR
d

La revista de la

Gestin del Rendimiento

La revista para la Gestin del Rendimiento


www.gestiondelrendimiento.com

eventos

Marino Posadas

TechEd 2007: expectacin


ante un ao pleno de novedades
<<

Quien ms quien menos tena la idea de que la


recin concluida edicin del TechEd 2007 en Barcelona iba a ser la antesala de las innovaciones que
se esperan para el 2008: Windows Server 2008,
Visual Studio 2008 (cuya disponibilidad final se
anunci durante el evento), SQL Server 2008, Silverlight, etc. Y as fue. Tuvimos ocasin de asistir
a excelentes sesiones (las hubo de todas clases), abrir
los ojos a nuevas tecnologas y como siempre, compartir con una comunidad cada vez ms activa.

mantener, como clave del xito de la compaa.


A partir de ah, la marabunta hasta 15
sesiones simultneas! Siendo grande el foro que
aloj el evento, se tuvieron que habilitar dos
zonas exteriores cubiertas para dar cabida a la
gran cantidad de ponentes que se dieron cita este
ao. Y adems de las sesiones estndar, estaban
las interactivas (en las que el usuario puede interrumpir al ponente con sus preguntas desde el
principio), que en esta edicin tuvieron ms xi-

Somasegar, durante la keynote

Marino Posadas
es director de tecnologas de desarrollo para Espaa y
Portugal de Solid
Quality Learning.
Puedes leer su blog
en http://www.
elavefenix.net.

Fue Soma Somasegar (vicepresidente corporativo de la Divisin de Desarrollo) el encargado


este ao de abrir las sesiones con una keynote en
la que fue introduciendo la mayor parte de las
novedades que se espera vayan apareciendo desde ahora hasta finales de 2008 (o hasta el siguiente TechEd, que repetir ubicacin en Barcelona).
Ayudado por Tony Goodhew y Dan Fernandez
en las presentaciones, fue desglosando uno a uno
los elementos clave de cada producto y presentando un ecosistema cada vez ms integrado, ms
colaborador con su entorno, ms fcil de usar: el
mantra habitual que omos en muchas presentaciones y que Gates trata por todos los medios de

to que nunca. Se presenta un tema (normalmente el mismo que el ponente ha expuesto en una
sesin estndar), y se debate en profundidad discutiendo y aportando cada espectador sus miedos o experiencias en la implementacin. En la
foto adjunta, vemos a Francisco Gonzlez de
Solid Quality Mentors, nico ponente espaol
junto a Catherine Heller, atender al pblico al
final de su sesin interactiva.
Afortunadamente, los asistentes al evento recibiremos un post-conference DVD con todo el
contenido de las ponencias grabado en vdeo junto a las presentaciones PowerPoint y cdigo fuente. Por suerte, otra novedad de este TechEd con-

<< dnm.directo.eventos

Francisco Gonzlez, nico ponente de una compaa


espaola (Solid Quality Mentors)

sisti en que desde la semana posterior al evento no tenemos que esperar


la llegada del DVD para ver las sesiones que nos perdimos, ya que pueden
verse online desde la pgina Web de
TechEd Europa (http://www.mseventseurope.com/TechEd/Developers).
Pero haba muchas otras formas de
colaboracin: la seccin Ask The Experts
contaba con mucha ms presencia (el
pblico vot masivamente a favor de esta
iniciativa), se habilitaron como siempre zonas wireless (Delegate Work Area
y Communications Network) donde el
personal poda atender sus urgencias corporativas, y la zona de Exhibitors estaba como siempre, llena de curiosos por
ver las ofertas de compaas de terceros,
que este ao contaban incluso con una
tienda de ropa con distintos logos de
productos Microsoft.

Falta uno? S. Falta mencionar la


que fue quizs mi entrevista favorita
de este ao, con Don Syme, de Microsoft Research (Cambridge), arquitecto
principal del lenguaje funcional F#, que
se incorpora de pleno derecho a la familia de lenguajes soportados por Visual
Studio en la siguiente versin, y que ofrece unas caractersticas para el clculo
matemtico como no habamos visto hasta ahora. Don es un tipo muy accesible,
y nos estuvo enseando in situ, con su
propio porttil, algunas de las carac-

Don Syme nos explica -en su demo de F# la potencia del lenguaje


en clculo matricial

tecto de SQL Server 2000/2005, que


dio un autntico espectculo en sus presentaciones sobre filosofa del software), o Jesse Liberty, quien, recientemente fichado por la compaa, se ha
convertido en el alma evangelizadora de Silverlight en Redmond. Tambin estuvimos con otros evangelistas, como la espaola (de padre norteamericano) Catherine Heller, que
dedica sus esfuerzos actuales a la
divulgacin de Windows Live, Joe
Marini, Program Manager del equipo de extensibilidad de Visual Studio,
Dan Fernandez, Lead Product
Manager de herramientas como
PopFly o Visual Studio Express y jefe
de Arturo Toledo, otro de nuestros
entrevistados (ver dotNetMana n
40) y Damir Tomicic, Presidente de
INETA Group Europe.

tersticas ms sobresalientes de este nuevo miembro de la familia .NET.


Iremos publicando estas entrevistas
en los prximos nmeros de la revista.
Tambin hubo lugar para el esparcimiento, tanto en la zona XBox como
despus de las jornadas, con cenas para
la comunidad MVP espaola, dirigida
por Cristina Gonzlez Herrero, para
las comunidades nacionales por pases,
y para certificados Microsoft, donde
hizo de anfitriona Karen Young,
EMEA MVP Regional Manager.
Un TechEd, en suma, ms intimista
(sin la super-fiesta final del jueves), ms
centrado en el trabajo, con un altsimo
nivel de sesiones, y donde pudimos contactar ms directamente que nunca con
aquellos que estn haciendo y presentando el software que todos queremos utilizar en el inmediato futuro.

<<dotNetMana

Hall principal de expositores y zonas comunes

Hubo muchos conferenciantes distinguidos,


pero lo mejor es que tuvimos oportunidad de entrevistar a 8 de ellos para dotNetMana. Hablamos con
autnticos clsicos de la tecnologa Microsoft, como
Ted Pattison (Presidente
de Ted Pattison Group y
conocido autor del mundo
COM), Pat Helland
(coautor de MTS y arqui-

17

<< dnm.directo.eventos

<<dotNetMana

Lanzamiento de Biztalk

18

La verdad es que desde el principio la


cosa prometa. Pnganse en situacin:
Museo Thyssen de Madrid, un evento
de todo un da dedicado exclusivamente a Biztalk, un montn de buenas referencias de implantaciones Biztalk verticalizadas en 3 grupos (banca y seguros, industria y sector pblico), charlas
tcnicas focalizadas en las novedades de
esta revisin de Biztalk, raona como
Partner Platinum presentando un caso
de xito implantado en Catalana Occidente y una difusin del evento a la base
de datos de Microsoft, formada por
unos 6000 contactos.
La primera de las ponencias que
figuraban en la agenda tras la bienvenida a los asistentes por parte de Fernando Bocigas, responsable del producto en Espaa, corra a cargo de
Fernando Garca, director de Ventas
de Soluciones de Aplicacin en Microsoft, que bajo el ttulo Seis tendencias tecnolgicas que marcarn la prxima dcada contextualiz de manera general el estado actual de la tecnologa, y augur los principales retos
a los que tendremos que hacer frente
en un futuro inmediato como responsables de IT y como usuarios que conviven en el da a da con la informacin. La verdad es que aqu, como en
otros mbitos, Microsoft marca tendencias, as que no es arriesgado aventurar que darn en el clavo y que, efectivamente, la evolucin lgica que se
nos present (les suena mundo interconectado?) ser acertada.
Tras Fernando Garca, de nuevo fue
el turno de Fernando Bocigas, con una
ponencia llamada Extendiendo el negocio conectado, en la que se hizo un repaso de cul ha sido la evolucin del producto desde sus orgenes (cmo han cam-

2006 R2

biado las cosas, afortunadamente, desde


aquel Biztalk 2000 intratable) hasta la
actual versin 2006 R2. Sorprende ver
cmo progresivamente se va ganando la
aceptacin de las compaas, pasando de
500 clientes en la primera versin hasta
aproximadamente 7000 con la, hasta la
fecha, ltima versin con datos fiables,
Biztalk 2006. En este caso, Microsoft fue
prudente y se reserv el dar una fecha estimada de la previsin de calado de R2 para
cuando alcance la etapa de madurez, aunque nada hace indicar que la tendencia al
alza se frene.

Biztalk como integrador de una cadena de fabricacin de componentes


para el interior del automvil; una
implantacin en un centro de salud
para la comunicacin de diferentes
reas y departamentos; un caso real
de utilizacin del adaptador SWIFT
para transacciones seguras dentro del
entorno de banca El caso de xito
por el que raona fue invitado al evento consista en la comunicacin de la
compaa de seguros Catalana Occidente con el Ministerio de Justicia con
la finalidad de hacerle llegar datos

Las exposiciones no defraudaron y nos mostraron


Biztalk como una realidad que funciona y que
goza de un merecido respeto en las compaas
en las que ha sido implantado
Y, por fin, el plato fuerte del da:
casos de xito de implantaciones reales de Biztalk 2006. Los hubo para
cada una de las verticales que, por parte de Microsoft, acudan al evento:
industria, sector pblico y bancaseguros. Por este orden, los diferentes partners que acudieron al evento
fueron exponiendo sus desarrollos,
presentando 2 casos de xito para cada
vertical. Pudimos ver un sinfn de
problemticas diferentes con un
denominador comn: Biztalk. Entre
los casos destacados se mostraron un

requeridos de las plizas de vida, en


virtud de la ley 20/2005 sobre la creacin del Registro de Contratos de
Seguros de Cobertura de Fallecimiento.
La verdad es que las exposiciones
no defraudaron y nos mostraron Biztalk como una realidad que funciona
y que goza de un merecido respeto en
las compaas en las que ha sido
implantado. Djenme hacerles una
confesin: en los numerosos aos que
llevo haciendo implantaciones de Biztalk, jams me he encontrado con un

<< dnm.directo.eventos
cliente que se haya sentido defraudado por el resultado final, ni en cuanto a expectativas de rendimiento ni en cuanto a capacidad de integracin.
Lleg el momento de recobrar fuerzas con el
cctel programado para afrontar la recta final del
evento con las energas renovadas. Respecto a lo
acontecido por la tarde, poco tenemos que comentar: tres diferentes charlas, eminentemente tcnicas, en las que sin grandes pretensiones se nos
detall el funcionamiento de los adaptadores RFID
y EDI mejorados para esta ltima versin, y una
ltima charla que cerraba el da y que rezaba algo
as como Extendiendo SOA desde la Empresa al
Mundo (previsible, muy previsible).

Y esto fue todo. Al final, menos asistencia de la


prevista: 75 participantes entre partners, clientes e
invitados. Una impecable organizacin, en la que
los tiempos se cumplieron rigurosamente, y un
buen sabor de boca respecto a los incrementales
esfuerzos por parte de Microsoft por situar Biztalk
en el lugar que le corresponde como herramienta
de integracin de primer nivel.

Suriel Hilario
Project Manager de Raona

CEUS 2007
El pasado 30 de octubre, cerca de 320 personas asistieron a la tercera edicin de CEUS 2007, la III Conferencia de Usuarios de SharePoint, en Madrid. Esta
edicin sirve para consolidar dichas conferencias entre
la comunidad y confirma el xito de la plataforma de
moda de Microsoft. Prueba de ello fue el nmero de
asistentes, que super al del ao pasado, confirmando el inters de la plataforma SharePoint. El da se
dividi en dos formatos totalmente diferentes de presentaciones.
La maana estuvo presidida por presentaciones de
empresas usuarias de SharePoint, que junto al cliente
final, nos mostraron casos de xito con SharePoint; en
la presentacin daban a conocer a todo el aforo su experiencia, implementacin y sensaciones con el producto. Entre estas empresas se encontraban raona junto a
su cliente Criteria Caixa Corp, Getronics con Ancert
y K2, Renacimiento con el Ministerio de Presidencia
e Informtica el Corte Ingls con Caja Mediterrneo.
Todas estas presentaciones fueron de carcter prctico,
con la puesta en marcha del proyecto y las peculiaridades de cada uno. Enmedio, y despus del descanso, intervinieron distintos responsables de Microsoft, que nos
dieron algunos detalles del futuro de SharePoint, enfocado en las bsquedas, lo que anuncia la salida del nuevo SharePoint Search Server. Por parte de Microsoft,
contamos con la presencia de Rafael Snchez, jefe de
producto de SharePoint, y con Sarah Hammon, responsable de producto SharePoint en Europa.

Las sesiones de la tarde, en cambio, fueron sesiones mucho ms tcnicas, ms enfocadas hacia un
tema especfico. Se cont con un total de siete salas,
y en cada una de ellas tuvieron lugar tres presentaciones de unos 55 minutos cada una. Con este formato de presentaciones y con la disponibilidad de
salas, los asistentes se dividieron entre las sesiones
ms interesantes para cada uno de ellos. Se trataton temas muy diversos, desde migraciones de SharePoint 2003 y CMS 2001 a SharePoint 2007, hasta integraciones de BI, Microsoft Dynamics, Business Data Catalog, workflows con SharePoint Designer y definicin de arquitecturas de alta disponibilidad. Los ponentes de estas presentaciones pertenecan a las distintas empresas patrocinadoras del
evento y otros voluntarios, as como personal de
Microsoft. Todas las presentaciones estarn disponibles pblicamente en breve para las personas que
no puedieron asistir al evento.
Entre las novedades, la nueva versin de Microsoft Search Server 2008. Esta versin del nuevo buscador para SharePoint ya se encuentra liberada en su
versin release candidate para que cualquiera de los
usuarios pueda descargarla y probarla.

Sergio Holgado
Software Engineer de Raona

plataforma.net

Javier Roldn

Tablet PC SDK (y II)


Reconocimiento de escritura manual
En la primera parte de este artculo indicamos el modo de preparar el
entorno de desarrollo necesario para la programacin de aplicaciones
capaces de aceptar tinta digital para ms tarde reconocerla como escritura manuscrita.Asimismo, utilizamos los principales elementos que para
este fin proporciona el Microsoft Windows XP Tablet PC Edition Software Development Kit.

Fco. Javier Roldn


Huecas
es ingeniero superior
informtico. Con una
experiencia laboral de
ocho aos como profesional del sector de
las TI, en la actualidad
trabaja como ingeniero de sistemas y responsable de proyectos
en una importante
empresa industrial de
mbito nacional.
javier.roldan@gmail.com

Estos elementos, flexibles y de sencilla incorporacin a nuestros proyectos, eran el control InkEdit y el control InkPicture. El primero permita la
captura de trazos de tinta digital y su reconocimiento de manera automtica, todo ello sin escribir una sola lnea de cdigo. Por otro lado, el control InkPicture permita la captura automtica de
trazos de tinta digital; sin embargo, para el reconocimiento de los trazos como escritura era necesario un poco de programacin.
En el presente artculo iremos ms all y estudiaremos la manera de hacer que cualquier control
(como por ejemplo un Panel, un RichTextBox o un
ListBox, por solo poner unos ejemplos) sea capaz de
aceptar trazos de tinta digital y reconocerlos como
escritura manual. Asimismo, veremos los principales mtodos existentes para mejorar la efectividad del
reconocimiento, tales como el uso de los factoids (cadenas predefinidas que proporcionan al reconocedor
informacin sobre el tipo de texto a reconocer) y
wordlists (listas predefinidas de palabras).
Para finalizar, analizaremos el uso de lo que se
conoce como gestures, gestos especiales no reconocidos como palabras y que permiten la ejecucin de acciones a medida.

damos. Al igual que el control InkPicture, la clase InkOverlay no proporciona por defecto mtodos automticos para el reconocimiento de la escritura manual; sin embargo, del mismo modo podremos suplir esta ausencia mediante la clase Recognizers y un poco de programacin.
Pasemos por tanto a ver cmo usar la clase
InkOverlay. Para ello, crearemos un nuevo formulario a imagen y semejanza del formulario usado en la primera parte de este artculo, con la diferencia de que sustituiremos el control InkPicture
por un simple Panel. Para aquellos que no hayan
podido leer esa primera parte, el formulario se
compone bsicamente de un control Panel sobre
el que escribiremos trazos de tinta digital, un TextBox en el que mostraremos el resultado de inten-

La clase InkOverlay
La clase InkOverlay nos permite aadir caractersticas de tinta digital a cualquier control que deci-

Figura 1. Formulario InkOverlay.

<< dnm.plataforma.net

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

Como podemos observar, en la primera lnea de cdigo simplemente creamos una instancia de la clase InkOverlay, a la que le pasamos en el constructor el control con el que queremos asociarlo. En la segunda lnea activamos
dicha instancia.
Si ejecutamos la aplicacin de nuevo, observaremos que hemos convertido el Panel en un control capaz de
recibir trazos de tinta digital; pero que
(al igual que ocurra con el control
InkPicture) ste no es capaz de reconocerlos como texto de manera
automtica. Utilizando el mismo cdigo que el usado en el artculo anterior
para el control InkPicture, pero sustituyendo la referencia a la clase InkPicture por la clase InkOverlay, haremos
posible que el texto manuscrito sobre
el control Panel sea reconocido y mos-

trado en el cuadro de texto. Del mismo


modo, podremos borrar, seleccionar, escalar y mover cada trazo dibujado con solo

using
using
using
using
using
using
using
using

aadir el cdigo necesario a los botones


de la interfaz de usuario. Puede verse el
cdigo completo en el listado 1.

System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Text;
System.Windows.Forms;
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();

<<dotNetMana

tar reconocer los trazos como texto y


una serie de cuatro botones que nos
permitirn escribir trazos, modificarlos
y borrarlos. Por ltimo, dispondremos
de un botn que lanzar el evento de
reconocimiento de escritura. Puede verse como queda dicho formulario en la
figura 1.
Si ejecutamos la aplicacin e intentamos realizar algunos trazos sobre el
Panel, veremos que (como era de esperar) nada sucede. Esto es debido a que
el control Panel, al contrario de lo que
ocurra con el control InkEdit o InkPicture, no espera que sobre l se dibujen trazos de tinta digital, por lo que
detecta los eventos del ratn (o puntero) como simples eventos de pulsacin
y arrastre.
La solucin pasa por superponer
sobre el control Panel (o cualquier otro
sobre el que queramos escribir) un control que es capaz de capturar y mostrar
trazos de tinta digital. Dicho control se
implementa a travs de la clase InkOverlay. Para ello, aadimos el siguiente cdigo al evento Load del formulario:

21

<< dnm.plataforma.net

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 2. Reconocimiento sin factoids.

to_Click, justo tras la lnea donde creamos el RecognizerContext:


contextoReconocedor.Factoid =
Factoid.Number;

O bien esta otra lnea, totalmente


equivalente a la anterior:

}
contextoReconocedor.Factoid =
NUMBER;

<<dotNetMana

Listado 1. Cdigo de reconocimiento de escritura con InkOverlay.

22

Mejorando el
reconocimiento

varias herramientas, entre las que se


encuentran los factoids y las wordlists.

A estas alturas, si ha seguido de manera prctica el artculo, con total seguridad ya habr probado la sorprendente
eficacia del reconocedor implementado en el Microsoft Windows XP Tablet
PC Edition 2005 Recognizer Pack. Sin
embargo, existen situaciones en las que
es muy difcil para cualquier reconocedor automtico de texto averiguar qu
es lo que el usuario exactamente ha querido escribir.
Pensemos, por solo poner un par de
ejemplos, en aquellos casos en los que
es necesario que la aplicacin reconozca letras sueltas, o palabras sin ningn
sentido en cualquier idioma, como
nombres de usuario o contraseas. Para
poder enfrentarnos con xito a este tipo
de casusticas, el Microsoft Windows
XP Tablet PC Edition Software Development Kit pone a nuestra disposicin

Factoids

Si ahora ejecutamos la aplicacin y


escribimos de nuevo el nmero 51, nos
lo reconocer sin problemas. Sin
embargo, si probamos a escribir el
carcter 1 de un tamao considerablemente mayor que el 5, es posible
que el reconocedor nos interprete el
texto como la cadena s1 (figura 3).

Los factoids son constantes de tipo


string que asignadas a la propiedad Factoid de la clase RecognizerContext que

proporcionan informacin contextual


al reconocedor que permite mejorar la
efectividad de reconocimiento.
Para entenderlo mejor, veamos un
sencillo ejemplo. Supongamos que en la
aplicacin de ejemplo del apartado anterior quisiramos reconocer nicamente
cifras numricas introducidas por el usuario. Pues bien, si ejecutamos la aplicacin
e intentamos escribir el nmero 51 pero
de un modo un tanto simplificado, el
reconocedor lo interpretar como la
cadena de texto si (ver figura 2).
Para solucionar este contratiempo,
aadimos la siguiente lnea de cdigo
dentro del evento buttonReconocimien-

Figura 3. Reconocimiento usando factoids.

Hemos mejorado el reconocimiento, sin embargo no hemos alcanzado el

<< dnm.plataforma.net

objetivo de que la aplicacin reconozca todo el texto introducido por el


usuario exclusivamente como nmeros. Para forzar al reconocedor a que
interprete los trazos introducidos nicamente dentro del contexto especificado por la propiedad Factoid, debemos incorporar la siguiente lnea de
cdigo a nuestra aplicacin:
contextoReconocedor.RecognitionFlags=
RecognitionModes.Coerce;

minar el formato de cada factoid en funcin del idioma que estemos utilizando. Asimismo, debemos tener en cuenta que no todos los factoids existen en
todos los idiomas, por lo que es recomendable tener muy claro en qu idioma estamos trabajando y usar los factoids que correspondan.
En la tabla 1 se presentan los principales factoids, divididos en dos grandes grupos: dependientes e independientes de idioma. No se han incluido,
por encontrase fuera del alcance de este
artculo, los factoids de idiomas orientales (japons, chino y coreano).

Wordlists
Existen situaciones en las que el uso
de factoids es del todo inadecuado, y sin
embargo el reconocimiento por defecto sigue siendo deficiente. Pensemos
por ejemplo aquellos casos en los que
la aplicacin deba reconocer palabras
sin sentido que combinen letras y
nmeros, como por ejemplo nombres
de usuario y contraseas.
Si volvemos al ejemplo inicial e
intentamos reconocer por ejemplo la
cadena ss5lo10, pero adems no
haciendo distincin alguna mientras

Factoids independientes de idioma


Digit

Dgito simple.

Email

Direcciones de correo electrnico.

Web

Diferentes tipos de URL. Los valores por defecto del reconocedor


incluyen el factoid Web, por lo que no existe mayor diferencia entre
usar este factoid y no usarlo.

Default

Devuelve al reconocedor a sus valores por defecto.


En idiomas occidentales, esto incluye el diccionario de sistema, el
diccionario de usuario, los signos de puntuacin y los factoids Web
y Number.
En idiomas orientales, incluye todos los caracteres soportados por el
reconocedor.

None

Desactiva todos los factoids y diccionarios.


No debe usarse el modo Coerce con este factoid.

Figura 4. Forzando el uso de factoids.

Factoids dependientes de idioma


Filename

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

SystemDictionary

Activa en exclusiva el diccionario de sistema.

Wordlist
Currency

Activa en exclusive la lista de palabras.


Cantidades monetarias en libras, euros, dlares y yenes, escritos en
funcin del idioma.
Fechas escritas en funcin del idioma.
Todos los nmeros, incluyendo ordinales, smbolos matemticos y unidades de medida (mm, kg,), todos ellos en funcin del idioma. Tambin estn incluidos los factoids Date, Time, Telephone y Currency.

Date
Number

OneChar

Un carcter ANSI.

Percent

Un nmero seguido del smbolo %. Existir un espacio entre el nmero y el smbolo de porcentaje en funcin del idioma.

PostalCode

Cdigos postales en funcin del idioma.

Telephone

Nmeros de telfono en funcin del idioma.

Time

Horas y minutos escritos en funcin del idioma.

UpperChar

Una letra mayscula.


Tabla 1. Principales factoids

<<dotNetMana

Sin embargo, debemos usar con cuidado la combinacin de la propiedad Factoid y el modo de reconocimiento Coerce, ya que tal y como hemos comentado,
el modo Coerce fuerza a reconocer nicamente aquellas cadenas de texto que
concuerden exactamente con la definicin
del factoid. As por ejemplo, el factoid Email
en modo Coerce solo reconocer cuentas
de correo electrnico completas; es decir,
que contengan el carcter @ y un dominio
totalmente cualificado (por ejemplo
javier.roldan@gmail.com), no permitiendo el reconocimiento de textos que no
cumplan estrictamente estos requerimientos, como por ejemplo aliases (JavierRoldan) o cuentas de correo sin dominios
totalmente cualificados, comunes en algunas implementaciones de mensajera interna (javier.roldan@midominio).
Es importante sealar que mientras
algunos factoids, como por ejemplo Email
y Web, son idnticos en cualquier idioma, otros, como por ejemplo Telephone y PostalCode dependen del idioma
utilizado. Es fundamental por tanto exa-

23

<< dnm.plataforma.net

Gestures

escribimos entre el 5 y la s, el 1 y la
l y el 0 y la o, parece imposible que
ninguna aplicacin (o incluso persona)
pueda reconocer ese texto (figura 5).

Figura 6. Reconocimiento
mediante wordlists

Figura 5. Reconocimiento imposible?

Sin embargo, existe un modo de


hacer que este reconocimiento funcione, y es proporcionando al reconocedor
una lista de palabras posibles a introducir por el usuario. Es lo que se conoce
como el uso de wordlists.
Aadiremos el siguiente cdigo
dentro del evento buttonReconocimiento_Click, justo tras la lnea donde creamos el RecognizerContext y en sustitucin del cdigo aadido en el apartado
anterior (ver listado 2):

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;

<<dotNetMana

contextoReconocedor.Factoid =
Factoid.WordList;
WordList wordList =
new WordList();
wordList.Add(ss5lo10);
contextoReconocedor.WordList =
wordList;
contextoReconocedor.RecognitionFlags=
RecognitionModes.Coerce;

24

Podremos comprobar que la aplicacin es capaz de reconocer los trazos introducidos sin mayor problema
(figura 6).
Teniendo en cuenta que es posible
aadir en tiempo de ejecucin tantas
palabras como deseemos a la propiedad
WordList, esto convierte su utilizacin en
prcticamente obligada en todos aquellos casos en los que sea factible su uso.

Finalizaremos el artculo haciendo


un breve recorrido por el uso de los gestures. Los gestures son gestos o trazos
especiales que no son reconocidos como
palabras y que permiten la ejecucin de
acciones a medida.
El Microsoft Gesture Recognizer
soporta dos tipos de gestures: de sistema
(SystemGesture) y de aplicacin (ApplicationGesture).
Los SystemGesture son gestos definidos y soportados por defecto y que en su
mayora son mapeados a eventos de ratn;
como por ejemplo el gesto Tap, que es

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 2. Usando wordlists para el reconocimiento de palabras complejas.

<< dnm.plataforma.net

Digit

Dgito simple.

Tap

Clic de ratn.

DoubleTap

Doble clic de ratn.

RightTap

Clic con el botn derecho del ratn.

Drag

Arrastre con el botn izquierdo del ratn.

RightDrag

Arrastre con el botn derecho del ratn. Se consigue haciendo un tap


largo y luego arrastrando sin levantar el puntero de la pantalla.

HoldEnter

Sin equivalente en el ratn.

HoldLeave

No implementado.

HoverEnter

Equivalente a pasar el ratn por encima.

HoverLeave

Equivalente a dejar de pasar el ratn por encima.


Tabla 2. SystemGesture disponibles

mapeado a un clic de ratn. La lista de


SystemGesture disponibles y su mapeo a
eventos de ratn se presenta en la tabla 2.
Por otra parte, los ApplicationGesture son gestos que podemos incluir (o
no) libremente en nuestra aplicacin.
Para implementar este tipo de gestures,
debemos aadir el siguiente cdigo al
evento Load del formulario:

A continuacin, el cdigo establece


qu tipo de gestures deseamos que sean
reconocidos mediante el uso del mtodo SetGestureStatus de la clase InkOverlay. En el ejemplo activamos el reconocimiento de todos los gestures. Es
posible activar el reconocimiento de
solamente ciertos gestures; para ello, sustituiramos la lnea de cdigo anterior
por una o ms lneas equivalentes a las
que vemos a continuacin:

Los gestures son


gestos o trazos
especiales que no
son reconocidos
como palabras y
que permiten la
ejecucin de
acciones a medida

this.inkOverlay = new
InkOverlay(this.panelEscritura);
this.inkOverlay.CollectionMode =
CollectionMode.InkAndGesture;

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

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

this.inkOverlay.Enabled = true;

Como puede observarse en el cdigo, inicialmente creamos un InkOverlay


asociado al panel sobre el que deseamos
escribir, para luego establecer su propiedad CollectionMode al valor CollectionMode.InkAndGesture. Esto nos permite indicar que tanto los trazos de tinta como los gestos deben ser reconocidos como tal.

Por ltimo, asociamos el mtodo


inkOverlay_Gesture al evento Gesture del
objeto inkOverlay y lo activamos. El
mtodo inkOverlay_Gesture, que sim-

plemente muestra en el cuadro de texto el texto asociado al gesture reconocido, se muestra a continuacin:

Podemos ver el cdigo completo en


el listado 3. No se ha incluido el cdigo asociado a los botones de edicin de
trazos ni de reconocimiento de escritura, ya que ste se muestra ntegramente en el listado 1.

void inkOverlay_Gesture(object sender, InkCollectorGestureEventArgs e)


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

<<dotNetMana

this.inkOverlay.Gesture += new
InkCollectorGestureEventHandler(
inkOverlay_Gesture);

25

<< dnm.plataforma.net

using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Text;
System.Windows.Forms;
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. Implementacin de los gestures.

Si ejecutamos la aplicacin y probamos a trazar


gestos reconocidos como ApplicationGesture, veremos cmo de manera inmediata el texto asociado al
gesture ser mostrado en el cuadro de texto habilitado al efecto.

<<dotNetMana

Conclusin

26

Figura 7. Gesture DoubleCurlicue.

Con esta segunda parte damos conclusin a nuestro


artculo relacionado con el desarrollo de aplicaciones capaces de aceptar tinta digital y de reconocer la
escritura manuscrita, que esperamos haya resultado
til e informativo para los lectores.

plataforma.net

Luis Miguel Blanco

El evento CellPainting
del control DataGridView
Va libre a la creatividad
Cuando 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 mera utilizacin de estilos resulta
escasa si nuestras pretensiones pasan por lograr efectos avanzados y un mayor
control sobre el proceso de dibujo de las celdas. Es por ello que el empleo
combinado del evento CellPainting, perteneciente a este control, junto al conjunto de clases de GDI+ (la API de programacin grfica de .NET Framework),
se va a convertir en un poderoso recurso a nuestro alcance, que nos permitir aplicar ese toque especial al dibujo de las celdas, para que luzcan con
todo su esplendor. Porque ellas lo valen.

CellPainting. Control total


del dibujo de celdas

Luis Miguel Blanco es


redactor de dotNetMana. Es consultor en
Alhambra-Eidos.Ha
escrito varios libros y
decenas de artculos
sobre la plataforma
.NET
(lalibreriadigital.com)

propiedades encontraremos tambin aquellas que


nos permitirn realizar todo el dibujo de la celda
y su contenido al completo. La tabla 1 muestra las
propiedades ms destacables de esta clase.

Se trata de un evento que se produce para cada


celda que va a dibujarse, con la particularidad de
que el desarrollador
Propiedad
Descripcin
dispone de pleno
ndice de la coleccin de columnas del control, que indica la columcontrol sobre toda la ColumnIndex
na sobre la que se produce el evento.
operacin de dibujo
de la celda, siendo RowIndex
ndice de la coleccin de filas del control, que indica la fila sobre la
posible aplicarle efecque se produce el evento.
tos grficos tales como
CellBounds
Objeto Rectangle con la posicin y dimensiones de la celda a pintar.
degradados (fundidos)
Estado de la celda: seleccionada, visible, solo lectura, etc.
de colores, texturas, State
imgenes, etc.
Graphics
Objeto Graphics conteniendo el contexto de dispositivo grfico sobre
CellPainting reciel que realizar la operacin de dibujo.
be como parmetro
Valor para pintar en la celda.
un objeto DataGrid Value
ViewCellPainting
EventArgs , que nos

servir para obtener la


informacin principal
sobre la columna, fila
y valor de celda.
Adems, entre sus

FormattedValue

Valor formateado para pintar en la celda.

CellStyle

Estilo de la celda.

Handled

Propiedad booleana que permite informar al control si la operacin de dibujo ha sido realizada manualmente mediante el cdigo suministrado por el
programador, o deber ser el control quien realice este proceso.
Tabla 1. Propiedades de la clase DataGridViewCellPaintingEventArgs

<<dotNetMana

<< dnm.plataforma.net

28

Es momento, por lo tanto, de


ponernos manos a la obra y crear un
nuevo formulario, al que aadiremos
un DataGridView que nos sirva para experimentar con esta caracterstica. Como
es habitual, todos los ejemplos de este
artculo se encuentran disponibles en
el sitio Web de la revista.
En este ejemplo aplicaremos la operacin de dibujo manual a los campos
ListPrice y Color, pertenecientes a la
consulta SQL que mostraremos en el
control de cuadrcula. Como paso previo, en el evento Load del formulario,
despus de asignar el DataSet con los
datos al DataGridView, crearemos para
los mencionados campos sendos estilos
con un tipo de letra que destaque notablemente del resto de columnas, lo que
vemos en el listado 1, donde adicionalmente se configura el ajuste de tamao
automtico para filas y columnas, de
modo que el contenido de estos campos se muestre correctamente.
A continuacin pasamos a escribir
el cdigo de CellPainting, donde nuestro objetivo consistir en pintar las
mencionadas celdas, dotndolas de un
efecto de fundido de colores que conseguiremos gracias al uso de un objeto
de la clase PathGradientBrush, que se
encuentra ubicada en el espacio de
nombres System.Drawing.Drawing2D. Un
objeto PathGradientBrush, brevemente
descrito, rellena una porcin de la
superficie del formulario tomando
como base a una figura (por ejemplo,
el rectngulo correspondiente a una celda del control), y le aplica un color central que ser rodeado por otro conjunto de colores situados en un array. La
forma en que los colores se distribuirn
y fundirn al aplicar este objeto se
determina gracias a un array de coordenadas (objetos Point), que en este caso
estar compuesto por los mismos puntos de coordenadas que el rectngulo
de la celda a pintar.
Entre los diversos estados que puede tomar una celda se encuentran los
correspondientes a normal y seleccionado. El estado actual de una celda se

// obtencin de datos
SqlConnection 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 DataGridView
this.dgvGrid.DataSource = dsAdvWorks;
this.dgvGrid.DataMember = DimProduct;
// cambiar el tipo de letra a las columnas
// que vamos a usar en el evento CellPainting
DataGridViewCellStyle 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 automtico para las filas
this.dgvGrid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
// establecer ajuste de anchura automtico para las columnas
this.dgvGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
// ocultar la primera columna del control
this.dgvGrid.Columns[ProductKey].Visible = false;

Listado 1

obtiene consultando la propiedad DataGridViewCellPaintingEventArgs.State; a


la hora de pintar la celda, podremos
asignarle un conjunto de colores distinto segn el mencionado estado.
En el momento de pintar la celda,
necesitaremos un objeto de la clase
Graphics, que representa el contexto de
dispositivo grfico o superficie sobre la
que vamos a dibujar. El acceso a este
objeto lo conseguimos gracias a la pro-

piedad DataGridViewCellPaintingEventArgs.Graphics, realizando el dibujo de


la celda mediante una llamada a su
mtodo FillRectangle, que recibe como
parmetros el objeto PathGradientBrush
para aplicar el fundido de colores, y el
rectngulo de la celda, que est en la
propiedad DataGridViewCellPaintingEventArgs.CellBounds. El contorno o
lnea delimitadora de los bordes de la
celda ser dibujado utilizando el mto-

<< dnm.plataforma.net
private void dgvGrid_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)
{
// comprobar que la fila y columna estn dentro del rango
// y que la columna corresponde a una de las que vamos
// a pintar
if (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 posicin y dimensin de la celda
Point[] 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;
//
//
//
if
{
aColores = new Color[] {
Color.LightYellow,
Color.DarkTurquoise,
Color.MediumSpringGreen,
Color.LightSteelBlue};
pgbBrush = new PathGradientBrush(aPuntos);
pgbBrush.CenterColor = Color.Lavender;
pgbBrush.SurroundColors = aColores;

DataGridViewCellPaintingEventArgs

necesarias para esta operacin: el objeto Graphics; la propiedad FormattedValue, ms recomendable que su homloga Value, fundamentalmente para
aquellos casos de columnas con valores numricos o de fecha formateados;
CellBounds, como superficie o rectngulo sobre la que dibujar el texto; y
finalmente los valores del estilo propiedad CellStyle, que contienen el
tipo de letra y su color.
Como ltima accin en el cdigo de
este evento, tenemos que asignar el
valor true a la propiedad DataGridViewCellPaintingEventArgs.Handled,
puesto que es necesario informar al
control de que nosotros hemos sido

crear el objeto brush con efecto de fundido


utilizando una combinacin de colores diferente
en funcin de si la celda est o no seleccionada
((e.State & DataGridViewElementStates.Selected) ==
DataGridViewElementStates.Selected)

}
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 rectngulo de la celda
e.Graphics.FillRectangle(pgbBrush, e.CellBounds);

<<dotNetMana

do Graphics.DrawRectangle, aplicando
un color al borde sobre el rectngulo
de la celda.
Pero esto no es suficiente, ya que
solamente hemos dibujado el borde y
colores de fondo de la celda. An nos
queda el texto que representa el valor
de la celda, que obtenemos de la propiedad Value o FormattedValue, pertenecientes al parmetro DataGridViewCellPaintingEventArgs del evento. Sin
embargo, no podemos utilizar directamente esta propiedad; recordemos que
el evento CellPainting nos obliga a realizar manualmente todas las operaciones de dibujo, por lo que deberemos
convertir a modo grfico la cadena a
dibujar siguiendo estos pasos:
Tras comprobar que existe realmente un valor a dibujar, tenemos que calcular las dimensiones del texto (de
tipo Size) utilizando el mtodo esttico TextRenderer.MeasureText, al que
pasaremos como parmetro el valor
de la celda y el tipo de letra que usaremos para dibujarlo. Para este ltimo, emplearemos el objeto Font situado en el estilo de la columna correspondiente a la celda.
A continuacin, empleando el tambin
mtodo esttico TextRenderer.DrawText, ser cuando realmente dibujemos el texto, pasando como parmetro aquellas propiedades del objeto

29

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

e.Graphics.DrawRectangle(
new Pen(Color.DarkMagenta, 3), e.CellBounds);
// si la celda tiene valor
if (e.Value != null)
{
// calcular el tamao del texto
Size szTexto;
szTexto = TextRenderer.MeasureText(
e.Value.ToString(), e.CellStyle.Font);

Listado 3

mos dibujando celdas para dos columnas diferentes mediante CellPainting.


Supongamos que es necesario aplicar
una alineacin distinta para cada una de
ellas. Esta es una situacin que podemos solventar en el evento Load del formulario, asignando a la propiedad Tag
de los estilos creados para estas columnas el valor o combinacin de valores
de TextFormatFlags que necesitemos para
establecer la alineacin o efectos para el
texto.
La propiedad DataGridViewCellStyle.Tag es de tipo object, lo cual la convierte en un estupendo cajn de sas-

// dibujar el texto
TextRenderer.DrawText(e.Graphics,
e.FormattedValue.ToString(),
e.CellStyle.Font,
e.CellBounds,
e.CellStyle.ForeColor);
}
e.Handled = true;
}
}

Listado 2

los encargados de realizar la operacin de dibujo de la celda; de lo contrario, el control har caso omiso de
nuestro cdigo, realizando l solito las
operaciones de dibujo.
El listado 2 muestra el cdigo del
evento CellPainting que acabamos de
explicar en los prrafos anteriores.
La figura 1 muestra la rejilla resultante de la aplicacin de este proceso de
dibujo personalizado con CellPainting,
donde podemos observar las celdas que
hemos pintado tanto en estado normal
como seleccionado.

<<dotNetMana

Cambiando la alineacin
en el contenido de las celdas

30

El mtodo TextRenderer.DrawText, como


acabamos de comprobar, dibuja el texto centrado en la celda de manera predeterminada, pero supongamos que es
necesaria una alineacin diferente. Para
conseguir dicho objetivo, aadiremos

Figura 1. Celdas pintadas mediante el evento CellPainting.

a DrawText como ltimo parmetro el


tipo enumerado TextFormatFlags, cuyos
valores podemos utilizar de forma combinada para crear diferentes efectos de
formato, alineacin, recorte de fuente,
etc. Por ejemplo, si queremos que el
texto de la celda quede alineado a la
parte superior de la misma, utilizaremos el cdigo del listado 3.
Pero en el DataGridView que estamos
desarrollando para este ejemplo esta-

tre para almacenar valores de cualquier


tipo, en funcin del problema a resolver en las ms diversas situaciones.
Por lo tanto, como hemos dicho, si
para cada estilo asignamos por separado los valores de alineacin a la propiedad Tag, posteriormente la aplicacin de
dichos valores en CellPainting se simplifica enormemente cuando dibujamos
el texto con el mtodo DrawText, como
vemos en el listado 4.

<< dnm.plataforma.net
private void Form1_Load(object sender, EventArgs e)
{
//....
styListPrice.Tag = TextFormatFlags.Right |
TextFormatFlags.VerticalCenter;
//....
styColor.Tag = TextFormatFlags.Left |
TextFormatFlags.VerticalCenter;
//....
}

zeColumnsMode. Esta accin tiene como efecto que el


usuario pueda cambiar el ancho de las columnas, y al
reducir su tamao, el texto de estas quede oculto en
algunos casos. El efecto conseguido por el recorte del
texto puede no resultar muy agradable, por lo que si
aplicamos el valor TextFormatFlags.WordEllipsis, agregando este efecto a los dems ya existentes que se utilizan en el mtodo DrawText, el resultado ser la visualizacin de puntos suspensivos en aquellas celdas que
no puedan mostrar su contenido al completo. Este efecto lo podemos ver en la figura 3.

private void dgvGrid_CellPainting(object


sender, DataGridViewCellPaintingEventArgs e)
{
//....
TextRenderer.DrawText(e.Graphics,
e.FormattedValue.ToString(),
e.CellStyle.Font,
e.CellBounds,
e.CellStyle.ForeColor,
(TextFormatFlags)e.CellStyle.Tag);
//....
}
Figura 3. Puntos suspensivos en las celdas
que no muestran su texto al completo.

Listado 4

En la figura 2 podemos apreciar el resultado de


esta tcnica para alinear los valores.

Y ya para terminar con el tipo TextFormatFlags,


vamos a comentar otro efecto realmente curioso. El
valor NoClipping de esta enumeracin tiene como finalidad no recortar los extremos del texto cuando reducimos el
tamao de la celda. Si combinamos este
valor con HorizontalCenter, como muestra el listado 5, obtendremos el interesante efecto de la figura 4, donde los
extremos de texto de la celda invaden
las celdas adyacentes.

Figura 2. Pintando celdas con distinta alineacin desde CellPainting.

<<dotNetMana

Otros efectos sobre el contenido

32

Vamos a continuacin a introducir una nueva variante en este escenario de trabajo. Imaginemos que no utilizamos el ajuste automtico de anchura de columnas
para el control, por lo que borramos la lnea de cdigo que hace uso de la propiedad DataGridView.AutoSi-

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

Listado 5

<< dnm.plataforma.net

CellPainting en las cabeceras de columna. Indicando el orden de los registros


con una imagen propia
Para aplicar el evento CellPainting en las cabeceras
del control, emplearemos la misma lgica que en las
celdas de datos, pero debemos tener en cuenta que el
comportamiento de una cabecera, cuando el usuario
hace clic sobre ella, consiste en ordenar sus celdas
mostrando adems un pequeo icono que
indica el orden establecido.
Si aplicamos una operacin de dibujo personalizado a la celda de cabecera
con CellPainting, al hacer clic en ella para
ordenar sus datos stos efectivamente se
ordenarn, pero el icono informativo del
tipo de orden no se mostrar, ya que
cuando realizamos el dibujo de una celda con este evento, como ya sabemos, la
responsabilidad de pintar hasta el ltimo
elemento necesario recae sobre el programador.
Dado que el cdigo a utilizar para pintar una celda de cabecera es muy parecido al de una celda normal de datos, dentro del listado 6, en lo que se refiere al
cdigo del evento CellPainting, nos centraremos slo en aquellos aspectos aplicables para este caso concreto.
Podemos ver, en primer lugar, la
necesidad de comprobar que el ndice de
la columna sea mayor o igual a cero, el
de la fila menor de cero, y el nombre de
la columna a dibujar corresponda a la
que necesitamos pintar de forma personalizada.

<<dotNetMana

Figura 4. Los extremos del texto en las celdas


no se recortan.

A continuacin, debemos averiguar el nombre de la


columna pulsada, disponible en la variable sCabeceraPulsada, que hemos declarado con mbito a nivel de la
clase del formulario. Dicha variable la asignamos en otro
evento: ColumnHeaderMouseClick, provocado cuando el
usuario hace clic en una cabecera de columna.
Despus de dibujar el ttulo de la celda alineado a
la izquierda, comprobaremos si la columna va a ordenarse en alguna direccin. En caso afirmativo, disponemos de dos imgenes agregadas al proyecto como
recursos incrustados (este valor lo establecemos en la
ventana de propiedades de la imagen, dentro de la propiedad Accin de generacin). Segn el orden, obtendremos la imagen correspondiente, asignndola a una
variable de tipo Bitmap.
No obstante, es posible que la celda necesite dibujarse, pero no porque se haya pulsado la cabecera, en
cuyo caso la propiedad DataGridView.SortOrder contendr el valor None, y la variable Bitmap estar a null.
Por dicho motivo, tenemos que comprobar que exista realmente una imagen a dibujar, y en ese caso, dibujarla en la parte derecha de la celda utilizando el mtodo Graphics.DrawImage, calculando la posicin en la
cual dibujar a partir del tamao de la propia imagen
y las propiedades del rectngulo de la cabecera.

33

<< dnm.plataforma.net

string sCabeceraPulsada = string.Empty;


//....
private void Form1_Load(object sender, EventArgs e)
{
//....
this.dgvGrid.EnableHeadersVisualStyles = false;
// crear un estilo para las cabeceras del control
DataGridViewCellStyle 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);

Figura 5. Cabecera de columna


con dibujo personalizado de icono
de orden y fundido de colores.

La figura 5 muestra el control en ejecucin, donde podemos observar la celda de cabecera con las operaciones que
acabamos de describir.

CellPainting en las cabeceras


de fila. Indicando el nmero de
fila a todo color

<<dotNetMana

Y si hemos podido pintar con alegres y


grciles colorines una cabecera del control, las cabeceras de las filas no van a
ser menos, ni se van a librar de nuestro
arrebato artstico, as que tomando nuestros botes de pintura y pinceles digitales, pongmonos a trabajar.
La tcnica que vamos a emplear,
como puede intuir el lector, ser muy
similar a los otros casos anteriores, con
la salvedad de que ahora vamos a dibu-

34

Al realizar el dibujo
de una celda
mediante CellPainting,
la responsabilidad de
pintar hasta el ltimo
detalle recae sobre
el programador

this.dgvGrid.ColumnHeadersDefaultCellStyle = styCabecera;
// ampliar la anchura de la columna
// sobre la que vamos a dibujar la cabecera
this.dgvGrid.Columns[ProductKey].Width += 40;
}
// cada vez que hacemos clic en la cabecera
// guardamos el nombre de la columna pulsada
private 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 necesitamos
if (e.ColumnIndex >= 0 &&
e.RowIndex < 0 &&
this.dgvGrid.Columns[e.ColumnIndex].Name == ProductKey)
{
//....
// dibujar el ttulo de la cabecera
// alineado a la izquierda
TextRenderer.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 funcin del tipo de ordenacin,
// obtener la imagen del recurso incrustado en el proyecto
Bitmap bmpImagen = null;
if (sCabeceraPulsada == ProductKey)
{
switch (this.dgvGrid.SortOrder)
{
case SortOrder.Ascending:
bmpImagen =

<< dnm.plataforma.net

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 orden
if (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 nmero a pintar en la celda
int nNumeroFila = e.RowIndex + 1;
//....
// crear la fuente a usar para dibujar el nmero
Font oFont = new Font(Comic Sans MS, 12, FontStyle.Italic);
// calcular el tamao del texto
Size szTexto =
TextRenderer.MeasureText(nNumeroFila.ToString(), oFont);
// dibujar el nmero
TextRenderer.DrawText(e.Graphics,
nNumeroFila.ToString(),
oFont,
e.CellBounds,
e.CellStyle.ForeColor);
e.Handled = true;
}
}
Listado 7

jar el nmero de cada fila, por lo que


tendremos que calcular dicho valor
basndonos en la propiedad DataGridViewCellPaintingEventArgs.RowIndex, y
comprobar que la celda sobre la que
vamos a realizar las operaciones pertenece a una fila; o lo que es lo mismo, al
tomar el parmetro DataGridViewCellPaintingEventArgs del evento CellPainting, la propiedad ColumnIndex deber
ser menor que cero, y la propiedad
RowIndex mayor o igual que cero.
Los efectos de colores fundidos y
clculo de coordenadas para pintar el
objeto PathGradientBrush sern los mismos que en los anteriores ejemplos, por
lo que el cambio en este caso concreto
consistir en crear un tipo de letra explcitamente para dibujar el nmero en la
celda. Por este motivo, en el listado 7
se exponen aquellas instrucciones que
representan cambios con respecto a los
anteriores ejemplos.
Para comprobar la aplicacin de este
efecto sobre esta parte del control, veamos la figura 6.

Figura 6. Personalizando el dibujo


de las cabeceras de fila.

Acabando la pintura
Llegamos al punto final de este artculo, en el que hemos realizado un repaso del evento CellPainting del control
DataGridView, como medio para aplicar
ciertos efectos avanzados de presentacin sobre las celdas del control a fin de
lograr un resultado ms agradable a la
vista de nuestros usuarios.
Que ustedes lo disfruten.

<<dotNetMana

new Bitmap(GetType(), FlechaArriba.png);


break;

35

plataforma.net

Alberto Poblacin

Ms sobre seguridad

de acceso a cdigo
En una entrega anterior (dotNetMana n 41) presentamos los fundamentos de la Seguridad de acceso a cdigo (Code Access Security, CAS)
en .NET Framework, y describimos cmo el CLR determina los permisos del cdigo y cmo se pueden manipular desde las herramientas
administrativas los permisos concedidos a cada ensamblado. En esta
entrega veremos cmo se pueden solicitar, manipular y limitar estos
permisos desde dentro de nuestro cdigo.

Atributos para solicitud


y rechazo de permisos
Un primer paso que podemos dar en nuestros
programas es el de decorar el cdigo fuente
con una serie de atributos en los que se especifican los requisitos que tiene el ensamblado en
cuanto a los permisos que necesita para poder
funcionar. Cuando especificamos los requisitos
de seguridad mediante atributos, se dice que estamos haciendo operaciones de seguridad declarativas, en contraposicin a las que se realizan
mediante sentencias de cdigo ejecutable, que se
denominan imperativas.
En su modalidad ms simple, la solicitud de
permisos puede tener este aspecto:
Alberto Poblacin lleva
27 aos desarrollando
software. Cuenta entre
otras con las certificaciones MCSE, MCDBA,
MCITP, MCSD, MCPD y
MCT, adems de ser
MVP de C#. En la actualidad trabaja como consultor independiente,
dedicndose principalmente a la formacin,
asesoramiento y desarrollo de aplicaciones.

using System.Security.Permissions;
...
[assembly:
UIPermission(SecurityAction.RequestMinimum,
Window=UIPermissionWindow.AllWindows)]

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

zacin, agruparlos dentro del archivo AssemblyInfo.cs (o .vb).

En el ejemplo anterior hemos utilizado un


permiso del tipo UIPermission, es decir, una solicitud de permiso de interfaz de usuario. En los
argumentos hemos especificado SecurityAction.RequestMinimum, indicando que el programa
necesita como mnimo este permiso para poder
funcionar. Si las polticas de seguridad del sistema no concediesen a este ensamblado los permisos que hemos sealado como mnimos, el
ensamblado no llegara a cargarse, y el sistema
mostrara directamente un error de seguridad,
sin siquiera arrancar el programa.
El parmetro Window=UIPermissionWindow.AllWindows especifica en mayor detalle el tipo concreto de UIPermission que estamos solicitando. Para
cada subtipo de Permission, los argumentos disponibles son diferentes y permiten matizar las caractersticas y alcance del permiso correspondiente.
Cabe sealar que tambin es posible solicitar
de golpe un conjunto de permisos completo. Por
ejemplo, para solicitar el conjunto Full Trust:

[assembly: RegistryPermission(
SecurityAction.RequestMinimum,
Name=FullTrust)]

<< dnm.plataforma.net

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

Con el primero de estos atributos


estamos indicando al sistema de seguridad que deseamos utilizar el permiso de FileIO si las polticas de seguridad lo permiten para este ensamblado, pero que el programa puede
funcionar sin este permiso. Esto puede ser til, por ejemplo, para un programa que grabe una bitcora (log) de
sus operaciones en un archivo en disco, pero que en caso de no tener ese
permiso puede seguir funcionando;
eso s, sin grabar el log.
El segundo atributo expresa que
no deseamos disponer de permiso de
acceso al Registro de Windows,
incluso aunque las polticas de seguridad lo consientan para nuestro
ensamblado. De esta forma garantizamos que el programa nunca pueda
modificar el Registro, incluso aunque presente un mal funcionamiento o un uso indebido de alguna funcin de librera que pudiera realizar
ese tipo de operacin.
La asignacin final de permisos que
recibe el ensamblado consiste en los
Mnimos, ms los Opcionales que permita la poltica de seguridad, menos los
Rechazados.
Hay que sealar que, en caso de que
no se solicite ningn permiso opcional,
el sistema interpreta que se solicita Full
Trust como permiso opcional, y por
tanto se conceden todos los permisos
que permita la poltica, salvo los rechazados expresamente. Por este motivo,
es buena costumbre incluir un atributo como el siguiente:

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

Con esto indicamos que solicitamos como Opcional ningn permiso, con lo que ya no se aplica lo indicado en el prrafo anterior, y los nicos permisos concedidos son los que
solicitemos expresamente mediante
el resto de los atributos. De esta forma, el programa no recibe ningn
permiso superfluo.

(Ensamblado 2) que graba ciertos


datos en disco. Este ensamblado, al
igual que el anterior, habr recibido
los permisos que le correspondan; por
ejemplo, podra tener permiso de escritura en disco. Para realizar fsicamente la grabacin, esta DLL utiliza las
rutinas contenidas en el espacio de
nombres System.IO, que se encuentran
compiladas dentro de una de las DLL
que se suministran con .NET Framework, y que en la figura hemos llamado Ensamblado 3.

Solicitud de permisos
(Demand)
Hemos visto que un ensamblado
puede solicitar y recibir una serie de
permisos. Los permisos que ha recibido el ensamblado entrarn en juego en el momento en que el cdigo
que se ejecuta realice una operacin
que requiera dichos permisos. Cmo
se determinan y se controlan estas
operaciones? Vemoslo, apoyndonos
en la figura 1.
Supongamos que tenemos un programa ejecutable, que en la figura
denominamos Ensamblado 1, que
conforme con las polticas del sistema
ha recibido permiso de ejecucin pero
no de escritura en disco. Este programa realiza una llamada a una DLL

Figura 1

Esta librera, en ltima instancia,


tendr que utilizar los servicios de invocacin a la plataforma (P/Invoke) para

Instrucciones de control de seguridad


Solicitar permisos

Demand

Afirmar permisos

Assert

Restriccin de permisos

Deny
PermitOnly

Desactivar llamadas en la pila

RevertAssert
RevertDeny
RevertPermitOnly
RevertAll

Comparar permisos

IsSubsetOf

Combinacin de permisos

Union
Intersect

<<dotNetMana

De forma similar a la solicitud de


permisos mnimos, se pueden aadir
solicitudes de permisos Opcionales y
Rechazados:

37

<< dnm.plataforma.net

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 excepcin
}
}

<<dotNetMana

Listado 1

38

llamar a las API de Windows que realizan la grabacin mediante cdigo no


manejado. Antes de hacer el salto a
dicho cdigo no manejado, el programa hace una llamada al cdigo de seguridad de .NET que se denomina solicitud de permiso (Demand). En el
listado 1 tenemos un ejemplo que muestra una solicitud de este tipo.
Cuando se ejecuta el Demand(), el
motor de seguridad realiza un recorrido por la pila de llamadas (stack walk),
comprobando si todos los llamantes de
esta rutina tienen el permiso solicitado. En el ejemplo de la figura 1, la solicitud sube en primer lugar al Ensamblado 2, que efectivamente tena permiso de escritura, con lo que la solicitud contina subiendo por la pila. Al
llegar al Ensamblado 1, el CLR determina que dicho ensamblado no tiene
permiso de escritura, por lo que se produce una excepcin de seguridad y la
escritura no llega a realizarse.
El resultado final es que no se produce ninguna escritura en disco, a pesar
de que las DLL que contienen instrucciones de grabacin tienen permiso para
ello, debido a que el llamante inicial tiene prohibida dicha escritura por las
polticas de seguridad de .NET.
Estas solicitudes tambin se pueden hacer de forma declarativa en lugar
de imperativa, a nivel de clase o de
mtodo:

[FileIOPermission(
SecurityAction.Demand,
Write = C:\\Fichero)]
public class ClaseConPermiso
{...}

Afirmacin de permisos
(Assert)
Vayamos ms all y supongamos que
realmente s que deseamos realizar la
grabacin anterior. Por ejemplo, el
Ensamblado 2 podra contener unas
rutinas de registro en bitcora (logging)
que graben en un archivo una traza de
las operaciones realizadas, y deseamos
que esa traza quede grabada siempre
que un ejecutable llame a esta librera,
aunque el ejecutable en s no tenga permiso para escribir en disco. Esto se
logra mediante la operacin llamada
Assert, tal como muestra el ejemplo
del listado 2.
Volviendo al ejemplo de la figura 1,
y suponiendo que el Assert() se ha
introducido en el Ensamblado 2, cuando se produce el Demand() en el Ensamblado 3 y sube a la trama anterior de
la pila, se encuentra que en dicha trama se ha realizado una afirmacin del
permiso solicitado, y en consecuencia
se da dicho permiso por concedido,
teniendo xito el Demand() sin llegar a
subir hasta el Ensamblado 1.

private void GrabarTraza()


{
const string fichero = C:\\log.txt;
FileIOPermission permiso = new
FileIOPermission(
FileIOPermissionAccess.Write,
fichero);
permiso.Assert();
// Aqu se hace la grabacin
FileIOPermission.RevertAssert();
}
Listado 2

Lgicamente, este proceso solo


tendr xito si la poltica de seguridad
concede el permiso solicitado al ensamblado que realiza el Assert.
Solo puede haber un nico Assert
activo por cada trama de la pila. Una
vez que el Assert ya no se necesita, se
desactiva mediante RevertAssert(),
como se ve en el ejemplo del listado 2.
Hay que actuar con precaucin al
escribir ensamblados que utilicen el
Assert, ya que por esta va se pueden abrir
agujeros de seguridad. Por ejemplo, en el
listado 2 hemos especificado como const
string el nombre del fichero en el que se
graba el log. Si en lugar de eso hubiramos aceptado este fichero como parmetro del mtodo, el programa llamante (que, recordemos, no tiene permisos
para grabar en disco) podra pasar por esta
va una ruta cualquiera y engaar al sistema de seguridad consiguiendo grabar
en disco un archivo de su eleccin, aprovechndose de los permisos que tiene
concedidos el Ensamblado 2.

Rechazo de permisos
(Deny)
La operacin Deny funciona del
modo contrario que Assert. Cuando
ejecutamos un Deny(), estamos forzando que se produzca una excepcin
cuando el cdigo ms abajo en la pila
realice un Demand() del permiso objeto del Deny, incluso aunque el ensam-

<< dnm.plataforma.net

blado llamante s que tenga el permiso en cuestin. El ejemplo del listado 3 rechaza el permiso de utilizar
reflexin sobre miembros no visibles
de un tipo.

public void Metodo()


{
ReflectionPermission permiso =
new ReflectionPermission(
ReflectionPermissionFlag.
TypeInformation);
permiso.Deny();
// Usar reflexin para acceder a
// miembros pblicos
ReflectionPermission.RevertDeny();
}

Prueba de los programas bajo condiciones de seguridad restringida


Cuando estamos desarrollando programas, normalmente los ejecutables se crean sobre nuestro
disco local y desde ah los ejecutamos. La poltica de seguridad predeterminada les otorga entonces el conjunto de permisos Full Trust. Por lo tanto, al ejecutarlos no ejercitamos las distintas
limitaciones de seguridad a las que se refiere este artculo.
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 carpeta una poltica restrictiva, aadiendo el atributo Exclusive, para que no reciban adems los
permisos predeterminados. Una forma de asignar estos permisos consiste en utilizar el comando CASPOL:
md c:\pruebas
caspol -ag 1 -url file:///C:/pruebas/* Internet -n Pruebas -exclusive on
Para probar nuestro programa, copiaremos el ejecutable a esta carpeta y lo ejecutaremos
desde ah, con lo cual se ver limitado a los permisos asignados, que en el ejemplo anterior son
los de la Zona Internet.

[PermissionSet(
SecurityAction.LinkDemand,
Name = FullTrust)]
public void Metodo(...){...}

validez de su cdigo en dichos entornos mediante el atributo AllowPartiallyTrustedCallers:

Listado 3
[assembly: AllowPartiallyTrustedCallers]

Si este cdigo se introdujera en el


Ensamblado 2 de la figura 1, y detrs
del Deny se llamara a una subrutina del
Ensamblado 3 que tratara de usar reflexin sobre miembros privados de una
clase, se producira una excepcin de
seguridad, an en el caso de que tanto
el Ensamblado 3 como el 2 tuvieran
concedido dicho permiso.

LinkDemand
La operacin LinkDemand opera de
forma similar al Demand que hemos
mencionado ms arriba, con la diferencia de que LinkDemand() solo comprueba el llamante inmediato, en lugar
de recorrer toda la pila comprobando
si la totalidad de los llamantes tienen el
permiso solicitado.
Por ejemplo, para comprobar que
el llamante tiene Full Trust:

Adicionalmente, el Demand recorre la pila cada vez que es invocado,


debido a que los llamantes podran ser
distintos, mientras que el LinkDemand
se resuelve en tiempo de compilacin
Just-In-Time (JIT), por lo que solo se
comprueba una vez.

El atributo AllowPartiallyTrustedCallers
Todo ensamblado que tiene un nombre fuerte (strong name) recibe implcitamente un LinkDemand del conjunto de permisos Full Trust. Esto
provoca el que dichos ensamblados
no puedan ser llamados desde programas que no tengan confianza completa. Si el programador ha tenido en
cuenta al desarrollar el ensamblado
las implicaciones de seguridad de los
entornos que tienen confianza parcial, puede declarar expresamente la

La consecuencia de aplicar este atributo es que se elimina el mencionado


LinkDemand y el ensamblado deja de
requerir que sus llamantes tengan permisos Full Trust.

Conclusin
Cuando escribamos libreras que utilicen
llamadas a cdigo no gestionado, y sea
previsible que stas puedan ser llamadas
desde cdigo que no tenga confianza completa, es recomendable que introduzcamos dentro las peticiones de permisos (con
Demand) que sean oportunas de conformidad con las operaciones que realice
dicho cdigo no manejado, a fin de evitar
que los programas que llamen a nuestra
librera y no tengan confianza completa
puedan aprovecharse de ella para saltarse
las polticas de seguridad.

La librera de MSDN contiene la referencia completa de las clases que manejan la Seguridad de acceso a cdigo. Vanse estos enlaces:
http://msdn.microsoft.com/library/SPA/cpguide/html/cpconsecurecodingguidelines.asp
http://msdn2.microsoft.com/es-es/library/system.security(VS.80).aspx

<<dotNetMana

Documentacin

39

plataforma.net

Daniel Seara

Herramientas genricas para los

componentes: ficheros y recursos


Siguiendo con la idea de las generalizaciones en componentes expuesta en el nmero anterior, en este artculo veremos algunos otros ejemplos que pueden resultarle interesantes.

Manipulando archivos (o ficheros)


Ms tarde o ms temprano, nuestros componentes necesitarn acceder a archivos fsicos en disco.
Consideremos entonces una clase que encapsule
dichas acciones: FileIO.
En este caso, las acciones sern inmediatas, sin
mucha cosa que hacer ms que la tarea especfica.
Para facilitar el acceso, hagamos que los mtodos de
esta clase sean accesibles directamente, sin necesidad de instanciar la misma. Para ello, nos aseguraremos de que la clase no sea heredable, utilizando
NotInheritable como modificador en la declaracin
de la clase, y tenga un nico constructor privado,
para que no se puedan crear instancias.

Public NotInheritable Class FileIO


Private Sub New()
End Sub
End Class

Public Shared Function GetFileContent( _


ByVal path As String) As String
Try
Se evala si el usuario tiene permiso de acceso
Dim 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 recurso
Using fi As New System.IO.StreamReader(path, _
System.Text.Encoding.Default)
Dim s As String = fi.ReadToEnd
fi.Close()
Return s
End Using
Catch ex As Exception
Throw
Finally
End Try
End Function

Listado 1

Leyendo contenido del disco


Daniel Seara es mentor
de Solid Quality Mentors
y director del rea de
desarrollo .NET. Es MVP
desde 2003 y ponente
habitual de INETA y
Microsoft.

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 mtodos para recuperar y almacenar informacin privada del usuario para cada aplicacin. Para ello, es ms seguro
utilizar IsolatedStorage.
Y de una forma muy similar, implementamos
escrituras (listado 2).

<< dnm.plataforma.net

El cdigo importa el espacio


System.IO.IsolatedStorage

para facilitar el acceso a los


objetos definidos en l.

][

NOTA
Es importante tener en cuenta
que se pueden duplicar estas
funciones para que utilicen
arrays de bytes u objetos
MemoryStream para manipular
datos binarios.

Public Shared Function GetPrivateContent( ByVal name As String) _


As String
Try
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.Open, isoFile)
Using Reader As New IO.StreamReader(isoStream)
Dim sReturn As String = Reader.ReadToEnd
Reader.Close()
isoStream.Close()
isoFile.Close()
Return sReturn
End Using
End Using
End Using
Catch ex As Exception
Throw
End Try
End Function
Listado 2

Listado 3

Otro elemento interesante a generalizar es la obtencin de recursos, tan-

Public Enum SourceAssemblyEnum_


As Integer
CallerAssembly
InitialAssembly
End Enum

Y, nuevamente, una clase que permita acceder directamente los mtodos,


sin necesidad de instanciarla.

Public NotInheritable Class_


Resources
Shared Sub New()
End Sub
End Class

[ ]
NOTA

En este caso, el constructor


es Shared. La diferencia es
que, si necesitramos hacer
algo la primera vez que se utiliza un mtodo de esta clase,
podramos hacerlo all. No es
este el caso, pero quera dejar
claro cmo se hace.

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 Using
End Using
End Using
End Sub

Recursos

pleja, puede que sean del componente


que se est ejecutando o del proceso que
lanza la ejecucin.
Definamos un enumerador que nos
permita identificar de dnde queremos
extraer los recursos:

to sean textos como de formato binario. En muchas oportunidades necesitaremos de ellos y, cosa an ms com-

Utilizando el enumerador podremos identificar de dnde obtener el


recurso. Necesitamos entonces el nombre del mismo y ya podremos hacerlo
(siempre, los recursos se obtienen como
un stream) (listado 4).
Una vez que obtenemos el stream,
convertirlo a texto es simplemente
transformarlo de acuerdo a la codificacin, que en general es la predeterminada en el proceso (listado 5).

<<dotNetMana

NOTA

41

<< dnm.plataforma.net

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 = Nothing
Select Case Source
Case SourceAssemblyEnum.CallerAssembly
ass = System.Reflection.Assembly.GetCallingAssembly
Case SourceAssemblyEnum.InitialAssembly
ass = 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 necesitamos
Dim 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 Nothing
If str Is Nothing Then
Esta excepcin hereda de
Solid.Tools.ExceptionHandler.BaseException
Throw New KeyNotExistException
End If
Return str
End Function
Listado 4

<<dotNetMana

Public Shared Function GetResourceString( _


ByVal name As String, _
Optional ByVal source As SourceAssemblyEnum = _
SourceAssemblyEnum.CallerAssembly) As String

42

Utiliza GetResourceStream para obtener el recurso


Dim str As System.IO.Stream = _
GetResourceStream(name, source)
With str
Se obtienen todos los bytes
Dim bytes(CInt(.Length)) As Byte
.Read(bytes, 0, CInt(.Length - 1))
Dim textConverter As System.Text.Encoding = _
System.Text.Encoding.Default
Try
Se transforman a cadena de caracteres
Return textConverter.GetString(bytes)
Catch ex As Exception
Hereda de
Solid.Tools.ExceptionHandler.BaseException
Throw New ResourceNotFoundException(ex)
End Try
End With
End Function
Listado 5

Es muy til disponer de mtodos para


recuperar y almacenar informacin
privada del usuario para cada
aplicacin. Para ello, es ms seguro
utilizar IsolatedStorage

Y qu pasa con My?


S, claro, obviamente puede utilizarse sin problemas, pero las
funciones anteriores sirven para obtener cualquier recurso,
no solo los incluidos en el proyecto actual (ensamblado actual).
Y hablando de My, les dejo un pequeo procedimiento para
cargar los iconos que necesite un formulario en controles ImageList desde los recursos de la aplicacin. En el ejemplo se
asume que toda imagen cuyo nombre termine en 16 es para
un determinado ImageList (podra repetirse para 32, etc.
para cargar distintos ImageList).

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.MoveNext
If 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
Loop
End Sub
Listado 5

Y basta por ahora. Espero en la prxima comenzar con


algunas cosas algo ms complejas.
Saludos!

<< dnm.inicio

inicio

Guillermo Guille Som

Depuracin en .NET
El depurador que lo depure... recibir ayuda del CLR

Guillermo Guille
Som
Es Microsoft MVP de
Visual Basic desde 1997.
Es redactor de dotNetMana, mentor de Solid
Quality Iberoamericana,
tutor de campusMVP,
miembro de Ineta Speakers Bureau Latin America, y autor de los libros
Manual Imprescindible
de Visual Basic .NET y
Visual Basic 2005.
http://www.elguille.info

La crispacin a la que me refera antes se debe a que


con las primeras dos versiones de Visual Studio para
.NET, cuando depurbamos una aplicacin y detenamos (o se detena) la ejecucin del programa, normalmente porque se produca un error, lo primero
que queras hacer era solucionar la causa del error, y
para solucionarlo lo habitual era que modificaras el
cdigo. Y aqu es cuando empezaban los problemas.
Con la versin inicial (llammosla Visual Studio 2002),
no podas modificar nada del cdigo durante la depuracin. Si tus antecedentes de programador eran porque usabas Visual Basic 6.0, esa crispacin llevaba
implcita una implementacin de ICabreante (ver dotNetMana n 16 y 18 para saber ms sobre las interfaces), y es que en Visual Basic 6.0 la depuracin era
muy cmoda; ste permita modificar el cdigo, cambiar por dnde deba continuar la ejecucin y otras
facilidades que resultaban tiles a la hora de realizar
esa tarea tan, digamos, desagradable.
La excusa que nosotros mismos nos ponamos era
que bueno, lo acepto, ya que en Visual Basic 6.0 la
ejecucin es sobre cdigo casi interpretado y .NET
debe hacerlo sobre cdigo compilado, por tanto...
acepto pulpo como animal de compaa, y... te tenas
que aguantar! Qu remedio!
Despus lleg Visual Studio 2003, y la cosa cambi un poco; no mucho, la verdad, pero al menos permita (y sigue permitiendo) modificar el cdigo. El

problema es que esos cambios no seran tenidos en


cuenta hasta la prxima vez; es decir, para que fuesen
aplicados esos cambios tenas que detener la depuracin (o parar la ejecucin, que para el caso es lo mismo) y empezar de nuevo. La interfaz que defina esta
segunda versin de Visual Studio era IDesesperante;
pero ya casi te habas acostumbrado y casi no la implementabas.
Y entonces empezaron los rumores: Visual Studio 2005 (por entonces conocido como Whidbey)
tendra algo que los programadores de Visual Basic
pre-.NET ya tenan desde haca aos: Edit & Continue (editar y continuar). Bien! Una buena noticia!
Pero la noticia no solo era buena, sino fabulosa. Esa
caracterstica de editar y continuar estara implementada en el propio corazn de .NET: el CLR. Esto
supona que todos los lenguajes de .NET se beneficiaran de esa caracterstica. Y lo mejor de todo es que
si el motor de ejecucin permitira detener la ejecucin, hacer cambios y seguir ejecutando la aplicacin,
lo haramos sobre cdigo compilado; es decir, todo
el proceso sera ms fiable que si fuese interpretado
o simulado por el entorno de desarrollo, que era lo
que en un principio pareca que iba a ocurrir (inicialmente se rumoreaba que solo iba a ser posible
usarlo en Visual Basic).
Por fin sali a la calle Visual Studio 2005, y pudimos comprobar que era cierto: podemos detener la

<<dotNetMana

La depuracin es una de esas cosas que todos hacemos, o deberamos hacer,


y que a nadie le gusta tener que hacer; no porque no sea necesaria, sino porque al final terminabas fatal de los nervios cuando la depuracin 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 artculos mostraremos
las principales posibilidades que este ltimo entorno pone a nuestro alcance para facilitarnos la depuracin de nuestros programas.

43

<< dnm.inicio

ejecucin de la aplicacin, hacer cambios en el cdigo fuente y seguir ejecutando sin tener que volver a
empezar de cero. Y los que habitualmente usbamos
Visual Basic 6.0 incluso vimos muchas mejoras, ya que
el entorno de Visual Studio 2005 nos permite hacer
ciertos cambios en el cdigo que no podamos hacer
con VB6. Pero no voy a seguir haciendo comparaciones con Visual Basic 6.0; me voy a centrar en qu
es lo que podemos hacer y tambin en lo que no podemos hacer (ya que no podemos hacer todo lo que se
nos podra antojar: debemos tener en cuenta que todo
el proceso se realiza en tiempo de ejecucin y durante ese tiempo, el CLR debe almacenar el estado de la
ejecucin, almacenar en la pila lo que est ejecutando y otras muchas comprobaciones ms, sobre todo
cuando se produce una excepcin y hay un bloque
try/catch de por medio). Pero no empecemos con las
pegas, veamos los beneficios y ya iremos encontrndonos con las cosas que podemos y no podemos hacer
en nuestro camino hacia la tarea tediosa, pero necesaria de conseguir que nuestras aplicaciones estn
libres de fallos.

Los previos para la depuracin


Cuando vamos a depurar aplicaciones con Visual Studio 2005, en realidad no tenemos que hacer casi nada
antes, pero al menos debemos permitir la depuracin. Para permitir la depuracin debemos ejecutar
nuestro cdigo en modo Debug, ya que, (salvo que
usemos la versin Express) todos los proyectos de
Visual Studio 2005 permiten dos modos de compilacin y ejecucin: Debug y Release. Por regla general, (salvo que la hayamos ocultado), esas opciones
estn en la barra de herramientas (botonera) de la
parte superior del entorno integrado, como podemos
ver en la figura 1.

hemos incluido cdigo de gestin de la excepcin en


el bloque correspondiente a la parte catch. Pero el
incluir un try con su correspondiente catch cuando
estamos depurando puede que no nos permita hacer
todo lo que nos gustara hacer, ya que si tenemos un
bloque try/catch el error ser interceptado y no sabremos a ciencia cierta dnde se produjo... o casi; al menos
en un proyecto grande, ya que ese bloque try/catch
que detecte el error puede que no est donde a nosotros nos hubiera gustado que estuviera. Pero esta es
otra historia a la que volver ms tarde.
Si sabemos dnde se puede producir el error, podemos agregar un punto de interrupcin antes del lugar
donde ocurrir (ese lugar seguramente lo habremos
descubierto en una ejecucin anterior). Podemos agregar un punto de interrupcin pulsando la tecla [F9]
sobre la lnea en la que queremos que se detenga la ejecucin del programa. Al llegar a un punto de interrupcin, la ejecucin del programa se detiene, y podemos inspeccionar los valores de las variables, cambiar
dichos valores, ejecutar el cdigo lnea a lnea (o instruccin a instruccin) y hacer muchas cosas ms. Esas
muchas cosas ms son las que en realidad son novedades en la forma de depurar de Visual Studio 2005,
ya que en las versiones anteriores tambin podemos
poner puntos de interrupcin, inspeccionar las variables, etc. Ahora iremos viendo esas nuevas posibilidades de depuracin con ms detalle.

Slo mi cdigo
Cuando estamos depurando y ejecutando paso a
paso la aplicacin (ahora veremos cmo), lo lgico es
que solo queramos inspeccionar nuestro cdigo, es
decir, el cdigo que nosotros hemos escrito. Esto lo
haremos marcando la opcin Habilitar Slo mi cdigo en las opciones de depuracin (Herramientas
> Opciones > Depuracin, ver figura 2). De esta

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

<<dotNetMana

Puntos de interrupcin

44

Cuando estamos en modo de depuracin, si se


produce una excepcin (error) en tiempo de ejecucin,
la ejecucin (valga la redundancia) se detiene en el lugar
que se produce dicha excepcin. Si tenemos un bloque
try/catch, dicha ejecucin no se detendr, al menos si

forma, el depurador no tendr en cuenta el cdigo


que no est considerado como mi cdigo.
Segn la documentacin de Visual Studio, ste es
el proceso que se sigue para determinar qu se considera como mi cdigo (transcribo literalmente):
En una versin de depuracin estndar, se desactiva
la optimizacin y se crean smbolos de depuracin para
todos los mdulos. Cuando se ejecuta una versin de depu-

<< dnm.inicio

Figura 2. Opciones de depuracin: Habilitar Slo mi cdigo

Aunque esto no es totalmente cierto, al menos si lo tomamos al pie de la letra; ya que podemos aadir un proyecto a nuestra solucin, indicar que no se generen los
smbolos de depuracin (normalmente creando el fichero con la extensin .pdb) e incluso generarlo en modo
optimizado y an as se considera que es parte de mi
cdigo. Bueno, en realidad no se considera como nuestro, pero el IDE de Visual Studio nos advierte de que
si realmente no queremos que sea nuestro, pues... que
lo indiquemos, tal como vemos en la figura 3.
El aviso mostrado en la figura 3 nos indica que
en nuestro proyecto tenemos cdigo que no est marcado para depurar o que est marcado para ser optimizado, pero en realidad ese aviso solo se mostrar
si no generamos los smbolos de depuracin. La seleccin de la casilla de optimizacin no afecta y no ser
causante de que se muestre ese mensaje.

racin, se considera que esos


mdulos pertenecen a mi
cdigo. Si se llama a una funcin de biblioteca que se optimiza y no tiene smbolos de
depuracin, se considera que
no es mi cdigo. Solo mi
Figura 3. Advertencia de que si queremos hacer ciertas cosas,
cdigo le impide detenerse en
que lo indiquemos decuadamente
el cdigo de biblioteca, opcin
que puede desear en la mayora
de los casos.
Cmo configurar el proyecto para generar o no los smAhora veremos qu significa esto y cmo podebolos de depuracin?
mos definir parte de nuestro cdigo como si no fuera mi cdigo con idea de no detenernos en l cuanSi no queremos generar el fichero con la extendo estemos depurando.
sin .pdb, que es el causante de que se pueda depurar
Como veremos, (y tal como nos indica la ayuda
el cdigo, tendremos que indicarlo en las opciones
de Visual Studio), tener habilitada la opcin de Solo
avanzadas de generacin del cdigo. Segn trabajemi cdigo nos permite centrarnos en el cdigo que
mos con Visual Basic o con C#, el nombre de esa
nosotros hemos escrito y que es el que en realidad nos interesa depurar. Tambin nos ahorraremos mensajes extras del entorno de desarrollo cuando lo que se va a ejecutar est en
libreras externas o en libreras que no estn
generadas con la opcin de depuracin.

Como hemos visto en la seccin anterior,


podemos indicar al depurador de Visual Studio
que solo ejecute el cdigo considerado como
nuestro.
Qu se considera como cdigo nuestro? Tal
como nos indica la documentacin de Visual Studio, cualquier cdigo que tengamos referenciado en nuestro proyecto y no tenga smbolos de
depuracin se considera que no es nuestro; todo
lo dems s se considerar como nuestro cdigo.

Figura 4. Opcin de generacin de smbolos


de depuracin en C#

<<dotNetMana

Excluir cdigo para la depuracin

45

<< dnm.inicio

opcin ser diferente, pero ambas estn en el mismo


sitio, o casi, al menos si tenemos en cuenta de que en
Visual Basic las opciones de generacin est en la ficha
Compilar, mientras que en C#, esa ficha se llama
Generar.
Independientemente de cmo se llamen las opciones o dnde se encuentren, si no queremos que se
generen esos ficheros de depuracin, lo que tenemos
que hacer es indicar el valor none en las opciones de
generacin. En la figura 4 se muestra esa opcin para
C# y en la figura 5 para Visual Basic.

miento se excluir. Hay que tener en cuenta que este


atributo solo se tendr en cuenta si hemos seleccionado la opcin Habilitar Slo mi cdigo.
DebuggerHidden. Este atributo solo se puede indicar
a nivel de procedimiento (ver el comentario anterior para saber qu se considera un procedimiento) y nos servir para ocultarlo al depurador; de esa
forma, no podremos navegar por l en el proceso
de depuracin, independientemente del valor que
hayamos asignado a la opcin Habilitar Slo mi
cdigo.
Por ltimo, el atributo DebuggerStepThrough impedir que Visual Studio tenga en cuenta el elemento al que se aplica el atributo (que puede ser una clase o un procedimiento), pero en el sentido de que
no podremos ir paso a paso por el cdigo al que est
aplicado. A diferencia de DebuggerHidden, podemos
poner puntos de interrupcin, por ejemplo, en el
cuerpo del procedimiento, y en ese caso se detendr
la ejecucin al llegar a ese punto de interrupcin;
pero no nos permitir la navegacin paso a paso
(ahora veremos cmo podemos ejecutar el cdigo
paso a paso). En realidad, ese punto de interrupcin
solo se tendr en cuenta si no tenemos habilitada la
opcin Habilitar Slo mi cdigo.
De los tres atributos de ocultacin de cdigo al
depurador, DebuggerHidden es el nico que siempre
oculta el cdigo.

Figura 5. Opcin de generacin


de smbolos de depuracin en C#

Indicar partes del cdigo para excluirlo


de la depuracin

<<dotNetMana

Si dejamos seleccionada la opcin de generacin de


smbolos de depuracin y queremos excluir parte del
cdigo del proceso de depuracin, podemos usar ciertos atributos definidos en el espacio de nombres System.Diagnostics. Dependiendo de qu comportamiento queramos, podremos usar uno de estos tres
atributos:

46

DebuggerNonUserCode. Este atributo le indica a Visual


Studio de que el elemento al que se aplica no se considere como cdigo del usuario, es decir, no se tenga
en cuenta como mi cdigo. Si el atributo lo aplicamos a una clase, la clase completa se excluir del proceso de depuracin. Si lo aplicamos a un procedimiento (mtodo, constructor, etc.), solo ese procedi-

De los tres atributos de ocultacin de


cdigo al depurador, DebuggerHidden es
el nico que siempre oculta el cdigo

Ejecucin paso a paso


Cuando estamos depurando una aplicacin, usaremos los puntos de interrupcin para que la ejecucin se detenga al llegar a ellos. Una vez que hayamos detenido la ejecucin del programa, podremos
ir navegando lnea a lnea o procedimiento a procedimiento, esto es lo que se conoce como ejecucin
paso a paso.

<< dnm.inicio

Cambiar las combinaciones de tecla


Tal como he comentado en la nota, las teclas usadas para ejecutar en modo depuracin son las predeterminadas de cada configuracin de Visual Studio.
De todas formas, si preferimos usar otras combinaciones de teclas, siempre podremos modificarlas y elegir las que ms nos gusten. Esto lo haremos cambiando
las combinaciones de las teclas desde las opciones de
configuracin de Visual Studio. Si la tecla elegida ya
est asignada a otra opcin, el propio entorno nos avisar, tal como vemos en la figura 6.

Figura 6. Al elegir una combinacin de teclas,


si ya se est usando, nos avisar

Siguiente instruccin a ejecutar


Mientras estamos ejecutando paso a paso, la
siguiente instruccin (o lnea) a ejecutar estar resaltada en amarillo y con una flecha en la parte izquier-

NOTA
Las teclas de depuracin paso a paso cambian segn la configuracin de Visual Studio
Es importante resaltar que las teclas [F10] y [F11] son las predeterminadas para la configuracin del
entorno de desarrollo para Visual C#,Visual Web Developer o la conocida como Configuracin general
de desarrollo. Sin embargo si hemos seleccionado la configuracin del entorno de desarrollo para Visual
Basic, esas teclas sern [Mays]+[F8] y [F8], respectivamente.
Es importante saber que la configuracin del entorno no depende del lenguaje, es decir, si trabajamos
con proyectos de Visual Basic y de C# las teclas siempre sern las mismas, ya que es el tipo de configuracin
elegido el que asignar las teclas de depuracin no el lenguaje usado.
La tecla [F9] se usa siempre, independientemente de la configuracin seleccionada.
Como truco, comentar que yo (que normalmente uso Visual Basic para desarrollar) siempre suelo configurar el entorno de trabajo usando la configuracin general, de esa forma uso siempre las teclas [F10] y
[F11] para navegar por el cdigo.

<<dotNetMana

Cuando seleccionamos la opcin Paso a paso


por instrucciones del men Depurar o usamos la
tecla [F11], iremos navegando por cada una de las
instrucciones del cdigo; si una de esas instrucciones es un procedimiento, entraremos en el procedimiento y podremos ir inspeccionando cada una
de las instrucciones que haya. Como ya coment
antes, por procedimiento se entiende cualquier cosa
que no sea una clase (o tipo); es decir, una propiedad tambin es un procedimiento, y por tanto hay
veces que se hace tedioso este tipo de navegacin
por el cdigo, ya que se ejecutarn todas y cada una
de las instrucciones que tengamos
en nuestro cdigo. Si no queremos entrar en los procedimientos,
es decir, ejecutarlos, pero no ir paso
a paso por cada una de las instrucciones incluidas en l, podemos
usar la opcin Paso a paso por
procedimientos o bien usar la tecla
[F10]. Si estamos usando esta ltima forma de navegar por el cdigo, siempre podremos usar la otra
opcin para entrar en el procedimiento que nos interese.
Recordemos los atributos mencionados antes, ya que si hemos usado el atributo DebuggerStepThrough
solo podremos detenernos en ese
cdigo si hemos puesto un punto de
interrupcin; y aunque hayamos puesto ese punto de interrupcin, una vez
en l, no podremos utilizar ninguna de las dos formas
de navegar por el cdigo, ya que el IDE se saltar todo
el cdigo que haya a continuacin (saltar en el sentido
de no ir paso a paso), y seguir por el cdigo en el que
hayamos permitido la navegacin.

47

<< dnm.inicio

cin a lo mejor no es tan importante, pero lo de la declaracin s que lo es, ya que no nos dar ningn error de
duplicidad de declaracin. Esto es bastante til, ya que
nos permite deshacer todo lo que hemos hecho para
probar nuevamente a ver por qu ese cdigo no funciona como esperamos.

Inspeccionar el contenido de las variables

Figura 7. La lnea de ejecucin actual se resalta


en amarillo y los puntos de interrupcin en rojo

da, tal como vemos en la figura 7. En esa misma figura vemos en rojo los puntos de interrupcin.
En la figura 7 tambin podemos apreciar que los
dos puntos de interrupcin del mtodo Saludo tienen
una marca de advertencia y no estn en rojo en la barra
de la izquierda; esto es as porque ese mtodo est
marcado con el atributo DebuggerHidden.
La flecha amarilla indica qu es lo que se ejecutar
a continuacin, es decir, que el cdigo que se resalta
an no se ha ejecutado, y si necesitamos cambiar la
localizacin de la siguiente instruccin a ejecutar, podemos cambiarla moviendo esa flecha a otra posicin
dentro del cdigo. Por supuesto, no podemos mover
ese indicador a cualquier parte, solo donde est permitido; por ejemplo, si quisiramos cambiarlo a otro
mtodo, no nos lo permitira: el cursor cambiar a un
signo de prohibido, tal como vemos en la figura 8.

Mientras estamos en modo depuracin, con el cdigo


detenido, podemos ver los valores que tienen todas las
variables que estn en el mbito actual. Es decir, si estamos en un mtodo, podremos ver qu valores tienen
las variables que tengamos declaradas y que estn accesibles en ese punto del programa. Esos valores los podemos ver de dos formas distintas: una de ellas es seleccionando la variable a inspeccionar; si es una variable
simple, por ejemplo, una cadena, automticamente se
mostrar una ventana emergente (tooltip) con el valor.
Esa ventana permite editar el valor, de forma que podemos cambiarlo in situ. Si la variable a inspeccionar tiene aplicado algn mtodo o propiedad, entonces no
veremos el valor; bueno, s que lo veremos, pero tendremos que ser finos a la hora de posicionar el cursor
del ratn en la variable. En cualquier caso, siempre nos
quedar la opcin de seleccionar la variable al completo para poder mostrar el valor que contiene.

<<dotNetMana

Figura 8. El indicador de la siguiente instruccin


a ejecutar no nos permitir cambiar de mtodo

48

Cuando cambiamos la siguiente instruccin a ejecutar a una lnea anterior a la que se est ejecutando
actualmente, todo el cdigo que ya se haya ejecutado
se volver a ejecutar. Esto es lgico, pero si en ese cdigo tenemos declaraciones de variables o instanciamos
algn objeto, esas declaraciones volvern a ejecutarse
o el objeto volver a instanciarse. Lo de la instancia-

Figura 9. La ventana de inspeccin de variables

<< dnm.inicio

Por fortuna para los que tenemos poco pulso, estn


las ventanas de inspeccin de variables, en las que (tal
como podemos apreciar en la figura 9), tenemos dos
fichas en las que el propio entorno de desarrollo va agregando las variables que estn actualmente en un mbito ms prximo a la ejecucin del programa. En el montaje de la figura 9 vemos esas dos fichas de la ventana de
inspeccin. En la ventana Automtico se mostrarn
las variables que estn ms cercanas a la posicin de la
instruccin que se est ejecutando (habitualmente sern
las variables de la lnea actual y la anterior), mientras
que en la ficha Variables locales se mostrarn todas
las variables del procedimiento actual. Como vemos en
esa figura, se muestran los valores de las variables, adems
de que en esas ventanas tambin podemos cambiar los
valores de las variables.
Si en lugar de inspeccionar una variable simple
queremos ver el contenido de un objeto por referencia, por ejemplo, de un array, en ese caso se nos mostrar la informacin de una forma diferente, ya que
el contenido no es un solo valor. En la figura 10 podemos apreciar cmo se muestra el contenido de un array
de tipo string; en este caso, podemos acceder a los
valores individuales tanto de forma directa como desde la ventana de inspeccin.

Inspeccin personalizada de variables


Como vemos en las figuras 9 y 10, adems de las
dos ventanas de inspeccin mencionadas, tambin
podemos utilizar otras con las variables u objetos que

Figura 11.Ventana de inspeccin rpida

Conclusiones
Con lo explicado en este artculo, tendremos una visin
general de parte de lo que la depuracin con Visual
Studio 2005 (o superior) nos ofrece, aunque an quedan cosas importantes de las que hablar. Pero eso ser
en el prximo nmero de dotNetMana, en el que
veremos cmo utilizar todo lo relacionado con editar
y continuar y otras cosas relacionadas con la depuracin y deteccin de errores, mientras tanto... que lo
depure bien!

<<dotNetMana

Figura 10. La inspeccin de los arrays


nos permite acceder a los elementos individuales

nos interesen. Por ejemplo, si en una variable usamos


el mtodo ToString() no se mostrar el valor de forma automtica: para ver ese valor tendremos que crear lo que se conoce como una inspeccin rpida; la
forma de hacerlo (adems de usando el men contextual) es seleccionando la variable y pulsando
[Mays]+[F9]. Esa accin har que se abra un cuadro de
dilogo en el que se mostrar el resultado de la llamada a ese mtodo adems de permitirnos agregar
ese cdigo a una ventana de inspeccin. En la figura
11 vemos ese cuadro de dilogo y los botones que nos
permiten agregar lo que estamos inspeccionando a la
ventana de inspeccin personalizada. Tambin vemos
que hay un botn para actualizar el valor; esto es til
si en lugar de mostrar lo que inicialmente habamos
seleccionado queremos cambiar de idea y ver otras
propiedades u otros mtodos, ya que en esa ventana
tendremos acceso a los elementos del objeto que estamos inspeccionando (en este ejemplo es una variable
de tipo entero, pero esa variable puede ser cualquiera de las que tengamos definidas en el procedimiento que actualmente se est ejecutando, e incluso de
otros procedimientos, al menos si estn en mbito).

49

todonet@qa

todotNet.qa@dotnetmania.com

Dino Esposito

Dino Esposito
es mentor de Solid
Quality Learning. Es
ponente habitual en
los eventos de la
industria a nivel
mundial.Visite su
blog en: http://weblogs.
asp.net/despos.
(todotNet.QA@
dotnetmania.com)

Silverlight. Presente y futuro


Demasiadas promesas alrededor de Silverlight 1.0. La comunidad de desarrolladores esperaba mucho
de esta versin, pero existen muchas cosas para las que producto no ha sido diseado y que hoy da
no pueden realizarse. Muchas de las expectativas generadas acerca de Silverlight se harn realidad
solamente cuando la prxima versin en preparacin para el verano de 2008 est disponible. En
esta columna responder a preguntas frecuentes sobre Silverlight y su relacin con otras tecnologas
ricas para aplicaciones Web.

Parece que la mayora de desarrolladores se centra en lo que Silverlight no puede hacer todava,
en lugar de hacerlo en lo que s puede hacerse con la versin 1.0 ya liberada. As que mi pregunta es lgica: cul es el propsito de Silverlight 1.0? Soporta una pequea porcin de WPF y no
dispone de utilidades para desarrolladores, tales como controles o libreras de ayuda.Yo incluso
me preguntara si es realmente utilizable nos puede dar su visin sobre esto?
Silverlight 1.0 no es producto para desarrolladores
Web. S que es, no obstante, un producto que juega un papel estratgico en la lucha y esperamos que
derrocamiento del ya vetusto Adobe Flash. Puedes
imaginrtelo como una cabeza de puente lanzada en
el campo de batalla para proporcionar beneficios en
un futuro, pero no precisamente en este momento.
Ms concretamente, la funcionalidad que Silverlight
puede ofrecer hoy versin 1.0, como hemos dicho
se limita a las capacidades multimedia y a mostrar
documentos WPF muy simples.
El fin ltimo es decirle al mundo que Microsoft
ha sacado un anti-Flash, que cuenta, al menos, con
algunas pocas ventajas sobre ste. Primero, la descarga de documentos WPF no es una caja negra para
buscadores como Google u otros. Segundo, puede
reproducir formatos de creacin pblica, incluyendo WMV, WMA, MP3 y cualquier formato codificado en VC-1, la forma de codificacin de la mayora
de las pelculas en DVD. Y, finalmente, puede programarse utilizando un lenguaje estndar, no propietario, como Javascript. Para reproducir una pelcula desde una pgina Web, ahora podemos olvidarnos de cualquier reproductor externo (como

Media Player) y usar solo Silverlight. Y Silverlight


es multiplataforma, soporta varios navegadores y se
inserta mediante una etiqueta <OBJECT>.
Para preparar un documento Silverlight, no se
necesitan obligatoriamente herramientas ad hoc.
Todo lo que hay que crear es un fichero XAML,
que no es ms que un fichero con sintaxis XML.
Puedes usar las herramientas de la suite Expression
o incluso Visual Studio 2008. Pero en muchos casos
sencillos, el Bloc de notas es suficiente. Un fichero XAML describe su salida mediante un subconjunto de elementos de Windows Presentation
Foundation. Pero este subconjunto soportado es
extremadamente limitado, y no incluye campos de
entrada, elementos ubicables, estilos o enlace a
datos. Las capacidades limitadas de Silverlight 1.0
se derivan de estas caractersticas.
Silverlight se presenta en ocasiones, y se percibe a menudo, como la herramienta que har posible a los desarrolladores construir aplicaciones ricas
para Internet (Rich Internet Applications, RIA) que
sern distribuidas va Web, pero con caractersticas
prcticamente idnticas a las aplicaciones de escritorio Windows. Este es el destino final donde nos

exista una versin beta hasta primavera. Esta versin dispondr de una gran cantidad de potentes caractersticas
programables para capacitar la creacin de una autntica capa de presentacin basada en lenguajes administrados y objetos. Esta es la situacin actual.

Asumiendo que he comprendido bien el rol y las perspectivas de Silverlight, yo dira que
WPF y Silverlight podran eventualmente convertir las aplicaciones ASP.NET y AJAX en
obsoletas. Qu le parece esa prediccin?

No es algo tan descabellado. Sin embargo, yo creo firmemente que los dos mundos, Windows y Web, van a
permanecer separados durante la mayor parte del futuro predecible. Al mismo tiempo, eso s, la llegada de WPF
y Silverlight genera posibilidades de interaccin entre la
Web y Windows que ahora mismo son impracticables o
sencillamente imposibles.
Una vez que la prxima versin de
Silverlight est disponible, podrs desarrollar para la Web con la mayora de
las facilidades que tenemos hoy da en
el escritorio. Podras incluso llegar al
punto de utilizar el mismo documento WPF para alimentar aplicaciones
Web y Windows en un sistema multicapa. Tengamos en cuenta, no obstante, que esto no sucede gratis, pero es
un escenario que el uso de patrones de
diseo adecuados (p.e., el modelo Vista-Presentador) puede hacer posible.
No estoy seguro de que la llegada
de Silverlight vaya a revolucionar el
mundo del desarrollo Web en la plataforma Microsoft hasta el punto de
eliminar a ASP.NET. Como Adobe Flash, se puede usar
Silverlight de dos formas: como el entorno o contexto
entero de una aplicacin Web, o como un reproductor
de contenidos especiales en una pgina ASP.NET estndar. Segn mi criterio, es esta segunda opcin la que
ser ms ampliamente adoptada. En otras palabras,
todava veo la Web del futuro cercano hecha de pginas
HTML con algunas islas WPF en su interior.
Silverlight 1.1 (o cual sea su nombre/nmero final)
va a ser una plataforma mucho ms potente para la Web.
Basado en el conjunto de caractersticas conocido hoy,
con el aadido de un rico conjunto de etiquetas WPF,
Silverlight 1.1 incorporar un CLR muy ligero en el
navegador (en modo multiplataforma) para procesar lenguajes administrados (como C#, Visual Basic .NET, Javascript administrado o IronPython), una versin reducida

de .NET Framework que incluir extensiones LINQ,


manejo de excepciones y clases ad hoc para manejar llamadas remotas a servicios. Al final, WPF y Silverlight
forman un poderoso do, pero tengo la sensacin de que
la adopcin amplia del producto estar condicionada a
las herramientas de programacin que los equipos de
Microsoft pongan a nuestra disposicin.

Todava veo la Web del futuro cercano


hecha de pginas HTML con algunas
islas WPF en su interior

Probablemente, necesitaremos Silverlight para continuar con la exitosa programacin basada en ASP.NET
con controles de servidor y extensiones del lado del cliente. Si Microsoft puede llegar a ofrecer esto, mi prediccin es que la mayora de los desarrolladores adoptarn
Silverlight como una poderosa herramienta para construir aplicaciones Web todava ms potentes. Por otro
lado, estamos en esta situacin debido a una extraa conjuncin astral: casi todos los navegadores soportan un
mismo (y potente) conjunto de caractersticas programables. Para que WPF y Silverlight destronaran a
ASP.NET y AJAX, todos los desarrolladores de todas las
plataformas deberan estar de acuerdo. Tecnolgicamente
hablando, no hay nada que lo impida, pero, en la prctica, yo no apostara por ello. Aunque s veo un montn
de interaccin entre ambos tipos de aplicaciones.

<<dotNetMana

llevar Silverlight, pero todava est lejos de donde nos


encontramos hoy. La siguiente versin, actualmente etiquetada como Silverlight 1.1 y en fase alfa, probablemente nos lleve donde esperamos. Pero Silverlight 1.1
se espera para despus del verano, y probablemente no

TodotNet.qa@dotnetmania.com TodotNet.qa@dotnetmania.com

<< dnm.todonet@qa

51

<<dotNetMana T o d o t N e t . q a @ d o t n e t m a n i a . c o m T o d o t N e t . q a @ d o t n e t m a n i a . c o m

<< dnm.todonet@qa

52

Intent insertar un documento XAML en una pgina ASP.NET y no sucedi nada incluso en
mquinas equipadas con la ltima versin de Silverlight. De qu forma puedo consumir
contenido XAML desde una pgina ASP.NET?
Silverlight no es una aplicacin preparada para consumir cualquier contenido XAML servido a un navegador.
Si apuntas tu navegador a una URL que proporciona un
stream XAML, no deberas esperar ningn comportamiento especial en el navegador. La manera de usar Silverlight es ligeramente diferente.
Lo primero, inyectas una etiqueta <OBJECT> en una
pgina Web que apunte al motor de Silverlight para la
plataforma del navegador. El motor de Silverlight est
actualmente disponible para plataformas Mac y Windows y est siendo desarrollado para sistemas Linux por
el grupo Mono, en el marco de un proyecto que se conoce como Moonlight.
El motor de Silverlight se define en un script llamado
Silverlight.js, que debes enlazar a la pgina. Este fichero es parte del SDK de Silverlight. Contiene objetos de
ayuda, que pueden ser instanciados e inicializados para
que todo funcione como se espera. En una pgina Web
ASP.NET AJAX, usaramos el siguiente cdigo:
<script type="text/javascript">
function pageLoad()
{
var parent = $get("host");
createSilverlightHost(parent);
}
</script>

En una pgina HTML, simplemente ejecutas el cdigo en el manejador del evento onLoad de esa pgina o
puedes situar un bloque <script> dentro de la etiqueta
<body>. La funcin CreateSilverlightHost() es una funcin definida por el usuario que inicializa la ventana Silverlight. Esta funcin debe ser vinculada a la pgina de

alguna forma. Normalmente, situamos el cuerpo de la


funcin en un script separado. A continuacin inicializamos 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 parmetro indica el contenedor de la ventana Silverlight, donde el contenido Silverlight ser mostrado, en
la pgina. La ventana Silverlight recibe un ID que es SilverlightControl1 en el cdigo para poder comunicar con
el resto de la pgina va Javascript. Finalmente, se definen
el tamao y la apariencia de la ventana. El contenido XAML
se identifica mediante una URL. El fichero es descargado
y procesado en forma local en el navegador del cliente.
Como el XAML se referencia mediante URL, nada impide que una aplicacin ASP.NET genere dinmicamente el
contenido utilizando un manejador HTTP.

Hay algn sitio Web pblico que utilice Silverlight?


Desde luego que s, ya empiezan a aparecer los primeros sitios que utilizan Silverlight 1.0 para los anuncios o contenidos multimedia1. De todos ellos, me gustara sealar que http://www.tafiti.com es un ejemplo
de sitio potenciado mediante Silverlight. Tafiti semeja el comportamiento de Google y utiliza el motor de
Live Search para recoger informacin a partir de una

cadena de consulta. Su interfaz de usuario est enteramente basada en Silverlight, aunque en este momento contiene un montn de cdigo de script. As que,
despus de todo, deberas considerar Tafiti como una
representacin de las funciones que obtienes hoy de
Silverlight, pero no todava del cdigo que escribirs
cuando la versin siguiente est disponible.

Traducido al castellano por Marino Posadas


1

Un sitio Web con tales caractersticas es http://www.mlb.com. Pero Dino seguramente no es aficionado al bisbol (N. del E. T.)

<< dnm.laboratorio.net

Octavio Hernndez

Laboratorio.net

ILOG Diagrammer for .NET


Este mes presentamos ILOG Diagrammer for .NET, un marco de trabajo para la
edicin y visualizacin de diagramas y cuadros de mando sacado recientemente
al mercado por la multinacional ILOG (http://www.ilog.com), que permite crear
sofisticadas y atractivas interfaces visuales para las aplicaciones Windows y Web
basadas en .NET Framework.

Nombre: ILOG Diagrammer for .NET


Versin: 1.0
Fabricante: ILOG
Sitio Web: http://www.ilog.com/
Categora: Componentes de interfaz de
usuario
Precios:
Licencia de desarrollo: 2.500 EUR.
Licencia de despliegue: contactar con
ILOG

Octavio Hernndez es
Development Advisor
de Plain Concepts,
editor tcnico de
dotNetMana y tutor
de campusMVP.
Es MVP de C# desde
2004, MCSD y MCT.

ILOG Diagrammer for .NET es un potente conjunto de herramientas, componentes y libreras para
el desarrollo de aplicaciones de edicin grfica,
visualizacin, supervisin y monitorizacin para la
plataforma .NET, que simplifican sensiblemente
tareas como crear diagramas que permitan establecer o mostrar la relacin entre objetos o monitorizar los parmetros de negocios o sistemas dinmicos de la ms diversa ndole. Las figuras 1 y 2
muestran ejemplos de tales actividades: mientras
que en la figura 1 se presenta una aplicacin que
permite crear y manipular grficamente diagramas
BPM (Business Process Management), en la figura 2
se muestra una aplicacin que simula la monitorizacin en tiempo real del comportamiento del
trfico en tneles subterrneos al estilo de los
recientemente inaugurados en Madrid. Estas dos
aplicaciones forman parte de los ejemplos que se
entregan con el producto.
Como complemento de las libreras que componen el SDK de ILOG Diagrammer for .NET, desarrollado al 100% en C#, la instalacin del producto

integra dentro de Visual Studio 2005 dos nuevos tipos


de proyectos, las Aplicaciones ILOG Diagrammer y
las Libreras de Smbolos ILOG Diagrammer. Mediante el primer tipo de proyectos es posible crear de una
manera visual e interactiva proyectos que incluyan diagramas de los ms diversos tipos; al estilo de como hace
Visual Studio cuando diseamos un formulario Windows Forms, en la medida en que vamos arrastrando
elementos desde el Cuadro de herramientas hasta el
lienzo de diseo el add-in de ILOG Diagrammer va
generando el cdigo fuente necesario para reproducir
el diagrama en tiempo de ejecucin. Durante el diseo
de los diagramas, el Cuadro de herramientas de Visual

Figura 1. Editor BPM

Studio (figura 3) se enriquece con un amplio conjunto de smbolos grficos pre-programados que estn a
nuestra disposicin desde el primer momento. Estos
smbolos no representan otra cosa que clases, por lo
que podemos aplicar sobre ellos los patrones familiares de desarrollo basados en el modelo PEM (Propie-

<<dotNetMana

Ficha tcnica

53

<< dnm.laboratorio.net

Figura 2. Monitor de trfico en tneles

Modelado de diagramas de clases UML:


tambin se ofrecen controles para
representar los elementos y conectores tpicos de la notacin UML (Unified Modeling Language).
Facilidad de creacin de nuevos
controles grficos. ILOG Diagrammer for .NET incluye un amplio conjunto de primitivas (rectngulos, elipses, rutas, lneas, curvas, arcos, textos,
imgenes, escalas y otros) y de contenedores comunes (lienzos, paneles
apilados o adosados, visores con desplazamiento) que pueden ser utilizados directamente o en combinacin
con otros grficos para crear nuevas
variaciones. El producto tambin permite importar grficos en formato
SVG.
Representacin avanzada de grafos. El ncleo de la implementacin

dades-Eventos-Mtodos). El resto ya seguramente lo imagina el lector: los smbolos de la librera de ILOG Diagrammer
siguen un modelo de arquitectura abierta, y el segundo tipo de proyectos antes
mencionado permite precisamente desarrollar nuevas libreras de smbolos para
reutilizar en nuestros propios proyectos
o distribuir a terceros.

Caractersticas principales

<<dotNetMana

A continuacin se enumeran las principales caractersticas del producto que


podran ser de inters para los lectores:

54

Amplia gama de controles listos para


su uso. El amplio conjunto de controles grficos incluidos de serie en ILOG
Diagrammer for .NET permite satisfacer un amplio rango de necesidades
de los diseadores grficos en muchos
dominios de aplicacin diferentes. Estos
controles incorporan un conjunto de
comportamientos e interacciones predeterminadas; en todos los casos, es
posible redefinir las propiedades y
mtodos virtuales correspondientes
para crear nuevas variaciones. Los controles incorporados de serie en ILOG
Diagrammer for .NET se orientan a
los siguientes tipos de aplicaciones:

Figura 3. El Cuadro de herramientas de VS2005 durante la edicin de diagramas

Modelado y monitorizacin de procesos de negocio: se ofrece el conjunto


completo de smbolos de la notacin BPMN (Business Process Modeling Notation).
Monitorizacin de negocios: el producto incluye mltiples tipos de controles para el desarrollo de cuadros
de mando y paneles de monitorizacin para negocios, incluyendo
barras de progreso, relojes, visores
de grficos comerciales y botones.

de ILOG Diagrammer for .NET


incluye una implementacin eficiente de una estructura de datos para
representar grafos, entidades complejas que constan de nodos y enlaces que los interconectan. Esta estructura de datos es ideal para representar redes, procesos, flujos y cualquier
tipo de diagramas tcnicos o de negocio. Cualquier control grfico puede
servir como nodo de un grafo, y el
producto ofrece una amplia variedad

<< dnm.laboratorio.net

Noticias
Infragistics (www.infragistics.com) acaba de sacar al mercado NetAdvantage for
.NET volumen 3, una nueva edicin de la popular suite de herramientas de interfaz
de usuario para Windows y la Web. Entre las novedades ms significativas de esta edicin estn la inclusin de nuevas metforas de navegacin asociadas a la experiencia
de usuario de Windows Vista y la adicin de nuevas posibilidades de exportacin a
XPS y PDF para permitir nuevos escenarios de comparticin de documentos y generacin de informes, en lo que respecta a NetAdvantage for ASP.NET. Asimismo, la
empresa ha presentado la CTP (Community Technology Preview) de Aikido, un nuevo
marco de trabajo para ASP.NET basado en AJAX.
Iron Speed (www.ironspeed.com) ha puesto a disposicin del pblico Iron Speed
Designer v. 5.0, una nueva versin de este potente generador de generacin automtica de aplicaciones Web, que incorpora una cantidad realmente impresionante de
novedades que harn el producto an ms til y productivo para sus usuarios.
Business Objects (www.businessobjects.com) acaba de anunciar Crystal Reports
2008, nueva versin (la duodcima) de la conocida herramienta de creacin y ejecucin de informes que permitir a los usuarios alcanzar una mayor productividad, condensar una mayor cantidad de informacin en un informe evitando as la proliferacin
de stos, aumentar la interactividad de los informes e integrar objetos de Flash, Flex
y Xcelsius para producir informes ms impactantes.
En el marco de esta seccin, dotNetMana describir en prximas ediciones las caractersticas
principales de estos productos.

De rejilla. Caracterizado por el


hecho de que no se dibujan los
conectores; puede utilizarse en
cualquier caso en que se desee simplemente disponer grficamente un
conjunto de elementos.
Editores personalizables. Entre sus
ejemplos, el producto incluye tres editores independientes completos y con
cdigo fuente incluido: un editor de
diagramas, un editor de
diagramas de clases UML
y el ya mencionado editor
de diagramas BPMN.
Despliegue para el
escritorio o para el
navegador. Las aplicaciones creadas con ILOG
Diagrammer for .NET
pueden ser desplegadas
como aplicaciones Windows Forms o (con mnimos cambios) como aplicaciones ASP.NET con
soporte Ajax (basado en
las extensiones de Microsoft e independientes de
Figura 4. Editor de diagramas UML como
otro proveedor especfiaplicacin Web.

co). Este nivel de flexibilidad es especialmente til si una misma aplicacin


debe ejecutarse en diferentes plataformas. La figura 4 muestra al editor de
diagramas de clases UML ejecutndose como una aplicacin Web.

Conclusin
En este artculo hemos descrito las principales posibilidades que ofrece ILOG
Diagrammer for .NET, un potente marco de trabajo en cdigo manejado para
el desarrollo de interfaces grficas interactivas para Windows y la Web. El alto
precio de salida del producto est sin
duda ms que justificado por la calidad y
las prestaciones que ofrece; invito al lector a descargar la versin de evaluacin
[1] y comprobarlas por s mismo.

Referencias
[ 1]

Sitio Web del producto:


http://www.ilog.com/products/
diagrammernet.

<<dotNetMana

de tipos de conectores: rectos, curvilneos, ortogonales, etc. para enlazar los nodos entre s. Adicionalmente, el producto incluye toda una
serie de servicios avanzados como la
deteccin de intersecciones entre
conectores o la interconexin entre
diferentes grafos.
Distribucin automtica de grafos.
ILOG Diagrammer for .NET ofrece un conjunto sofisticado de algoritmos para la distribucin automtica de los nodos y los conectores, que
a la vez que intentan satisfacer objetivos generales como la minimizacin
del rea de dibujo necesaria, la minimizacin de la cantidad de intersecciones entre conectores, entre otros,
permiten al usuario de una manera
rpida distribuir los nodos del grafo
en dependencia del tipo de diagrama
que desea crear. Entre los algoritmos
de distribucin disponibles estn:
Jerrquico. Generalmente utilizado
en aplicaciones de ingeniera elctrica (diagramas de circuitos), ingeniera industrial (diagramas de procesos), gestin de software (diagramas UML, diagramas de flujo).
Arbreo. Ideal para la representacin de diagramas organizativos,
diagramas de bases de datos o
mapas de sitios Web.
Guiado por fuerza (force directed).
Utilizado en diagramas de redes de
telecomunicaciones o redes semnticas, entre otras aplicaciones.

55

comunidad.net
European Silverlight Challenge
El concurso de desarrollo de Silverlight se ha ampliado a toda Europa, aumentando tambin los premios. INETA Europa (http://europe.ineta.org), en colaboracin con Microsoft, ha preparado esta competicin que ya ha empezado y que
finalizar el da 31 de enero de 2008.
La competicin se realizar en dos fases:
1. Competiciones Nacionales. Estas se realizarn de forma local en cada pas
bajo la supervisin y apoyo del equipo de INETA.
2. Competicin Europea (Gran Final). En ella participarn solo los participantes que hayan obtenido el primer premio con su aplicacin ganadora.
Si crees en tu talento, apntate y participa en la competicin European Silverlight Challenge y gana, adems del reconocimiento de la comunidad, fabulosos premios por un valor total de 160.000 (segn precio de mercado), incluyendo tickets para el MIX 2008 (con viaje y estancia incluidos), suscripciones
MSDN, etc.
El objetivo de la competicin es desarrollar una aplicacin, mdulo o componente .NET en la que su interfaz de usuario est desarrollada con la tecnologa Silverlight. Esta participacin deber acatar la licencia MS-PL para poder
ser distribuida y utilizada gratuitamente por grupos de usuarios de INETA o de
cualquier otra comunidad en sus sitios Web y comunidades tcnicas online.
Ms informacin en http://silverlightchallenge.eu. Para participar en la competicin espaola: http://desafiosilverlight.bcndev.net.

3 Aniversario GUSE.NET
Durante los das 23, 24 y 25 de noviembre se celebr el III Aniversario de
Gusenet, en Santa Pola (Alicante). Como
ya viene siendo habitual en este evento,
intentamos combinar las sesiones tcnicas con un poquito de ocio que adems
pueda ser compartido por nuestras parejas, con el objetivo de pasar un fin de semana 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 Studio 2008 y una mesa redonda sobre el pasado, presente y futuro del grupo, con aportaciones interesantes que empezaremos a poner en prctica en prximos eventos.
Centrndonos en las sesiones tcnicas, comenzamos con una charla de nuestro
amigo Guille, que nos habl de las novedades de VB9, consiguiendo, adems de
transmitir de forma muy clara dichas novedades, hacer una sesin muy amena, cargada de bromas y risas. Y cmo no, aprovech para vender algn libro, camisetas
cuyo importe ser donado a DotNetSolidario, y hacer algunos regalos.
A continuacin pudimos contar con David Salgado, de Microsoft Ibrica, quien
nos habl principalmente de AJAX, haciendo una sesin muy interesante y participativa, donde invit al pblico a hacerle todo tipo de preguntas, incluidas aquellas que no
iban directamente relacionadas con el tema en cuestin, consiguiendo as una excelente comunicacin con el pblico, que pudo resolver cualquier duda que plante.

CSLA.NET: introduccin al framework de desarrollo CSLA.NET 3.0


El pasado 21 de noviembre tuvimos la enorme fortuna de poder contar con
la presencia de uno de los
grandes del mundo .NET,
Rockford Lhotka, que
aprovechando una estancia en Barcelona nos ha
honrado con una charla en
la que pudimos ver la
nueva arquitectura CSLA
3.5 (en desarrollo actualmente), con lo que fuimos honrados doblemente: con el gran speaker que es (adems de
un gran escritor y arquitecto de software), as como con
la posibilidad de echar un vistazo al nuevo CSLA 3.5.
La sesin transcurri sin problemas, totalmente en ingls
y con asistencia de pblico internacional va Live Meeting. Por ltimo, se regalaron dos de los ltimos libros
sobre CSLA por parte de Lhotka al pblico, todo un
detalle por su parte. La sesin de firma de libros destap
ms de un fan de Lhotka oculto entre el pblico.
La experiencia se podra calicar de genial. Adems
de que desde los inicios de la vida de BcnDev, sobre principios del 2006, tenamos muchas ganas de realizar una
sesin sobre CSLA, al nal la ha realizado el mismsimo
Lhotka. Si tenis la oportunidad de asistir a alguna sesin
suya, online o presencial, recomendamos altamente la
asistencia.

Yo, Robot
Si desarrollas con tecnologa Microsoft, debes saber que no
solo puedes crear aplicaciones comerciales con Visual Studio, tambin puedes divertirte y mucho. En esta charla veremos algunas aplicaciones de Microsoft Robotics Studio y
LEGO Mindstorm, cmo trabajar con Visual Studio .NET
y un WiiMote, cmo controlar un helicptero utilizando
Visual Studio y alguna sorpresita ms.
El viernes 14 de diciembre tendr lugar en el saln de
actos del Hospital Juan Ramn Jimnez de Huelva el
evento "Yo, Robot".
Registro: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032358807&Culture=es-ES.
Como siempre, despus del evento colgaremos los
materiales disponibles en nuestra seccin de eventos
(http://www.onobanet.com/eventos/eventos.aspx).

biblioteca.net
Microsoft Expression Web Plain & Simple
Katherine Murray
Editorial: Microsoft Press
Pginas: 256
Publicado: octubre de 2007
ISBN: 978-0735625198
Idioma: ingls
Estamos trabajando con Expression Web desde su aparicin, y la impresin es positiva, as que una obra sobre este tema (una de las primeras) merece la pena citarse, especialmente cuando viene directamente de la casa.
Es una obra cortita, que se lee casi- del tirn, y decimos casi, porque merece la pena
perderse un poco en algunos de los ejercicios prcticos que presenta, para adquirir soltura con un producto que, una vez controlado, puede ser muy productivo. Que nadie
espere anlisis en profundidad, pero es una obra idnea para los que se estn iniciando
con las capacidades de la herramienta (que son bastantes). Cubre todas las tareas fundamentales para la creacin de sitios profesionales y se deja ver la experiencia de la autora
(a ms de la de usuario): tiene ms de 40 libros publicados. Su lectura resulta didctica y
divertida.

C# 3.0 y LINQ
Octavio Hernndez Leal
Editorial: Krasis Press
Pginas: 290
Publicado: noviembre de 2007
ISBN: 978-8493548919
Idioma: castellano

novedades

Es un placer comentar esta obra por varias razones (algunas personales): es una de las
primeras en su gnero que se publican en castellano; algunas partes de su contenido las
habr podido leer el lector en esta revista; y adems se trata del Editor Tcnico de dotNetMana. Una obra corta, pero, a diferencia de la anterior, intensa. Hay que decir tambin que, debido al formato de publicacin que utiliza Krasis con muy cuidada encuadernacin en carton, las casi 300 pginas del libro dan para bastante ms de lo que se
podra adivinar detrs de esa cifra.
Octavio Hernndez repasa en los primeros cuatro captulos las novedades aportadas por el lenguaje a partir de la versin 2.0 (especialmente los tipos genricos),
para pasar, a continuacin, a abordar los fundamentos de LINQ y su reflejo en el lenguaje C# 3.0 y su librera bsica de apoyo (LINQ to Objects). La ltima parte del
libro describe las posibilidades que ofrecen los principales proveedores de LINQ
contenidos en .NET 3.5, junto a abundantes ejemplos, probados hasta la ltima coma
(perdn, punto y coma).

Introducing Microsoft Expression Design


Greg Holden. Editorial: Course Technology PTR. Pginas: 600. Disponible: enero de 2008.
ISBN: 978-1598631562. Idioma: ingls.

Microsoft Expression Blend Unleashed


Brennon Williams. Editorial: SAMS. Pginas: 500. Disponible: junio de 2008. ISBN: 9780672329319. Idioma: ingls.

TEXTO: MARINO POSADAS

desvn

Marino Posadas

<<dotNetMana

El ADN como lenguaje de programacin

58

Se haba intentado antes, pero el proyecto de investigacin dirigido por Erik


Winfree, profesor de ciencias de la
computacin en el Instituto de Tecnologa de California, puede considerarse el primer intento serio de reunir bioqumica e informtica. Podemos
disear una serie de estructuras capaces
de crear patrones complejos, circuitos,
y motores, afirm respecto a las pruebas obtenidas creando patrones y estructuras de ADN en tubos de ensayo, Winfree, quien adems se define como un ferviente creyente de
que la anunciada (pero todava no producida) comunin entre
las dos disciplinas cientficas est a punto de producirse, aada:
No se trata de quedarnos en el mero ensamblado de formas
geomtricas utilizando ADN. Si entendemos el lenguaje,
podramos disear respuestas biolgicas a travs de la re-programacin, para terminar con virus reales.
De cualquier forma, Winfree no es el nico que investiga seriamente con esta posibilidad. Hace ya algn tiempo, la doctora Lila
Kari de la University of Western Ontario (Canada), especializada
en lenguajes formales, gan el premio Florence Bucke por sus trabajos de recombinacin gentica del ADN, en los que demostraba que, tericamente, se podra utilizar este tipo de combinacin
para simular cualquier operacin de las realizadas habitualmente
por un ordenador. La forma de plantear los problemas sera lo ms
complejo y duradero, mientras que el tiempo de clculo se reducira de forma tan drstica, que proposiciones que ahora escapan
al clculo de la mayora de los ordenadores (o sea, que tardaran
aos en realizarse) podran resolverse en cuestin de horas.
Y es que las conexiones entre
bioqumica e informtica son cada
vez ms numerosas. Lo ltimo en
conexiones directas lo presentaba
hace poco un grupo de cientficos
de la Universidad de Arizona, dirigidos por Charles M. Higgins,
quienes han construido un robot
cuyo movimiento est vinculado al
cerebro de una polilla (como lo
oyen). El dispositivo (ver foto adjunta) conecta el cerebro de la polilla
(inmovilizada en un tubo de ensayo
especial, y rodeada de dibujos que al moverse le sugieren movimiento) con el robot, y cuando el escenario de control genera la
sensacin de movimiento el robot responde de varias formas. Higgins afirma haber construido el dispositivo como medio de estudio neuronal, pero otros colegas afirman que podra utilizarse en
sentido inverso; esto es, sugiriendo reacciones en el cerebro
mediante movimientos robotizados. Para ms informacin sobre
este ltimo experimento, ver el artculo de Physics.org:
http://www.physorg.com/news114715561.html.

noticias.noticias.noticias

documentos en la red
Utiliza Captchas como
Webmaster? Si cree que son
seguros, no se pierda este artculo sobre las vulnerabilidades
de estos grficos que supuestamente permiten diferenciar la
percepcin humana de las acciones de los bots en la red. En el
artculo Has CAPTCHA Been "Broken"? (http://www.codinghorror.com/blog/archives/001001.html), Jeff Atwood (Coding
Horror) analiza las vulnerabilidades de estos mecanismos e
incluso indica la pgina Web de un hacker chino que consigue
romper la mayora de ellos.
SQL Server 2008 podr ser administrado mediante
PowerShell! Jeffrey Snover (Microsoft) anunciaba recientemente en el blog del equipo de desarrollo de Windows
PowerShell esta noticia que sin duda merece la pena leer
tanto si se est en el mundo de IT, como en el de desarrollo o se es un DBA. Para ms datos, visitar:
http://blogs.msdn.com/powershell/archive/2007/11/13/
sql-server-support-for-powershell.aspx.

sitios del mes


La propia MSDN recoge la
actividad de los bloggers ms
destacados (no conocemos el
criterio que siguen), y los agrupa en pginas para los interesados en un lenguaje o tecnologa determinados. Este es el
caso de Visual Basic Blogs (http://msdn2.microsoft.com/
en-us/vbasic/ms789067.aspx#mvp) donde aparecen algunos de
los autores habituales de esta revista.

utilidades del mes


Recover Keys. Una ms que til herramienta ahora que
todos los programas tienen claves, y no siempre hemos
prestado atencin a dnde las guardbamos. Es capaz de
recuperar claves de ms de 140 productos. Una tranquilidad y solo un 1 Mb de descarga (el programa costar
20$ en el futuro, pero es gratuito en la actualidad por
tiempo limitado, otra razn para descargarlo pronto)
El sitio: http://www.giveawayoftheday.com/recover-keys.
bCheck: un sitio de utilidades. Se trata de pequeas utilidades algunas no ocupan ms de 12K, pero son gratuitas
y algunas pueden resultar extremadamente tiles. Como
HoeKey, que permite configurar el teclado como se quiera (cualquier combinacin, cualquier programa), o Capster, que ejecuta cualquier programa al inicio de Windows
solo si la tecla de control est pulsada, o Reso, que lanza
una aplicacin en la resolucin favorita del usuario devolviendo el sistema al estado en que se encontraba al salir
de sta. Por cierto, si alguna vez podemos decir de un sitio
que es minimalista al mximo, es ste: http://www.bcheck.net.

Vous aimerez peut-être aussi