Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y...

60
dotNetManía nº10 diciembre 2004 • Precio: 6,00 (España) Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Orientación al producto versus orientación al procedimiento opinión SpainNet Vocación de comunidad al alcance de todos Arquitecturas Orientadas a Servicios: Una introducción DevPartner Studio Professional Edition Aspectos e intercepción de métodos en .NET o cómo poner la guinda sin estropear el merengue Comunidad Arquitectura Laboratorio dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET Informes y trazado de gráficas 3D en ASPNET (II) • Verificando la seguridad de nuestras aplicaciones • SQL Analysis Services (I)• Trabajando con el registro de Windows Entrevista a Ivan Medvedev miembro del CLR Security Team en Redmond Universidad Proyecto MoMo. Museos, Hormigas y Serialización en el Compact Framework de .Net

Transcript of Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y...

Page 1: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotNetManíanº10 diciembre 2004 • Precio: 6,00 € (España)

Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System

Orientación al producto versus orientación al procedimientoopinión

SpainNetVocación de comunidad al alcance de todos

Arquitecturas Orientadas a Servicios: Una introducción

DevPartner Studio Professional Edition

Aspectos e intercepciónde métodos en .NET

o cómo poner la guinda sin estropear el merengue

Comunidad

Arquitectura

Laboratorio

dotNetManíawww.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

Informes y trazado de gráficas 3D enASPNET (II) • Verificando la seguridad de

nuestras aplicaciones • SQL Analysis Services (I)•Trabajando con el registro de Windows

Entrevista a Ivan Medvedevmiembro del CLR Security Team en Redmond

UniversidadProyecto MoMo. Museos, Hormigas y Serializaciónen el Compact Framework de .Net

Page 2: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración
Page 3: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

Éste es un número con más caras nue-vas de lo habitual. Se estrena YamilHernández, del Grupo Weboo de launiversidad de La Habana, de la mano deMiguel Katrib, ¡cómo no!, quien ademásde escribir, nos ha diseñado la portada deeste mes: “Misión Imposible” que ilustrasu artículo “Aspectos e intercepción demétodos en .NET o cómo poner la guin-da sin estropear el merengue”. Un artí-culo de once páginas en la que describealgunos mecanismos para interceptar lallamada a un método en .NET. Pero noes la única misión imposible de este mes;la otra fue conseguir acercarse siquiera aBill Gates quien pasó por Europa conmotivo del IT Forum en Dinamarca ypasó por España el viernes 19 de noviem-bre, entre grandes medidas de seguridady como un auténtico fenómeno mediáti-co, y con tantos compromisos que es deesos días que uno se alegra de no ser él.¡Pobre hombre!

Y otro estreno con el Proyecto MoMo,o de cómo programar de forma “natural”.Fijándose en el comportamiento de lashormigas cuando buscan comida, JavierJaén, profesor de la universidad politéc-nica de Valencia y un equipo de estu-diantes ha realizado un interesante pro-yecto para la visita asistida a museos.

Fueron los ganadores de la Imagine Cupen España. Espero que cunda el ejemploy otros meses contemos con otros profe-sores que nos expliquen sus proyectos deinvestigación -a ser posible tan bien comoJavier Jaén y José A. Mocholí lo hanhecho esta vez-.

Interesante entrevista a Ivan Med-vedev, miembro del CLR Security Teamen Redmond, realizada por MarinoPosadas, en la que también estuvo pre-sente “activamente” el ya mencionadoMiguel Katrib. Recordarán que Miguelhablaba sobre un problema de seguridaddel CLR en el número 3 de dotNet-Manía. Afirmación con la que SebastianLange program manager, precisamentedel CLR Security Team en Redmond, noestaba de acuerdo y nos lo hizo saber enel número 4. Ivan y Miguel tuvieron oca-sión de comentar éstos y otros temas enel Microsoft Research de este año.

Por último, también se estrenaAntonio Soto, Technical Account Managerde Alcatraz Solutions, quien comienza acolaborar con nosostros con su artículo“Verificando la seguridad de nuestras apli-caciones” que nos describe brevemente lautilización de la no siempre bien conoci-da herramienta Windows ApplicationVerifier.

dotN

etM

anía

<<

3

Misión imposibledotNetManía

Dedicada a los profesionales de la plataforma .NET

Año I •Número 10 • Diciembre 2004Precio: 6€ (España)

EditorPaco Marín

([email protected])

AdministraciónPilar Pérez

([email protected])

Asesor Técnico/CoordinaciónMarino Posadas

([email protected])

RedactoresAntonio Quiros, Guillermo 'guille' Som, Jorge

Serrano Pérez, José Manuel Alarcón Aguín,Luis Miguel Blanco y Manuel Imaz.

Colaboradores habitualesÁngel Esteban, Braulio Díez, Eladio Rincón,

Erich Bühler, Fernando Nogueras, JorgeCrespo Cano, José Miguel Torres, Miguel

Egea, Miguel Katrib Mora (Grupo Weboo),Octavio Hernández, Pablo Abbate, Pedro Pozo,

Pepe Hevia y Salvador Ramos.

Además colaboran en este númeroAntonio López, Javier Jaén y José A. Mocholí

PortadaYamil Hernández

Edición y Suscripciones.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

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

PublicidadMediadev

Sophie Mancini ([email protected])Tf. 93 426 22 57 - 670 99 74 64

Fax. 93 423 11 40

ImprimeGráficas Vallehermoso

www.graficasvallehermoso.com

ISSN 1698-5451

Depósito LegalM-3.075-2004

<<

dnm.editorial

Page 4: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

10dnm.sumario

Orientación al producto versus orientación al procedimiento 9-10Entre las muchas encrucijadas que existen hoy en el ámbito de la Ingeniería del Software,tenemos aquella donde se cruzan dos orientaciones que, no siendo contrapuestas, marcana veces el modo en que los equipos de trabajo se organizan y realizan su labor diaria. Setrata de la orientación al producto frente a la orientación al procedimiento.

Entrevista a Ivan Medvedev 11-13En el evento de Microsoft Research de este año, tuvimos la oportunidad de departircon Ivan Medvedev, del CLR Security Team en Redmond.

Informes y trazado de gráficas 3D en ASP.NET (II) 14-19En esta serie de artículos mostramos varias tecnologías que pueden ser utilizadas enaplicaciones Web y hemos elegido como excusa la creación de informes.

Aspectos e intercepción de métodos en .NET o cómo poner la guinda sin estropear el merengue 20-30

Con los recursos que brinda .NET, es posible desarrollar mecanismos para interceptar lallamada a un método. Una vez interceptada una llamada se puede entonces tomar elcontrol y ejecutar funcionalidades relacionadas con la ejecución del método, pero que noestán incluidas en el código de éste. Este artículo desarrolla y explica tres vías para llevara cabo esta “intercepción”.

Verificando la seguridad de nuestras aplicaciones 32-34Cada vez son más los agujeros de seguridad que explotan los códigos maliciosos,ocasionados por malas prácticas de programación. En este artículo se describe lautilización de una herramienta, Microsoft Application Verifier, que puede ser unbuen primer paso para el testeo de la seguridad de nuestras aplicaciones.

SQL Server Analysis Services. ¡Hola Cubo! (I) 35-38En esta serie de artículos presentaremos un pequeño ejemplo de un DataWarehouse, apartir del cual construiremos una base de datos multidimensional compuesta por un sóloCubo, y que será explotada y analizada con herramientas cliente como MS Excel y MSData Analyzer. El objetivo fundamental es que nos empecemos a familiarizar con estaestupenda herramienta que viene con SQL Server y que en la mayoría de las ocasionesno se utiliza por desconocimiento.

Museos,hormigas y serialización en el Compact Framework de .NET 40-46Hace 4 años, en París y con sólo 2 horas para visitar el Louvre. Así nació MOMO (MuseOMÓvil) en la mente del profesor Javier Jaén. Mediante el uso de un PocketPC inalámbricoy unas cuantas hormigas el visitante puede tener a su alcance una completa informaciónmultimedia optimizada a sus gustos y al tiempo de que dispone.

Trabajando con el registro de Windows 47-49En este artículo se muestran ejemplos de cómo trabajar con el registro de Windows usandoalgunas clases del namespace Microsoft.Win32.Registry.

Arquitecturas Orientadas a Servicios:Una introducción 50-52Introducción a SOA mostrando algunos antecedentes o evolución histórica que permitan,no solamente ubicar al nuevo concepto, sino entender porqué surge, qué problemas resuelve,la forma en que los resuelve, etc.

dnm.laboratorio 53-55DevPartner Studio Professional Edition

dnm.comunidad.net 56SpainNet: Vocación de comunidad al alcance de todos.

dnm.biblioteca.net 57Programming Microsoft .NET XML Web Services (Damien Foggon, Daniel Maharry,Chris Ullman y Karli Watson).Expert Web Services Security in the .NET Platform (Laurence Moroney, Brian Nantz).

dnm.desvan 58dnm

.sum

ario

Page 5: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración
Page 6: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

6

dnm.noticias<<dnm.noticias

Microsoft da a conocer la estrategia y nuevos lanza-mientos de su división de servidores y plataformas

no

ticia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s

BETA 2 DE SQL SERVER 2005 + KIT DE RECURSOS

Microsoft presentó MOM 2005,MVS 2005 y HIS 2004 como un paso másen la consecución de los objetivos de la Iniciativa Sistemas Dinámicos

Microsoft Virtual Server 2005

MVS 2005 incluye una instalaciónsimple y una cómoda gestión de lasmáquinas basada en la Web, así comoun almacenaje robusto y característi-cas de networking. Además las herra-mientas de gestión de los servidoresfísicos de Microsoft y de vendedoresde herramientas de gestión de terce-ras partes han sido actualizadas paraproporcionar a los administradores deuna experiencia uniforme de adminis-tración a través de la combinación deservidores físicos y virtuales. Por ejem-plo, un Virtual Server 2005Management Pack para MicrosoftOperations Manager 2005 habilitará lamonitorización centralizada y la admi-nistración de rendimiento de múlti-ples servidores físicos y virtuales.

Ambas ediciones tienen las mismascaracterísticas y sólo se diferencian enla escalabilidad. Virtu<al Server 2005Standard Edition soporta hasta 4procesadores y Virtual Server 2005Enterprise Edition soporta hasta 32procesadores.

Microsoft Operations Manager 2005

Ha sido presentado MOM 2005en su edición para grandes corpora-ciones y en su edición Workgroup paramedianas empresas.

MOM 2005 incluye un frame-work integrado que ofrece interco-nexiones basadas en servicios Webcon otros sistemas de gestión ya enuso, y una nueva consola que mues-tra el estado del sistema y permiteel acceso al servidor integrado parala elaboración de informes.

MOM 2005 ayuda a los adminis-tradores de TI a convertir los datos degestión en tareas con el conocimien-to avanzado que proporcionan losnuevos paquetes de gestión (para apli-caciones como Exchange, SQLServer, ISA Server, etc.).

La nueva versión de MOM ofre-ce características de seguridad inte-gradas, tales como la capacidad deautentificar mutuamente a agentes yservidores, que está diseñada para ayu-dar a las empresas a protegerse con-tra el mal uso del sistema de gestión.

Microsoft Host Integration Server 2004

HIS 2005 incluye las recientementedesarrolladas herramientas de diseñoTransaction Integrator (TI), que funcio-nan en el contexto del entorno de desa-rrollo integrado de Visual Studio .NET2003. Las herramientas TI permiten alos desarrolladores de Windows apro-vechar aplicaciones existentes de siste-mas host por línea de negocios como ser-vicios web XML o componentes del ser-vidor Microsoft .NET, que se puedenutilizar en una solución con arquitectu-ra orientada a los servicios (SOA).

HIS 2004 proporcionan a los clien-tes las herramientas para crear serviciosweb XML, que en última instancia pue-den ser consumidos y reutilizados enuna solución basada en SOA para alcan-zar este objetivo. Además Microsoft harealizado inversiones importantes enHIS 2004 que impulsarán la capacidadde los clientes para integrar diferentesaplicaciones y mejorar la interoperati-bilidad entre los sistemas host de IBMy las bases de datos DB2 y WindowsServer y SQL Server.

Este mes incluimos, con lacolaboración de MicrosoftIbérica, un kit (en inglés) condos CDs y un DVD cuyo con-tenido es el siguiente:• SQL Server 2005 Beta 2

Developer Edition. Ademásde la Beta 2 se incluye docu-mentación y ejemplos.

• SQL Server 2005 Beta 2DVD de recursos. Esta essu guía para SQL Server2005, con documentos yrecursos técnicos de granvalor que le ayudarán aempezar con SQL Server2005. Incluye además vídeos

técnicos, herramientas ydemostraciones.

• SQL Server 2005 Beta 2Laboratorios de prácticas,que ofrecen a los usuariosuna experiencia prácticaguiada de autoformaciónsobre áreas tan importantescomo las herramientas admi-nistrativas, seguridad, dise-ño de bases de datos e inte-ligencia de negocio (BI).

Para más información en cas-tellano sobre SQL Server 2005visite: www.microsoft.com/spain/-SQL/2005.

Page 7: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dnm.noticias<<

dnm.noticias

dotN

etM

anía

<<

7

Las novedades que incluyeInfragistics NetAdvantage Volumen 3 son un nuevo ycompleto motor de cálculo (CalcEngine) que le da toda lapotencia de Microsoft Excel a sus formularios de Windowsy a sus aplicaciones ASP.NET, una vista al estilo de Office2003 y Visual Studio 2005, etc.

Infragistics NetAdvantage 2004 Volumen 3 esel único entorno de componentes de presentaciónpor capas diseñado para darle todo lo que necesi-ta para crear GUIs pulidos y robustos para entor-nos Microsoft. Cuando está desarrollando en.COM, .NET o ASP.NET, NetAdvantage 2004le trae el sistema de herramientas correcto parasu trabajo, permitiéndole crear fácilmente inter-faces con la sofisticación y la usabilidad que seencuentra en las aplicaciones comerciales más

reconocidas hoy como Microsoft Office, Windows yOutlook. Más información en www.infragistics.com.

Infragistics NetAdvantage Volumen 3 salió al mercado enOctubre de 2004, pero a partir del 1 de diciembre, Abox ofre-cerá una mejora en el precio. Puede consultar en www.abox.com.

Infragistics NetAdvantage Volumen 3

ILOG presenta Rules for .NET,el primer sistemapara gestionar políticas empresariales desde WordEs el primer sistema de gestión de reglas de negocio que se integra conOffice y Visual Studio .NET y con los servicios de colaboración de SharePoint.

Las reglas de negocio proporcionan una for-ma probada de captar la lógica de negocio de las

aplicaciones empresariales. Un Sistema para la Gestión de las Reglasde Negocio o BRMS (Business Rule Management System) es unasolución diseñada para modificar y gestionar las reglas de nego-cio fuera de estas aplicaciones.

ILOG Rules for .NET permite la gestión de las reglas denegocio a lo largo del ciclo de vida de las aplicaciones de nego-cio de misión crítica. Para los analistas y otros usuarios de nego-cio, proporciona herramientas de creación y gestión integradasen Microsfoft Office System y un interface basado en la Web.

Para los arquitectos y desarrolladores de software, proporcionaun conjunto de herramientas dentro de Microsoft Visual Studio.NET para integrar la tecnología de reglas de negocio de ILOGdirectamente en las aplicaciones .NET.

ILOG Rule Studio for .NET

Incluye una amplia operativilidad para desarrollar y gestio-nar aplicaciones de reglas de negocio: integración con VisualStudio .NET, vista del modelo de objetos de negocio, editor dereglas de negocio y ejecución directa sobre objetos .NET.

ILOG Rule Engine for .NET

El motor ILOG Rule para .NET proporciona a los desa-rrolladores de .NET el poder y la versatilidad necesaria paralas exigentes aplicaciones de hoy en día:

• Motor de reglas nativo de .NET. Escrito enteramenteen C#, es un ensamblado que puede ser usado por cual-quiera de los lenguajes de .NET.

• Alto rendimiento y escalabilidad.• Soporte para distintas fuentes de datos. Puede acceder

a numerosas fuentes de datos, incluyendo objetos .NET,antiguas aplicaciones COM(+), documentos XML, ser-vicios Web, colas de mensajes, directorio activo y alma-cenes de datos de Exhange Server.

Puede obtener más información en la web del productoen http://rulesfordotnet.ilog.com.

Page 8: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

8

dnm.noticias<<

Microsoft IT Forum 2004Conferencia europea para profesionales TI, arquitectos de sistemas y aplicaciones,especialistasy administradores.

En días pasados,del 15 al 19 denoviembre, ha teni-do lugar en la ciudad

de Copenhagen el IT Forum 2004, el que qui-zás sea el mayor evento para IT Pros de todoslos que se celebran en Europa. Este año el even-to contó con la presencia de Bill Gates que par-ticipó en la primera de la keynote junto con Jean-Philippe Courtois, responsable en Microsoft paraEMEA con una charla titulada “The Magic ofSoftware”. En dicha charla resaltó la importan-cia del software y en general de la informáticacomo herramienta que permita a las personasdisfrutar de una vida mejor al mismo tiempoque exponía las iniciativas que están en marcha

en áreas como la gestión de identidades, anun-ciando el lanzamiento de una SmartCard basa-da en .NET, o la gestión de sistemas engloba-da en lo que Microsoft denomina DSI (DynamicSystems Initiative). Posteriormente, ScottCharney ya en una segunda keynote habló sobrelas iniciativas y el punto de vista de Microsoften temas relacionados con la seguridad, área dela cuál es uno de los máximos responsables enla compañía.

El evento, que se desarrolló con una logís-tica y planificación similar a la que Microsoftnos tiene acostumbrados con eventos como elTechEd, contó con múltiples charlas en áreascomo la administración y la gestión de sistemas,la gestión de datos, la planificación y desplieguede sistemas, soluciones de infraestructura, men-sajería y movilidad y, por supuesto, cómo no,seguridad. A mayores múltiples Hands-On-Labso talleres donde entrenar los conocimientosadquiridos en las conferencias y los inestima-bles Ask The Experts, que contaban con nom-bres como Ron Talmage, Gianluca Hotz oJimmy Andersson entre muchos otros.

En el capítulo de novedades o lanzamien-tos, los asistentes han podido trabajar ya en losHands-On-Labs con una beta de WindowsUpdate Services, o lo que es lo mismo, Software

Update Services (SUS) 2.0. Entre las nuevas carac-terísticas, una muy importante: con WUS sere-mos capaces de distribuir actualizaciones paraWindows pero además también para Office,Exchange y SQL Server. Sobrevolando en todomomento el Bella Center de Copenhagenestaba el lanzamiento de Microsoft OperationsManager (MOM) 2005 y de Virtual Server 2005,el hermano de Virtual PC 2004 orientado a ser-vidores que cuenta con novedades interesantescomo la posibilidad de desplegar sobre una mis-ma máquina física varias máquina virtuales queconformen un cluster de Windows.

Y de Copenhagen nos traemos una estu-penda noticia; en el año 2005 el IT Forum ten-drá lugar en… ¡Barcelona! Tomad nota, tene-mos todos una cita del 15 al 18 de noviembredel año próximo en el IT Forum 2005.

Macrovision ha anunciado la nueva ver-sión 10.5 de InstallShield. Entre las nue-vas características se incluye:• Característica Trialware.Puede convertir

en un producto completo, uno de eva-luación en pocos pasos.

• Soporte para MSI 3.0.• Diseño Colaboración. Introduce ensambla-

dos reusables, versionables y componen-tes modulares que pueden ser incorpora-dos en diferentes instalaciones.

• Vista de cambios XML. Permite actualiza-ciones automáticas de ficheros de confi-guración XML en las máquinas destino,sin que sea necesario escribir códigocliente.

• Repositorios locales y en red. Permite a losusuarios compartir y reutilizar elemen-tos comunes entre múltiples proyectos deinstalación.

Borland presentó Delphi 2005 enMadrid y Barcelona

Borland, conjunta-mente con Danysoft,celebró sendos semina-rios en Madrid yBarcelona para presen-tar las novedades deDephi 2005. Las pre-

sentaciones corrieron a cargo de OctavioHernández, director técnico deDanysoft y Jason Vokes, jefe deproducto para Delphi.

La agenda de los semina-rios fue:

• Delphi 2005. Presentaciónpor Jason Vokes.

• Ventajas de Delphi 2005para ADO.NET.

• Desarrollo de aplicacio-

nes y servicios Web ASP.NET.• Desarrollo de aplicaciones para

Win32 y .NET.• Panel de expertos.Puede obtener información de

Delphi 2005 en el número 9 dedotNetManía, o en www.borland.es oen www.danysoft.com.

Nuevo InstallShield 10.5

dnm.noticias

Page 9: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

9

y mucho se hablará aún, acerca de cómodebe fabricarse el software. Pero, en general, pode-mos conceptualizar las orientaciones actuales endos frentes diferentes:1) Quienes ponen el acento en fabricar un buen pro-

ducto. Para ellos lo importante es la calidad dela solución final sin importar tanto el métodode fabricación o el modelo de colaboración quese haya puesto en práctica para regular las rela-ciones con él. Hablando en términos algo vul-gares podríamos decir que, para los que siguenesta orientación, el fin justifica a los medios.Podemos afirmar que todos aquellos que hablande metodologías ligeras, ágiles, ExtremmeProgramming, etc. son los principales detenta-dores de esta afirmación.

2) Quienes ponen el acento en tener un procedimien-to riguroso de fabricación y un modelo de colabora-ción con el cliente lo más determinado posible. Paraellos lo importante es el rigor en el proceso deconstrucción a fin de que las partes contratan-tes y ejecutoras del proyecto tengan en todomomento claro que la fabricación se hará deacuerdo a unas normas y que los aspectos con-tractuales y económicos del proyecto se cuida-rán sobre cualquiera otros. CMM (CapabilityMaturity Model) es quizá el paradigma de losque defienden este punto de vista.Lo normal es que ambas posiciones, si se extre-

man, conduzcan a situaciones paradójicas que, sinduda, debemos evitar. Así, pues, no creo que unequipo de desarrollo pueda concentrarse en obte-

ner el mejor producto posible si, mientras tanto,su empresa se está arruinando porque el cliente,enfurecido por la anarquía y el caos presente duran-te el proceso de desarrollo, no paga ninguna de lasfacturas. Podemos estar orientados a realizar elmejor producto entre los posibles, pero si nos olvi-damos de que hay fechas que cumplir y lo sacamosun par de años más tarde de lo que estaba previs-to seguro que nuestro cliente no nos felicitará porel servicio prestado. Por el contrario, si nos con-centramos en sólo la forma, si guardamos las medi-

das más reglamentarias y hacemos que la planifi-cación del proyecto, las actas, las comunicacionesinternas, etc., sean nuestras herramientas de tra-bajo, pero no cuidamos de modo especial la cali-dad del producto final, estaremos igualmente per-didos. Nuestro cliente nos mantendrá su créditode credibilidad mientras dure el proyecto, anima-do por las buenas formas y un modelo de colabo-ración muy cuidado, pero explotará su cólera alfinal cuando compruebe que el producto obteni-

Orientación al producto versus orientación al procedimiento

Por Antonio QuirósGeneral Area ManagerAlhambra-Eidos

Entre las muchas encrucijadas que existen hoy en el ámbito de la Ingeniería delSoftware (perdón, ahora se llama Arquitectura, yo es que soy de letras y, por tanto,un poco lerdo), tenemos aquella donde se cruzan dos orientaciones que, no sien-do contrapuestas,marcan a veces el modo en que los equipos de trabajo se orga-nizan y realizan su labor diaria. Se trata de la orientación al producto frente a laorientación al procedimiento.

Mucho se ha hablado,<<

Muchos hubieran deseado nacer en otra época o que Cobol no

se hubiera acabado nunca

Page 10: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

do no responde a los estándares de calidad necesa-rios para su implantación con éxito.

¿Hacia dónde debe, pues, orientarse una empre-sa de servicios que desarrolle software para clien-tes o incluso un departamento de informática inter-na de cualquier corporación que deba desarrollar,igualmente, proyectos de software para los distin-tos departamentos de la misma? La respuesta a estapregunta no está en una afirmación rotunda hacianinguno de los dos componentes del binomio orien-tación al producto / orientación al procedimiento;desde mi punto de vista, lo que tenemos que haceres indagar acerca de la prelación que existe entreambas orientaciones para tratar de adecuar nuestraacción empresarial y tecnológica en función de loque descubramos.

A mí, y es una opinión estrictamente personal,no me cabe la menor duda de que el orden de pre-lación coloca en un nivel más relevante la orienta-ción al producto y, en segundo lugar, la orientaciónal procedimiento. ¿Quiero decir con esto que loque podemos hacer es olvidarnos de la orientaciónal procedimiento y centrarnos en la orientación alproducto? Ni mucho menos. Simplemente quieroindicar que un cliente quizá pueda perdonarnos difi-cultades en el modelo de colaboración pero, desdeluego, lo que no va a perdonarnos es la fabricaciónde software deficiente, escasamente probado, quea duras penas cumpla con los requisitos pedidos oque se encuentre obsoleto en cuanto a su concep-ción funcional y/o tecnológica.

Las empresas, no obstante, deben cuidar amboselementos en general. No es concebible que unacompañía actual que esté desarrollando software noesté pensando continuamente en formar y certifi-car a sus técnicos para que sus logros tecnológicossean cada vez mejores, pero tampoco es concebibleque no esté, en paralelo, activando políticas paralograr implantar abordajes metodológicos (CMMu otro cualquiera) que hagan más viables y senci-llos los proyectos.

Muchos pensarán que si ya es muy fuerte el con-tinuo tesón para estar al día tecnológicamente, loque ya nos desborda es tener que estarlo también

en la parte metodológica y procedimental.Efectivamente, muchos hubieran deseado nacer enotra época o que Cobol no se hubiera acabado nun-ca, pero la realidad es bien diferente y la compleji-dad es una tendencia irreversible dentro de nues-tro mundo. No podemos invertirla, no podemosbuscar la simplicidad porque la simplicidad perte-nece a un pasado mítico del hombre que ya no vol-verá (salvo catástrofe natural o nuclear). Por tantono sirve quejarse sino ponerse a trabajar.

Otro aspecto interesante que me gustaría resal-tar es la utilización de los aspectos procedimenta-les como barreras para detener las lógicas preten-siones de nuestros clientes respecto a que el soft-ware construido para ellos, además de estar reali-zado de modo formalmente correcto, funcione.Lógica pretensión, por otra parte, si consideramosque se suelen invertir decenas de miles, centenasde miles o incluso millones de euros en proyectoscuya finalidad es la de satisfacer las necesidades denegocio de los clientes. Esto debe llevarnos a con-siderar que, por encima de la orientación al pro-ducto y/o de la orientación al procedimiento debesobreponerse un valor de mucha mayor importan-cia que es la orientación a satisfacer las necesida-des del negocio de nuestro cliente. Por esto me gus-ta MSF (Microsoft Solutions Framework) porque creoque coloca todos estos elementos en el orden deprelación razonable entre ellos y, desde luego, alasunto de la satisfacción de las necesidades del nego-cio del cliente por encima de cualquier otro.

A poco que nos paremos a pensar, todo estoparece conducirnos a un consejo de radical impor-tancia y es la reeducación de nuestras mentes para,a modo de como lo hacemos en un armario, colo-car en ellas las cosas en los lugares adecuados, lascamisas en las perchas, los calcetines con los calce-tines y las corbatas en el corbatero. Hay muchosdesarrolladores, o muchas empresas de desarrolloal completo, que tienen muy mal colocado su arma-rio y a lo mejor han colgado los calcetines de lasperchas y amontonado las camisas al lado de loszapatos. Este proceso es difícil, ya que los prejui-cios y la educación amontonada durante años nosdificultan el trabajo, sin embargo es una laborimprescindible. En este proceso sólo sobreviviránlos que mejor se adapten a la complejidad de nues-tro mundo, los que comprendan que nuestros clien-tes sólo nos contratarán si construimos softwarecon el mejor método y con el mejor resultado posi-ble y siempre pensando en que somos sólo una par-te del engranaje de negocio de nuestros clientes yno una pieza imprescindible y autónoma. Los deli-rios de grandeza no nos llevarán más que al fraca-so. La humildad de reconocer nuestras limitacio-nes y defectos es lo único que nos puede conducira superarlos y crecer continuamente.

dotN

etM

anía

<<

10

dnm.opinion<<

No es concebible que una compañía actual que esté desarrollando software no esté

pensando continuamente en formar y certificar a sus técnicos.

Page 11: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

11

en esa ocasión el pro-fesor Miguel Katrib de la Universidadde La Habana, quien había estado inves-tigando temas de introspección de tipos(Reflection) y su relación con la seguridad(ver nº3 de dotNetManía).

Miguel Katrib: Escribí código para“factorizar” una clase utilizandoReflection.Emit, y observamos que el sis-tema no comprobaba el tipo de retornodel método, pero eso sólo ocurría cuan-do el valor SkipVerification mostraba unvalor verdadero. Mi pregunta es ¿porquéeste valor está asignado a verdadero pordefecto?

Ivan Medvedev: Efectivamente,pero eso sólo es cierto cuando la ejecu-ción es de código local. Lo que se pretende con esoes que el código de la propia máquina tenga los mayo-res permisos de cara al propio desarrollador. Hayvarios niveles, uno de los cuales es FullTrust, queincluye lo anterior.

Miguel Katrib: Entiendo, pero si en Visual Studiotenemos la posibilidad de prohibir la ejecución de códi-go desde diversos escenarios, ¿por qué necesitamosque ese valor sea verdadero?

Ivan Medvedev: Por que -por ejemplo- cuandotrabajas en C++, algunas veces hay que trabajar sin veri-ficación. Pongamos que trabajas con algún puntero, oacceso directo a la memoria. En esos casos, el compi-lador produce código no verificable y la única forma de

ejecutar ese código es tener permiso del tipoSkipVerification. Nosotros queríamos permitir que todoslos programas que se ejecuten manualmente desde lamáquina local tuvieran todos los permisos necesarios.La mayoría de las veces, tu código en la máquina locales propio y por tanto, seguro. Otro tema es que te bajesprogramas de Internet. Eso no puede ser seguro pordefecto, más bien lo contrario.

Miguel Katrib: ¿No hubiera sido mejor separaresos conceptos (cuando se necesitan punteros y demás)de los otros casos?

Ivan Medvedev: No porque lo que pretendíamoses que existiera una flag única que otorgase los per-misos para estos casos. Otra situación pensamos que

Entrevista a Ivan Medvedev

Por Marino PosadasMVP Visual Developer C#Alhambra-Eidos www.elavefenix.net

<<

Microsoft se adscribió a la iniciativa Trustworthy Computing (Informática Fiable) desde sus inicios. Suadopción, se extendió de forma natural a las plataformas de desarrollo, y en concreto, al propiomotor de .NET Framework (el CLR). En el evento de Microsoft Research de este año, tuvimos laoportunidad de departir con Ivan Medvedev, del CLR Security Team en Redmond.

Nos acompañó

Page 12: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

12

dnm.directo.entrevistas<<

hubiera resultado confusa de cara aldesarrollador.

Marino Posadas: Bien. Vayamosuna vez aclarado esto a cuestiones másgenéricas de seguridad. El otro día veíaun ejemplo de tu Web sobre cómo nose deben hacer algunas cosas (un cole-gio presentaba exámenes on-line, y lasrespuestas podían deducirse a partir delanálisis del código fuente). ¿Crees queesa es una práctica común?

Ivan Medvedev: Sucede más de loque se piensa. También depende delnivel de conocimientos del desarrolla-dor, claro. Por ejemplo, en Microsoft,tenemos un programa de formación lla-mado Monitoring Security Training, ycada ingeniero conoce el significado dela seguridad, o dónde tiene que acudirpara encontrar recursos asociados a laseguridad. Quizá no pasa lo mismo enempresas más pequeñas o en algunoscentros de enseñanza.

Marino Posadas: Ahora sabemosque Longhorn va a ser un sistema admi-nistrado. Eso quiere decir que en granmanera la seguridad del nuevo sistemava a estar vinculada a la seguridad delpropio CLR. ¿Podremos utilizar estascaracterísticas en el nuevo sistema paraevitar spam, spyware y otros elementosindeseables de Internet?

Ivan Medvedev: Sí, por supuesto.En Longhorn va a haber muchas API'sadministradas, y en suma, todo el siste-ma va a ser mucho más seguro, por quela propia plataforma .NET lo es.Supongamos un caso típico de explota-ción, los buffer overrun, por que existeun control administrado de esos búfe-res. Y hay muchísimos otros ejemplosque podría citar aquí. También es una

forma de hacer que los programadorespuedan escribir código más seguro deforma simple, gracias a que la platafor-ma misma lo soporte.

Marino Posadas: ¿Los llamadosspyware o adware utilizan igualmente esastécnicas para su intrusión?

Ivan Medvedev: Podrían utilizar-las a veces para conseguir instalarse. Unavez instalados, ya no. Lo que nosotrosqueremos es evitar que ese tipo de soft-ware llegue a instalarse.

Marino Posadas: ¿Podríamos decirque también aquí el futuro es la espe-cialización?

Ivan Medvedev: En Longhornvan a existir muchísimas más clasesadministradas, lo que va a hacer inne-cesarias muchas de las llamadas a lasAPI's actuales. Pero la especializaciónva en aumento, sí.

Marino Posadas: Desde el puntode vista de la seguridad, ¿qué piensas dela herramienta de ofuscación de código(Obfuscator) que viene con Visual Studio?

Ivan Medvedev: La ofuscación noes sino una técnica más. Puede hacerque un hacker tenga bastante más difí-

cil el acceso al código fuente, pero ensí misma no es suficiente. Pero no escomo convertirlo a código nativo. Ahísi que las cosas son mucho más difíci-les, por que aunque uses un desensam-blador, todo es mucho más difícil deleer y de entender.

Marino Posadas: En tu sitio Webhe leído acerca de la posibilidad de quela próxima versión de .NET no permi-ta la posibilidad de deshabilitar la segu-ridad. ¿No piensas que eso es una cues-tión personal?

Ivan Medvedev: Ahora existenvarias formas de deshabilitar la segu-ridad. La que yo quiero eliminar estárelacionada con un parámetro de lautilidad caspol que anula todo tipo deseguridad. Esto es peligroso por quealgunas veces, los usuarios que noconocen bien los problemas de segu-ridad, pueden provocar (y provocarsea sí mismos) problemas debido a estatécnica. Sin ese parámetro, tambiénexiste la posibilidad de deshabilitarmuchas características de seguridad,pero son formas que implican unmayor conocimiento de lo que estáshaciendo y sirven de recordatorio dela situación.

Marino Posadas: ¿Crees que lautilidad FxCop debería de estar inclui-da en la próxima versión de VisualStudio .NET?

Ivan Medvedev: FxCop es unaexcelente herramienta y yo la he reco-mendado muchas veces. De hecho has-ta cierto punto yo estuve implicado ensu desarrollo…

Marino Posadas: No me refierosólo a esa herramienta, en realidad, sinoa si la versión 2.0 va a incluir más herra-mientas en su SDK…

En Longhorn va a haber muchas API's administradas y, en suma, todo el sistema va a ser mucho más seguro,

por que la propia plataforma .NET lo es

Page 13: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

13

dnm.directo.entrevistas<<

Ivan Medvedev: Con toda seguridad. Aunque nopuedo decir que FxCop vaya a estar incluido en estaversión, pero sería una buena idea.

Marino Posadas: Y una pregunta que he hecho aRafal Luckawiecki, anteriormente, ¿la seguridad ple-na en la red necesitará de la Criptografía?

Ivan Medvedev: Si por seguridad entendemosprotección de datos, en muchas ocasiones sí, esa seríauna de las mejores soluciones. En realidad, la mayo-ría de los algoritmos criptográficos ya están bienestablecidos, y Microsoft no necesita realizar muchainvestigación al respecto. Nosotros mantenemoscontactos con universidades en las que se investiganlas aplicaciones de esos algoritmos y más tarde losaplicamos en algunos de nuestros productos. Perola investigación criptográfica es un esfuerzo a nivelmundial.

Por el contrario, si hablamos de aplicar esos algo-ritmos a protocolos de comunicación muchas vecesdepende de dónde vengan esos algoritmos. A veces vie-nen de organizaciones de estandarización, como laW3C, y otras veces de compañías privadas como lanuestra. Si están bien hechas pueden reforzar la segu-ridad, no cabe duda.

Marino Posadas: ¿Crees que la inversión en elconocimiento de estas tecnologías es una inversiónrecomendable?

Ivan Medvedev: Completamente. En el futuro,la seguridad se va a convertir cada vez más en un ele-mento crucial a tener en cuenta y conocer la seguri-dad de diferentes productos y compañías nos ayudaráa reforzar nuestros propios sistemas.

Marino Posadas: Una cuestión acerca de la polí-tica empresarial de seguridad. ¿Qué recomiendas a lasempresas que hagan respecto a la seguridad?

Ivan Medvedev: Creo que cualquier inversiónque realicen las empresas en ese sentido va a ser crí-tica a medio, e incluso a corto plazo. Nadie quieredistribuir productos inseguros en un mundo comoel de hoy, y los clientes empiezan a demandar esa

seguridad de las empresas que se dedican al desa-rrollo. Y lo que es bueno para los clientes, lo serápara las empresas.

Incluso podría recomendar algunos excelenteslibros al respecto, como la obra de Michael Howardy David C. LeBlanc, “Writing secure code”, que enMicrosoft es de lectura obligatoria para todos losdesarrolladores.

Miguel Katrib: ¿Harías esa recomendación tambiénpara los profesores que enseñamos informática?

Ivan Medvedev: La seguridad es una materiamuy extensa. Creo que merecería un curso aparte yser tratada en profundidad. Es difícil enseñar a la gen-te a escribir código seguro, especialmente a aquellosque nunca antes han pensado en la seguridad. Creoque con los buenos libros que existen actualmente

sobre seguridad, sepodría confeccionar uncurso excelente sobre eltema. La obra que citéanteriormente, está muybien estructurada, porejemplo, y podría servirde modelo.

Miguel Katrib: noso-tros intentamos hacerlocubriendo diferentes esce-narios de seguridad. Quizáeso no abarca todo lo nece-sario, pero es una aproxi-mación.

Ivan Medvedev :Creo que los estudiantes

y/o desarrolladores deberían comprender primeroqué es lo que sucede si no se hace el código seguro.Entender algunas de las más importantes vulnera-bilidades ayudaría a tenerlas en cuenta. Por ejem-plo, si los usuarios comprenden bien lo que es undebilidad del tipo buffer overrrun, la próxima vez queescriban algo que tenga que ver con búferes recor-darán esto y podrán sugerir soluciones.

Creo que los estudiantes y/o desarrolladoresdeberían comprender primero qué es lo que

sucede si no se hace el código seguro.Entender algunas de las más importantes

vulnerabilidades ayudaría a tenerlas en cuenta

Page 14: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

14

motivado particularmente por el hecho de quemuchas de las tecnologías parecen orientadas origi-nalmente a soluciones para ambientes Windows yfinalmente la gran parte de los desarrolladores des-conocen cómo sacar provecho en lo que a la Webrespecta. De esta forma he decidido elegir de excu-sa este tema para explicar varias utilidades desco-nocidas quizá para muchos de ustedes y he dejadode lado solamente durante estas entregas mis clási-cos artículos que apuntan a un nivel más bajo de lainfraestructura. ¿Le dice algo Office Web Components11.0 o ASP.NET Reports Starter Kit?. Si no sabe delo que le estoy hablando es buena idea que continuecon la lectura ya que de esta forma logrará dos obje-tivos: el primero, crear informes Web con resulta-dos más que espectaculares; el segundo, conocer unpar de tecnologías que tienen mucho para ofrecer.

En el artículo anterior vimos cómo utilizar traza-dos GDI+ y plasmarlos en una página de servidor acti-vo ASP.NET para finalmente enviarlo a un clienteWeb (Internet Explorer, Netscape, etc.). Aquí apren-deremos un poco de arquitectura, organización y -loque es más importante- cómo poner todo esto a fun-cionar en informes bajo un ambiente Web.

Por donde empezar…Por supuesto que existen varias herramientas

para generar visualmente informes, muchas de lascuales son versátiles y fáciles de utilizar, aunquetambién algunas de éstas tienen un precio un tan-to inaccesible por lo menos para mi bolsillo. Por

otro lado en algunas ocasiones se busca generarreportes sencillos o los que corresponden a losdenominados “informes estándares” (relaciones,subtotales, etc.). Es aquí donde es posible encon-trar otras alternativas fáciles y sin coste alguno; yun buen ejemplo de ello es ASP.NET Reports StarterKit (www.asp.net). A diferencia de lo que se puedepensar inicialmente, esto no es una herramientasino que se trata de una aplicación VS.NET quemuestra 8 ejemplos de informes y diferentes prác-ticas y tecnologías que pueden ser aplicadas pararesolver cada caso. Es así que ASP.NET ReportsStarter Kit es un proyecto de ejemplo que enseñahábitos “sanos” de programación así como la cre-ación de informes sin necesidad de utilizar con-troles de otros fabricantes. A su vez no sólo demues-tra la forma de crear el mismo, sino que tambiénla manera de realizar optimizaciones para su impre-sión. Pero sin lugar a dudas esto sigue siendo lomenos importante ya que a mi criterio lo que másresalta es la vía en la que está programado, esto es,utilizando gran parte de las recomendaciones deMicrosoft para proyectos ASP.NET. Es así queStarter Kit es también una maravilla desde el pun-to de vista de programación y organización, y seincluye tanto la versión en VB.NET como C#, loque puede ser ampliamente beneficioso si prefierealgún lenguaje en particular. Como de costumbreintentaré mostrar ejemplos en los dos lenguajespara que ambos bandos se sientan cubiertos.

Pero antes de comenzar es necesario instalarASP.NET Reports Starter Kit, el que además de esta-

Informes y trazado de gráficas 3D en ASP.NET (II)

No debo ocultar por más tiempo el objetivo de esta serie de artículos que a simple vista secentra en enseñar la vía de crear informes en ASP.NET. Se habrá dado cuenta si leyó la pri-mera parte que en realidad he querido mostrar varias tecnologías que pueden ser utilizadasen aplicaciones Web y por ello he elegido como excusa la creación de informes.

<<

Por Erich Bühler.NET Framework y VB.NET MVPwww.VBLibros.com

Esto ha sido

Page 15: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

blecer una carpeta para el código fuen-te, crea una base de datos SQL Servery configura la carpeta virtual para el pro-yecto Web. Si no cuenta con SQLServer es posible realizar algunos cam-bios para adaptar este proyecto con elfin de que haga uso de otra base dedatos, pero por supuesto esto implicalidiar con el código y entender cómo fueprogramado.

Una vez instalado se habrá creadouna base de datos llamada Reports yuna carpeta virtual. Es factible abrirel proyecto desde Visual Studio indi-cando este directorio virtual o acce-der directamente a la página de iniciomediante el explorador. Básicamentela página principal permite seleccio-nar uno de los 8 diferentes tipos deinformes (ver figura 1).

Todos ellos representan casos están-dares de la programación universalcomo pueden ser un listado tabular,maestro/detalle, visual empleando ungráfico de tarta 2D, etc. Por supuestoque todo esto sin hacer uso de un solocontrol de terceros Activex/ensambla-do, basado meramente en programación.NET framework.

Si se accede a un informe (figura 2)podrá ver una breve explicación sobresu funcionamiento, los controlesASP.NET empleados para su construc-ción, sus dependencias, etc. Sin lugar adudas que es un candidato ideal paraaprender mucho sobre .NET frame-work, programación y más.

En algunos casos el informe puedeser empleado prácticamente sin cam-bios, aunque debo admitir que en otros,

tan sólo los conceptos pueden ser utili-zados. Esto es así ya que en realidad cadainforme está “atado” a una tabla, suscampos y la lógica específica.

Le propongo desmenuzar uno delos informes para luego jugar un pococon éste y agregarle algo de códigoque haga uso de Office Web Components11.0, esto es, un conjunto de compo-nentes que nos permitirán realzar lapresentación Web mediante gráficostridimensionales.

Desmenuzando el listadojerárquico

El listado jerárquico se compone detres diferentes DataGrids, aunque sola-mente uno de ellos es visible inicial-mente. El mismo contiene totales deventas agrupados por zonas (o territo-rios). A su vez se cuenta con un controlcombo en la parte superior que haceposible seleccionar un año, lo que refres-cará automáticamente al DataGrid infe-rior. También implementa paginacióny como si fuera poco cada uno de loselementos de la lista se exhibe como unhipervínculo (figura 3).

Cuando se hace clic sobre un ele-mento se muestra un segundo DataGrida la derecha con los empleados perte-necientes a dicha zona y sus subtotalespresumiblemente de ventas. Finalmentesi se hace clic en el empleado apareceun tercer DataGrid con la informaciónpersonal del mismo. Puede seleccionarotra zona lo que hará comenzar con esteciclo nuevamente.

Como se puede apreciar, la infor-mación es navegada dinámicamente loque permite al usuario ir más allá delclásico informe estático. Básicamenteeste informe es un WebForm que cuen-ta con 3 controles DataGrid, de los cua-les 2 son invisibles al comienzo. El pri-mer DataGrid muestra sus elementoscomo hipervínculos lo que hace queellos puedan ser seleccionados. Éste seencuentra enlazado al procedimientoalmacenado SalesbyTerritory (ventaspor territorio) y cuando se produce elclic sobre uno de los valores, el segun-do DataGrid es enlazado al procedi-miento almacenado GetEmployeeSales-ByTerritory (obtener ventas de emple-ados por territorio) no sin antes utilizarla primera selección como filtro. Lomismo sucede con el último DataGrid,el que llamará a GetEmployeeById (obte-ner empleado por identificador) con elparámetro seleccionado en la lista ante-rior y en la primera.

Como vemos el segundo y tercerDataGrid dependen de la selección delinicial para exhibir sus datos. Voy a dete-nerme un segundo en la técnica que seemplea para el pasaje de informaciónentre ellos, ya que creo que puede serampliamente utilizada en varios con-textos.

dotN

etM

anía

<<

15

dnm.asp.net<<

Figura 1

Figura 2

Figura 3

Page 16: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

El fuente 1 nos muestra un resu-men de la plantilla del primerDataGrid, la misma provee un botónde link (1) lo que hará que el conte-nido sea exhibido como hipervíncu-lo. A su vez los elementos a mostrarserán el valor del campo de la base dedatos TerritoryDescription, y esto selogra mediante la evaluación en tiem-po de ejecución ofrecida por la sen-tencia DataBinder (4). También se pro-vee una hoja de estilo en cascada paramejorar la presentación (3). Sinembargo el punto 2 es el que hace quela “magia” funcione y que se le pasea la segunda lista el valor selecciona-do en la primera.

CommandArgument es una propiedaden la que es posible especificar cualquiercontenido, lo interesante es que el valorincluido aquí será transferido a un argu-mento del evento clic del DataGrid.Veamos un segundo la línea en cuestiónen el fuente 2.

En este caso el evento clic recibi-rá el contenido del campo de la filaseleccionada por el usuario, el que esutilizado para filtrar el segundoDataGrid. Incluso se podría especifi-car un campo de la base de datos dife-rente al mostrado en la lista, este es elcaso cuando se tiene un código y unadescripción y se desea exhibir unopero filtrar por el otro. En el lado del

servidor el valor se obtiene fácilmen-te como detalla en el fuente 3.

La implementación del tercerDataGrid es similar a lo que ya vimosen el segundo, salvo que en vez deindicarse tan solo un valor se debenpasar 2, esto es, el territorio seleccio-nado en la primera lista más la selec-ción actual (fuente 4).

En el evento clic es necesario apli-car un pequeño truco para aislar los 2datos. Como exhibe el fuente 5 estose logra convirtiendo al resultado enuna matriz utilizando de delimitadorla coma.

Aunque ésta ha sido la implementa-ción realizada por Microsoft me atrevoa decir que en general es recomendableusar un carácter diferente a la coma (unoque difícilmente se incluya), ya que parael caso que la misma aparezca en la des-cripción de un territorio se produciráun fallo en la aplicación debido a que laconversión será finalmente errónea.

Informes en arquitectura detres capas

Como mencioné al comienzo delartículo los informes hacen uso de doscaracterísticas dignas de ser comenta-das. Por un lado la lógica de cada infor-me no está en realidad contenida den-

tro del formulario Web. En realidad seha separado el código utilizando clasespara representar los diferentes objetosde negocio (funcionalidades). Cadainforme invoca su propio conjunto demétodos de clases, las que llevan lógi-camente adelante las diferentes opera-

ciones. Esto mejora ampliamente la reu-tilización ya que hace viable que inclu-so la interfaz gráfica pueda ser una apli-cación de Windows, o lo que es másinteresante, exponer esta lógica median-te servicios Web con el fin de que sea

dotN

etM

anía

<<

16

dnm.asp.net<<

Fuente 1

<asp:templatecolumn sortexpression="Territory" headertext="Territory Name"><itemtemplate>

(1)<asp:linkbutton oncommand="TerritoryGrid_Click"

commandname="TerritoryDrill"

(2)commandargument='<%# DataBinder.Eval(Container, "DataItem.TerritoryDescription") %>'

(3)cssclass="hier" runat="server" id="Territorylnk" (4) text='<%# DataBinder.Eval(Container,

"DataItem.TerritoryDescription") %>'</asp:linkbutton>

</itemtemplate><itemstyle width="200px"></itemstyle>

</asp:templatecolumn>}

Fuente 2

commandargument='<%#DataBinder.Eval(Container,

"DataItem.TerritoryDescription") %>'

Fuente 3

protected void TerritoryGrid_Click(Object sender, CommandEventArgs e){

// Obtiene el valor del campo seleccionado.

...

// Utiliza el valor como filtro del segundo DataGridETTableColumn.Visible = true;ETHeader.Text = territoryName;

...}

string territoryName = e.CommandArgument.ToString().Trim();

BindList_EmpTerr(territoryName);

Fuente 4

commandargument='<%# (String) DataBinder.Eval(Container, "DataItem.EmployeeName") + ","+ DataBinder.Eval(Container,"DataItem.EmployeeID").ToString() %>'

Fuente 5

string[] cmdArgs = e.CommandArgument.ToString().Split(',');string employeeName = cmdArgs[0];int employeeID = Convert.ToInt32(cmdArgs[1]);

Page 17: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

consumida por terceros. A su vez el código relacio-nado con el acceso a datos se comprende dentro deuna clase común a toda la aplicación, lo que brinda elbeneficio de poder modificar la implementación deconexión al origen de datos y que siempre y cuandose conserve la interfaz (métodos) la aplicación siga fun-cionando.

Seguramente ya sepa de lo que le estoy hablando,de una bonita aplicación en 3 capas (presentación, lógi-ca de negocio y lógica de acceso a datos -se muestranen la figura 4-).

Debido a que los informes están siempre orienta-dos a listas de elementos la transferencia de informa-ción entre los componentes de negocio se hace utili-zando colecciones personalizadas basadas en la claseArrayList. Esto facilita posteriormente la gestión ypasaje de la información entre métodos de las clases.El fuente 6 nos muestra parte de su implementación.

A su vez se implementan algunos métodos comoser Sort, el que hace posible ordenar alfabéticamentesus miembros. Sin embargo esta técnica tiene variasventajas y por supuesto desventajas. La parte buenaes que se tiene en todo momento la tecnología intelli-sense para consultar los campos de la base de datos, losque en realidad son implementados en la colecciónmediante un enumerado. Adicionalmente colecciónrima con orientación (a objetos), lo que hace que seamucho más liviana para el pasaje entre componentesen comparación con un DataSet. Sin embargo el pun-to oscuro es que si se agrega un nuevo campo a la base

de datos hay que modificar la implementación de lacolección y el código si se desea tener acceso al mis-mo. Recomiendo evaluar en cada caso ventajas y des-ventajas de aplicar esta técnica.

Bloque de aplicación de acceso a datosComo comenté anteriormente el acceso a datos se

realiza empleando procedimientos almacenados y porsupuesto ADO.NET. Aquí se utiliza el llamado Bloquede Aplicación de acceso a datos. Básicamente éste es un

conjunto de clases orien-tadas a SQL Server, lasque encapsulan llamadasa ADO.NET con el obje-tivo de brindar una víamás sencilla, rápida y cla-ra de lidiar con una basede datos. A mi criterio uti-lizar ADO.NET es tedio-so, por lo que Microsoft aimplementado esta biblio-teca para mejorar la expe-riencia. Para los curiososdebo decir que se ofrecenlos fuentes en C# y Visual

Basic .NET incluido en los ejemplos de inicio rápido(Quick Start Samples). Esto permite personalizar cadauna de las facetas, aunque en general con lo que seofrece es más que suficiente.

La compilación del proyecto de Bloque de aplica-ción de acceso a datos produce una biblioteca denomi-nada Microsoft.ApplicationBlocks.Data.dll. Dentrode ésta se incluye una clase principal SqlHelper queofrece el núcleo de funcionalidades (hay otras pero lasdejaremos de lado para no extendernos). A su vez seofrecen varios métodos estáticos lo que hace posibleinvocar a varios de sus miembros directamente. Heincluido dos pequeños ejemplos de utilización en elfuente 7.

En ADO.NET se necesitarían varias líneas parallevar adelante esta tarea, sin embargo utilizando laclase citada se reduce a una sola línea. Si está inte-resado en conocer más acerca del bloque le reco-miendo que lo baje del sitio de Microsoft (msdn.micro-

dotN

etM

anía

<<

17

dnm.asp.net<<

Figura 4

Fuente 6

public class HierarchicalReportCollection : ArrayList{

public enum HierarchicalReportFields{

InitValue,Territory,SalesTotals,EmployeeName

}//Sigue...

Fuente 7

//Obtiene un DataSet de una consulta estándar-DataSet ds = SqlHelper.ExecuteDataset( "SERVER=MiServidor;DATABASE=Northwind;INTEGRATED

SECURITY=sspi;", CommandType.Text, "SELECT * FROM Clientes");

//Obtiene un DataSet invocando a un procedimiento //almacenado con 1 parámetro.DataSet miDataset = SqlHelper.ExecuteDataset(""SERVER=MiServidor;DATA-BASE=Northwind;INTEGRATED

SECURITY=sspi;", "ObtenerCliente", "1133");

Page 18: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

soft.com/library/default.asp?url=/downlo-ads/list/bda.asp).

Hemos visto hasta aquí el funciona-miento más que interesante de ASP.NETReports Starter Kit y sus condimentos. Enel próximo apartado aprenderemos cómoañadir al informe jerárquico, un gráfico3D utilizando los componentes Web deOffice 2003.

Utilizando Office WebComponents 11.0

Un requerimiento común de uninforme en estos días es ofrecer algúntipo de gráficos. Cuando se piensa enuna aplicación de Windows esto es bas-tante sencillo ya que hay varias biblio-tecas que cumplen este fin, incluso setienen varios controles ActiveX que pue-den brindar una solución sencilla enpocas horas de programación. Proveerla capacidad gráfica a una aplicaciónWeb también puede tenerse sin dema-siadas complicaciones si se conocen lasherramientas adecuadas. Básicamenteexisten dos posibles soluciones: la pri-mera es utilizando controles ActiveX oensamblados a ejecutarse del lado delexplorador. Esto ofrece una excelenteinteractividad y posibilita que el propiousuario pueda interactuar con la gráfi-ca. Sin embargo además de no ser unasolución multiplataforma, esta opciónpuede verse opacada por temas de segu-ridad, el usuario puede tener una polí-tica restrictiva que no le permita ejecu-tar el control. La segunda solución escrear la gráfica del lado del servidor paraluego enviarla al explorador dentro deuna página Web. Esta alternativa no esinteractiva, aunque se consiguen ciertascaracterísticas de este tipo escribiendocódigo script del lado del cliente en con-junto con el servidor.

Afortunadamente Microsoft cuentacon un motor de gráficos bastantepotente que cubre ambas alternativasllamado Microsoft Web Components y laversión 11 es la más reciente. OWC esla biblioteca que utiliza Microsoft Office2003 para generar las gráficas, aunquetambién se pueden hacer muchas, peromuchas cosas más. Vale la pena desta-car que no es necesario tener instaladoMicrosoft Office 2003, es posible bajare instalar gratuitamente este paquete de

la Web de la siguiente dirección (si tie-ne el CD de Office podrá encontrar allíesta utilidad): www.microsoft.com/down-loads/details.aspx?displaylang=es&FamilyID = 7 2 8 7 2 5 2 c - 4 0 2 e - 4 f 7 2 - 9 7 a 5 -e0fd290d4b76.

Tenga presente la ruta de instalaciónya que la utilizaremos luego para loca-lizar las ayudas. Ahora bien si hace usodel modo interactivo deberá contar conuna licencia de Office en el servidor,pero si por el contrario usa el modo está-tico esto no es necesario, por lo menosen base a lo que dice la licencia la quepodrá leer y evaluar tranquilamente(support.microsoft.com/default.aspx?scid=kb;en-us;555075).

Entendiendo como trabajaOWC 11.0

OWC es una colección de compo-nentes COM que ofrecen clases con susrespectivos métodos, los que pueden seraccedidos desde cualquier aplicación.NET framework. Es viable utilizar losmismos en modo interactivo -comocontrol ActiveX del lado del explora-dor- o en modo estático, cosa que ele-giré ya que nos permitirá crear median-te código de servidor los gráficos queserán insertados en el formulario Webcomo imagen.

Lo primero que debemos hacer unavez bajado e instalado este paquete esagregar una referencia COM en nues-tro proyecto de Visual Studio .NET, loque nos permitirá interactuar con cadauna de las facilidades provistas por labiblioteca (figura 5).

Dependiendo de si se trata de VisualC# o Visual Basic .NET una de las

siguientes dos líneas será de utilidad paraconfigurar las clases al espacio prede-terminado.

using OWC11;Imports OWC11

OWC cuenta con varias ayudas ycomponentes, la tabla 1 muestra losarchivos de documentación de las dis-tintas funcionalidades.

Antes de escribir una sola línea quehaga referencia a OWC he creado unformulario Web vacío que será el encar-gado de implementar al código quedibujará al gráfico. Este formulario seráinsertado dentro de la página del infor-me jerárquico que vimos anteriormen-te utilizando una etiqueta de IFRAME(si desea compatibilidad con Netscapeutilice un marco estándar). Ella permi-te en forma muy sencilla y modular adi-cionarle nuevas características a la pági-na del informe, simplemente insertan-do al nuevo formulario Web dentro delque contiene al informe.

<iframe id=MiIframe name=MiIframeframeborder=norunat=serverwidth=90% height=330 src=Grafico3D.aspx>

</iframe>

La página que contendrá al gráficotomará de una variable de sesión losdatos a mostrar, por lo que bastará conguardar allí el DataSet para que la seriesea representada automáticamente.Ahora centraremos nuestra atención enla parte programática. Para dibujar ungráfico es necesario crear un objeto detipo ChartSpaceClass. Esta clase en rea-lidad hace posible contener una o másgráficas; de hecho podríamos tenervarios dibujos contenidos en el mismoespacio. La siguiente línea muestracómo añadir un gráfico al espacio pre-viamente creado.

EspacioGráfico.Charts.Add(0)

El próximo paso es bastante senci-llo ya que solamente hay que configu-rar algunos valores estéticos como elestilo de la gráfica, el fuente del textoa utilizar, el color de borde, etc; todo

dotN

etM

anía

<<

18

dnm.asp.net<<

Figura 5

Page 19: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

esto interactuando directamente conlas propiedades de la clase. Mostrarétan sólo unas pocas líneas para noextenderme en demasía, puede luegosi lo desea bajar el código fuente com-pleto y depurarlo paso a paso para ana-lizar el resto de las líneas, aunque leadvierto que no se llevará mayores sor-presas (fuente 8).

Ahora es necesario establecer unanueva serie que contenga la informa-

ción de cómo los datos serán mostra-dos. Aquí se define la vía en la que seplasmarán la información en colores,tipos de letra, centrado de los valores,etc. (fuente 9).

Como último paso es necesariocargar en el gráfico de tarta los valo-res de la serie a representar.Lamentablemente si bien este control

es muy flexible no acepta un DataSetcomo origen de datos, cosa inconve-

niente ya que el informe jerárquicoutiliza este medio como fuente deinformación. Sin embargo se admiteuna matriz como origen, por lo quehe creado una pequeña rutina queconvierte el DataSet en un objeto deeste tipo. La primera línea establecela matriz conteniendo las categorías(descripciones), mientras que la segun-da configura los valores a representar(fuente 10).

El enumerado ChartDimensionsEnumindica qué tipo de serie se cargarán encada caso -descripciones o valores-,mientras el valor chDataLiteral deChartSpecialDataSourcesEnum especifi-ca que los datos deberán ser tomadosdel último argumento del métodoSetData, en este caso la matriz.

Finalmente el gráfico resultante seretorna al formulario Web utilizando latécnica que explicamos en el artículoanterior que se basaba en escribir sobreel objeto de respuesta el binario conte-niendo la imagen resultante. La figura6 nos muestra lo que podemos lograrhaciendo uso de ASP.NET ReportsStarter Kit y OWC 11.

Espero que lo que traté aquí lehaya servido para conocer algunas téc-nicas, trucos, y tecnologías aplicadasa ASP.NET. Por mi parte me despidoesperando como siempre vuestroscomentarios.

dotN

etM

anía

<<

19

dnm.asp.net<<

Tabla1. Resumen de espacios en GDI+

Componente Archivo deayuda Descripción

Chart OWCDCH11.chmReferencia para tiempo de diseño delcomponente para creación de gráficas.

PivotTable OWCDPL11.chmReferencia para tiempo de diseño delcomponente de tabla Pivote.

Spreadsheet OWCDSS11.chmReferencia de tiempo de diseño del com-ponente de hoja de cálculo.

Spreadsheet OWCFUN11.chmReferencia de funciones del compo-nente de hoja de calculo.

DataSource, Chart,

PivotTable y SpreadsheetOWCVBA11.chm

Referencia de programación para todoslos componentes.

Fuente 8

EspacioGráfico.Border.Color = "white"EspacioGráfico.Charts(0).HasTitle = TrueEspacioGráfico.Charts(0).Type = ChartChartTypeEnum.chChartTypePie3DEspacioGráfico.Charts(0).Title.Font.Bold = True

Fuente 9

EspacioGráfico.Charts(0).SeriesCollection(0).DataLabelsCollection(0).Font.Name = "verdana"EspacioGráfico.Charts(0).SeriesCollection(0).DataLabelsCollection(0).Font.Size = 10EspacioGráfico.Charts(0).SeriesCollection(0).DataLabelsCollection(0).Font.Bold = TrueEspacioGráfico.Charts(0).SeriesCollection(0).DataLabelsCollection(0).Font.Color = "red"EspacioGráfico.Charts(0).SeriesCollection(0).DataLabelsCollection(0).Position =

ChartDataLabelPositionEnum.chLabelPositionCenter

Fuente 10

EspacioGráfico.Charts(0).SeriesCollection(0).SetData(OWC11.ChartDimensionsEnum.chDimCategories,Convert.ToInt32(OWC11.ChartSpecialDataSourcesEnum.chDataLiteral), MatrizCategorias)

EspacioGráfico.Charts(0).SeriesCollection(0).SetData(OWC11.ChartDimensionsEnum.chDimValues,Convert.ToInt32(OWC11.ChartSpecialDataSourcesEnum.chDataLiteral), MatrizValores)

Figura 6

Page 20: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

Aspectos e Intercepción

El sueño de muchos desarrolladores de soft-ware se manifiesta en tener un mundo en el quedesarrollar aplicaciones se sustente en ensamblarcomponentes de software que interactúen víasimples llamadas a métodos. Sin embargo, por logeneral esto pasa por alto que ciertos aspectos delas aplicaciones suelen afectar a todas las partesde un programa.

A la larga los programas tienden a contami-narse con “cachitos”2 de código que intentanlidiar con aquellos aspectos de las aplicacionesque no son el foco central del problema que éstosintentan solucionar. Con frecuencia estos aspec-tos suelen entrometerse en el código originalafectando con ello la aspiración de obtener solu-ciones reutilizables. Esta es el área que aborda loque se ha dado en llamar Programación Orientadaa Aspectos (AOP)1 al intentar proveer estrategiasde reutilización para solucionar los problemasmencionados.

Ejemplos tradicionales de estos “aspectos” quepueden estar presentes o no en muchas compo-nentes de software, con independencia del domi-nio del problema al que están dedicados, son la segu-ridad, la serialización, la sincronización, la transac-cionalidad, etc. De hecho la infraestructura de .NETtrae integrada, a través de Visual Studio, los com-piladores, la BCL y el CLR, soluciones para estascategorías de aspectos.

Lamentablemente no hay aún en .NET unmecanismo directo e integrado para que, de for-ma simple, los desarrolladores puedan implemen-tar sus propios aspectos personalizados. Sin embar-go, .NET sí dispone de tres recursos básicos, queutilizados y desarrollados integradamente, puedenpermitirnos dar un soporte para la implantaciónde estas ideas. Estos tres recursos son la infraes-

Aspectos e intercepción de métodos en .neto cómo poner la guinda sin estropear el merengue

Con los recursos que brinda .NET, esposible desarrollar mecanismos parainterceptar la llamada a un método.Unavez interceptada una llamada se puedeentonces tomar el control y ejecutar fun-cionalidades relacionadas con la ejecu-ción del método, pero que no estánincluidas en el código de éste.

Este artículo desarrolla y explica tresvías para llevar a cabo esta “intercep-ción”.Se propone además un patrón decómo aprovechar la intercepción para,mediante el uso de los atributos de.NET, poder “intercalar” funcionalidadpara asociar a la ejecución del métodointerceptado.Se muestra cómo esta fun-cionalidad puede expresarse en térmi-nos de atributos.Esto sirve de base a loque se suele llamar “entretejido” decódigo (weaving) y con ello dar sopor-te a la aplicación de las ideas de laProgramación Orientada a Aspectos (AOP1)en el desarrollo de software sobre .NET.

<<

1 Siglas del inglés Aspect Oriented Programming.2 A ver si aceptamos esta palabra, tan sonora en español, como sustitución del término en inglés snippet.

<<

Por Yamil Hernández y Miguel KatribGrupo Weboo Universidad de La Habana

Page 21: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

tructura de intercambio de mensajes, elmecanismo de reflexión y emisión decódigo que nos permite hacer introspec-ción de un ensamblado y generar diná-micamente código, junto con la capaci-dad de incrustar metainformación en unensamblado a través de una novedosamaravilla aportada por .NET (y lamen-tablemente no lo suficientemente reco-nocida aún en su verdadera valía) que sonlos atributos.

Consideremos como simple ejem-plo una clase C que hace de código ser-vidor de una componente:

class C{public void F(){...}...

}

Un código cliente de C para invocara la funcionalidad ofrecida por el méto-do F debe hacer:

C c = new C();...c.F();

Supongamos que más adelante,por razones de auditoría o evaluación,se desea además contar las veces queesta funcionalidad F es invocada. Estoclaro podría lograrse modificando elcódigo de F como se muestra a conti-nuación:

class C{static int llamadasaF=0;public void F(){llamadasaF++;... código original de F}...

}

Pero esta es una solución “invasiva”,del estilo de las que mencionamos quecontamina al código existente, ya queobliga a introducir dentro de F un códi-

go que realmente no tiene que ver conla propia funcionalidad de F3.

Imagine que queremos aplicar unacontabilidad similar a otros métodos.Habría que estar metiendo, en cadauno de ellos, cachitos similares decódigo.

Otra manera de lograr este efecto es“pasarle el problema” al código cliente.Definiendo la variable llamadasaF enalgún contexto accesible a todos los quepuedan llamar a F:

public class Global{public static int llamadasaF=0;...

}

Entonces se puede hacer precedercada llamada a F con el incremento dedicha variable:

Global.llamadasaF++;c.F();

Pero ésta tampoco es una alternati-va atractiva porque obliga a hacer modi-ficaciones en el código cliente y en todoslos puntos en los que éste haga una lla-

mada a F.Otros intereses similares podrí-

amos plantearnos para relacionara F con otras funcionalidades,

como por ejemplo desplegar un mensa-je que indique que se ha llamado a F conel objetivo de llevar una traza de la eje-cución, comprobar si se cumple deter-minada condición antes de permitir laejecución de F, ejecutar una acción alter-nativa si durante la ejecución de F se dis-paró una excepción, etc.

Si se considera entonces que la eje-cución de un método es una primiti-va básica de computabilidad, presen-te en cualquier sistema de software,entonces es conveniente, para esteobjetivo de “mezclar funcionalida-des”4, poder “interceptar” la llamadaa un método de modo de poder incor-porar o ejecutar acciones asociadas adicha llamada.

La sección que sigue a continua-ción ilustra cómo usar en .NET losatributos para, de forma declarativa yno invasiva, expresar estos aspectos eintegrarlos a la intercepción de unallamada. En las secciones posterioresse proponen tres vías de cómo se pue-de lograr esta intercepción en .NETy ejecutar entonces la funcionalidadindicada por los atributos.

Integrando Intercepción yAtributos

La solución que se propone en esteartículo para aplicar aspectos en .NETse basa en poder “decorar” un código(el merengue) con determinados atri-butos personalizados que harán de

dotN

etM

anía

<<

21

3 Aún cuando se disponga del código fuente de F esto no es una buena práctica porque por este camino podríamos llegar a hacer ilegible la funcionalidadesencial de F, por no decir que al meter las “garras” en el código fuente de F podemos dañar lo que ya funcionaba de F.4 Que estén juntas pero no revueltas.

Page 22: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

22

dnm.plataforma.net<<

“aspectos” (las guindas) sin que éstos distorsioneno confundan la comprensión del código original,y en poder interceptar la llamada a un método paraaplicar la “funcionalidad” que expresan estos atri-butos-aspectos.

De este modo se aspira a que un código clienteque quiera contar las llamadas al método F de la cla-se C, le baste con escribir algo como:

class C{[CountingCalls]public void F(){...}...

}

Y luego recuperar la cantidad de llamadas a Fhaciendo CountingCalls.Calls["F"] sin que el con-teo de las llamadas a F se entremezcle con el códi-go de F.

En las secciones siguientes veremos tres enfo-ques de cómo interceptar la llamada a un método.Cualquiera que sea el mecanismo de intercepciónque apliquemos, consideraremos que en la inter-cepción se puede disponer de la información nece-saria (esto se verá en cada mecanismo) para apli-car el método InterceptionHandler que se descri-be a continuación:

public delegate object MethodCall(object, MethodBase, object[], AspectAttribute[]);

class Interceptor{

public static MethodCall InterceptionHandler{...}...

}

El tipo delegate MethodCall describe la infor-mación asociada con la llamada a un método y alos atributos que hacen de aspectos decorando adicho método:

• El tipo object de retorno indica el resultado adevolver producto de la llamada que ha sidointerceptada. Hay que destacar que no necesa-riamente el valor devuelto será el resultado deejecutar el método llamado por el código clien-te, ya que esto depende de la funcionalidad aintercalar en la intercepción que, de hecho,puede decidir no ejecutar el método llamadosino otro sustituto. Pero lo que sí que no pue-de alterarse es la devolución al código clientede un objeto del tipo que él espera.

• El primer parámetro, de tipo object, será elobjeto receptor de la llamada que está sien-do interceptada. Es decir, que si el códigocliente hace x.F() entonces el primer pará-metro que se le pasa al InterceptionHandleres el objeto valor de x.

• El segundo parámetro, de tipo MethodBase,denota al objeto (Reflection) que describe almétodo que está siendo llamado. Es decirpara una llamada c.F() sería el objeto de tipoMethodBase que describe el método F de laclase C.

• El tercer parámetro, de tipo object[], es unarray con los parámetros que se han pasado enla llamada que está siendo interceptada. Seaprovecha aquí otra de las grandes ventajas dela infraestructura de .NET porque si hubieseparámetros que fuesen de algún tipo primiti-vo éstos pueden pasarse transparentementecomo de tipo object (es decir, sin mediacióndel código cliente) gracias al mecanismo deboxing. Será pasado null en el caso en que elmétodo no tenga parámetros.

• El cuarto parámetro, de tipo AspectAttribute[],es un array con los atributos aspectos que deco-ran a dicho método.

La clase abstracta AspectAttribute (fuente 1)describe el tipo de atributo que hará de aspecto paraser asociado a una clase o interfaz (decora a dichotipo) o a un método (decora a dicho método) y quetendrá una funcionalidad con la intercepción de unallamada. Un atributo que decore a una interfaz seinterpretará como que decora a todos los métodosde la interfaz.

Cada clase concreta que herede de AspectAttributedebe definir en el método Action una acción posible arealizar con la intercepción de una llamada.

La idea es que la llamada sea interceptada antesde que el método llamado se ejecute (esto sería lo queen la jerga de la AOP suele ser denominado point cut).

[AttributeUsage(AttributeTargets.Method |AttributeTargets.Property,AttributeTargets.InterfaceInherited = true)

]public abstract class AspectAttribute: Attribute{public abstract object Action(object target,

MethodBase method,object[] parameters,object result);

}

public abstract class BeforeAttribute: AspectAttribute{}

public abstract class AfterAttribute: AspectAttribute{}

Fuente 1

Page 23: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

23

dnm.plataforma.net<<

La(s) acción(es) a “intercalar” estará(n) definida(s) enel método Action de los atributos que decoren al méto-do (esto sería lo que en la jerga de la AOP suele serdenominado advice).

Pero esto no quiere decir que la forma de “entre-tejer” esta acción con la llamada (lo que en la jerga dela AOP se denomina weaving) sea ejecutarla antes deejecutar la llamada. Es la implementación delInterceptionHandler la que decidirá cómo, cuándo ycuáles Action de cuáles atributos (porque un métodopuede estar decorado con varios) “entretejerá” con lallamada. Así podemos, entre otros, tener un atributoque especifique una acción para:

• Ejecutar antes de ejecutar el método llamado.• Ejecutar después de ejecutar el método lla-

mado.• Que pueda servir de precondición para poder

ejecutar el método llamado.• Ejecutar en sustitución del método llamado.• Ejecutar en el caso de que la ejecución del méto-

do llamado dispare una excepción.• Ejecutar en el caso de que la ejecución del méto-

do llamado haya sobrepasado un timeout.• Transformar el resultado devuelto por el método

llamado.• Deshacer la acción del método llamado.Por razones de espacio en este artículo sólo consi-

deraremos los dos primeros casos, es decir, atributos quedescriben acciones para ejecutar antes y atributos quedescriben acciones para ejecutar después de ejecutar elmétodo llamado (ver en el fuente 1 los tiposBeforeAttribute y AfterAttribute que heredan deAspectAttribute). Lo que se pretende5 es que el mane-jador de la intercepción (InterceptionHandler) apliquela acción descrita por un atributo Before antes de ejecu-tar el método decorado por dicho atributo y que apliquela acción descrita por un atributo After después de eje-cutar el método. Para esto el InterceptionHandler eva-lúa los métodos Action de los atributos Before, luego eje-cuta el método llamado y a continuación evalúa los méto-dos Action de los atributos After que decoran al méto-do llamado (el fuente 2 muestra la implementación deéste). Toda excepción en la ejecución de un método Actionserá considerada como una excepción en la ejecución delmétodo llamado y reportada por tanto al código clienteque ha realizado la llamada.

Los diferentes parámetros que se pasan al méto-do Action son:

• target, objeto receptor de la llamada inter-ceptada.

• method, objeto que describe (Reflection) el méto-do llamado.

• parameters, array con todos los parámetros pasa-dos en la llamada interceptada.

• result, resultado de la evaluación de la llamada(para poder ser utilizado por una acción cuyo

efecto sea posterior a la ejecución del métodollamado).

El mecanismo de reflexión de .NET no recu-pera necesariamente los atributos en el orden enque éstos están incluidos en el código fuente. Demodo que en este caso el orden en que se ejecutanentre sí los diferentes atributos Before y After es nodeterminista. Es el programador el responsable de

5 Esto dependerá de cómo se implemente el mecanismo de intercepción.

public static object InterceptionHandler(object targetObject,MethodBase method,object[] parameters,AspectAttribute[] attributes)

{foreach (AspectAttribute b in attributes)if (b is BeforeAttribute)b.Action(targetObject, method, parameters, null);

object returnValue = targetObject.GetType().GetMethod

(method.Name,GetParameterTypes(method)

).Invoke(targetObject,parameters);

//Una acción After puede necesitar del resultado de haber evaluado el//método por eso se le pasa returnValueforeach (AspectAttribute a in attributes)if (a is AfterAttribute)a.Action(targetObject, method, parameters, returnValue);

return returnValue;}

Fuente 2

public class CountingCalls: BeforeAttribute{static Dictionary calls;public override object Action(object targetObject,

MethodBase targetMethod,object[] parameters,object result)

{if (calls == null) calls = new Dictionary();if (calls[targetMethod.Name] == null)calls[targetMethod.Name] == 1;

elsecalls[targetMethod.Name] = ((int)calls[targetMethod.Name])+1;

}public static int Calls[string methodName]{get{if (calls == null) return 0;else if (calls[methodName] == null) return 0;else return (int)calls[methodName];

}}

}

Fuente 3

Page 24: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

24

dnm.plataforma.net<<

no basar la lógica de su aplicación en un determi-nado orden6.

El fuente 3 muestra cómo se podría definir unatributo CountingCalls para intercalar la funcionali-dad de nuestro ejemplo que pretende contar las vecesque se llama a un método.

Como hay que poder distinguir entre los distintosmétodos, hay que tener un contador de llamadas porcada método que se decore con este atributo. Esto secontrolará en la propia semántica del atributo. Por ellose incluye un diccionario global (static Dictionarycalls) con una entrada por cada método.

Note que la funcionalidad del método F es inde-pendiente de la funcionalidad del aspectoCountingCalls que se le quiere asociar y que laimplementación del atributo no disturba la imple-mentación de la clase. Incluso si el código clientede C no usase el mecanismo de intercepción enton-ces el atributo CountingCalls es inocuo y no inci-de en la ejecución de una llamada. Esto se corres-ponde a lo que en la jerga de la AOP se le conocecomo separación de incumbencias (concerns).

Para completar la descripción del mecanismo pro-puesto es necesario proponer un patrón de cómodecorar el código con los aspectos y cómo lograr laintercepción. Las tres secciones a continuación des-criben diferentes soluciones para lograr esto.

Intercepción basada en proxies de .NETEl .NET CLR provee una rica arquitectura

(namespace System.Runtime.Remoting) para mode-lar las invocaciones a métodos como intercambiode mensajes. La clave para comprender dicha arqui-tectura está en examinar qué es lo que hace el CLRcuando ejecuta una llamada a un método. El CLRse basa en una máquina con memoria de pila (stack)y en que ejecutar un método es esencialmente pro-vocar una transformación en esa memoria de pila7.El código IL al que queda traducida una llamadaa un método pone los parámetros correspondien-tes en la pila (uno de estos parámetros es el obje-to receptor de la llamada) y pasa el control al códi-go del método que se encarga de procesar esosparámetros y reescribir la pila para indicar en ellalos resultados de procesar el método.

En esta arquitectura del System.Runtime.Remoting, .NET ofrece medios para interceptar unallamada y poder trabajar con el contenido de la pilainterpretando éste como un mensaje, lo cual nos per-mitirá en nuestro caso invocar a nuestro manipula-dor de intercepción y pasarle la información adecuadapara nuestro propósito de aplicación de aspectos.Explicar esta arquitectura en toda su complejidad se

public class Interceptor: RealProxy{object targetObject;Type interfaceType;MethodBase interceptedMethod;

private Interceptor(Type t):base(t){}

public static object Create(object targetObject, Type interfaceType){Interceptor newobject = new Interceptor(interfaceType);newobject.targetObject = targetObject;newobject.interfaceType = interfaceType;return newobject.GetTransparentProxy();}public static object Create(object targetObject){MarshalByRefObject marshalTarget = (targetObject as MarshalByRefObject);

if (marshalTarget == null){throw new Exception("El tipo del parámetro \" targetObject \" no

es MarsalByRefObject");}else{Interceptor newobject = new Interceptor(targetObject.GetType());newobject.targetObject = targetObject;return newobject.GetTransparentProxy();}}public override IMessage Invoke(IMessage msg){AspectAttribute[] aspectAttributes;

IMethodCallMessage methodMessage = msg as IMethodCallMessage;interceptedMethod = methodMessage.MethodBase;

if (interfaceType != null)aspectAttributes = Helper.AspectUnion(

(AspectAttribute[])interfaceType.GetCustomAttributes(typeof(AspectAttribute),true),

(AspectAttribute[])interceptedMethod.GetCustomAttributes(typeof(AspectAttribute),true));

elseaspectAttributes = (AspectAttribute[])interceptedMethod.

GetCustomAttributes(typeof(AspectAttribute), true);

object returnValue = InterceptionHandler(targetObject, interceptedMethod, methodMessage.Args, aspectAttributes);

ReturnMessage returnMessage = new ReturnMessage(returnValue,methodMessage.Args, methodMessage.ArgCount,methodMessage.LogicalCallContext, methodMessage);

return returnMessage;}...

}

Fuente 4

6 Ciertamente se podría incluir algún mecanismo de prioridades en la definición de los propios atributos pero para mantener lasimplicidad esto no se ha incluido aquí.

7 De hecho los puristas de la programación funcional reducen a esto la definición de una función (método).

Page 25: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

sale del alcance de este artículo (el lec-tor puede ampliar con la propia docu-mentación de MSDN o en [2][3][4]) porlo que en lo que resta de esta secciónnos limitaremos a presentar simplifica-damente sólo algunos elementos deinterés para nuestro propósito.

Para realizar la intercepción nos basa-remos en que entre el código cliente y elobjeto receptor de la llamada va a haberun objeto intermediario (proxy). Lo quepretenderemos es hacer lo más transpa-rente posible, para el código cliente, laparticipación de un tal proxy8 en la comu-nicación del código cliente con el objetoservidor, receptor de una llamada. La cla-se Interceptor es la que describe este tra-bajo de crear y colocar el proxy.

En Interceptor (fuente 4) tenemosdos métodos estáticos Create que ser-virán de patrón factoría9 para la crea-ción de un objeto que sirva de proxya un objeto receptor, de tal modo queel código cliente pueda invocar a losmétodos del objeto receptor a travésdel proxy, pero de la misma forma(sintaxis) con la que lo haría a través

del objeto original. De este modo seráel proxy el que se encargará de hacerla intercepción.

Para lograr interceptar lo que seríauna llamada en el código fuente hay quelograr que ésta realmente exista en elcódigo IL generado. Muchos compila-dores .NET convierten, cuando pue-den, una llamada a un método en la apli-cación inline del código del método, por

lo que si se quiere interceptar la llama-da entonces hay que evitar que esto ocu-rra. Para ello el mecanismo de inter-cepción exige que el tipo del objetoreceptor implemente una interfaz paraque sea a través de la cual que el códi-go cliente invoque al método10.

Tenemos entonces que para lograrla intercepción del método F de la cla-se C de nuestro ejemplo, la clase debeestar definida de la forma siguiente:

interface IC{

void F();}class C: IC{public void F(){...}

}

El patrón a seguir para lograr laintercepción es crear los objetos de laforma siguiente:

IC c = (IC)Interceptor.Create(new C(), typeof(IC));

Hay otra forma de lograr esto sinexigir que C implemente una interfaz.Para ello la clase C debe heredar del tipoMarshalByRefObject:

class C: MarshalByRefObject{public void F(){...}

}

Y entonces hacer:

C c = (C)Interceptor.Create(new C());

Veamos la implementación delmétodo Create(object, Type) (fuen-te 4) para ilustrar cómo se ha utiliza-do aquí el mecanismo ofrecido por.NET. Este método crea un objeto detipo Interceptor a cuyo constructor lepasa como parámetro el tipoInterface. El tipo Interceptor lohemos definido como derivado de laclase .NET RealProxy cuyo construc-tor (llamada a base(interfaceType) enel fuente 4) debe recibir un paráme-tro de tipo Type pero que sea tipointerfaz (o MarshalByRefObject). Noteque en la clase Interceptor tenemostambién una variable targetObject enla que guardamos el objeto originalpara el que se está construyendo elproxy. La clase .NET RealProxy tieneun método GetTransparentProxy quedevuelve un TransparentProxy. Para elCLR el TransparentProxy puede ver-se como si fuese del mismo tipo deltipo que le fue pasado al constructordel RealProxy. Por ello es correcta laoperación de casting que hace el clien-te cuando escribe:

IC c = (IC)Interceptor.Create(new C(), typeof(IC))

Un TransparentProxy es un objetomuy especial de esta maquinaria de.NET que transforma una llamada a unmétodo en un intercambio de mensa-jes de la máquina de pila (estos mensa-jes se describen con el tipo IMessage).Pero el TransparentProxy mantiene unnexo con el RealProxy a través del cualfue creado, de modo que cuando en elcódigo cliente se hace c.F() el CLR lla-ma al método Invoke al que le pasacomo parámetro un objeto msg de tipoIMessage (que contiene el contenido dela pila que describe la llamada originaly sus parámetros).

Esta es la clave (simplificada) delmecanismo que ofrece .NET para rea-

dotN

etM

anía

<<

25

dnm.plataforma.net<<

8 Muchas de las herramientas de desarrollo .NET (Visual Studio .NET como su principal exponente) hacen un gran uso de proxiespara hacer más transparente y simple el trabajo de programación.

9 Factory Pattern.10 Todos los métodos que implementen una interfaz son invocados realmente a través de la tabla de métodos virtuales y una

llamada a estos no se sustituye entonces por código inline.

El .NET CLR provee una rica arquitectura para modelar las invocaciones a métodos como intercambio de

mensajes. La clave para comprender dicha arquitectura está en examinar qué es lo que hace el CLR

cuando ejecuta una llamada a un método

Page 26: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

lizar la intercepción de una llamada. Lo que restaahora es redefinir el método Invoke (que es abstrac-to en la clase RealProxy) para personalizar lo que que-remos hacer luego de haber interceptado la llamada.

Note (fuente 4) que al hacer msg.args el méto-do Invoke extrae del mensaje msg, que le ha pasa-do el CLR, los argumentos con los que el códigocliente llamó al método. Para "recrear" la llama-da original se necesitaría el objeto receptor de lallamada ya que es el TransparentProxy el que estáocupando su lugar. Hay que notar que no es elmecanismo de .NET el que se ocupa de conservarel objeto original. Es nuestro método Create el queen el momento de la creación del objetoInterceptor se ha cuidado de guardar el objeto ori-ginal (variable targetObject) para luego poderloutilizar dentro de la implementación de Invoke. Apartir del objeto MethodBase, que se extrae del men-saje msg, se pueden obtener los atributos que seanaspectos (su tipo es algún subtipo de la claseAspectAttribute).

Con toda la información anterior el métodoInvoke llama al InterceptionHandler. Luego se con-forma el mensaje de retorno (ReturnMessage). Es esteReturnMessage el que el CLR retorna a través delTransparentProxy, al código cliente que hizo la lla-mada original .

Intercepción basada en contextosUn inconveniente del mecanismo de intercep-

ción anterior es que exige que el objeto a intercep-tar tenga que crearse con alguno de los dos patronesfactoría, es decir:

C c = (C)Interceptor.Create(new C());

o

IC c = (IC)Interceptor.Create(new C(), typeof(IC));

Hubiese sido más transparente si .NET dispu-siese también de alguna suerte de atributoInterceptable de modo que si se decora una clase Cen la forma:

[Interceptable]class C{...

}

Entonces el código cliente puede crear los obje-tos de tipo C en la forma tradicional de:

C c = new C();

Con la garantía de que las llamadas a través deC serían interceptadas. En tal caso la implementa-ción de un método como Invoke dentro de la cla-

se Interceptable podría ser la vía para colocar laestrategia a aplicar al hacer la intercepción.Lamentablemente .NET no ofrece algo similar.La segunda vía basada en contextos, que explora-remos a continuación, intenta lograr algo pareci-do a esto.

dotN

etM

anía

<<

26

dnm.plataforma.net<<

[AttributeUsage(AttributeTargets.Class|AttributeTargets.Interface|AttributeTargets.Struct, Inherited = true)]public class Interceptable : ProxyAttribute{class InterceptingProxy : RealProxy{private MarshalByRefObject target;private Type targetType;private object returnValue;private object targetObject;private MethodBase method;private object[] args;public InterceptingProxy(MarshalByRefObject target, Type t): base(t){this.target = target;

}public override IMessage Invoke(IMessage msg){IMethodCallMessage methodMsg = msg as IMethodCallMessage;

if( methodMsg is IConstructionCallMessage ){targetType = methodMsg.MethodBase.DeclaringType;targetObject = System.Runtime.Serialization.FormatterServices.

GetUninitializedObject(targetType);method = methodMsg.MethodBase;args = methodMsg.Args;RealProxy rp = RemotingServices.GetRealProxy(target);rp.InitializeServerObject((IConstructionCallMessage)methodMsg);MarshalByRefObject tp = (MarshalByRefObject)

this.GetTransparentProxy();IMessage ctorRetMsg = EnterpriseServicesHelper.

CreateConstructionReturnMessage((IConstructionCallMessage)methodMsg,tp);

return(ctorRetMsg);}else{newMsg = methodMsg as MethodMessage;args = newMsg.Args;method= newMsg.MethodBase;returnValue = InterceptionHandler(

targetObject, method, args, (AspectAttribute[])method.GetCustomAttributes(

typeof(AspectAttribute),true));

return new ReturnMessage(returnValue, methodMessage.Args, methodMessage.ArgCount,methodMessage.LogicalCallContext,methodMessage);

}}public override MarshalByRefObject CreateInstance(Type t){MarshalByRefObject target = base.CreateInstance(t);RealProxy rp = new InterceptingProxy(target, t);return (MarshalByRefObject)rp.GetTransparentProxy();

}}

Fuente 5

Page 27: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

.NET ofrece la clase Context-BoundObject para crear objetos que tie-nen un contexto asociado. Si una cla-se C que herede de ContextBoundObjectse decora con un atributo derivado deProxyAttribute (digamos Intercep-tableAttribute):

[Interceptable]class C: ContextBoundObject{

public void F(){...}}

Entonces el CLR intercepta la eje-cución del operador new cuando se vana crear objetos de tipo C, es decir alejecutar el código IL .ctor corres-pondiente al código cliente new C().En este caso el CLR invoca en su lugaral método:

public virtualMarshalByRefObjectCreateInstance(Type targetType);

De la clase ProxyAttribute. Rede-finiendo entonces adecuadamente estemétodo en la clase Interceptable pode-mos colocar un TransparentProxy en lugardel objeto de tipo C y este Transparent-Proxy sería el que el CLR le entrega alcódigo cliente que hizo el new. A partir deaquí estamos en situación de seguir unaestrategia similar (fuente 5) a la de la sec-ción anterior, pero con la comodidad deque el código cliente sigue creando losobjetos con la notación new C(), en lugarde con el patrón factoría como en la sec-ción anterior.

Intercepción con proxy gene-rado al vuelo (vía Reflection yEmit)

Las dos soluciones de las seccio-nes anteriores tienen cierta carga deineficiencia porque se basan en que lasllamadas se tratan vía mensajes.Además como ambas soluciones seaplican para objetos creados con elmecanismo de mensajes remotosentonces esto implica que todas las lla-madas a métodos a través de esos obje-tos serán tratadas por mensajes, inde-pendientemente de que el método noesté decorado con ningún atributo de

aspecto y que por tanto no nos inte-resa interceptar. Esto podría ser acep-table cuando de todos modos, porotros intereses de la aplicación origi-nal, el objeto receptor (servidor) ten-ga que ser remoto, pero no cuandopretendemos interceptar objetos quepodrían ser locales.

En esta sección exploraremos unaalternativa basada en generar un tipoProxy al vuelo (on the fly). Es decir,generar un tipo dinámicamente(durante la ejecución) cuyas instanciasnos harán de intermediarios entre elcódigo cliente y el código servidor.Serán las llamadas a través de estosintermediarios las que serán intercep-tadas.

La infraestructura de Reflection del.NET Framework ofrece un podero-so mecanismo de introspección quepermite obtener información de losobjetos. Haciendo uso de esta infor-mación, es posible que un código pue-da generar nuevos tipos durante lapropia ejecución de dicho código. Estose logra utilizando los recursos delSystem.Reflection y System.Reflec-tion.Emit (esto fue tratado también enun artículo anterior de dotNetManía[5]).

En esta nueva variante no será elCLR quien interprete las llamadas comointercambio de mensajes, sino que a par-tir de un objeto original se generarádinámicamente un tipo Proxy, se crearáun objeto de dicho tipo Proxy y si se sus-tituye en el código cliente al objeto ori-ginal por el Proxy; entonces éste será elencargado de interceptar una llamada yllamar al InterceptionHandler (figura 1).

El código cliente debe entonces cre-ar los objetos en la forma:

IC c = (IC)Interceptor.Create(new C(), typeof(IC));

En este caso el método factoríaI n t e r c e p t o r . C r e a t e ( o b j e c t

targetObject, Type interfaceType)

crea el tipo Proxy y genera un objetocreado a partir de este tipo, el cuálhará de intermediario con el objetotargetObject. El tipo generado imple-mentará el tipo interfaceType.

En el tipo generado se emite unmétodo por cada uno de los métodosexistentes en el interfaceType (verifi-cando que tengan una implementaciónconcreta en el tipo del objetotargetObject). Note que la ventaja esque esto no exige que el tipo del objeto

dotN

etM

anía

<<

27

dnm.plataforma.net<<

Figura 1

Page 28: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

targetObject haya sido definido como que explícita-mente implementa el tipo interfaceType, sino sóloque tenga una implementación por cada método dela misma signatura existente en interfaceType.

Esta solución nos permite entonces decorar conaspectos a una clase C ya existente y compilada a unaDLL (de la cual no tenemos ni que disponer del fuen-te) que en el momento de su definición no se pensócon este propósito. Esto se logra siguiendo los pasossiguientes:

class C{

public void F(){...}...

}

Se escribe ahora una interfaz que corresponda conC que es la que se decora con aspectos:

interface IC{[CountingCalls]void F();

}

Y entonces el código cliente puede crear sus objetosa interceptar haciendo:

IC c = (IC)Interceptor(new C(), typeof(IC));

Vea la implementación de Interceptor en elfuente 6. El método Create llama a EmitProxyType(-targetObject.GetType(), interfaceType) que emi-tirá dinámicamente el tipo Proxy (en el que se guar-dará la referencia al objeto receptor originaltargetObject)11. Luego usando el método de reflec-tion de .NET Activator.CreateInstance se crea unainstancia Proxy de este tipo generado, pasándolecomo parámetros para su construcción el objetotargetObject y el tipo interfaz interfaceType. Elmétodo Activator.CreateInstance recibe un tipo yun array de objetos object[] y crea una instanciade dicho tipo seleccionando entre los constructo-res de éste, aquél que reciba como parámetros losque se indican en el object[] (por razones de espa-cio se ha omitido del fuente 6 la emisión del cons-tructor).

Note que si el código cliente hace:

C c1 = new C();IC pc1 = (IC)Interceptor.Create(c1,

typeof(IC));...C c2 = new C();IC pc2 = (IC)Interceptor.Create(c2,

typeof(IC));

Esta segunda llamada a Interceptor.Create nodebe duplicar la creación de un mismo tipo dinámi-co que asocie al tipo C con el tipo IC. Para ello el méto-do EmitProxyType comprueba si no ha creado previa-mente tal tipo.

EmitProxyType emitirá entonces un método por cadamétodo existente en el tipo interfaz (parámetrointerfaceType), comprobando que exista uno de igualsignatura en el tipo del objeto targetType). De este modo,por cada llamada del tipo pc1.F() en el código cliente seestará llamando al correspondiente método generado enel tipo Proxy. El código del método correspondiente enel Proxy es el que se encarga, durante su ejecución, decolocar en la pila la información necesaria para invocaral delegate InterceptionHandler. Note que la línea delcódigo emitido con:

il.EmitCall(OpCodes.Callvirt,

typeof(MethodCall).GetMethod("Invoke"),

null);

Es la que hará la llamada al método Invoke corres-pondiente al InterceptionHandler (el Invoke es elmétodo que ejecutan los delegates). El resultado quequedará en la pila al ejecutarse este Invoke es el que asu vez se retornará al código cliente.

dotN

etM

anía

<<

28

dnm.plataforma.net<<

public class Interceptor{. . .public static object Create(object targetObject, Type interfaceType){Type proxyType = EmitProxyType( targetObject.GetType(), interfaceType);return Activator.CreateInstance(proxyType,

new object[] { targetObject, interfaceType });}private static Type EmitProxyType(Type targetType, Type interfaceType){createBuilders(assemblyName, moduleName, access);

Type type = modBuilder.GetType(asmBuilder.GetName().Name + ".__Proxy" + interfaceType.Name + targetType.Name);

if (type == null){

typeBuilder = modBuilder.DefineType(asmBuilder.GetName().Name + ".__Proxy" + interfaceType.Name + targetType.Name,TypeAttributes.Class | TypeAttributes.Public,targetType.BaseType, new Type[] {interfaceType, typeof (IEmitedInfo)});

fbTarget = typeBuilder.DefineField("target", baseInterface, FieldAttributes.Private);

fbIface = typeBuilder.DefineField("iface", typeof(Type), FieldAttributes.Private);

EmitCtor(typeBuilder,fbTarget,fbIface);MethodInfo[] methods = interfaceType.GetMethods();foreach (MethodInfo m in methods) EmitProxyMethod(m, typeBuilder);Type[] ifaces = targetType.GetInterfaces();foreach (Type iface in ifaces)

Fuente 6 (sigue...)

11 Esto está inspirado en una idea similar a la que utilizamos en un artículo anterior de dotNetManía [5].

Page 29: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

//InterceptionHandler) pues el GetCurrentMethod devuelve //su equivalente en el Proxy.il.Emit(OpCodes.Ldarg_0);il.Emit(OpCodes.Ldfld, (FieldInfo)fbTarget);il.EmitCall(OpCodes.Call, typeof(object).GetMethod("GetType"));il.EmitCall(OpCodes.Call, typeof(MethodBase).

GetMethod("GetCurrentMethod"), null); //Segundo parámetro InterceptionHandler: MethodBase methodil.EmitCall(OpCodes.Call,

typeof(Helper).GetMethod("GetMethodFromType"), null);//Tercer parámetro InterceptionHandler: object[] parametersil.Emit(OpCodes.Ldloc,parameters);

//Poner en la pila el método en la interface equivalente al //que devuelve GetCurrentMethod del Proxy para extraerle los //AspectAttributes.il.Emit(OpCodes.Ldarg_0);il.Emit(OpCodes.Ldfld, (FieldInfo)fbIface);il.EmitCall(OpCodes.Call,

typeof(MethodBase).GetMethod("GetCurrentMethod"), null); il.EmitCall(OpCodes.Call,

typeof(Helper).GetMethod("GetMethodFromType"), null);

//Poner en la pila los parámetros del GetCustomAttributes//Primer parámetro: Type attributeTypeil.Emit(OpCodes.Ldtoken,typeof(AspectAttribute));il.Emit(OpCodes.Call, typeof(Type).GetMethod("GetTypeFromHandle"));

//Segundo parámetro: bool inheritil.Emit(OpCodes.Ldc_I4,1);

il.EmitCall(OpCodes.Callvirt,typeof(MethodInfo).GetMethod("GetCustomAttributes",new Type[] { typeof(Type), typeof (bool) }), null);

il.Emit(OpCodes.Ldarg_0);il.Emit(OpCodes.Ldfld, (FieldInfo)fbIface);

//Primer parámetro: Type attributeTypeil.Emit(OpCodes.Ldtoken,typeof(AspectAttribute));il.Emit(OpCodes.Call, typeof(Type).GetMethod("GetTypeFromHandle"));

//Segundo parámetro: bool inheritil.Emit(OpCodes.Ldc_I4,1);

il.EmitCall(OpCodes.Callvirt,typeof(Type).GetMethod("GetCustomAttributes",

new Type[] { typeof(Type), typeof (bool) }), null);

//Cuarto parámetro del InterceptionHandler: AspectAttribute[] aspectsil.EmitCall(OpCodes.Callvirt,

typeof(Helper).GetMethod("AspectUnion"), null);

//Invocar al InterceptionHandleril.EmitCall(OpCodes.Callvirt,

typeof(MethodCall).GetMethod("Invoke"),null);

//Dejar en la pila el valor del retorno de forma adecuadaif (m.ReturnType == typeof(void))

il.Emit(OpCodes.Pop);else if (m.ReturnType.IsValueType) {

il.Emit(OpCodes.Unbox, m.ReturnType); il.Emit(OpCodes.Ldind_Ref);

}

il.Emit(OpCodes.Ret);}...}

dotN

etM

anía

<<

29

dnm.plataforma.net<<

(continuación...) Fuente 6

{typeBuilder.AddInterfaceImplementation(iface);EmitMethod(iface, typeBuilder);}type = typeBuilder.CreateType();}return type;

}

protected static void EmitMethod(Type interf, TypeBuilder proxyBuilder){MethodInfo[] methods = interf.GetMethods();foreach (MethodInfo method in methods){Type[] argsTypes = MethodHelper.GetParameterTypes(method);MethodInfo coreMethod = fbTarget.FieldType.GetMethod(method.Name,

argsTypes);MethodBuilder methodBuilder = proxyBuilder.DefineMethod(method.Name, MethodAttributes.Public |MethodAttributes.Virtual, method.ReturnType, argsTypes);

ILGenerator il = methodBuilder.GetILGenerator();il.Emit(OpCodes.Ldarg_0);il.Emit(OpCodes.Ldfld, fbTarget);for (int i = 0; i < argsTypes.Length; i++)

il.Emit(OpCodes.Ldarg, i+1);OpCode callCode = OpCodes.Call;if (coreMethod.IsVirtual)

callCode = OpCodes.Callvirt;il.EmitCall(callCode, coreMethod, null);il.Emit(OpCodes.Ret);

}}

public static void EmitProxyMethod(MethodInfo m, TypeBuilder builder){Type[] paramTypes = Helper.GetParameterTypes(m);MethodBuilder mb = builder.DefineMethod(m.Name,

MethodAttributes.Public |MethodAttributes.Virtual, m.ReturnType, paramTypes);

ILGenerator il = mb.GetILGenerator();

//Convertir los parámetros del método en un object[]LocalBuilder parameters = il.DeclareLocal(typeof(object[]));

il.Emit(OpCodes.Ldc_I4, paramTypes.Length);il.Emit(OpCodes.Newarr, typeof(object));il.Emit(OpCodes.Stloc, parameters);

for (int i=0; i<paramTypes.Length; i++) {il.Emit(OpCodes.Ldloc,parameters);il.Emit(OpCodes.Ldc_I4, i);il.Emit(OpCodes.Ldarg, i+1);if (paramTypes[i].IsValueType)il.Emit(OpCodes.Box, paramTypes[i]);il.Emit(OpCodes.Stelem_Ref);

}

//Poner en la pila el InterceptionHandler y //sus respectivos parámetros.il.EmitCall(OpCodes.Callvirt,

typeof(Interceptor).GetProperty("InterceptionHandler").GetGetMethod(),null);

//Primer parámetro InterceptionHandler: object targetObjectil.Emit(OpCodes.Ldarg_0);il.Emit(OpCodes.Ldfld, (FieldInfo)fbTarget);

//Obtener el método en el objeto original(parámetro para el

Page 30: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

Conclusiones

En [6] se describe una alternativa para incorporaraspectos en .NET basada en el uso de contextos eintercambio de mensajes. Esta alternativa exige queel código cliente conozca cómo funciona esta infra-estructura de intercambio de mensajes. En dicho artí-culo cada uno de los atributos que se definan para usarcon objetivo de aspecto tiene que “repetir” un mismopatrón en su implementación, lo cual es, en ciertomodo, una paradoja porque esto mismo es parte de loque la AOP pretende evitar.

La estrategia propuesta en el presente trabajo es másgenérica porque pretende independizar, la forma de defi-nir y usar los atributos que harán de aspectos, del meca-nismo de intercepción utilizado. Desafortunadamente,la infraestructura de contextos y de proxies reales y pro-xies transparentes no está aún ampliamente documen-tada en .NET. Uno de los objetivos de los dos primerosmodos de intercepción que expusimos en este artículoha sido el de simplificar y ejemplificar el uso de esta infra-estructura de .NET.

Hay otros enfoques (ver por ejemplo [7]) que se basanen usar preprocesadores, o herramientas adicionales, odepender de que se implementen nuevos compiladorespara colocar e implementar los aspectos que hagan el“entretejido” de código. Sin embargo, uno de los obje-tivos de las soluciones que hemos propuesto en este tra-bajo, ha sido el de basarse en los propios recursos exis-tentes en .NET y en proponer un patrón de cómo uti-lizarlos.

Las dos primeras estrategias presentadas tienenun costo adicional en eficiencia porque se basan en elmecanismo de .NET remoting lo que implica que lasllamadas a cualquier método a través de esos objetosserán tratadas por mensajes, independientemente deque el método en particular no esté decorado con nin-gún atributo-aspecto.

Por otra parte la primera solución, que estuvo basa-da en proxies de .NET, obliga a que el tipo del obje-to a interceptar tenga que implementar una interfaz,para luego tratar al objeto a través de dicha interfaz.De modo que no podría ser aplicable a un tipo que yaestuviese definido y que no indicase que implementeuna interfaz.

La segunda solución, la basada en contextos, exigeque el tipo de los objetos a interceptarle las llamadas ten-

ga que ser un tipo que herede de ContextBoundObject.De modo que tampoco podría ser aplicable a un tipo yadefinido y que no herede de ContextBoundObject. Comoademás en .NET no hay herencia múltiple tampocopodría ser aplicable a un tipo que quisiéramos que here-dase de alguna otra clase.

La tercera alternativa de lograr el equivalente ala “intercepción” se basó en la generación dinámicade un tipo que emule al original. Con esta alterna-tiva se puede lograr, no sólo una variante más efi-ciente de intercepción, sino más viable si pretende-mos poner aspectos a los métodos de una clase yaexistente. En otras palabras, mezclar sin revolver oponer sin estropear.

Las propuestas de intercepción que se han anali-zado se han dedicado a la intercepción de “grano fino”,es decir, a interceptar a nivel de código IL y CLR.Otra concepción de intercepción de “grano grueso”,por ejemplo a nivel de servicios web, también podríaser considerada pero ése no ha sido el caso que pre-tende ilustrar este trabajo.

Por razones de espacio, y para simplificar la com-prensión, sólo se ha mostrado el patrón de “entrete-jido” más común: poner acciones a aplicar antes deejecutar el método llamado y acciones a aplicar des-pués de ejecutar el método llamado.

Una derivación interesante de esta propuesta esusar atributos e intercepción para poder intercalar, enun tipo y sus métodos, precondiciones, postcondi-ciones e invariantes, dando con ello soporte en .NETa la metodología conocida como Programación porContratos. Esto será objeto de un futuro artículo dedotNetManía. Se pueden desarrollar otros patronesde entretejido de funcionalidades (algunos se men-cionaron en este trabajo) basados en las solucionespropuestas. Esperamos que algún lector interesado senos una a ello.

Bibliografía[1]Gregor Kiczales and others, Aspect Oriented

Programming, Springer Verlag, Proceedings of ECO-OP 1997

[2]Don Box, Chris Sells Essential .NET: The CommonLanguage Runtime, Addison-Wesley 2003

[3] Juval Löwy, Programming .NET Components, O'Reilly2003

[4] Tom Barnaby, Jason Bock, Applied .NET Attributes,APress 2003

[5] Mario del Valle, Miguel Katrib, El poder de la refle-xión en .NET, dotNetManía No 3, Abril 2004

[6] Drama Shukla, Simon Fell, Chriss Sells Aspect-Oriented Programming Enables Better Code Encapsulationand Reuse¸MSDN Mag, March 2003.

[7] Vladimir Safonov, Aspect.NET: Concepts andArchitecture, .NET Developer's Journal, October2004.

dotN

etM

anía

<<

30

dnm.plataforma.net<<

Las propuestas de intercepción que se han analizadose han dedicado a la intercepción de “grano fino”, es

decir, a interceptar a nivel de código IL y CLR

Page 31: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración
Page 32: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

32

recibimos el encargo de anali-zar la aplicación de un cliente desde el punto devista de la seguridad. Lo primero que se me vinoa la cabeza fue intentar buscar alguna herramien-ta que nos permitiese automatizar tests de prue-ba de la aplicación, en busca de agujeros de segu-ridad. Cuál fue mi sorpresa cuando encontré quela propia Microsoft dispone de una herramientaque nos permite hace un primer análisis de lasoperaciones que realiza una aplicación para ave-riguar si es posible que alguna de esas operacio-nes sea explotada malintencionadamente. Dichaherramienta es Windows Application Verifier(que ya va por su versión 2.5 y que el equipo dedesarrollo promete continuar mejorando, sobretodo desde el punto de vista de la seguridad) queforma parte del Microsoft Windows ApplicationCompatibility Toolkit. (http://www.microsoft.com/win-dows/appcompatibility ), que es el primer paso queuna aplicación debe de superar en el caso de quedeseemos poseer la especificación de AplicaciónDiseñada para Windows XP.

AppVerifier es una herramienta de testeo dise-ñada para ayudar a los desarrolladores a crear mejo-res aplicaciones, sacando a la luz los errores máscomunes desde el punto de vista del desarrollo. Laherramienta inspecciona nuestra aplicación cuan-do este se está ejecutando y monitoriza su com-

portamiento interceptando las llamadas que la apli-cación realiza a determinadas APIs. Al colocarseentre la aplicación y el sistema operativo, nos per-

Verificando la seguridad de nuestras aplicaciones

El desarrollo de aplicaciones seguras es un proceso realmente complejo, y que en la mayor parte delas aplicaciones no se tiene en cuenta en su conjunto. Los programadores estábamos acostumbra-dos,hasta no hace no mucho tiempo,a no pensar en esto,y dejar los temas de la seguridad en manode los administradores de sistemas. Sin embargo, cada vez son más los agujeros de seguridad queexplotan los códigos maliciosos, ocasionados por malas prácticas de programación. En este artículose describe la utilización de una herramienta,Microsoft Application Verifier, que puede ser un buen pri-mer paso para el testeo de la seguridad de nuestras aplicaciones.

<<

Por Antonio SotoTechnical Account ManagerAlcatraz Solutions

Hace un par de meses

Microsoft Application Verifier forma parte deun conjunto de herramientas denominadoMicrosoft Windows Application Compatibility Toolkit.Este conjunto de herramientas nos permite com-probar la compatibilidad de una aplicación enuna determinada configuración proporcionandodescripciones detalladas de varias metodologíasde testeo. Entre ellas destacamos:

• Instrucciones detalladas para distribuir par-ches para la compatibilidad de aplicacio-nes a través de varios métodos.

• Guías de desarrollo para mantener la com-patibilidad con diferentes sistemasWindows.

• Comprobación de los requisitos para quela aplicación pueda disponer de la certifi-cación y el logo de “Windows Logo andaCertification”.

• Más de 200 conjuntos de síntomas/resolu-ciones para el mantenimiento de compa-tibilidad.

Microsoft Application Verifier

Page 33: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

mite, por ejemplo, chequear los pará-metros que se le pasan a las funcionesAPIs, inyectar parámetros erróneospara comprobar cómo la aplicación se

recupera ante los errores, registrar loscambios que la aplicación realiza en elregistro o en el sistema de ficheros,etcétera.

Cómo trabajar conAppVerifier

El modo de funcionamiento de laherramienta es realmente sencillo.Como se puede ver en la figura 1, laaplicación dispone de una única pan-talla desde la que deberemos ir agre-gando, en el panel de la izquierda, lasaplicaciones que deseemos analizar.Una vez hayamos seleccionado lasaplicaciones, en el panel de la izquier-da disponemos de los tests que la apli-cación nos permite automatizar; unavez seleccionados, desde el botón deRun, ejecutaremos la aplicación, y apartir de ese momento AppVerifiercomenzará a registrar las operacionesrelacionadas con los tests que haya-mos seleccionado. Lo único que debe-mos hacer es trabajar normalmentecon la aplicación, de forma queAppVerifier pueda interceptar las lla-madas que ésta realiza y hacer suscomprobaciones. Una vez hayamosfinalizado, podremos ver los resulta-dos en los logs generados por la herra-mienta, que además podremos expor-tar y recuperar posteriormente.Podemos ver uno de estos logs en lafigura 2.

Cómo controlar la seguri-dad de nuestra aplicacióncon AppVerifier

A la hora de comprobar la segu-ridad de nuestras aplicaciones, elequipo de desarrollo de WindowsApplication Verifier recomienda quecomo mínimo se habiliten los siguien-tes tests:

• PageHeap. Detecta los problemasque puedan ocurrir en la pila en elmomento en el que se producen.

• Handles. Nos asegura que una apli-cación no intenta utilizar handlesinválidos.

• Locks. Nos asegura que nuestraaplicación utiliza los recursos crí-ticos de forma adecuada.

• SecurityChecks. Registra aquellassituaciones en las que un códigomalicioso podría ejecutarse.

dotN

etM

anía

<<

33

dnm.plataforma.net<<

Figura 1.- Pantalla Principal de Windows Application Verifier

Figura 2.- Registro de Errores

Page 34: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

Los puntos que los tests de seguridad com-prueban son:• Avisa al usuario sobre las ACLs que tienen con-

troles de seguridad cuestionables. AppVerifier com-prueba las listas de permisos de los objetos crea-dos, copiados o movidos por la aplicación, regis-trando aquellos casos en los que se asigne unaDACL NULL, o la predeterminada que le asig-na el permiso de Control Total a todos los usuarios.El test también considera erróneo que un usuarioque no sea administrador tenga privilegios paracambiar los permisos de un objeto.

• Comprueba que determinadas APIs, comoCreateProcess, se utilizan adecuadamente.Concretamente, comprueba que los parámetrosde dichas funciones estén correctamente for-mados y no sean nulos.

• Avisa al usuario cuando se utilizan funciones queson susceptibles de sufrir un ataque de bufferoverrun.

• Chequea las configuraciones de las APIs decomunicaciones. Asegurándose de que se utili-za el flag SO_EXCLUSIVEADDRUSE, preveiendo asíaccesos no autorizados a esos puertos.

A la hora de realizar estos tests, podemos deci-dir cómo queremos que AppVerifier interactúe connuestra aplicación gracias a los dos modos de fun-cionamiento de que disponemos: registro y depura-ción. En el modo registro AppVerifier tan solo regis-tra, como vimos en la figura 2, los eventos que gene-ra la aplicación, en base a los tests que nosotroshemos seleccionado. Sin embargo, disponemos dela posibilidad de configurar AppVerifier de formaque, en el momento en el que detecta un mal com-portamiento lance un depurador y nos lleve a lalínea de código que está generando dicho compor-tamiento. Para ello, como se puede apreciar en lafigura 3, disponemos, en el botón de opciones delas configuraciones, de la posibilidad de indicarle

cuándo queremos que “rompa” en el depurador yqué depurador queremos utilizar, y en el que pode-mos indicar el depurador del CLR (dbgclr.exe).

Otro de los problemas con los que nos encontra-mos, fue que, a pesar de que AppVerifier, es una muybuena herramienta para el chequeo de nuestras apli-caciones, no automatiza los tests que realiza, por loque deberíamos realizar las pruebas de forma manual,navegando por todas las opciones de menú y casuís-ticas de nuestras aplicaciones, lo que evidentementereduce mucho la posibilidad de dar con determina-dos errores. Por ello intentamos utilizarlo junto conla herramienta con lo que habitualmente realizamosnuestro juego de pruebas -y de la que hablaremos másen profundidad en dotNetManía- NUnit, y el resul-tado fue espectacular, conviven sin ningún problema,y de este modo conseguimos realizar los tests de for-ma automatizada.

ConclusionesEjecutar los tests de seguridad

que nos proporciona AppVerifier esel primer paso que debemos darpara asegurarnos de que nuestrasaplicaciones cumplen con deter-minadas políticas de seguridad,pero evidentemente no es sufi-ciente para asegurarnos de quenuestra aplicación es segura. Elproceso de desarrollo de apli-caciones seguras es casi unaciencia que afecta a todos lospasos en el ciclo de vida del desa-rrollo de una aplicación. Este tipo de herramientasayudan, y mucho, pero no sustituyen a las buenasprácticas de desarrollo respecto a la seguridad.

dotN

etM

anía

<<

34

dnm.plataforma.net<<

Ejecutar los tests de seguridad que nos proporciona AppVerifieres el primer paso que debemos

dar para asegurarnos de que nuestras aplicaciones cumplen con determinadas políticas de

seguridad, pero evidentemente noes suficiente para asegurarnos deque nuestra aplicación es segura

Figura 3.- Opciones de Configuración

Page 35: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

de estos artículos es dar a conocerlos Analaysis Services de SQL Server, intentandoser lo más prácticos y didácticos posibles, entran-do lo mínimo posible en conceptos comoDataWarehouse o DataMart, OLAP, o el tan demoda Business Intelligence. Simplemente iré indi-cando las definiciones necesarias para que lo aquíexpuesto sea entendido, dejando para otra oca-sión un artículo más teórico sobre estos temas taninteresantes. Y por supuesto quedan tambiénexcluidos todos los temas de arquitectura y dise-ño, ya que el enfoque que aquí expongo es paraque un desarrollador pueda crear un pequeñoejemplo y dejen de “sonarle a chino” estas herra-mientas y conceptos.

Pues manos a la obra, empezaremos a hacer lasdefiniciones mínimas para que los artículos sean enten-didos, voy a intentar ser lo más breve posible.

OLAP son las siglas de On-Line AnalyticalProcessing, que lo podemos traducir por “ProcesoAnalítico En Línea”. Se trata de unos servidorescuyas bases de datos están diseñadas y optimizadaspara permitir consultar con una gran flexibilidad yeficacia, sin formatos establecidos o predefinidos,obteniendo rápidamente respuestas a una gran varie-dad de preguntas (lo que se conoce como consultas“ad-hoc”). Dichas bases de datos son multidimen-sionales, no son relacionales.

Por ejemplo, pensemos en las preguntas:• “¿Cuáles fueron las ventas al contado (inclu-

yendo importe y cantidad) realizadas por clien-tes de Murcia en el primer trimestre de 2001?”.

• “¿Cuántas unidades fueron vendidas del artí-culo 512 en las provincias de Murcia y Almeríadurante los meses de marzo y abril de 2001?”

• “¿A cuánto ascendieron las ventas por fami-lia, por producto y por tiempo?”

Es importante conocer la arquitectura de unainfraestructura de este tipo, y conocer que elDataWarehouse se suele alimentar de datos proce-dentes de sistemas transaccionales, llamados tam-bién OLTP (On-Line Transaction Processing).

SQL Server Analysis Services¡Hola Cubo! (I)

Por Salvador RamosSQL Server MVPHelpDNA.net

En esta serie de artículos os presentaré un pequeño ejemplo de un DataWarehouse, apartir del cual construiremos una base de datos multidimensional compuesta por unsólo Cubo, y que será explotada y analizada con herramientas cliente como MS Excely MS Data Analyzer. El objetivo fundamental es que nos empecemos a familiarizar conesta estupenda herramienta que viene con SQL Server y que en la mayoría de las oca-siones no se utiliza por desconocimiento. Será algo así como el famoso “¡Hola mun-do!” de los que se inician en la programación.

La idea fundamental<<

dotN

etM

anía

<<

35

Figura 1. Ejemplo de una arquitectura OLTP y OLAP típica.

Page 36: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

En las Bases de Datos Relacionales (BDR en ade-lante) el objeto en el que se almacena la información esla tabla, que consta de dos dimensiones, filas y columnas.En las Bases de Datos Multidimensionales (BDM enadelante) la información se almacena en Cubos, que pue-den tener varias dimensiones.

Todos los que ya conocéis las estructuras bidimen-sionales (tablas) en las que sólo tenéis dos perspectivasde la información, habéis podido comprobar por vues-tra experiencia la gran cantidad de información que sepuede extraer de ellas. Pues ahora imaginaos esa poten-cia multiplicada por N veces, al disponer de N perspec-tivas para analizar la información. Así os haréis una ideainicial de lo potente, ágil y flexible que puede resultar elmodelo multidimensional.

El cubo es el objeto que tiene los datos analíticos conlos que queremos trabajar. Los cubos tienen una estruc-tura multidimensional organizada en dimensiones ymedidas.

Para obtener los datos referentes a las tres pregun-tas iniciales referentes a las ventas, debemos obtener losdatos de las dimensiones Cliente, Provincia, Forma dePago, Artículo y Tiempo, y de las medidas Importe yCantidad.

A estas estructuras se les ha dado el nombre de cubo(supongo que porque no somos capaces de representargráficamente más de tres dimensiones), pero no se limi-

ta a mostrar únicamente datos tridimensionales, sino enN dimensiones. En el párrafo anterior hemos utilizadocinco dimensiones y dos medidas.

Una de las habilidades principales en la navegacióny manipulación de estructuras de datos en una BDM esque el cubo se puede rotar, girar, cortar porciones o extra-er parte de su estructura.

Ahora vamos a entender otros de los conceptos quehemos nombrado. Las medidas son los datos numéricosque queremos analizar. Para cada medida del cubo, éstecontiene un valor en la celda, en función de las dimen-siones y niveles que se estén mostrando. La medida esel valor numérico que obtenemos en la intersección delas diversas dimensiones del cubo.

Una dimensión es cada uno de los ejes que forman elcubo, o sea cada una de las perspectivas desde las que elusuario quiere ver la información. Las dimensiones sonjerárquicas y, en la mayoría de los casos, sus miembrosestán organizados en una configuración de tipo pirami-dal. Están estructuradas jerárquicamente en niveles y susmiembros (cada uno de los elementos o valores que hayen la dimensión) suelen tener una configuración de tipopiramidal.

Por ejemplo, la dimensión Factory Location consta delos siete miembros siguientes:

dotN

etM

anía

<<

36

dnm.servidores.sql<<

Figura 3.Comparativa de una estructura piramidal de una dimensióncon la estructura de una tabla en una base de datos relacional.

Figura 2. Cubo formado por tres dimensiones (Product,Time, Factory Location) y una medida (unidades vendidas).

Una de las habilidades principales en la navegación y manipulación de estructuras de datos en una BDM es que el cubo se puede rotar,

girar, cortar porciones o extraer parte de su estructura.

Todas Factory Location (1)East (2)

Maine (3)Ohio (4)

West (5)Idaho (6)Texas (7)

Page 37: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

Una dimensión puede tener diversos modos dealmacenamiento, los más habituales son: OLAPMultidimensional (MOLAP) u OLAP Relacional(ROLAP). MOLAP es el modo de almacenamientoque utilizaremos en nuestro ejemplo. Queda fueradel ámbito de este artículo la explicación de cada unode estos sistemas de almacenamiento, y cuándo esaconsejable utilizar cada uno de ellos.

Bien, pues una vez hecha esta pequeña introduc-ción, vamos a centrarnos en SQL Server AnalysisServices y en el ejemplo que vamos a implementar.

Una vez instalados los Analysis Services y el último service pack para éstos, tenemos disponi-ble la herramienta con la que vamos a implemen-tar y administrar las bases de datos multidimen-sionales que vamos a desarrollar, el AnalysisManager.

Vamos a partir de una BDR donde ya hemosextraído y transformado los datos desde nuestros sis-temas OLTP (la que en la figura 6 aparece con elnombre “DataWarehouse”). Esta es una base de datossobre la que podremos lanzar todas las consultas quedeseemos en lenguaje SQL, que podrá ser aprove-chada al estar denormalizada y ser independiente denuestros sistemas OLTP para que éstos tengan unamenor carga de consultas. A partir de ella vamos acargar la información en nuestra BDM, que llama-remos “dotNetMania”, donde vamos a crear el cubo“Ventas”.

Aunque lo que acabamos de indicar es la situa-ción típica de este tipo de desarrollos, aquí vamos apartir de la base de datos DataWarehouse ya carga-da con los datos, y no incluiremos el resto de DBRde los sistemas OLTP, ni los procesos de extracción,transformación y carga utilizados.

Como anticipación al siguiente capítulo mostra-remos unas imágenes que nos amplíen la visión de lovisto hasta ahora:

dotN

etM

anía

<<

37

dnm.servidores.sql<<

Niveles:Provincia

Niveles:Familia

Artículo

Niveles:Cliente

Niveles:Forma de Pago

Niveles:Año

TrimestreMes

Día

Figura 4.Dimensiones del ejemplo a desarrollar según se ven en el Analysis Manager.

Figura 5. El Analysis Manager.

Figura 6. Esquema de las Bases de Datos y herramientas de acceso.

Page 38: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

Aunque tanto el cubo “Ventas” como el“DataWarehouse” utilizan las mismas tablas, esto es debi-do a que hemos montado un mini-DataWarehouse quesólo contiene la información imprescindible para el ejem-plo. Como puede suponer un DataWarehouse real seráinmensamente mayor, tanto en número de tablas comoen filas por tabla, ya que éste contiene información his-tórica y procedente de diversos sistemas OLTP.

A continuación presentamos la información comorespuesta a las tres preguntas efectuadas al principiodel artículo:

Próximamente, partiremos ya del DataWa-rehouse aquí definido y crearemos paso a paso labase de datos multidimensional “dotNetMania”,y en ella el cubo “Ventas” para analizar la infor-mación referente a las ventas de nuestra empre-sa ficticia, y finalmente explicaremos cómo obte-ner información de ella utilizando MS Excel yMS Data Analyzer.

dotN

etM

anía

<<

38

dnm.servidores.sql<<

Figura 9. ¿Cuáles fueron las ventas al contado (incluyendo importe y cantidad)realizadas por clientes de Murcia en el primer trimestre de 2001?

Figura 10. ¿Cuántas unidades fueron vendidas del artículo 512 en las provincias de Murcia y Almería durante

los meses de marzo y abril de 2001?

Figura 11. ¿A cuanto ascendieron las ventas por familia, porproducto y por tiempo?

Figura 7.Esquema relacional de DataWarehouse realizado con la herra-mienta dediagramas incluida en el administrador corporativo de SQL Server.

Figura 8.Cubo de Ventas visto desde el Editor de Cubos del Análisis Manager.

Importante

Es muy importante que sepaque los service packs de SQLServer y de los AnalysisServices se instalan por sepa-rado,son dos ejecutables total-mente independientes. Nointerprete que por tener ins-talado el último service packde SQL Server tiene tambiéninstalado el de los AnalysisServices, ni viceversa.[ [

Page 39: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración
Page 40: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

40

los museos han sido considerados como meros“contenedores visuales” de obras de arte, esto es, suprincipal labor era la conservación física: manteni-miento, restauración y seguridad de cierto patrimo-nio artístico. Afortunadamente, esta visión arcaica yestática del papel que deben jugar los museos en elabanico cultural de una sociedad ha sido renovada enlos últimos años. Como consecuencia de esta nuevavisión han surgido nuevas responsabilidades adesempeñar por este tipo de instituciones. Entreellas cabe destacar: en primer lugar, la labor de con-servación intelectual entendida como el estudio,interpretación, catalogación y valoración de lasobras de arte en cuanto a objetos de carácter esté-tico que constituyen las huellas culturales de lahumanidad; y, en segundo lugar, la labor de dina-mización cultural, mediante la cual los antiguoscontenedores “dejan atrás su silencioso aposentopara dialogar con el arte y con la sociedad, inte-rrogando constantemente, relacionándose y modi-ficando el entorno”. Es fácil encontrar expresionesde estas nuevas responsabilidades en la práctica tota-lidad de los museos españoles dado que la granmayoría organiza conferencias y talleres, editapublicaciones explicativas, posee bibliotecas de arte,son centros de atracción turística, e incluso, los másatrevidos, utilizan tecnologías de la informaciónpara hacer llegar sus contenidos al mayor númeroposible de ciudadanos. Sin embargo, todavía exis-ten nuevas metas o mecanismos innovadores que

permitirían desarrollar el papel dinamizador de losmuseos. El arte y la tecnología pueden fusionarseen el seno de estas instituciones facilitando el diá-logo con el arte, haciendo más accesible el patri-monio cultural, promocionando su conocimiento“in situ”, y en definitiva, convirtiendo a los muse-os en instituciones más dinámicas y cercanas a losciudadanos.

Los museos y las TICsEn [1] se presenta un estudio detallado en el que

se cuantifica el grado de presencia y desarrollo delas tecnologías de la información en los museos espa-ñoles en comparación con los museos de mayor rele-vancia internacional. Dicho estudio analiza desdedistintas perspectivas 53 museos de arte y cienciasy revela que a pesar de que más de un 93% de losmuseos estudiados tiene presencia en Internet, sóloel 4,5% posee un nivel alto de desarrollo global(figura 1), es decir, “el grado de aproximación delmuseo al ciudadano ... mediante, entre otros, la ges-tión de trámites, el fomento de la participación o lapersonalización de la información” es deficiente enla inmensa mayoría de los museos estudiados, excep-to en “el Museo Thyssen-Bornemisza de Madridy el Centro de Cultura Contemporánea deBarcelona que son los dos museos españoles quepresentan un nivel alto de desarrollo en el cómpu-to final”. Cabe destacar, sin embargo, para no dar

Museos, hormigas y serialización en el Compact Framework de .NET

Por Javier Jaén y Jose A. MocholíProyecto MOMOUniversidad Politécnica de Valencia

<< En el pasado

Hace 4 años, en París y con sólo 2 horas para visitar el Louvre. Así nació MOMO(MuseO MÓvil) en la mente del profesor Javier Jaén. Mediante el uso de un PocketPCinalámbrico y unas cuantas hormigas el visitante puede tener a su alcance una com-pleta información multimedia optimizada a sus gustos y al tiempo de que dispone.

Page 41: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

una visión demasiado catastrofista, queen el ámbito de la fidelización (aquélrelacionado con la existencia de visi-tas virtuales, correo electrónico, con-sultas telemáticas, etc.) este mismoestudio concluye que el 80% de losmuseos tiene un nivel “medio-alto”.Dicho de otro modo, la inmensa mayo-ría de los museos ha utilizado las nue-vas tecnologías para implementar visi-tas virtuales accesibles en la Web. Esto,que a priori parece un dato realmentepositivo, no debe llevar a conclusionesprematuras dado que el estudio no seacompaña con estadísticas de uso dedichos servicios de fidelización. Dadoque carecemos de estos datos, utiliza-remos otros datos indirectos para lle-gar a conclusiones razonablementeacertadas. Si consideramos que en [2]se afirma que en el primer trimestrede 2004 sólo un 26.9% de los hogaresespañoles disponía de acceso aInternet, y que según [3] la penetra-ción de la banda ancha en los hogaresde España es sólo de un 12% (aspectofundamental para visitas virtuales degran riqueza sensorial) podemos, cuan-to menos, cuestionar la eficacia dedichas estrategias a la hora de contri-buir a la promoción de la cultura y lacomprensión del arte por parte de lagran mayoría de los ciudadanos. Siademás corroboramos que muchosamantes del arte se sienten defrauda-dos al realizar visitas virtuales debidoa la poca riqueza sensorial que dichasvisitas poseen podríamos concluir quela situación actual de uso de nuevastecnologías en los museos en general,y de los españoles en particular, no esen absoluto la deseable.

Para resolver este problema, existenvarias iniciativas relacionadas con laintroducción de las nuevas tecnologías

en los museos. iTour [4]es un proyecto llevado acabo en el Museo deArte Blanton de laUniversidad de Texas(UT) conjuntamenteentre el museo y elDepartamento deTecnologías de laInformación de UT. Elproyecto utiliza la plata-forma PocketPC en la

memoria de la cual se almacenan losdatos de las obras y los contenidos mul-timedia que más tarde se mostrarán alusuario. La información se muestra alusuario a través de una aplicación dise-ñada en Flash [7] y programada usando

Action Script. Durante la visita se vancapturando datos sobre los patrones(tiempo empleado en cada obra, ordende visita de cada página, etc.) de reali-zación de la visita con iTour, que sonalmacenados en un fichero XML quemás tarde se pasará a un PC para quesus datos sean almacenados en una basede datos, de manera que se puedan rea-lizar estudios de utilización. El proyec-to Multimedia Tour [5] forma parte delos esfuerzos de la Tate ModernGallery por introducir las visitas mul-timedia en los últimos dos años. La faseactual del proyecto cuenta conPocketPCs en las que se muestran con-tenidos multimedia, realizados en Flash,vía una aplicación desarrollada por unpartner del proyecto, Antenna Audio.El contenido que se muestra al visitan-te puede estar tanto en el dispositivomóvil como en un servidor central, delque se recibirá vía la red inalámbrica delmuseo. El proyecto cuenta con tres tipos

de tours: el Multimedia Highlights, queestá específicamente diseñado para unaaudiencia entre los 16 y los 25 años yque se centra en un único conjunto deobras del museo; el British SignLanguage, que va dirigido a los visitan-tes sordos del museo y les muestra víde-os de una persona explicando la obra enlengua de signos; y el Collections Tour,que hace uso de la información almace-nada (textual en su mayor parte) rela-cionada con las obras de que dispone lagalería. El museo J. Paul Getty, juntocon Sun Microsystems, ha desarrolladoel proyecto GettyGuide [6] para com-plementar la red de quioscos multime-dia con la que ya contaba. Para el pro-yecto se eligió como plataforma Palm y

el uso de Flash para mostrar los conte-nidos multimedia que recibe del servi-dor central a través de la red inalámbri-ca del museo. El visitante puede buscarlas obras que quiere ver realizando bús-quedas por autor, género, estilos, etc.,o bien puede acercarse a una obra de suinterés para recibir la información.

MoMo: .NET al ser-vicio del arte

Los ejemplosanteriores presentanserias carencias, bienpor no soportar inte-racción social, por no presentarcontenidos dinámicos e incluso, lo quees más grave, por no guiar al usuariode una forma inteligente por el museo.El proyecto MoMo desarrollado en laUniversidad Politécnica de Valenciaresuelve todas estas carencias e imple-menta una serie de componentes inte-

dotN

etM

anía

<<

41

dnm.universidad.net<<

Figura 1. Nivel de desarrollo global tecnologías de la información

El arte y la tecnología pueden fusionarse en el seno de los museos facilitando el diálogo con el arte,haciendo más accesible el patrimonio cultural,

promocionando su conocimiento “in situ”, y en definitiva,convirtiendo a los museos en instituciones más

dinámicas y cercanas a los ciudadanos

Page 42: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

ligentes para hacer de la visita una experiencia másenriquecedora, todo ello usando la tecnología .NETtanto a nivel de servidor como en los dispositivosinalámbricos. Entre las componentes inteligentesdesarrolladas destaca la que permite a los usuariosdisfrutar de una visita lo más rica posible en un tiem-po limitado, esto es, garantiza que el visitante pue-da ver el máximo número de obras de arte popula-res sin sobrepasar un tiempo de visita dado.

Esto que puede parecer un problema trivial, nolo es, dado que hay que tener en cuenta los tiem-pos de visita a cada obra, las popularidades de lasmismas, los tiempos de desplazamiento entre salasen el museo y las posibles desviaciones (adelantoso retrasos) que el visitante pueda sufrir en su trans-curso por el museo. Este problema tiene una for-mulación matemática conocida como TheOrienteering Problem (OP), la cual tiene una gransimilitud con la formulación del clásico problemadel Viaje de Comercio. La complejidad de dicho pro-blema en términos computacionales es alta y no esposible obtener soluciones óptimas en tiempo deorden polinomial. De hecho, las implementacio-nes realizadas hasta la fecha para resolver el OPhan hecho uso de estaciones de trabajo o compu-tadores de altas prestaciones. ¿Hemos, pues, deobligar a los museos a realizar una inversión enhardware prohibitiva? ¿No es posible con los recur-sos de que disponen resolver el OP y guiar de for-ma inteligente a los visitantes?. Afortunadamente,como veremos a continuación, es posible resolverel OP sin hacer uso de grandes infraestructuras decomputación.

La sabia naturaleza ha ideado mecanismos muyefectivos para la resolución de problemas comple-jos. Por ejemplo, cuando una colonia de hormigasse emplea en la dura tarea de encontrar comida sepueden observar mecanismos de coordinación y decolaboración muy sofisticados. Las hormigas dejanseñales químicas (feromonas) cuando van en bus-ca de comida. Estas señales químicas son intensi-ficadas a medida que varias hormigas pasan por unmismo camino. El resultado final es que aquelloscaminos que conducen a lugares donde existe comi-da quedan intensamente señalados mientras quelos caminos no conducentes a comida ven evapo-radas sus feromonas. Actuando de esta manera lashormigas pueden llegar hasta la comida y volver alhormiguero de una forma efectiva. Siguiendo conesta analogía, podríamos decir que en un museolas obras que tienen gran popularidad son la “comi-da”, que los visitantes (“hormigas”) desean alcan-zar, pero claro, no parece una gran idea invitar alos usuarios del museo a ir dejando feromonas a supaso...

La pregunta es, en cambio, si es posible diseñarun algoritmo que imite el comportamiento de las hor-

migas y que sirva para resolver el OP. La respuestaes afirmativa y dicho algoritmo ha sido propuesto en[8,9]. La idea es representar los sitios de interés (ennuestro caso salas de un museo) como nodos de ungrafo. Dichos nodos tienen un peso que representasu popularidad (calculada en base a las obras de arteque contienen). Además los arcos de dicho grafoconectan salas y tienen asociado un peso que repre-senta el tiempo que cuesta ir desde una sala a otra (siello es posible). Las hormigas van recorriendo dichografo, bien de forma aleatoria o bien utilizando lasferomonas que han dejado otras compañeras. Cadavez que se encuentra un buen camino, éste es notifi-cado al resto de las hormigas para que tengan en cuen-ta las feromonas de ese camino. Al final del proceso,aquellos caminos en el museo que tienen gran can-tidad de obras de arte populares quedan enorme-mente intensificados y por tanto se obtiene una visi-ta (secuencia de salas) que tendrá un gran número deobras de arte populares.

dotN

etM

anía

<<

42

dnm.universidad.net<<

Figura 2. Caminos con feromonas de hormigas en busca de alimento

Figura 3. Mecanismo de Grid Computing en pocketPCs

Page 43: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

Mediante este algoritmo es posible resolver deforma colaborativa el OP, ahora bien, ¿necesitamostodavía un computador de altas prestaciones que per-mita trabajar a múltiples hormigas de forma parale-la?. La respuesta es NO. No hemos de olvidar queen un museo tendremos decenas de visitantes con unpocketPC en sus manos y que dichos dispositivos,aunque limitados en su capacidad de computación,pueden de forma conjunta proveer de ciclos libres deCPU para resolver el OP. Esta estrategia de compu-tación no es nueva y se conoce como Grid Computingo Utility Computing[10] (ver figura 3).

Aplicando las ideas de esta novedosa estrategia decomputación es posible obtener soluciones al OPmediante el uso de pequeños ordenadores como sonlos PocketPCs. En la figura 4 se observa una solu-ción obtenida para el museo del Prado donde hemoscoloreado en rojo las salas muy populares que con-tienen obras de grandes pintores como Velázquez,Rubens y Goya entre otros, en marrón las salas deuna popularidad intermedia y en azul aquellas salasque son de baja popularidad. Hay que destacar quela solución que mostramos ha sido obtenida median-te este esquema de computación distribuida en sólounos segundos con sólo 6 hormigas. También hayque señalar que este algoritmo puede ser aprovecha-do por los propietarios del museo para redirigir a losvisitantes a nuevas salas que inicialmente tienen pocadensidad de visitas. El museo podría marcar una salacomo muy popular (aunque en realidad no lo sea) deforma que esta sala atrajera a las hormigas cuandoestán generando visitas dinámicas. Así pues, una sala

de baja popularidad real pasaría a formar parte siem-pre de las visitas generadas mediante el algoritmo yvería incrementado el numero de personas que irí-an, dirigidos por nuestro sistema, a visitar dicha sala.

Otro aspecto que es importante describir es el hechode que el algoritmo propuesto tiene mecanismos pararecalcular dinámicamente una visita en el caso de queun visitante se esté atrasando o adelantando respecto alhorario previsto. En este caso las hormigas, de nuevodirigidas por la hormiga reina, recalculan una nuevavisita teniendo en cuenta el tiempo restante para que elusuario no llegue al final de su visita más tarde o tem-prano de lo inicialmente previsto.

ImplementaciónPara hacer realidad las ide-

as descritas con anterioridadhemos diseñado un algoritmodistribuido en .NET donde cadahormiga es un programa escrito enC# que residirá en cada pocketPCa la espera de órdenes para ponerse a calcular cami-nos óptimos en el museo. Dichas órdenes son esta-blecidas por la hormiga reina que reside en el hor-miguero y que viene representada como un servicioWeb. Utilizar un servicio Web para la hormiga rei-na nos proporciona una gran ventaja tecnológicadado que no hay que definir protocolos propietariospara comunicar y coordinar a las hormigas obrerascon el hormiguero y simplemente nos tenemos queconcentrar en los aspectos específicos del algoritmo.Sin embargo, ciertas carencias en la serialización deobjetos complejos en el Compact Framework (CF)y la estrategia que sigue la plataforma para decidirqué clases, de las necesarias para comunicarse con elservicio web, serán accesibles en el cliente a travésdel espacio de nombres del proxy del servicio Web,nos hicieron tener que desarrollar un serializadorpropio que, utilizando los mecanismos que la refle-xión en .NET nos ofrece, tratase de forma genéricatodas las clases utilizadas en la comunicación con losservicios Web del proyecto y que pasamos a expli-car a continuación.

El desarrollo que realizamos no sustituye al seria-lizador de la plataforma, sino que se basa en sus capa-cidades y solventa las carencias que nos impedían uti-lizar todas las clases del proyecto (problemas con laserialización de clases complejas en el CF, clases quese quedaban “ocultas” al no estar expuestas directa-mente por el servicio Web, …), por lo que tal vezpodríamos definirlo como un preserializador encar-gado de preparar los objetos utilizados en la comu-nicación con el servicio web para que el serializadorde la plataforma sí que pueda trabajar con ellos. Sufuncionamiento, en pocas palabras, consiste en trans-formar los objetos de unas determinadas clases en

dotN

etM

anía

<<

43

dnm.universidad.net<<

Figura 4. Solución al OP obtenida mediante una colonia de hormigas

Page 44: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

una serie de objetos de tipos que la pla-taforma sí puede tratar.

El funcionamiento del serializadores el siguiente. Tenemos una clase,PPCSerializer, que expone dos méto-dos, uno para la serialización de obje-tos (SerializeInstance) y otro para ladeserialización (DeserializeInstance).El método para la deserialización tie-ne una sobrecarga para permitir espe-cificar un espacio de nombres queincluya el nombre del ensamblado enel cuál queremos que el serializadorbusque la clase de la que es instanciael objeto a deserializar. Como pode-mos observar, tanto el resultado de laserialización como la entrada de ladeserialización es un vector de objetosde tipos simples que el serializador deCF sí puede tratar (fuente 1).

Cuando se invoca el método deserialización sucede lo siguiente:haciendo uso del método TypeSize, secalcula el tamaño necesario para queel vector de objetos pueda contenertoda la información; se crea el vectorcon el tamaño calculado y se procedea serializar el objeto, siguiendo unaestrategia recursiva en el caso de obje-tos complejos hasta encontrar tipossimples (fuente 2).

En la deserialización, los pasos sonmuy similares al proceso de serializa-ción y empiezan con la comprobaciónde si estamos trabajando con el valornulo. Luego, se recupera el tipo delsiguiente objeto con el que se va a tra-bajar, teniendo en cuenta (si fuese elcaso) el ensamblado y el espacio de nom-bres especificado. Usando reflexiónsobre el tipo, recuperamos un cons-tructor sin parámetros válido (la exis-tencia de un constructor sin parámetrosen las clases cuyas instancias se va seria-lizar, es una restricción que también for-ma parte del serializador de .NET) ycreamos una instancia del mismo.Después procedemos a recuperar losatributos públicos y las propiedadespúblicas (que se puedan leer y escribir)del tipo, y a deserializar y a intentar asig-nar el siguiente objeto al atributo o a lapropiedad en la que estemos. Si el tipodel objeto fuese uno simple, la deseria-lización se limita a realizar un cast. Sise tratase de una enumeración, bastaríacon indicar el nombre de la enumera-

ción y el valor serializado para obtenerel valor asociado de la enumeración(fuente 3).

Como ejemplo de uso del mecanis-mo de serialización descrito podemos

observar cómo una hormiga obrera secomunica con el servicio Web de la hor-miga reina. En concreto en este ejem-plo la hormiga obrera informa a la hor-miga reina sobre su existencia median-

dotN

etM

anía

<<

44

dnm.universidad.net<<

public class PPCSerializer{

public static object[] SerializeInstance(object o){…}public static object DeserializeInstance(object[] serialized_instance){…}public static object DeserializeInstance(object[] serialized_instance,

string target_namespace){…}}

Fuente 1

public static object[] SerializeInstance(object o){

int size = 0;TypeSize(o, ref size);object[] serialized_instance = new object[size];int count = 0;SerializeInstance(o, ref serialized_instance, ref count);return serialized_instance;

}protected static void TypeSize(object o, ref int size){

size ++;if (o != null){

if ((o.GetType().IsClass) && (!(o.GetType().Equals(typeof(string)))) && (!(o.GetType().BaseType.Equals(typeof(Array)))) &&(!(o.GetType().Equals(typeof(ArrayList)))))

{FieldInfo[] fields = o.GetType().GetFields();foreach (FieldInfo field in fields){

if (!field.IsStatic){

TypeSize(field.GetValue(o), ref size);}

}

PropertyInfo[] props = o.GetType().GetProperties();foreach ( PropertyInfo prop in props ){

if (prop.CanRead){

TypeSize(prop.GetValue(o, new object [] {} ), ref size);}

}}else if (o.GetType().Equals(typeof(ArrayList))){

ArrayList list = (ArrayList)o;size++;foreach (object list_member in list)

TypeSize(list_member, ref size);}else if (o.GetType().BaseType.Equals(typeof(Array))){

Array list = (Array)o;size++;foreach (object list_member in list)

TypeSize(list_member, ref size);}

else{

size++;}

}}

Fuente 2

Page 45: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

te el método antAlive, sobre su dispo-sición a realizar trabajo mediante elmétodo antReady y notifica nuevas solu-ciones mediante el métodoantsCommandDone (fuente 4).

ResumenEn este artículo hemos hecho una

revisión de los proyectos que utilizanordenadores de bolsillo para la reali-zación de visitas multimedia en muse-os. En todos los proyectos revisadosse han encontrado serias carencias encuanto a las funcionalidades propor-cionadas. También hemos presentadoel proyecto MoMo, que suple todaslas carencias de los proyectos existen-tes hasta la fecha y está implementa-do íntegramente utilizando el lengua-je C# y la plataforma .NET. Hemosde decir que la productividad en la

programación de dispositivos móvilesutilizando esta plataforma es muysuperior a la de otras plataformas ylenguajes que hemos probado comopor ejemplo Flash y ActionScript.Gracias a la potencia del lenguaje deprogramación y a las facilidades paradefinir aplicaciones basadas en servi-cios Web hemos podido implementarun algoritmo distribuido para elOrienteering Problem que permitegenerar visitas dinámicas de tiempo

dotN

etM

anía

<<

45

dnm.universidad.net<<

protected static void DeserializeInstance(out object new_instance,object[] serialized_instance, ref int pos, string target_namespace)

{if (“null”.Equals((string)serialized_instance[pos])){

new_instance = null;pos++;

}else{

Type type = FindType((string)serialized_instance[pos++], target_namespace);if((type.IsClass)&&(!(type.Equals(typeof(string))))&&

(!(type.Equals(typeof(ArrayList))))&&(!(type.BaseType.Equals(typeof(Array)))) && (!(type.BaseType.Equals(typeof(Enum)))))

{ConstructorInfo constructor = type.GetConstructor(new System.Type[0]);new_instance = constructor.Invoke( BindingFlags.CreateInstance, null,

new object[0], null);FieldInfo[] fields = type.GetFields();foreach (FieldInfo field in fields){

if (!field.IsStatic){

object field_instance;DeserializeInstance( out field_instance, serialized_instance,

ref pos, target_namespace );field.SetValue(new_instance, field_instance);}

}PropertyInfo[] props = new_instance.GetType().GetProperties();foreach ( PropertyInfo prop in props ){

if (prop.CanRead){

object prop_instance;DeserializeInstance( out prop_instance, serialized_instance,

ref pos, target_namespace);if (prop.CanWrite){

prop.SetValue(new_instance, prop_instance, new object [] {});}

}}

}else if (type.Equals(typeof(System.Collections.ArrayList))){

new_instance = new ArrayList();int num_elements = (int)serialized_instance[pos++];int initial_pos = pos;for (int i=initial_pos; i<initial_pos + num_elements; i++){

object list_member;DeserializeInstance( out list_member, serialized_instance, ref pos,

target_namespace );((ArrayList)new_instance).Add(list_member);

}}……else if (type.BaseType.Equals(typeof(Enum))){

new_instance = System.Enum.ToObject(type,serialized_instance[pos++]);}else{

DeserializeValue(out new_instance, type, serialized_instance, ref pos);}

}

Fuente 3

La productividad en la programación de

dispositivos móviles utilizando la plataforma .NET es muy superior a la de otras plataformas y lenguajes que hemos

probado como por ejemploFlash y ActionScript

Page 46: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

restringido garantizando la máximariqueza de las mismas. Para ello se hanutilizado los propios dispositivosmóviles para la computación de dichoalgoritmo demostrando que éstos sonperfectamente válidos para la resolu-ción de problemas complejos de for-ma colaborativa. En la implementa-ción de este algoritmo complejohemos implementado un serializadorde clases complejas que solventa laslimitaciones que existen en la actuali-dad en el CF de .NET y que puede serutilizado de forma genérica en cual-

quier aplicación implementada en estaplataforma.

AgradecimientosEl presente trabajo ha sido desarro-

llado gracias al apoyo de los laboratoriosde Microsoft Research Cambridgemediante su programa MSR ExcellenceAwards for Embedded Systems. Tambiénhemos de agradecer el apoyo recibido porMicrosoft Ibérica durante el concursoImagine Cup 2004 tanto en su fase nacio-nal como internacional.

Referencias[1] e-España, Informe Anual sobre el

Desarrollo de la Sociedad de laInformación en España (2002).w w w . f u n d a c i o n a u n a . o r g /areas/25_publicaciones/publi_251

_2.asp.

[2] Las TIC en los hogares españoles(2004); Ministerio de Ciencia yTecnología.www.mcyt.es/asp/ministerio_informa/prensa/pdf/balance_ene04.

pdf.

[3] Banda Ancha, (2004); GAPTEL(Grupo de Análisis y Prospectivadel sector de las Telecomuni-caciones).observatorio.red.es/gaptel/

informes/trimestrales.html.

[4] The Blanton iTour, An InteractiveHandheld Museum Guide Expe-riment; Anne Manning, GlendaSims. www.archimuse.com/mw2004/papers/

manning/manning.html

[5] Multimedia Tour Programme at TateModern; Gillian Wilson.www.archimuse.com/mw2004/papers/

wilson/wilson.html.

[6] J. Paul Getty Museum Re-ArchitectsTechnology to Enhance Visitors'Experience; David S. Marshak. www.sun.com/service/about/

success/recent/getty.html

[7] Macromedia Flash.www.macromedia.com/software/

flash/

[8] An Ant Colony Approach to theOrienteering Problem, Yun-ChiaLiang and Alice E. Smith, IEEETransactions on EvolutionaryComputation, October 2001.

[9] A Parallel Implementation of AntColony, Marcus Randall, Journal ofParallel and Distributed Computing62, 1421-1432 (2002).

[10] The anatomy of the grid: Enablingscalable virtual organizations. IanFoster, Carl Kesselman, andSteve Tuecke. InternationalJournal of Supercomputer Appli-cations, 2001.

dotN

etM

anía

<<

46

dnm.universidad.net<<

using System;using System.Collections;using System.Net;using MoMo.Ant.Algorithm;

namespace AntPocket{

/// <summary>/// Summary description for PocketWrapper./// </summary>

public class PocketWrapper : WSWrapper{MasterQueenService.MasterQueenService mq;

public PocketWrapper() {mq = new MasterQueenService.MasterQueenService();}

public GraphDescr antAlive(int graphVersion) {int type = 1;string name = Environment.OSVersion.ToString();string remString = “Microsoft “;if(name.StartsWith(remString)) name = name.Substring(remString.Length,

name.Length-remString.Length);string ip = “”;try {

ip = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();} catch (Exception) {}return (GraphDescr)PPCSerializer.DeserializeInstance(mq.antAlive(graphVersion,

type, name, ip), “MoMo.Ant.Algorithm.GraphDescr”);}

public ArrayList antReady(int antid) {return (ArrayList)PPCSerializer.DeserializeInstance(mq.antReady(antid),

“MoMo.Ant.Algorithm.AntCommand”);}

public ArrayList antCommandsDone(int queenid, SolutionPath solution) {object[] o = mq.antCommandsDone( queenid,

PPCSerializer.SerializeInstance(solution));if (o != null) return (ArrayList)PPCSerializer.DeserializeInstance(o,

“MoMo.Ant.Algorithm.AntCommand”);return null;}

public void antDead(int antid) {mq.antDead(antid);

}}

}

Fuente 4

Page 47: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

47

veremos cómo trabajar con elregistro de Windows desde nuestras aplicaciones.En concreto, utilizaremos Visual Basic .NET comolenguaje de programación, sin embargo, migrarestos ejemplos a C# u otro lenguaje .NET es unamera anécdota. Lo principal, es aprender a accederal registro, cosa que sabrá hacer cuando termine deleer este artículo.

¿Quién es el responsable?Para acceder al registro de Windows, debemos

hacer uso de un nombre de espacio, que será elcomunicador directo con las clases que nos daránacceso al registro de Windows. El nombre de espa-cio Microsoft.Win32.Registry nos facilita, por lotanto, gran parte de este trabajo.

Dentro de este nombre de espacio, tenemos unconjunto de clases preparadas para acceder a lasdiferentes partes del registro. Recordemos que elregistro de Windows está dividido en pequeñosdirectorios dónde almacena muchas variables y valo-res de las aplicaciones y configuraciones que se eje-cutan en el sistema.

De esta manera, tenemos las clases y valores a uti-lizar por cada carpeta del registro en las tablas 1 y 2.

El uso de estas clases, nos facilitará el acceso acada una de las carpetas del registro. En este artí-culo, sólo veremos algunas de las funciones gené-ricas con el registro de Windows. Todas esas fun-ciones son aplicables a las carpetas del registro deWindows.

Trabajando con el registro de Windows

En no pocas ocasiones debemos utilizar ficheros de inicialización para almacenar deter-minados valores que serán utilizados por nuestra aplicación. Sin embargo, y según el tipode proyecto, en algunas ocasiones resulta especialmente útil trabajar con el registro deWindows.

<<

Por Jorge SerranoVisual Basic y .NET MVPwww.PortalVB.com

Tabla 1. Clases a utilizar por cada carpeta del registro

A continuación, Carpeta de registro Clase

HKEY_CLASSES_ROOT ClassesRoot

HKEY_CURRENT_CONFIG CurrentConfig

HKEY_CURRENT_USER CurrentUser

HKEY_DYN_DATA DynData

HKEY_LOCAL_MACHINE LocalMachine

HKEY_PERFORMANCE_DATA PerformanceData

HKEY_USERS Users

Tabla 2.Valores a utilizar en el registro de Windows

Carpeta de registro Clase

REG_SZ ClassesRoot

REG_EXPAND_SZ CurrentConfig

REG_DWORD CurrentUser

REG_MULTI_SZ DynData

Page 48: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

48

dnm.plataforma.net<<

La figura 1, representa una ventana típica delregistro de Windows.

Observando esta figura, vemos que hay cuatropartes a tener en cuenta (enumeradas para facilitarla comprensión). El primer número correspondecon la carpeta y subdirectorios del registro deWindows; el segundo número corresponde con elnombre del campo; el tercer número correspondecon el tipo de valor contenido en el campo nom-bre; el cuarto número, corresponde con el valoralmacenado en la variable nombre.

¿Ahora bien, cómo accederemos a esta informa-ción?. Esto y mucho más será lo queveremos a continuación.

Creando una carpeta en elregistro

Una de las posibilidades que nosofrece el registro de Windows es lade crear una subcarpeta con valores.En primer lugar, veremos como crear una carpeta,que la situaremos en: HKEY_CURRENT_USER\Ejemplo.

Esto lo conseguiremos hacer ejecutando la siguien-te instrucción:

Escribiendo un valor en una carpeta deregistro

Aprovechando el ejemplo anterior, crearemosun nombre y valor dentro de la carpeta de regis-

tro creada anteriormente: HKEY_CURRENT_USER\Ejemplo.

Dentro de esa carpeta de registro, crearemos elnombre de valor MiNombre y como valor, un valor deter-minado. La teoría vista en la práctica quedaría comose detalla a continuación:

Este ejemplo añade dos nombres y valores de dife-rente tipo a nuestro registro de Windows, tal y cómose muestra en la figura 2.

Leyendo un valor en una carpeta deregistro

Accederemos nuevamente en esta ocasión aHKEY_CURRENT_USER\Ejemplo para leer el contenidode los valores almacenados en esa carpeta.

Esto lo conseguiremos con el código del fuen-te 3.

Como podemos ver, recuperamos todos losnombres de la carpeta indicada y los recorremosrecuperando sus valores.

Eliminando un valor en una carpetade registro

Nuestro cometido ahora, será el de eliminar unnombre y valor situado dentro de una determina-da carpeta. Seguiremos utilizando para ello la car-

Figura 1Ventana típica del registro de Windows

Fuente 1

Imports Microsoft.Win32[...]‘HKEY_CURRENT_USERDim MiRegKey As RegistryKey = Registry.CurrentUser‘HKEY_CURRENT_USER\EjemploMiRegKey.CreateSubKey(“Ejemplo”)‘Cerramos el objetoMiRegKey.Close()

Fuente 2

Imports Microsoft.Win32

[...]

‘HKEY_CURRENT_USER\Ejemplo

Dim MiRegKey As RegistryKey =

Registry.CurrentUser.OpenSubKey(“Ejemplo”, True)

‘Asignamos un Nombre y Valor (texto)

MiRegKey.SetValue(“MiNombre1”, “MiValor1”)

‘Asignamos un Nombre y Valor (entero)

MiRegKey.SetValue(“MiNombre2”, 2004)

‘Cerramos el objeto

MiRegKey.Close()

Figura 2. Registro de Windows con los nombres y valores creados

Page 49: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

peta que creamos en este artículo y que corres-ponde con HKEY_CURRENT_USER\Ejemplo.

Para eliminar un nombre y valor dado, debere-mos hacerlo como se indica en el siguiente código:

Accediendo al valor por defecto de unacarpeta de registro

Una de las particularidades sobre la que prác-ticamente nadie cae, es la de usar el valor Default

o Predeterminado para nuestras aplicaciones. Esmuy normal dejar ese valor inutilizado, pero enalgunos programas o aplicaciones, puede resultar-nos especialmente útil su uso. Usando la carpetaactual, HKEY_CURRENT_USER\Ejemplo, modificaremosmanualmente el valor Default o Predeterminado,según como aparezca en su sistema operativo(depende del idioma).

El acceso por código a este valor, sería tal ycomo podemos ver en el fuente 5.

Conclusiones

Como hemos podido observar en este artícu-lo, el uso del registro en Windows es muy senci-llo. Con el nombre de espacio Microsoft.Win32.Registry, tenemos acceso a las clases de acce-so al registro.

Lo que sí hay que tener siempre en cuenta, esla creación y tratamiento de los nombres y valo-res; tratamiento que según la complejidad que lehayamos dado, se puede llegar a producir en for-ma de árbol.

Por último, me gustaría destacar que a veces elregistro de Windows es especialmente útil paraalmacenar en él ciertos valores encriptados quedebemos utilizar en nuestras aplicaciones.

dotN

etM

anía

<<

49

dnm.plataforma.net<<

Fuente 3

Imports Microsoft.Win32

[...]

‘HKEY_CURRENT_USER\Ejemplo

Dim MiRegKey As RegistryKey =

Registry.CurrentUser.OpenSubKey(“Ejemplo”)

‘Recuperamos los nombres declarados dentro

‘de la carpeta anterior

Dim ListaNombres() As String =

MiRegKey.GetValueNames()

Dim strNombre As String

‘Recorremos la lista de nombres para recuperar

‘sus valores

For Each strNombre In ListaNombres

MessageBox.Show(strNombre & “ = “ &

MiRegKey.GetValue(strNombre))

Next

‘Cerramos el objeto

MiRegKey.Close()

Fuente 4

Imports Microsoft.Win32[...]‘HKEY_CURRENT_USER\EjemploDim MiRegKey As RegistryKey =

Registry.CurrentUser.OpenSubKey(“Ejemplo”, True)‘Eliminamos el nombre y valorMiRegKey.DeleteValue(“MiNombre2”)‘Cerramos el objetoMiRegKey.Close()

Fuente 5

Imports Microsoft.Win32[...]‘HKEY_CURRENT_USER\EjemploDim MiRegKey As RegistryKey =

Registry.CurrentUser.OpenSubKey(“Ejemplo”)‘Obtenemos el valor Default o PredeterminadoDim strValor As String =

CType(MiRegKey.GetValue(strValor,“DEFAULT-VALUE”),

String)‘Mostramos el contenido de este valorMessageBox.Show(strValor)‘Cerramos el objetoMiRegKey.Close()

Para acceder al registro de Windows, debemos hacer uso de un nombre de espacio, que será el comunicador directo con las clases que nos darán acceso

al registro de Windows. El nombre de espacio Microsoft.Win32.Registrynos facilita por lo tanto, gran parte de este trabajo.

Page 50: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

50

Arquitecturas Orientadas a los Servicios, conside-ramos que una breve descripción de:

• Sistemas Distribuidos• Servicios Web

Pueden permitirnos entender el origen de algu-nos conceptos que, en el caso de SOA oArquitecturas Orientadas a Servicios, han adquiridoun sentido más general o un desarrollo más com-pleto.

Sistemas DistribuidosLos sistemas distribuidos aparecen en los años 80

y el marco que intentaba definir la forma de integrardiversos elementos que posibilitaran dicha soluciónse denominó DCE (Distributed ComputingEnvironment) o Entorno de Informática Distribuida. DCEbrinda una infraestructura completa para la imple-mentación de sistemas que son el resultado de ejecu-tar funciones en un conjunto de nodos distribuidosen una red local o una de área amplia. Este marco sedenominó middleware -o tecnología posibilitadora-debido a que estaba en un nivel intermedio entre elsistema operativo y la aplicación -distribuida- que seejecutaba.

El organismo que regulaba este conjunto de com-ponentes era el OSF (Open Software Foundation), queluego se convirtió en el Open Group, y tenía comoobjetivo brindar los servicios necesarios para llevar

a cabo la implementación de los sistemas distribui-dos. Entre estos servicios se cuentan los de seguri-dad -para permitir la protección y el control de acce-so a los datos, los de nombres -que posibilitan la ubi-cación de los recursos distribuidos, de persistencia -que brindan una interfaz para almacenar los datosen bases de datos, etc.

La evolución de DCE fue la de CORBA(Common Object Request Broker Architecture), un equi-valente de DCE en términos de la tecnología deobjetos. Esta arquitectura se basa fundamentalmenteen la distribución de componentes a través de unbus lógico que permite la conexión de todos los ele-mentos necesarios para ejecutar una aplicación deobjetos distribuidos. Los servicios ofrecidos porCORBA ampliaban los originales de DCE e incluí-an aspectos tales como los de ciclo de vida (con ope-raciones para la creación, desplazamiento o borra-do de componentes en el bus), el servicio de even-tos (para registrar o eliminar el interés de deter-minados tipos de eventos), el servicio de transac-ciones (para posibilitar la coordinación de los com-mits en dos fases), etc.

Pero lo que debemos tener en cuenta de esta arqui-tectura es la oferta de distintos tipos de servicios quepermiten garantizar una serie de funciones que norequieren ser contempladas en cada una de las apli-caciones implementadas.

Esta arquitectura en la que las aplicaciones se basanen marcos (horizontales y verticales) que a su vez seasientan en los servicios CORBA y éstos a su vez en

Arquitecturas Orientadas a Servicios:Una introducción

Por Manuel ImazConsultor [email protected]

En el caso de las<<

Cuando se intenta definir o describir algún nuevo concepto de una disciplina, esinteresante mostrar algunos antecedentes o evolución histórica que permitan, nosolamente ubicar al nuevo concepto, sino entender porqué surge, qué problemasresuelve, la forma en que los resuelve, etc.

Page 51: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

51

dnm.arquitectura<<

un bus común de objetos puede representarse de lasiguiente manera, usando la metáfora de capas quehemos visto en los artículos anteriores.

Servicios WebUna visión completa de la Arquitectura Orientada

a Servicios implica el manejo de innumerables acró-nimos cuyo significado es necesario conocer para quela perspectiva de dicha arquitectura resulte adecua-da. Aunque el concepto de servicio comienza a serutilizado en CORBA, en dicha arquitectura el con-cepto está ligado al de componente, es decir un blo-que constructivo independiente que en conjuntorepresentan un entorno de la aplicación.

Pero a diferencia de los componentes tradicionales,los servicios tienen un número de características únicasque les permite participar en una arquitectura orienta-da a los servicios. Una de estas cualidades es su com-pleta autonomía respecto de otros servicios. Esto sig-nifica que cada servicio es responsable de su propiodominio, lo que se traduce normalmente en limitar sualcance a una función específica de negocio (o un gru-po de funciones relacionadas).

Este enfoque de diseño desemboca en la creaciónde unidades aisladas de funcionalidad de negocio queestán débilmente ligadas mediante la conformidad amarcos de comunicación estándar. Debido a la inde-pendencia de que gozan los servicios dentro del mar-co, la lógica de programación que encapsulan no

requiere ajustarse a ninguna plataforma o conjuntotecnológico.

El tipo más ampliamente aceptado de servicio esel Servicio Web XML1 (de aquí en adelante llamadoservicio Web o simplemente servicio).

Estos servicios tienen dos requisitos funda-mentales:

• Se comunican vía protocolos Internet (más fre-cuentemente HTTP2)

• Envían y reciben datos formateados comodocumentos XML

La amplia aceptación del modelo de diseño deservicios Web ha determinado la emergencia de unconjunto de tecnologías suplementarias que se hanconvertido en estándares de facto. Un servicio están-dar de la industria se supone que va a:

• Suministrar una descripción del servicio que,como mínimo, consiste en un documentoWSDL3.

• Ser capaz de transportar documentos XML uti-lizando SOAP4 sobre HTTP.

Estas tecnologías no alteran la funcionalidad cen-tral de un servicio Web en tanto y en cuanto man-tienen su habilidad para representarse a sí mismos ycomunicarse de una forma estándar. Muchas de lasconvenciones arquitectónicas asumen que tantoSOAP como WSDL forman parte del marco defini-do de servicios Web.

Además, es frecuente en relación con estos ser-vicios que:

• Sean capaces de ser al mismo tiempo el peti-cionario y suministrador de un servicio.

• Estén registrados por un agente descubridor através del cual puedan ser ubicados.

Esto significa que los servicios Web noencajan en el modelo clásico de clien-te-servidor. En su lugar, tienden a esta-blecer un sistema peer-to-peer -P2P-,en el que cada servicio puede jugar el

rol de cliente o de servidor

Figura 1. La arquitectura CORBA

1 XML -o eXtensible Markup Language- es un lenguaje apuntado (o marcado) para crear documentos con información estructurada.2 El HTTP es uno de los protocolos más recientes (1996), que se ha expandido internacionalmente gracias a Internet. Su función fundamental es la de interfaz

con WWW (World Wide Web) y, en consecuencia, con HTML (Hyper-Text Markup Language), el lenguaje que está a la base de los documentos hiper-textuales.HTTP ha sido proyectado como un protocolo "state-less", es decir, sin memoria.

3 WSDL (Web Services Description Language) es un formato XML para describir servicios de red como un conjunto de puntos finales operando sobre mensajesque contienen información ya sea orientada a documentos u orientada a procedimientos.Los documentos WSDL definen los servicios como colecciones de puntosfinales de red o puertos. En WSDL, la definición abstracta de puntos finales y de mensajes se separa de la instalación concreta de red o de los enlaces del formatode datos.

4 SOAP es un protocolo ligero basado en XML,para el intercambio de información en un ambiente descentralizado y distribuido.El SOAP permite la intercomunicaciónentre objetos de cualquier tipo - sobre cualquier plataforma, en cualquier lenguaje.

Page 52: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

52

dnm.arquitectura<<

En una conversación típica con un servicio Web, elcliente que inicia la petición es también un servicio Web.Es decir que cualquier interfaz expuesta por un “servi-cio cliente” lo convierte en un servicio del cual otros ser-vicios pueden solicitar información.

Esto significa que los servicios Web no encajan enel modelo clásico de cliente-servidor. En su lugar, tien-den a establecer un sistema peer-to-peer -P2P- (de para par, de igual a igual o entre pares o iguales), en el quecada servicio puede jugar el rol de cliente o de servidor.

Arquitectura Orientada a Servicios (AOS)En general, no hay demasiados problemas en añadir

unos cuantos servicios Web a una aplicación. Esta inte-gración limitada puede ser adecuada como una expe-riencia de aprendizaje o para ampliar una arquitecturade aplicación existente con una pieza de funcionalidadbasada en servicios que se ajusta a un requisito de un pro-yecto específico. Pero esto, de por sí, no constituye unaarquitectura orientada a servicios.

Una AOS es un modelo de diseño con un conceptosumamente arraigado de encapsular la lógica de la apli-cación dentro de servicios que interactúan a través de un

protocolo común de comunicaciones. Cuando se utili-zan servicios Web para establecer este marco de comu-nicaciones, eso representa básicamente una implemen-tación basada en la Web de una AOS.

La arquitectura resultante establece esencialmenteun paradigma de diseño dentro del cual los servicios Webson un bloque constructivo clave. Esto significa que cuan-do migramos nuestra arquitectura de la aplicación a unaAOS, nos estamos comprometiendo a aplicar los prin-cipios de diseño de servicios Web y de las tecnologíasque los acompañan como partes centrales del entornotecnológico.

Una AOS basada en servicios Web XML construyeen base a capas de tecnología XML bien establecidas conel foco en exponer la lógica de las aplicaciones existen-tes como servicios débilmente acoplados. Soportandoeste modelo, una AOS promueve el uso de mecanismosde descubrimiento de los servicios a través de un brokerde servicio o agente descubridor.

Por supuesto, antes de que un cliente -o peticiona-rio- pueda solicitar un servicio, necesita encontrar el pro-veedor (el cual ha publicado previamente el servicio).Este servicio de ubicar un posible proveedor es realiza-do por el broker de servicio, el cual opera típicamentecon un repositorio. Cuando se le solicita, el broker deservicio devuelve un documento que permite al cliente,primero localizar, y luego unirse con el proveedor.

Un cliente puede requerir múltiples servicios, cadauno con un proveedor diferente. El hecho de registrarlos servicios en un registro central -repositorio- en elque los clientes pueden buscar, les brinda la flexibilidadnecesaria para realizar búsquedas basadas en conjuntosde criterios que cambian dinámicamente y, de esta for-ma, no estar ligados estáticamente al proveedor. Sin dichoregistro, el cliente debería estar obligado a codificar laubicación del proveedor del servicio y complicar así elmantenimiento.

En general, no hay demasiados problemas en añadir unos cuantos servicios Web a una

aplicación. Esta integración limitada puede seradecuada como una experiencia de aprendizaje o para ampliar una arquitectura de aplicaciónexistente... Pero esto, de por sí, no constituye

una arquitectura orientada a servicios

Figura 3. Relación entre Peticionario, Proveedor y Broker de servicio

Figura 2. Servicios Web intercambiando sus roles en una conversación

Page 53: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

53

DevPartner lo primero que comprobamoses que se integra como un Add-In de Visual Studio.NET; con eso ya nos hacemos a la idea de que es unaherramienta que está desarrollada con la mirada pues-ta en este entorno de desarrollo.

DevPartner nos permite realizar las siguientestareas:

• Revisión de código.• Análisis de aplicaciones distribuidas.• Detección de errores.• Análisis de rendimiento.• Análisis de memoria.• Análisis de alcance.

Y todo esto podemos hacerlo sin salir de VisualStudio .NET, ya que se integra a la perfección conel entorno de desarrollo permitiendo realizar cual-quiera de estas tareas.

Como único inconveniente, los más clásicos, echa-mos en falta un manual en papel, aunque por supues-to vienen en el disco de instalación varios manualesen formato PDF que podemos imprimir.

DevPartner además de integrarse en Visual Studio.NET, nos permite ejecutarlo desde la línea decomandos para poder integrarlo, por ejemplo, enrevisiones nocturnas de código, pudiendo realizaruna explotación de la información extraída en Accesspara la creación de informes personalizados.

Revisión de código

Una de las funcionalidades que mas gustará a losprogramadores es la revisión de código que realiza

DevPartner. Se trata de una utilidad que nos permi-tirá afinar al máximo nuestro código, mejorando elrendimiento, seguridad, mantenimiento y escalabili-dad de nuestros desarrollos.

Tan sólo pulsando un botón nos creará un amplioinforme con las posibles mejoras que podemos rea-lizar a nuestro código fuente. Este informe nos indi-cará las posibles mejoras del código, mostrándonosuna amplia explicación del motivo por el cual debe-ríamos modificarlo.

También cabe destacar que no sólo lleva una expli-cación de cómo mejorar el código, sino que tambiénincluye, en la mayoría de los casos, ejemplos con códi-go de cómo realizar las mejoras.

La detección de estas posibles mejoras se realiza através de reglas, siendo éstas totalmente configura-bles. Esto permite una gran flexibilidad a la hora derealizar revisiones de código, pudiendo personalizaresa revisión a gusto del desarrollador.

DevPartner incluye un completo gestor de reglasque nos permite añadir, modificar o eliminar las reglasque deseemos, para así obtener unos informes perso-nalizados de las posibles mejoras del código y com-probando que se cumplen en todo el proyecto las reglasque determine el usuario.

Análisis de aplicaciones distribuidas

Las aplicaciones Web utilizan numerosos recur-sos de distinto tipo, como un servidor de páginas Web,una base de datos, un lenguaje para el servidor o unlenguaje de script para el cliente. Todo esto supone

DevPartner Studio Professional Edition

Cuando instalamos<<

A qué desarrollador no le gustaría tener un experto a su lado comentándole qué mejo-ras puede hacer a su código,en qué partes está consumiendo más memoria o que méto-dos están penalizando el rendimiento de su desarrollo.DevPartner es ese experto quenos ayuda en la puesta a punto de nuestros desarrollos.

Por Pedro PozoClikearclikear.com

Page 54: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

54

dnm.laboratorio.net<<

que realizar un análisis de las posiblesmejoras de una aplicación de este tipo, odetectar los cuellos de botella o posibleserrores de programación sea bastantecomplejo.

DevPartner permite analizar aplica-ciones Web a través de un entorno pro-pio, cuyo interfaz podemos ver en la figu-ra 1. Analiza todos los eventos que ocu-rren en la aplicación, y así genera infor-mes sobre errores, código poco optimi-zado, y rendimiento de la aplicación.

A través de la herramienta que inclu-ye DevPartner para analizar aplicacionesdistribuidas se van revisando todos loseventos que van ocurriendo en la aplica-ción que hemos decidido monitorizar. Asíse va registrando todo lo que ocurre ennuestras páginas Web, los ficheros que secargan, los objetos, los scripts, y llegandoa un nivel de detalle que permite locali-zar mas fácilmente cualquier problema enla aplicación.

Los resultados del análisis los pode-mos ver en un panel de resultados y enun panel de eventos y métricas.

En el panel de resultados aparecenlos datos clasificados en Alarms, Hints oAlerts. Alarms indican que existe un pro-

blema en el código analizado y que debeinvestigarse una posible mejora; Hintsnos ofrecen valiosas sugerencias que nospueden ayudar a mejorar el rendimien-to de nuestra aplicación en trozos decódigo que son analizados y son sus-ceptibles de mejora ya que si no puedenpenalizar el rendimiento de nuestra apli-cación; y por último Alerts nos mues-tran los valores que exceden de un lími-te determinado en nuestra aplicación y

puede causar por tanto problemas ennuestros desarrollos.

En el panel de eventos y métricas,podemos ver todos los eventos que se hanproducido en la aplicación, organizadosde una forma jerárquica, y unos gráficos

que nos indican lo que ocurre cuandosucede cada evento en una máquina, unproceso o un hilo de ejecución.

Detección de errores

A través del analizador de errores,podemos lanzar sesiones de nuestra apli-cación que serán analizadas y guardadaspara su posterior estudio por parte deldesarrollador.

Se genera un informe de todos losmétodos por los que hemos pasado porla sesión analizada. Este informe nosindicará el tanto por cierto de líneas decódigo revisadas, así como el número dellamadas a cada proceso; incluso pode-mos profundizar un poco más y ver elnúmero de veces que se ha ejecutado cadalínea de código. De esta forma podemoscomprobar por dónde ha pasado la eje-cución del programa y dónde no, paraasí poder localizar errores y posiblesmejoras.

El sistema de detección de errorestambién nos permite, entre otras cosas,detectar el mal uso de memoria, usoincorrecto a las llamadas al API deWindows, uso incorrecto de punteros,y analizar llamadas de código maneja-do a código nativo.

Análisis de rendimientoPara mejorar el rendimiento de nues-

tra aplicación, DevPartner también dispo-ne de una interesante funcionalidad quenos genera un informe que nos indica eltiempo que ha gastado cada uno de los

Figura 1. DevPartner - Análisis de aplicaciones distribuidas.

Si necesitamos realizar una puesta a punto de nuestrodesarrollo, mejorar el rendimiento, localizar los

cuellos de botella, reducir el consumo de memoria y en definitiva mejorar nuestro código, DevPartner

nos ayudará a realizar todas estas tareas

Page 55: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

55

dnm.laboratorio.net<<

métodos de nuestro código fuente, inclu-so el tiempo consumido por cada una delas líneas de nuestro código.

De esta forma tendremos un comple-to informe que nos permitirá ver cuáles sonlos cuellos de botella de la aplicación, ydónde podemos mejorar el rendimiento.

Si queremos tener una visión másatractiva de nuestro informe podemos ira cualquiera de los métodos de nuestraaplicación y ver un gráfico del análisis rea-lizado, dónde nos mostrará un gráfico connodos. Aparecerá un nodo con el méto-do que hemos elegido y los nodos repre-sentando a los métodos hijo del métodoanalizado. Podemos ver un ejemplo deestos gráficos en la figura 2.

El análisis de rendimiento no sólose realiza en el código escrito por noso-tros, también realiza un análisis de códi-go hecho por terceras partes o de losprocesos del sistema operativo, permi-tiendo así descubrir dónde están pro-duciéndose los cuellos de botella.

Análisis de memoria

Especialmente interesante en el desa-rrollo es el análisis de la memoria, y porsupuesto DevPartner se encarga de mane-ra detallada. El informe que nos generaDevPartner de la memoria es muy com-pleto; nos mostrará desde la memoria con-sumida por cada uno de los objetos pudien-do verlos ordenados por consumo, hasta lamemoria consumida por cada método.

Dentro de una página podremosver a través de gráficos cuánto ha con-

sumido cada uno de los métodos quese ejecutan. Así de esta forma visual,podremos ver rápidamente cuáles sonlos procesos que más recursos estánconsumiendo.

Análisis de alcance

Esta herramienta de DevPartner nospermite localizar código que no ha sidoprobado, disminuyendo así el tiempo depruebas, y haciéndolas más fiables parano dejar ningún cabo suelto a la hora deprobar nuestra aplicación.

Este análisis también nos permitealmacenar los datos utilizados en nues-tra aplicación y poder recopilar los datosde servidor y de cliente, pudiendo asíhacer una comparativa de ambos.

Si tenemos varias personas realizandolas pruebas, podemos almacenar todos losdatos generados por estas personas en laspruebas y luego compararlos para poderasí localizar mejoras del código o errores.También soporta múltiples lenguajes comoVisual Basic, C#, Visual C++, incluso len-guajes de script como Javascript yVBScript. Además tenemos la posibilidadde realizar un análisis integrado con detec-ción de errores en una misma sesión.

Requisitos del sistema

Hay que destacar que DevPartner estápreparado para funcionar en Visual Studio6, Visual Studio .NET 2002 y Visual Studio.NET 2003. Al tratarse de una aplicaciónintegrada en Visual Studio .NET los reque-

rimientos tanto de hardware como de soft-ware son los que tenga nuestro entorno dedesarrollo. En la siguiente tabla podemosver las recomendaciones mínimas:

Conclusiones

Si necesitamos realizar una puesta apunto de nuestro desarrollo, mejorar elrendimiento, localizar los cuellos debotella, reducir el consumo de memoriay en definitiva mejorar nuestro código,DevPartner nos ayudará a realizar todasestas tareas.

Desde los programadores hasta losarquitectos de software, pasando por losdepartamentos de calidad del software,DevPartner puede ser utilizado paramejorar las aplicaciones que desarrolle-mos, y será de gran utilidad para conse-guir código de calidad y en consecuen-cia aplicaciones de calidad.

Figura 2. Grafico de nodos.

Requisitos mínimosHardware Software

Pentium III 733Mhz

Microsoft InternetExplorer 5.01 osuperior

256 MB memoriaRam

Microsoft ScriptDebugger Version 1.0a

500 MB espaciolibre en disco

Microsoft Windows2000, XP ó 2003

Unidad CD ó DVD

Ficha técnica

NombreDevpartner StudioProfessional Edition

Versión 7.2.0

Fabricante Compuware

Web www.compuware.com

Categoría Visual Studio Add-In

PrecioA partir de 2.850€

(con mantenimiento)

Valoración

Page 56: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

56

dnm.comunidad.net<<dnm.comunidad.net

SpainNetVocación de comunidad al alcance de todos

no es una reunión ala que los vecinos de escalera deben asis-tir una vez al año, a pesar de que muchoslo crean así, si bien es cierto que existenmuchos tipos de comunidades. SpainNetnace en el año 2001, como vinculo entreprofesionales, estudiantes y aficionadoscompartiendo un espacio común. En labase y en espíritu SpainNet, más que unpunto de encuentro, es una función vitalde unir y representar a la comunidad dedesarrolladores de una manera plural,independiente y al alcance de todos, ade-más de divulgar y compartir los conoci-mientos de la misma, entre sus miembros.Fundamentado en un marco no lucrati-vo, potenciamos al máximo tres valores:la comunicación, la divulgación y el aprendi-zaje, todo ello respaldado por los recur-sos de la propia comunidad y la ayuda deentidades sociales colaboradoras.

No es nada nuevo ver la formaciónde grupos de profesionales, estudianteso aficionados, organizados alrededor deinquietudes y dificultades. Sin embargoSpainNet crece rompiendo ciertas barre-ras, ¿porqué no?; Pretendemos mejorary promocionar la interacción y la comu-nicación entre los desarrolladores de todoel Estado, así como aportar, compartir ydivulgar el conocimiento del grupo enbien de sus miembros, con indepen-dencia de su nivel, posición o situación.Nuestro lema inicial fue “Conocimientoy Tecnología Patrimonio de Todos”.Queremos ser la parte visible de un colec-tivo excesivamente virtual.

Ayudar a romper el mito del “ler-do”, cualquier persona debe ser capazde utilizar herramientas de desarrolloo hacer uso de cualquier medio, que

dé rienda suelta a su creatividad. Esnuestra tarea como grupo, y apoyadosen nuestros voluntarios, minimizar ladependencia tecnológica a nivel social,organizando encuentros, cursos, talle-res y otros eventos, fundamentados enmecanismos que no sirven a interesescomerciales ni políticos. Nuestrainfraestructura es la plataforma don-de cualquier iniciativa o idea puedatomar forma; disponemos del sufi-ciente bagaje para poder encontrar onegociar recursos que permitan mate-rializar prácticamente cualquier pro-puesta. Todo ello es posible gracias anuestra condición cooperativista y noproductiva; el mero hecho de no tenerque soportar una estructura económi-ca, nos desvincula de cualquier otrointerés. Todo lo que hacemos es porla ilusión de compartir y materializarnuestro conocimiento, renunciando acomercializar nuestro excedente yaprovechando el de la sociedad delbienestar. Construimos por lo tanto,con un potencial probablementemayor que el de la inteligencia... ¡lailusión! Nos llena de satisfaccióndeclarar que ¡NO HAY NINGÚNOTRO MOTIVO!

Hacemos asequible para nuestrosmiembros y personas afines, recursoscomo charlas de expertos, literaturatécnica, material informático o elec-trónico, etc. Todo ello gracias a nues-tros acuerdos de colaboración yesponsorias con diversas institucionesy entidades, así como a través de nues-tra relación con otras asociaciones deámbito nacional e internacional, comopor ejemplo INETA.

Lo que realmente es un hechoconsumado, es la consolidación delgrupo con aproximadamente 94 per-sonas, 40 de las cuales participan deuna manera habitual y 15 de ellas secomprometen al extremo de dedicar-le un montón de horas semanales. Entodo caso hemos sido capaces de aten-der el interés de unas 265 personas, yla cosa crece. Es importante comen-tar en su medida, la entrada en fun-cionamiento de nuestro portal unidoa la propiedad de un servidor exclusi-vo para nuestra comunidad, en unaADSL de 2Mb.

Aparte, lo más significativo de esteaño lo dejamos atrás en tres sesionesintensas en la universidad, hablandosobre .NET Framework, XML,Longhorn, Indigo, Yukon en Febrero.Cabe destacar a finales de Julio laorganización del evento del VisualBasic 2005 Tour por Europa en España.Así como nuestra colaboración en laSemana Digital que organiza elAyuntamiento y la Universidad en Vic,para terminar merendando una de 30horas de ASP.NET, Web Matrix,Visual Basic.NET y MSDE duranteeste mes de noviembre. Si la cosa dapara más, esperamos poder estar ayu-dando en la semana digital ExpoEnteren Orense, así como poderos explicarimportantes iniciativas para este pró-ximo año.

Podéis encontrarnos en www.ine-ta.org/latam en www.panoramabox.com yprovisionalmente en http://weblogs.golemproject.com/spainnet.

<< La común_unidad,

Ni tan siquiera la tercera generación de Internet sustituye el calor de una buena reunión entre colegas. Romper la barrera de nuestra interacción individual y sumar

esfuerzos en construir actividades que sean útiles a un colectivo virtual por excelencia, es una de las mejores experiencias para los miembros de SpainNet

Pep Lluis Baño es Presidente de SpainNet

Page 57: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

dotN

etM

anía

<<

57

<<

Programming Microsoft .NET XML Web ServicesDamien Foggon,Daniel Maharry, Chris Ullman y Karli Watson

Editorial: Microsoft PressISBN: 0735619123 Páginas: 698Publicado: Agosto-2003

Este mismo año ha visto la luz esta completa obra sobre programación de ser-vicios Web con .NET, a la que -sin duda- debo de calificar como una de lasmás completas de su género. Recorre todo el escenario de construcción de ser-vicios y de implantación de clientes, desde los fundamentos donde se basan losestándares de creación, SOAP, WSDL, DISCO y UDDI, hasta las implanta-ciones prácticas y sus soluciones de optimización.

Además, incluye tratamiento de datos, gestión de estado, cuestiones de rendi-miento y seguridad, y -muy importante- una exhaustiva explicación del fun-cionamiento de las Web Services Extensions, con muchos ejemplos de funciona-miento y despliegue.

Expert Web Services Security in the .NET Platform Laurence Moroney, Brian Nantz

Editorial: APressISBN: 0735615551 Páginas: 456Publicado: Noviembre-2004

Obra muy recientemente aparecida, que podríamos considerar, desde algunospuntos de vista, como complementaria de la anterior.

Los autores describen previamente los fundamentos en los que puede basarsela seguridad en servicios Web dentro de los estándares actualmente estableci-dos, y basándose en las últimas versiones, tanto de Visual Studio, como de lasExtensiones de los Servicios Web, e Internet Information Server, para pasar a pro-fundizar en el uso de estas extensiones, haciendo especial hincapié en WS-Security, WS-Attachments, WS-Routing, WS-Authorization y WS-Encryption,como modelos de desarrollo. Especialmente notables son las páginas dedica-das a la criptografía, incluyendo un interesante análisis sobre criptografía declave pública, y lo que los propios autores denominan “criptografía asíncrona”,por oposición a la tradicional “criptografía simétrica”.

dnm.biblioteca.net<<

dnm.biblioteca.net

Page 58: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

Microsoft no planea incluir la navegación multipágina en IE,sino la potenciación de sus complementos (IE plug-ins)En una entrevista concedida a BetaNews, Gary Schare,Director of Windows Product Management en Microsoft,declaraba que no habría grandes cambios en el navegador has-ta la aparición de Longhorn, a mediados de 2006. "Hacerlo,supondría romper don muchas cosas ya en funcionamientopor parte de terceros, a los que debemos apoyar también. Lomismo sucede con las posibles extensiones del estándar CSSde Hojas de Estilo. Existen muchas aplicaciones y solucionescorporativas que utilizan ActiveX para extender las posibili-dades de IE. Además algunas de esas características romperí-an políticas de seguridad que no estamos dispuestos a rom-per." (Recordemos al lector, que IE en realidad, consta de dospartes: la interfaz de usuario de navegación y un núcleo deinterpretación de páginas -ampliable mediante ActiveX- lla-mado SHDOCVW.dll, que puede ser usado para procesosde automatización). Otras fuentes, confirman -además- esta

idea, valorando las actualizaciones automáticas del softwareque Microsoft piensa seguir haciendo, lo que coincide con elhecho de que ya se haya publicado la continuación de WUS(Windows Update Services), cuya beta está ya disponible ycuya versión final verá la luz a mediados de 2005 (www.ewe-ek.com/article2/0,1759,1728284,00.asp).

Disponible una “Preview” de AvalonParalelamente, los avances en la implementación de las API'sde Longhorn para otras plataformas, se suceden. A finales denoviembre, se hizo pública una CTP (Community TechnologyPreview) de Avalon, el subsistema de gráficos que utilizaráLonghorn y que será instalable en Windows XP y Windows2003. La beta "oficial" de Avalon, se espera para el próximoverano, junto con la primera beta de Longhorn. Y a todo esto,hay que añadir la aparición de versiones de terceras partes,como XAMLON (www.xamlon.com) y LASZLO (www.lasz-losystems.com)

dotN

etM

anía

<<

58

no

ticia

s.n

oti

cia

s

Sitio Web del MVPAlejandro Mezcua, gran

experto en MS-Exchange y programación de dispositi-vos móviles. Contiene noticias, artículos y rutinas de inte-rés. www.byteabyte.net.

Sitio Web de Michelle Lerroux Bus-tamante, una de las mejores divulga-doras de tecnologías Web de la actuali-dad, especializada en servicios Web yarquitectura SOA. Contiene interesan-

tes ejemplos gratuitos de utilización con código fuen-te incluidos. (Ver www.dotnetdashboard.net/ark/wstuto-rial.aspx).

dnm.desvan<<

Marino Posadas

Cómo reinstalar todo el software en un PC seriamenteamenazado:Cuando la amenaza es seria, el problema radicaen volver a dejar todo como estaba antes. Tremenda labor, enla que siempre se queda algo en el camino. El documento HowTo Re-Install All The Software On A Seriously Gummed-Up PC,pretende servir de ayuda en tan ingrata tarea. Se encuentraen www.securitypipeline.com/showArticle.jhtml?articleId=53200389

“The ADO Object Model” y “Referential IntegrityExplained: Bonding Tables Together”, son dos interesantesdocumentos para desarrolladores, publicados por ASP.FREErecientemente. El lector puede acceder a ellos en www.asp-free.com/c/a/ASP.NET/The-ADO-Object-Model y www.asp-free.com/c/a/Database/Referential-Integrity-Explained-Bonding-Tables-Together/ respectivamente.

Documentos en la Red

A Marcos que vio la luz mientras buscábamos el tema de la tira cómica delmes :-). Esperamos que esto sea augurio de una vida divertida.

Enlaces del mes

Page 59: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración

IMPORTES VÁLIDOS HASTA NUEVA OFERTA

DATOS DE FACTURACIÓN

CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . .

DATOS DE ENVÍO (sólo si son distintos de los datos de facturación)

CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . .

FORMA DE PAGO

❑ Talón nominativo a nombre NETALIA, S.L.❑ Transferencia bancaria a nombre de NETALIA, S.L. a:

La Caixa - Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia)

❑ Domiciliación Bancaria (con renovación automática, previo aviso)Indique su número de cuenta:

❑ Tarjeta de crédito❑ VISA ❑ MASTERCARD

Número de su tarjeta: Fecha de caducidad: / (imprescindible)

Firma y/o sello (imprescindible)

a de de 20

Suscripción a dotNetManía

Usted autoriza a la mecanizaciónde estos datos. El responsable ydestinatario de éstos es Netalia,S.L. Usted tiene derecho a accedera sus datos, modificarlos y cance-larlos cuando lo desee. Sus datosno serán cedidos en ninguna de lasformas posibles a terceras partes yno se utilizarán más que para elbuen funcionamiento de su sus-cripción a la revista dotNetManíay para informarle de las activida-des comerciales que realice la edi-torial Netalia, S.L. Si no desea reci-bir información comercial dedotNetManía marque la casillasiguiente ❑

❑ Nº9❑ Nº3 ❑ Nº4 ❑ Nº5

Puede enviar los datos al email [email protected],al FAX (34) 91 499 13 64 o al teléfono (34) 91 666 74 77.También puede enviarlo por correo postal a la siguiente dirección:

C/ Robledal, 13528529- Rivas VaciamadridMadrid (España)

❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) y beneficiarme de la oferta del 10% de descuento por unimporte total de 60 € para España; o por 75 € para el resto de Europa; o por 90 € para el resto del mundo (IVA incluido).

❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) por un importe de 45 € por ser estudiante (IVA incluido).Aporto fotocopia del carné de estudiante o sello del centro académico (IMPRESCINDIBLE). OFERTA VÁLIDA SÓLOPARA ESTUDIANTES RESIDENTES EN ESPAÑA.

❑ Nº6 ❑ Nº7 ❑ Nº8

Si desea algún otro número indíquelo

Page 60: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET …€¦ ·  · 2011-04-22y las bases de datos DB2 y Windows Server y SQL Server. Este mes incluimos, con la colaboración