dnm004

60
El software ha muerto, viva el software opinión nº4 abril 2004 • Precio: 6,00 (España) La seguridad de tipos en .NET Seguridad basada en código .Net 2003 acerca la programación a la movilidad Nueva versión de Windows Mobile Arquitectura Introducción a los Patrones .NET: Observer Sobre el uso de la Programación Extrema (XP) para desarrollar una paella en el exilio Open Source Creando la capa de acceso a datos con Data Tier Generator Comunidades Panorama BOX Creando aplicaciones Web babilónicas con ASP .NET • Relleno de formas gráficas, texturas, degradados y otros efectos avanzados con GDI+ • Configuración de sitio Web seguro con Certificado de clientes dotNetManía dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System

Transcript of dnm004

Page 1: dnm004

El software ha muerto, viva el softwareopinión

nº4 abril 2004 • Precio: 6,00 € (España)

La seguridad de tipos en .NETSeguridad basada en código

.Net 2003 acerca la programación a la movilidadNueva versión de Windows Mobile

ArquitecturaIntroducción a los Patrones .NET: Observer Sobre el uso de la Programación Extrema (XP)para desarrollar una paella en el exilio

Open SourceCreando la capa de acceso a datos con Data Tier Generator

ComunidadesPanorama BOX

Creando aplicaciones Webbabilónicas con ASP .NET •Relleno de formas gráficas,texturas, degradados y otrosefectos avanzados con GDI+• Configuración de sitioWeb seguro conCertificado declientes

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

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

Page 2: dnm004
Page 3: dnm004

dotNetManía nace como revista indepen-diente donde todas las opiniones y puntos devista tienen cabida. Desde esta completa inde-pendencia, el pasado número publicamos elartículo “El poder de la reflexión en .NET”de Mario del Valle y Miguel Katrib, dondedábamos a conocer un potencial agujero deseguridad en el entorno de ejecución .NET.La misma transparencia que nos empujó apublicar este artículo nos obliga en este núme-ro a reconocer nuestro error; el agujero deseguridad no era tal y nos precipitamos alhacerlo público sin contrastar con el fabri-cante su veracidad.

Quiero pedirle disculpas públicamente poresto y hacerlas extensivas al fabricante, Microsoft,pues la imagen de su producto quedó en entre-dicho, y sin embargo, se han volcado tanto connosotros como con los autores para darle unasolución positiva para esta publicación.

Si bien la afirmación que se realizaba sobreesta vulnerabilidad ha resultado ser falsa, almenos ha servido para demostrar la calidadde los autores que reconocieron su error inme-diatamente, poniéndose a nuestra disposiciónpara enviarnos toda la información que hemos

precisado, y el interés de los responsables deMicrosoft en España y también en EstadosUnidos, que desde un primer momento hancolaborado para estudiar el agujero de segu-ridad y solventarlo en caso de haber sido cier-to. Desde aquí quiero agradecer a unos y aotros su actitud positiva.

Como fruto de esta colaboración DavidCarmona de Microsoft Ibérica publica en estenúmero un artículo dedicado exclusivamentea la seguridad de tipos en .NET, origen delsupuesto agujero de seguridad. También nosenvía unas palabras Sebastian Lange,Program Manager de seguridad en el grupo deproducto .NET en Redmond, que desde unprimer momento fue informado del proble-ma y lo ha seguido con sumo interés.

Desde luego lo deseable sería no equivo-carse nunca; huelga decir que esto es imposi-ble, especialmente cuando se pretende publi-car con cierta audacia, aunque nosotros hare-mos lo que esté en nuestra mano para evitar-lo. Os podemos garantizar, aún así, que esto noafectará ni a nuestra independencia, ni a nues-tra vocación de publicar información audaz...y veraz.

dotN

etM

anía

<<

3

Por una información audaz...y veraz

<<

dnm.editorial<<dnm.editorial

EditorPaco Marín ([email protected])

AdministraciónPilar Pérez ([email protected])

Asesor Técnico/CoordinaciónMarino Posadas ([email protected])

PublicidadJuan Manuel Urraca ([email protected])

Redactores y ColaboradoresAlejandro Mezcua, Angel Esteban,Antonio Quirós, Antonio Rojo, DavidCarmona, Eladio Rincón, Francisco

Charte, Fernando Guerrero, FernandoNogueras, Guillermo ‘guille’ Som, IvánGonzález, Jesús López, Jordi Rambla,Jorge Serrano, José Manuel Alarcón, JuanTorres, Liborio López, Luis Miguel Blan-co, Marino Posadas, Miguel Egea, MiguelKatrib, Pablo Abbate, Pedro Gómez,Pedro Pozo, Pepe Hevia, Salvador Ramos

Diseño y MaquetaciónÉride Diseño GráficoTel.: (34) 91 477 48 [email protected] • www.eride.net

EditaNetaliac/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)Tf. (34) 91 6667477Fax (34) 91 4991364

ImprimeGráficas Vallehermosowww.graficasvallehermoso.com

Depósito LegalM-3.075-2004

[email protected]

[email protected]

Nuevos [email protected]

Page 4: dnm004

4dnm.sumario

El Software ha muerto,viva el software 8-9¡¡¡El software ha MUERTO!!! Así lo proclama Marc Benioff , uno de los gurúsde las tecnologías de la información. Y no sólo él, son muchas las personas yempresas que opinan lo mismo y auguran el fin del sector del software tal y como loconocemos actualmente.

La seguridad de tipos en .NET 10-13Leyendo el pasado número de dotnetmanía me encontré con el estupendo artículo“El poder de la reflexión en .NET”, donde se explicaba la potencia del espacio denombres System.Reflection y su aplicación a la factorización de clases .NET. En elúltimo apartado del artículo y utilizando la misma técnica se mencionaba unagujero de seguridad en el entorno de ejecución de .NET e incluso se proporcionabael código fuente para explotarlo. Después del susto inicial me disponía areproducirlo en mi máquina cuando me di cuenta del error que cometía elartículo, ¿qué detalle se pasó por alto?

Creando aplicaciones Web babilónicas con ASP .NET 14-20¿Cuántas veces hemos querido tener una página o un sitio web en diferentesidiomas? Realizar sitios web en múltiples idiomas eleva considerablemente lospresupuestos y los gastos, incrementando proporcionalmente, los tiempos, losrecursos y el dinero de forma casi desproporcionada.

Introducción a los Patrones .NET:Observer 21-29En este número empezamos a hablar sobre los patrones en .Net y hemos elegido enprimer lugar al Observer por su importancia capital dentro del Framework de.NET.

Relleno de formas gráficas, texturas,degradados y otros efectos avanzados con GDI+ 30-34

A lo largo de este artículo, realizaremos un repaso de los principales elementosexistentes en GDI+ de forma que sirvan de base al lector para la elaboración desus propios efectos.

.Net 2003 acerca la programación a la movilidad 36-43La nueva versión de Visual Studio .NET nos presenta un tipo de proyecto cercanoa la movilidad, tan cercano que programar para una PDA resulta sumamentesencillo.

Configuración de sitio Web seguro con Certificado de clientes 44-47En este artículo encontrará una guía sencilla, paso a paso, de cómo configurar un sitio web seguro en IIS 6 con certificado de clientes.

Sobre el uso de la Programación Extrema (XP) para desarrollar una paella en el exilio 49-53

En los fundamentos de este modelo de programación se encuentra la semilla de larevolución de los desarrolladores frente a sus explotadores tradicionales, y cómorealizar el despliegue, implantación y explotación de una paella.

Comunidad 54Panorama BOX

Open Source 55-56Creando la capa de acceso a datos con Data Tier Generator

Biblioteca 57Programación en XML para Microsoft .NET De Dino EspositoShared Source CLI (Essentials) De David Stutz, Ted Neward y Geoff Shilling

Desván 58

dnm

.sum

ario

Page 5: dnm004
Page 6: dnm004

dotN

etM

anía

<<

6

dnm.noticias<<dnm.noticias

Borland celebra por primera vez en España su “Borland Day”,donde presentará sus soluciones para la gestión del ciclo de vida de las aplicacionesDurante esta jornada Borland y sus principales part-ners mostrarán todas sus novedades

Bajo el lema “Potencie su Desarrollo” Borland daráa conocer a todos los profesionales involucrados en elproceso de desarrollo de aplicaciones, su definición,diseño, desarrollo, test, despliegue y gestión de sus solu-ciones totalmente integradas.

Borland Day tendrá lugar el próximo 6 de mayo enel Palacio Municipal de Congresos y Exposiciones delCampo de las Naciones de Madrid.

Con más de 20 ponencias y workshops en tres salasen paralelo donde repasar las distintas soluciones paraplataformas J2EE, Microsoft.NET, herramientas dedefinición y diseño, desarrollos sobre dispositivos móvi-

les, soluciones CORBA, novedades de sus IDEs,JBuilder, Delphi, C++, y sus servicios de consultoría,formación y soporte.

“En esta jornada todos los profesionales de TI,directores, responsables de proyectos, analistas ydesarrolladores, podrán ver la única solución de desa-rrollo independiente, basada en estándares y total-mente integrado con los líderes del sector, con la quereducir sus costes y aumentar su productividad”apunta Antonio Gómez, Director de Marketing deBorland.

Para más información y/o registro para inscribir-se al Borland Day: www.borland.es o llamar al telé-fono 902 344 556.

Desarrolladores deMicrosoft han creadoeste interesante canalde información para lacomunidad de desarro-lladores.

¿Un weblog deMicrosoft? Es bastantemás; una nueva manerade informar directamen-te al usuario desde unaperspectiva menos for-

mal y más directa que los comunidados de prensa ofi-ciales de una gran compañía como Microsoft; de unaforma más “oficial”, rigurosa y completa que los blogsindividuales nos ofrecen. Además cuenta con interesan-tes vídeos, foros, RSS, moblogs (mobile weblogs) y wikis.

El nombre se puso en honor al canal de las UnitedAirlines que permitía a los pasajeros oir lo que ocu-rría en la cabina del piloto. Esta es la filosofía quequieren transmitirnos, que podamos ver y oir de pri-mera mano lo que ocurre en la cabina de los pilotosde Microsoft.

La idea de que los propios desarrolladores de latecnología de Microsoft informen y se comuniquendirecta e informalmente con sus desarrolladores usua-rios y que éstos puedan opinar e interactuar, es una

iniciativa realmente atractiva y divertida, y resulta unpaso adelante en la blogosfera en la que a lo mejortenemos que empezar a acostumbrarnos a ver a gran-des fabricantes inmersos en ella.

Microsoft ya ha estado experimentando con unavariedad de este tipo de tecnologías social-computing(http://www.research.microsoft.com/scg/) a lo largode la compañía:

• Su división de investigación, Microsoft Research,ha presentado Wallop (http://www.mywallop.com),su entorno de social-computing y el proyecto pilo-to de autoblogging Aura. Wallop es un proyectoque explora cómo la gente comparte media y con-versa en el contexto de las redes sociales.

• El pasado año, la división académica de desarro-lladores creó un centro llamado The Spoke(http://www.thespoke.net), donde los blogs deempleados, foros y otras tecnologías relacionadasincrementan la comunicación entre Microsoft yla comunidad académica.

• Y la división oficial de Microsoft MSN anunció afinales de marzo de 2004 que la compañía está tra-bajando en una herramienta de búsqueda en blogllamada Blogbot que posiblemente esté disponi-ble a finales de este año.Puede visitarlo en: http://channel9.msdn.com.

Nace Channel 9, la cara humana de Microsoft

no

ticia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s

Page 7: dnm004

dnm.noticias<<

dnm.noticias

Microsoft Corporation y SunMicrosystems han anunciado que hanllegado a un amplio acuerdo de colabo-ración tecnológica para conseguir quesus respectivos productos funcionenmejor juntos, al tiempo que se pone fina los litigios pendientes entre ambascompañías. Asimismo, se han alcanza-do diversos acuerdos relativos a paten-tes y otros aspectos.

Dichos acuerdos incluyen los pagos,por parte de Microsoft a Sun, de 700millones de dólares por un lado, pararesolver los litigios legales pendientessobre antimonopolio, y de 900 millonesde dólares por otro, para resolver aspec-tos relativos a las patentes. Además, Suny Microsoft han acordado pagarse mutua-mente royalties por permitir uno al otroel uso de sus respectivas tecnologías, demanera que Microsoft paga por adelan-tado 350 millones de dólares y Sun efec-tuará sus correspondientes pagos cuandoincorpore la tecnología de Microsoft ensus productos de servidor.

Incluyen los siguientes puntos:• Colaboración técnica. El Acuerdo

de Colaboración Técnica proporcio-nará a cada compañía acceso a aspec-tos de la tecnología basada en servi-dor de la otra y les permitirá utilizaresa información para desarrollar nue-vos productos de software para servi-dores que funcionen mejor conjunta-mente. La cooperación se centrará ini-cialmente en las plataformas Windowspara servidor y cliente, pero even-tualmente podrá incluir otras áreas

importantes, incluyendo softwarede correo electrónico y bases dedatos. Por ejemplo, un de los ele-mentos importantes de los entor-nos de informática a gran escala esel software para gestionar identida-des de usuario, autentificación yautorización. Como resultado deeste acuerdo, ingenieros de Sun yMicrosoft colaborarán para conse-guir que la información sobre iden-tidad sea fácilmente compartidaentre el Directorio Activo deMicrosoft y el Sun Java SystemIdentity Server, lo que resultará enentornos informáticos menos com-plejos y más seguros.

• Programa de Protocolo de Comu-nicaciones Microsoft. Sun ha acor-dado firmar una licencia para el pro-tocolo de comunicaciones del sistemaoperativo de sobremesa Windows através del Programa de Protocolo deComunicaciones de Microsoft, esta-blecido durante el proceso con elDepartamento de Justicia de EstadosUnidos y los 18 estados demandantes.

• Soporte de Microsoft para Java. Lascompañías han acordado que Micro-soft puede seguir ofreciendo soportepara la Java Virtual Machine deMicrosoft que los clientes han implan-tado en productos Microsoft.

• Certificación Windows para SunServer. Sun y Microsoft han acorda-do que trabajarán conjuntamente paramejorar la colaboración técnica entresus tecnologías Java y .NET.

• Patentes y propiedad intelectual.Ambas partes han llegado a un pactoen sentido amplio para no litigar res-pecto a pasadas acusaciones mutuasde infringimiento de patentes quehayan podido existir. El acuerdo tam-bién contempla la potencial extensiónen el futuro de este pacto. Asimismo,las dos empresas entablarán negocia-ciones para acuerdos de intercambiode licencias de patentes entre ellas.

• Acuerdos legales. Sun y Microsofthan decidido dar por resuelto su pro-ceso legal en Estados Unidos. Sun estátambién satisfecha de que los acuer-dos ahora anunciados cumplen losobjetivos que perseguía en las accio-nes emprendidas en la Unión Europeacontra Microsoft.

Puede descargarse el video comple-to de su comparecencia ante la prensaen Only4Gurús: http://www.only4gurus.com/v2/download.asp?ID=5300

Microsoft y Sun Microsystems anuncian unamplio acuerdo de cooperación que pone fin alos litigios entre ambas compañías Comunicado de prensa de Microsoft Ibérica

Fotografía: Sun Microsystems

Scott McNealy y Steve Ballmer ¡bromeando!

Microsoft Ibérica ha puesto en mar-cha una atractiva campaña de actualiza-ción para que los usuarios de versionesanteriores de las herramientas de desa-rrollo de la compañía rentabilicen lainversión que realizaron, y obtengan laúltima tecnología de desarrollo con des-

cuentos de hasta el 40 %. Asimismo, ypor acogerse a esta promoción, se lesdará la posibilidad de asistir a un cursogratuito de introducción al desarrolloen .NET.

De esta forma, todos los usuarios deherramientas de desarrollo Professional

o Enterprise en sus versiones 5 y 6 pue-den obtener este descuento, que estarádisponible desde el 1 de abril al 30 dejunio (ambos inclusive).

Para información:http://www.microsoft.com/spanish/msdn/spain/ofermigra

Microsoft pone en marcha una campaña de actualización a .NET

Page 8: dnm004

dotN

etM

anía

<<

8

La mayoría de los proble-mas en un sistema de información es el software, ysobre todo el software que se desarrolla a medida,donde la mayoría de las veces se realiza con escasosrecursos, poco tiempo y pocos conocimientos.

El resultado es un software de mala calidad, queen la mayoría de los casos no cumple con lasexpectativas iniciales, ofrece un mal rendimiento ynumerosos quebraderos de cabeza. Y no sólo eso,además el coste es alto y el mantenimiento también.

Por ejemplo, cuando una empresa desea tener unalínea de teléfono la contrata con una empresa detelecomunicaciones para que ésta le preste ese servicio,y no tiene que preocuparse de nada más, ni contrataun experto en telecomunicaciones, ni monta los postes

de teléfono, ni nada por el estilo. Sin embargo, cuandose decide informatizar los procesos de negocio de unaempresa, se comienza por un largo y tortuoso caminoque suele llevar a numerosos problemas, ya que lainformática que tan solo debe ser un servicio adisposición de la empresa, se convierte en una partedel negocio e incluso a veces obliga a modificar laforma de desarrollarlo, para lo cual la mayoría deempresas no están preparadas.

¿Cuántas veces hemos oído que la red esta caída,que hay un virus, que la aplicación tiene un error, quela nueva versión de esa aplicación no es estable o noes compatible con nuestro PC, o simplemente necesitauna máquina más potente?. Éstos y otros muchosproblemas son los que ocurren con el sistematradicional de implantación de software de escritorio,y del cual muchas empresas están empezando arenunciar.

¡¡¡Viva el Software!!! No todo es malo en elsoftware, pero sí debemos reconocer que es una labormuy complicada conseguir un software de calidad.Son cada vez más los que piensan que para solucionargran parte de estos problemas se debe adoptar unsistema ASP, que son las siglas de Application ServiceProvider. En este tipo de sistemas la empresa final queva a utilizar el software no deberá encargarse deproducir ni mantener ningún tipo de aplicación. Tansolo contrata un servicio, como lo hace cuandocontrata una línea de teléfono, sin necesidad de tenerexpertos en tecnologías de la información, ni perderel tiempo en el desarrollo, puesta en producción ymantenimiento del mismo.

El software ha muerto, viva el software

Por Pedro PozoClikearclikear.com

¡¡¡El software ha MUERTO!!! Así lo proclama Marc Benioff , uno de los gurús de las tec-nologías de la información.Y no sólo él, son muchas las personas y empresas que opinanlo mismo y auguran el fin del sector del software tal y como lo conocemos actualmente.

¿Pero por qué ocurre esto?<<

La mayoría de los problemas en un sistema de información es el software,

y sobre todo, el software que se desarrolla a medida, donde la mayoría de las veces

se realiza con escasos recursos,poco tiempo y pocos conocimientos

Page 9: dnm004

Montar un sistema de información de calidadrequiere de muchos recursos, tanto humanos comotecnológicos. Por un lado se requieren expertos entecnologías, que cada vez cambian con más rapidez yque por tanto son difíciles de encontrar y muy caros,y por otro lado requiere gran inversión en máquinasque se quedan obsoletas también en breve espacio detiempo. Además algunos temas como la seguridadinformática, requieren cada vez más de unaespecialización que sólo es posible encontrarla enempresas cuyo negocio son las tecnologías de lainformación. En la mayoría de las ocasiones, sedescuidan estos temas y se recortan gastos para poderabordar los proyectos, con el consiguiente perjuiciopara la calidad de los mismos.

Con los sistemas ASP, las empresas contrataríanel software como si fuera un servicio, al cual accederíana través de Internet. Este sistema tendría ventajasdirectas como despreocuparse del desarrollo de lasaplicaciones, el mantenimiento de las mismas, así comode los complejos sistemas informáticos tradicionalescon redes locales, servidores, PC’s, actualizaciones desoftware, etc ...

Tan solo un terminal en el cual se ejecute unnavegador de Internet y una línea ADSL sonsuficientes para tener acceso a todas las aplicacionesde gestión de la empresa, a la Intranet, a losdocumentos empresariales, y todos los servicios queson habituales en cualquier sistema de escritoriotambién pueden estar disponibles en un sistema ASP.

En un momento hemos trasladado el 90% de losproblemas de mantenimiento del sistema informáticode la empresa a otra empresa que nos prestará esteservicio. En la mayoría de los casos, si nuestro sistemainformático es mínimamente complejo con un ahorrode costes y recursos notable.

Con los sistemas ASP, nos olvidamos de losproblemas de comprar un nuevo servidor, porque elactual está muy sobrecargado; directamente notenemos servidor, tan solo debemos conectar aInternet y trabajar. Se acabaron los problemas decomprar nuevos PC’s para instalar nuevo software ode instalar nuevas versiones en cientos de PC’s. Esnuestro proveedor ASP el que actualiza sus máquinase instala las nuevas versiones y nosotros tan solo

debemos conectarnos a Internet para acceder a ellas.También se acaban nuestros problemas de seguridad,con la complejidad de instalar, configurar y mantenerfirewall, antivirus, parches, etc ... , será nuestroproveedor del servicio ASP el que tendrá expertosen seguridad que se encarguen de estos temas;nosotros tan solo tenemos que conectarnos y utilizarel servicio.

Pero tampoco podemos pensar que es la solucióna todos los problemas. Los detractores de los sistemasASP inciden en los problemas que surgen cuando lavelocidad de conexión no es óptima, y que los datosde la empresa están alojados en una empresa externa.En cuanto a la conexión a Internet, cada vez se mejorael acceso y la velocidad con las líneas ADSL y con lasredes privadas virtuales (VPN) ofrecen un acceso aInternet de calidad; y en cuanto a la localización y laprivacidad de los datos de la empresa, es quizá el temamas complejo de solucionar porque supone un cambiode mentalidad por parte de las empresas que no vencon buenos ojos que sus datos privados residan en otrolugar que no sea sus propias instalaciones.

En resumen, debería haber un cambio dementalidad en el mundo del software, consistente endejar de vender el software como un producto ycomenzar a vender el software como un servicio. Sóloel tiempo determinará si esta transformación en elnegocio del software se lleva a cabo, pero lo que pareceseguro es que se abre una posibilidad de abrir un nuevomercado en un sector con una gran competencia.

dotN

etM

anía

<<

9

dnm.opinion<<

Debería haber un cambio de mentalidad en el mundo del software, consistente en dejar

de vender el software como un producto ycomenzar a vender el software como un servicio

Page 10: dnm004

dotN

etM

anía

<<

10

Seguridad basada en código

Los sistemas operativos basados en NT (WindowsNT, 2000, XP y 2003) proporcionan un sistema deseguridad basado en el usuario. Cualquier recurso delsistema como los archivos, entradas en el registro odispositivos de red está protegido para que sólo losusuarios autorizados puedan acceder a él. Cualquieraplicación ejecutada por el usuario funcionará conestas restricciones, por lo que no le será posible acce-der a los recursos protegidos.

El problema de este sistema de seguridad surgecon la aparición de Internet, donde los usuarios eje-cutan aplicaciones directamente desde la red en lasque no confían plenamente. Windows permite a todaslas aplicaciones ejecutadas por un usuario el acceso acualquier recurso para el que esté autorizado, sin teneren cuenta si se trata de una aplicación corporativa enla que confiamos plenamente o un juego ejecutadodesde Internet de dudosa procedencia.

El entorno de ejecución de .NET elimina estarestricción, porque proporciona un sistema de segu-ridad que tiene en cuenta no sólo la identidad delusuario sino las características de la aplicación eje-cutada. La seguridad de Windows seguirá siendoválida y podremos limitar el acceso a recursos paradeterminados usuarios, pero se añade además lacapacidad de restringir aún más los permisos depen-diendo de la identidad del código ejecutado, su

autor, procedencia o cualquier otra característicadel mismo.

Implementar un sistema de seguridad como éstepresenta varios retos. El código ejecutado debe fun-cionar de forma aislada, sin que se permita el accesodirecto a los recursos del sistema operativo donde

sólo se tendría en cuenta la seguridad del usuario.Surge por tanto la necesidad de una librería de cla-ses, controlada por el propio entorno de ejecución, yque sirva de envoltorio a los recursos del sistema.Clases incluidas en esta librería son por ejemploFileStream para el acceso a archivos o Registry para elacceso al registro.

Una vez creada esta librería de clases tenemos que

La seguridad de tipos en .NET

Leyendo el pasado número de dotnetmanía me encontré con el estupendoartículo “El poder de la reflexión en .NET”, donde se explicaba la potencia delespacio de nombres System.Reflection y su aplicación a la factorización de cla-ses .NET. En el último apartado del artículo y utilizando la misma técnica semencionaba un agujero de seguridad en el entorno de ejecución de .NET eincluso se proporcionaba el código fuente para explotarlo. Después del sustoinicial me disponía a reproducirlo en mi máquina cuando me di cuenta delerror que cometía el artículo, ¿qué detalle se pasó por alto?

<<

Por David CarmonaDevelopment Consultant - Divisiónde Desarrollo y Plataforma deMicrosoft Ibérica

“El equipo de .NET tuvo que teneren cuenta multitud de técnicas diferentes para que la seguridad

basada en código no fuera vulnerable”

Page 11: dnm004

garantizar que nuestra aplicación no eje-cute un código directamente sobre elprocesador para acceder a los recursosdel sistema operativo, lo que origina elconcepto del llamado código manejado(managed code). Este código manejadopresenta una característica muy impor-tante: puede ser verificado. La verifica-ción es un proceso que permite cono-cer al entorno .NET si el código que vaa ejecutar es inseguro; bien porqueintenta saltarse las reglas básicas de tiposo porque accede de forma directa a unrecurso. Los mecanismos para hacertipo de ataques son variados, por ejem-plo con llamadas a métodos privados dela librería de clases, lecturas o escritu-ras en posiciones de memoria donderesiden variables protegidas, llamadasdirectas a funciones de Windows o algu-nas más que veremos en este artículo.

El otro reto de implementación esque todas estas restricciones que debeimponer el entorno de ejecución nosupongan una limitación para el soft-ware. El proceso de verificación es cos-toso y las restricciones que conlleva limi-tan la funcionalidad de la aplicación.Todas las aplicaciones inseguras proce-dentes de Internet deberían sometersea este proceso pero las aplicaciones loca-les confiadas por el usuario tienen queseguir funcionando a plena potencia ycon la máxima funcionalidad.

Técnicas de ataque habitualesEl equipo de .NET tuvo que tener

en cuenta multitud de técnicas diferen-tes para que la seguridad basada en códi-go no fuera vulnerable, de hecho laempleada por los autores del último artí-culo es una de ellas y está incluida en labatería de pruebas que todas las versio-nes de .NET tienen que pasar antes dever la luz.

Esta técnica consiste en generar uncódigo manejado que realice un castingentre dos tipos incompatibles. La difi-cultad consiste en generar este código,porque los compiladores habituales de.NET (C# o VB) comprueban la com-patibilidad entre tipos antes de generarel ejecutable. El artículo planteaba laposibilidad de generar el código inter-medio directamente, utilizando para ello

las clases System.Reflection.Emit. El códi-go resultante era bastante extenso, porlo que no lo repetiré aquí.

Una forma más sencilla de generareste código inseguro consiste en utili-zar cualquier otro compilador que sí mepermita el casting entre tipos incompa-tibles. Por ejemplo, supongamos quetenemos dos clases como éstas:

El compilador ilasm.exe permite uti-lizar código intermedio como lenguaje yno realiza ninguna comprobación detipos. Podemos utilizar este compiladorpara crear la siguiente clase:

Esta clase convierte una instancia dela clase A que define un campo privado,a la clase B que implementa el mismocampo pero con acceso público. Un lla-mante podría utilizar esta clase para sal-tarse la seguridad de tipos .NET y acce-der a cualquier campo privado. Y esto

mismo puede realizarse con otros com-piladores incluidos en el Framework máscompletos, como el de C++ manejado.

Hemos simplificado bastante elsupuesto agujero de seguridad, perotodavía se puede mejorar. La libreríaSystem.Reflection utilizada en el artículopermite también acceder directamentea cualquier campo o método privado,

sin necesidad de crear ningún códigointermedio en tiempo de ejecución.Véase fuente 1.

Con este código podemos accederdirectamente al valor de un campo pri-

vado de una clase sin crear ninguna cla-se intermedia B o generar código entiempo de ejecución.

Podemos utilizar otras técnicas másoriginales para hacer esto mismo. Porejemplo, algunos compiladores de.NET permiten la generación del lla-

dotN

etM

anía

<<

11

dnm.plataforma.net<<

class A{

private string campo = “Esto es privado”;}

class B{

public string campo;}

class UnsafeCaster {

.method public static class B DoCast(class A a) cil managed {

ldarg.0

ret

}

}

“El grupo de producto de .NET está comprometido a estudiar las vulnerabilidades de seguridad encon-tradas por cualquier desarrollador del mundo. Nuestra máxima prioridad consiste en hacer que elFramework .NET sea la plataforma más segura y estable sobre la que construir las mejores y más poten-tes aplicaciones, y la opinión de nuestros desarrolladores es esencial para conseguirlo. Agradecemos lahonestidad de dotNetManía por su disposición a dar a conocer las cuestiones de seguridad, permitien-do nuestra participación y haciendo posible mientras tanto que la plataforma mejore en el proceso.”

Sebastian LangeProgram Manager de Seguridad del CLR

Sebastian Lange es además Autor del libro “.NET Framework Security” y coautor de las guías “Improving WebApplication Security: Threats and Countermeasures” y “Building Secure ASP.NET Applications: Authentication,Authorization, and Secure Communication”, además de ser ponente habitual de TechEd y PDC.

Page 12: dnm004

mado código inseguro (unsafe code). C# tiene unaopción de compilación, accesible en las propiedadesdel proyecto desde Visual Studio, para generar códi-go que potencialmente no pasará el proceso de veri-ficación. Con esta modalidad podemos, entre otrascosas, realizar aritmética de punteros y conseguir asíun mayor rendimiento, pero también nos permitiráobviar la seguridad de .NET. Imaginemos la siguien-te clase:

Podemos utilizar la aritmética de punteros paraacceder al campo privado saldo:

Algunas técnicas son todavía más sencillas. .NETofrece la serialización de tipos para su almacenamientoo envío secuencial. Normalmente los campos priva-dos de una clase también se incluyen en esta seriali-zación, con lo que un atacante podría utilizar esta téc-nica para leer el resultado de la serialización y acce-der a las variables privadas. Si la clase anterior estámarcada como [Serializable] podemos utilizar elsiguiente código para acceder a sus variables privadas:

Todavía nos quedan varias técnicas más, pero sóloveremos una muy sencilla. El Framework .NET per-mite llamar a funciones externas no manejadas, comolas incluidas en la API de Win32. Sólo tenemos quebuscar una función en esta API que nos permita leer

arbitrariamente de la memoria, por ejemploCopyMemory. Jugando un poco con la memoria don-de se almacenan los miembros de la clase podemosconseguir el valor del campo privado. Véase fuente 2.

El sistema de permisos de .NETParece que en este artículo no sólo hemos descu-

bierto el mismo agujero de seguridad con el que empe-zamos, sino que hemos añadido muchos más. Resultaevidente que no podemos prescindir de funcionalidadtan importante como la reflexión, los compiladoresinseguros como IL o C++, la serialización, los punte-ros o las llamadas a código nativo, con lo que no esuna opción eliminar todas estas características delFramework para solucionar el problema.

El reto de .NET consistía en permitir que las apli-caciones locales confiadas por el usuario puedan uti-lizar todas estas características, pero impidiendo tam-bién que aplicaciones poco seguras como las ejecuta-das desde Internet no tengan este nivel de acceso. Lasolución implementada por .NET consiste en la defi-nición de permisos que limitan sólo aquellas caracte-rísticas que afectan a la seguridad del sistema.

Cuando una aplicación intenta realizar alguna accióncomprometedora el entorno de ejecución comienza un

proceso que estudia los permisos asignados a todas laslibrerías que participan en la pila de llamadas actual. Sialguna de las librerías no tiene permiso para ejecutar laacción el sistema nos devolverá una excepción que impe-dirá la ejecución del código malicioso.

Existen permisos para cualquier acción que se nosocurra. Desde los más básicos como el acceso al sis-tema de archivos o a determinados directorios, hastalos más complejos como el acceso a bases de datos, la

red, el interfaz de usuario, las impresoras o ActiveDirectory. Nos centraremos en los siguientes:

• Omitir Comprobación (Skip Verification): supri-me el proceso de verificación en la carga de unaaplicación.

dotN

etM

anía

<<

12

dnm.plataforma.net<<

A a = new A();

Type t = typeof(A);FieldInfo f = t.GetField(“campo”, BindingFlags.Instance | BindingFlags.NonPublic);Console.WriteLine(f.GetValue(a));

class A{

public uint id = 0;private uint saldo = 10;

}

A a = new A();unsafe{

fixed(uint* pid = &(a.id)){

uint* psaldo = pid + 1;Console.WriteLine(“Te pillé el saldo: {0}”, *psaldo);

}}

IFormatter formatter = new BinaryFormatter();

MemoryStream stream = new MemoryStream();

formatter.Serialize(stream, new A());

Console.WriteLine((“Te pillé el saldo: {0}”, stream.GetBuffer()[136]);

Fuente 1

Page 13: dnm004

• Reflexión (Reflection): limita el usode las clases de reflexión y genera-ción de código en tiempo de ejecu-ción.

• Permitir llamadas a ensamblados noadministrados (Allow calls to unma-naged assemblies): impide a una apli-cación llamar a código no maneja-do, como la API de Windows.

• Habilitar el formateador de seriali-zación (Enable serialization format-ter): restringe el uso de la serializa-ción de clases.

Existen ocho permisos más relacio-nados con la seguridad, pero nos inte-resan estos últimos especialmente por-que son los asociados a las técnicas deataque vistas en este artículo:

Las aplicaciones que realizan castingsentre tipos incompatibles son detectadaspor el entorno de ejecución si no dispo-nen del permiso Skip Verification. Inclusosi ese código es generado en tiempo deejecución, como el ejemplo mostrado enel anterior número de dotnetmanía, el sis-tema controlará la situación y lanzará unaexcepción de seguridad.

• La aritmética de punteros que per-miten algunos lenguajes como C++o C# (este último si se configurapara la generación de código inse-guro) es detectada automáticamen-te por el mismo proceso de verifi-cación, con lo que necesitará tam-bién el permiso Skip Verification.

• Cualquier intento de acceso a varia-bles protegidas utilizando las clasesde reflexión será cancelado por elentorno si la aplicación no disponedel permiso Reflection. Tanto la téc-nica utilizada por los autores delpasado artículo como la opción sim-plificada mostrada en éste no pasa-rían este requisito para su ejecución.

• Los intentos de acceso a la memo-ria utilizando llamadas a la API deWindows no llegan a ejecutarse sila aplicación no dispone del permi-so Allow calls to unmanaged assem-blies.

• Por último, la técnica de ataquebasada en la serialización no fun-cionaría sin el permiso Enable seria-lization formatter.

Todos estos permisos son confi-gurables para una máquina individual,para un usuario concreto e incluso anivel global de empresa. La herra-mienta para gestionar esta configura-ción se denomina Configuración deMicrosoft .NET Framework y seencuentra localizada en el menú deHerramientas Administrativas del sis-tema.

Si consulta esta configuración en suequipo tendrá valores distintos depen-diendo de si utiliza el Framework 1.0 oel 1.1. Si utiliza la versión 1.0 verá quesólo las aplicaciones locales disponende todos los permisos y que las prove-

nientes de Internet si siquiera dispo-nen del permiso de ejecución. En laversión 1.1 estos permisos fueronampliados y se permite la ejecución deaplicaciones Internet. En ambas ver-siones y para el caso menos restrictivo(aplicaciones provenientes de laIntranet) se permiten algunas accionescomo la impresión, la generación decódigo o el interfaz de usuario. Si sefija ninguno de los permisos vistos eneste artículo es otorgado, por lo que nose podrá utilizar ninguna de las técni-cas de ataque estudiadas.

Conclusiones

El sistema de seguridad de .NET hasido concebido para complementar alexistente en el propio sistema operati-vo. Por la propia naturaleza de esta segu-ridad, basada en el código y no en laidentidad del usuario, hay que tener encuenta multitud de mecanismos quepuede utilizar una aplicación maliciosapara evitar los controles de acceso.Todos esos mecanismos están contem-plados en el sistema de permisos de.NET, que además blinda por defecto alas aplicaciones ejecutadas desde entor-nos inseguros como Internet.

El artículo publicado en el númeroanterior de dotnetmanía utilizaba una deestas técnicas para evitar el sistema deseguridad, indicándose que su ejecuciónera posible en un entorno seguro. En elpresente artículo sin embargo hemosvisto cómo este código es detectado porel Framework como inseguro y que suejecución es suspendida en este tipo deentornos por el proceso de verificación.

Quisiera dar las gracias a los edito-res de la revista y a los autores del artí-culo por publicar cualquier vulnerabi-lidad encontrada en .NET y permitir-me también clarificar un tema tan com-plejo como el de la seguridad de tiposen .NET. Desde aquí me gustaría mos-trar el compromiso de Microsoft enprestar el máximo apoyo a cualquier otraposible vulnerabilidad encontrada porlos autores y lectores de la revista, estu-diándola en profundidad y haciéndolallegar a los responsables de seguridadde .NET para su resolución inmediatasi así fuera necesario.

dotN

etM

anía

<<

13

dnm.plataforma.net<<

[DllImport(“kernel32.dll”)]public static extern void CopyMemory(ref ulong dest, ref uint source, int length);

static void Main(){

A a = new A();ulong saldo = 0;CopyMemory(ref saldo, ref a.id, 8);Console.WriteLine(“Te pillé el saldo: {0}”, saldo >> 32);

}

Fuente 2

Page 14: dnm004

dotN

etM

anía

<<

14

podemos desarrollarsitios web en diferentes idiomas reduciendo drásti-camente estos costes, tiempos y recursos, pero nues-tra dificultad estriba entonces no en el qué sino en elcómo hacer esto posible en .NET, y es justamente esto,lo que aprenderemos a hacer en este artículo, en elaplicaremos algunas de las técnicas que nos haránposible la creación de sitios web en diferentes idio-mas y con características avanzadas.

Contenido vs PresentaciónEn un rasgo general y tratando de apartar el desa-

rrollo en n-tier común, debemos tener en cuenta queuna página web está compuesta de dos partes princi-pales, una de ellas es la formada por la capa de pre-sentación y la otra la formada por la capa de conte-nido, tal y como se muestra en la figura 1.

Suponiendo la página web Index.aspx que corres-ponde a la página inicial de un sitio web en el cuálpor ejemplo, el usuario debe insertar su palabra deacceso y su correspondiente contraseña para que elusuario sea autentificado, ésta se compone de la capade presentación formada por sus cajas de texto, eti-quetas generales de información y botones, etc., mien-tras que la capa de contenido podría estar formadapor un pequeño recuadro con las últimas noticias de

bolsa, por ejemplo. Nuestro sitio web está en espa-ñol y esta información aparecerá siempre en este idio-ma y sobre la bolsa de Madrid por ejemplo, aunqueel usuario que acceda sea angloparlante y le interesemás la bolsa de Londres o de Wall Street.

De esta manera, vemos que una página web, con-tiene dos partes generales. Quizás ambas deberían sertraducidas, pero de momento, vamos a fijar nuestraatención en la capa de presentación que es la parteque se ve en primer lugar.

Creando aplicaciones Web babilónicas con ASP .NET

¿Cuántas veces hemos querido tener una página o un sitio web en diferentesidiomas? Supongo que si usted es desarrollador de aplicaciones web o gestionao mantiene sitios web,encontrará esta pregunta muy habitual y frecuente,sobretodo si su sitio se dirige a un público muy diverso en el ámbito idiomático. Si esasí, sabrá además, que realizar sitios web en múltiples idiomas eleva considera-blemente los presupuestos y los gastos, incrementando proporcionalmente, lostiempos, los recursos y el dinero de forma casi desproporcionada.

Sin embargo, con ASP .NET<<

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

Figura 1. Partes principales de una página web

Page 15: dnm004

Un breve repaso al pasado

Indudablemente, antes de embarcarnos en la fabu-losa aventura de aprender a crear nuestras páginasweb en diferentes idiomas con ASP.NET, convieneantes hacer un repaso, aunque breve, de cómo se lle-vaban a cabo hasta ahora las técnicas más generalesde diseñar y crear sitios web internacionales.

Por lo general, era habitual tener un directoriocomún con aquellos recursos que no sufrían ningúntipo de modificación, recursos tales como las imáge-nes, las bases de datos, etc., de nuestro sitio.

Por otro lado, nos encontrábamos con que otrotipo de recursos, sobre todo las páginas web y en par-ticular la capa de presentación, ya no sólo la capa decontenido, debían ser repetidas tantas veces, comoidiomas diferentes tuviéramos en nuestro sitio web.

La figura 2 aclara esta explicación.

Observando con atención la figura 2, destacamosde ella, que existe un directorio principal en nuestrositio web y que éste contendrá posiblemente algunapágina inicial como la típica página Index.asp en ver-siones anteriores a ASP.NET, y que dentro de estedirectorio principal, encontramos el árbol de direc-torios que forman parte de nuestro sitio web. El direc-torio Images y el directorio BBDD, son directorioscon contenido compartido por todas las páginas webde nuestro sitio, aunque estén en diferentes idiomas.Luego encontramos dos directorios que tienen la mis-ma información con la única excepción que uno delos directorios está dirigido a los usuarios anglopar-lantes, mientras que el otro está dirigido a los usua-rios hispanohablantes de nuestro sitio.

Indudablemente, este planteamiento es suficien-te para lograr nuestro propósito de ofrecer un sitioweb en diferentes idiomas, pero esta solución nos pre-senta ventajas e inconvenientes.

Aunque las ventajas de presencia de un sitio weben múltiples idiomas no tiene discusión alguna, entre

las desventajas encontramos como rasgo fundamen-tal, que el mantenimiento y el esfuerzo que hay quehacer es en ocasiones demasiado elevado y muchasveces no se obtiene apenas recompensa de ello, sinotodo lo contrario. Además, si modificamos una pági-na web correspondiente a uno de los idiomas, debe-remos hacer lo mismo en el resto de directorioscorrespondientes a los otros idiomas. Podríamos con-tinuar enumerando inconvenientes, pero sirvan loscomentados, como ejemplos de escasa eficiencia eneste tipo de tareas.

Con todas estas premisas, no es raro encontrarmultitud de sitios internacionales en Internet quecomparten la casi totalidad de recursos, y que tie-nen su propia página web corporativa –la de susheadquarters- y luego desde allí, se redirecciona alresto de sitios webs correspondientes a sus oficinasa lo largo de todo el mundo o a la de los sitios endiferentes idiomas, pero esta técnica no es tampo-co la más adecuada, o por lo menos, eso es lo quepienso yo.

Ahora se preguntará muy posiblemente, que des-pués de todo lo comentado, es peor el remedio quela enfermedad, y que probablemente, conviene dejarnuestro sitio web en un único idioma y no hacersemejante esfuerzo de diseñar nuestro sitio web endiferentes idiomas, pero siento contradecirle, porlo menos ahora que tenemos a ASP.NET y suscaracterísticas de nuestro lado, porque al valor aña-dido que obtendrá nuestro sitio web con estas carac-terísticas, deberemos incorporarle además, las posi-bilidades que .NET nos ofrece como veremos a con-tinuación.

dotN

etM

anía

<<

15

dnm.asp.net<<

Figura 2. Diagrama general de un sitio web enmúltiples idiomas sin aplicar las técnicas de .NET

Page 16: dnm004

De todas las maneras, y dependien-do de nuestros intereses, lo que vamosa ver puede adecuarse a sus necesidadeso no. Recuerde que la informática es unaciencia inexacta, y por lo tanto, no siem-pre hay un único camino para solucio-nar los problemas planteados, y nimucho menos, la línea recta, en lo quea informática se refiere, es la que menosquebraderos de cabeza nos va a dar aun-que nos parezca a priori que sí.

La solución a la capa de presentación:Recursos

Comenzaremos nuestra andaduradando unos pasos largos pero muy fir-mes, por ello, quiero hablar de una pala-bra: recursos, y en su caso, del nombrede espacio o namespace en .NET culpa-ble de que se puedan utilizar,System.Resources.

Como vimos anteriormente en lafigura 1, una página web está com-puesta por la capa de presentación y lacapa de contenido. La capa de presen-tación es lo que recubre siempre al con-tenido y es la capa de una página webque nunca varía. Su parte externa nun-ca varía y siempre tiene el mismo aspec-to, pero el interior o contenido, sí pue-de variar dependiendo de nuestrasnecesidades.

Para aclarar aún más esta explica-ción, si encontramos el típico formula-rio web dónde insertar nuestro nombre,apellidos y dirección de correo electró-nico, las etiquetas o textos que indicandónde escribir cada parte nunca cam-biarán, así como el botón que indicaActivate o Activar si utilizamos comoidiomas el inglés o español por ejemplo.Sin embargo, otra información quepudiera aparecer en la página web comopor ejemplo un banner o anuncio, sípodría cambiar dependiendo del idio-ma seleccionado.

A aquellas partes que podemos defi-nir como partes fijas, las denominare-mos recursos. Éstas son las partes másmolestas dentro del mantenimiento weben el método tradicional, y requierenpor nuestra parte como hemos yacomentado, de un esfuerzo bastantegrande.

El nombre de espacio System.Resources nos facilita enormemente el tra-bajo con recursos y con la capa de pre-sentación de las páginas web. Pero parallevar a cabo nuestra tarea, necesitare-mos de otro nombre de espacio,System.Globalization, el cuál nos facilita-rá el trabajo con los recursos, y de algu-na herramienta adicional, herramientasque encontraremos en el entorno dedesarrollo de Visual Studio .NET y portanto en Microsoft .NET Framework.En mi caso, voy a desarrollar todos misrecursos con un editor de textos comoel Bloc de Notas de Windows y conMicrosoft .NET Framework 1.1, tal ycomo veremos a continuación.

Creando recursosNuestra primera tarea va a comenzar

siempre en el diseño del web y sus partesmás generales. Independientemente delos objetivos de nuestra página web deejemplo y de hacerla de modo tal que pue-da mostrarse en diferentes idiomas, esrecomendable abordarla en un único idio-ma, haciéndola eso sí, acreedora delsoporte de idiomas múltiples. Podemosjugar con clases, componentes propios,etc., pero aquí vamos a mostrar las pin-celadas generales de cómo llevar a cabonuestro propósito.

En primer lugar crearemos nuestrapágina web tratando de mostrar la infor-mación que se detalla en la figura 3.

Nuestra página web, Index_Resource.aspx, tendrá dos controles de tipo Buttono botón, que nos servirán para que elusuario seleccione el idioma que pre-fiera en nuestra página web. Ademástendrá cuatro etiquetas o controles detipo Label para mostrar diferentes infor-maciones fijas.

Nuestro objetivo es que los boto-nes permanezcan con el mismo textoque tendrán de origen y que de lascuatro etiquetas o controles Label,

dotN

etM

anía

<<

16

dnm.asp.net<<

Se preguntará muy posiblemente si no conviene dejarnuestro sitio web en un único idioma y no hacer el gran

esfuerzo de diseñar nuestro sitio web en diferentes idiomas, pero siento contradecirle,

por lo menos ahora que tenemos a ASP.NET y sus características de nuestro lado

Figura 3. Diseño general de una página web en español e inglés

Page 17: dnm004

sólo una de ellas posea el mismo texto inalterado.Por lo tanto, sólo tres controles, los tres primeroscontroles Label, pueden sufrir modificaciones encuanto a la capa de presentación en nuestra pági-na web dependiendo del idioma seleccionado porel usuario.

Para llevar a cabo la tarea, crearemos nuestrofichero de recursos. La página web se llamará en estecaso, Index_Resource.aspx y los ficheros de recursostendrán el mismo nombre que la página web pero conuna particularidad como veremos a continuación.

En primer lugar, crearemos nuestros ficheros derecursos, para lo cuál deberemos conocer el nombrede los controles que queremos utilizar para modifi-car el texto de presentación. Estos controles se lla-marán en este ejemplo Label1, Label2 y Label3.

Con un editor de textos, crearemos dos ficherosde nombres Index_Resource.es-ES.txt eIndex_Resource.en-US.txt que serán los ficheros quecontengan los nombres de los recursos de la páginaweb Index_Resource.aspx y su contenido.

En las tablas 1 y 2, podemos ver este contenido.Ahora que tenemos nuestros ficheros de recursos

ya creados, vamos a compilar estos ficheros para queluego nuestra aplicación ASP.NET pueda acceder aellos. Para realizar esto, vamos a utilizar una herra-mienta de Microsoft .NET Framework, como yacomentamos anteriormente. Esta herramienta se lla-ma ResGen y es un generador de recursos cuyo fun-cionamiento es muy básico y se resume en la siguien-te línea:

ResGen nombre_de_recursos.txt

El generador de recursos, compilará el archivocon extensión .txt cambiando esta extensión por laextensión .resources, de tal manera que tendremos dosarchivos con nombre Index_Resource.es-ES.resources yIndex_Resource.es-ES.resources respectivamente.

Para compilar estos ficheros de recursos, acudi-remos a la carpeta de programas de inicio corres-pondiente a Microsoft Visual Studio .NET 2003 y den-tro de ésta, accederemos a la carpeta denominadaVisual Studio .NET Tools haciendo clic sobre el pro-grama Visual Studio .NET 2003 Command Prompt.Se abrirá una ventana de MS-DOS y nos situaremosentonces en el directorio en el que hemos preparadonuestros ficheros de recursos, y los compilaremos taly como se muestra en la figura 4.

dotN

etM

anía

<<

17

dnm.asp.net<<

Figura 4. Ejecución de ResGen para compilar los ficheros de recursos

Index_Resource.es-ES.txt

Label1=Espa&ntilde;ol

Label2=Nombre

Label3=Apellido

Tabla 1. Index_Resource.es-ES.txt

Index_Resource.en-US.txt

Label1=English

Label2=Name

Label3=Surname

Tabla 2. Index_Resource.en-US.txt

Page 18: dnm004

Una vez que hemos creado nuestros ficheros derecursos, ahora tan sólo nos queda aplicarnos en laparte de programación.

Diseñando nuestra aplicaciónEn mi caso me he decantado por el uso de

Microsoft Visual Studio .NET 2003 para llevar a cabonuestra tarea de diseño y creación de nuestra aplica-ción de ejemplo. Crearemos por lo tanto un nuevoproyecto, que yo he querido iniciar con Visual Basic.NET y lo haremos en un directorio que creamos con-veniente. Yo por ejemplo, he decidido crearlo en laruta http://localhost/resources.

Teniendo presente la figura 3, la cuál es el modeloinicial de lo que queremos conseguir, trataremos de lle-var a cabo de manera práctica toda la teoría explicadahasta ahora. De hecho, el diseño de nuestra página webdebe ser semejante al que se indica en la figura 5.

Ahora bien, la parte correspondiente a la progra-mación, parte del uso de dos nombres de espacio onamespaces, el nombre de espacio System.Globalizationy el nombre de espacio System.Resources. Estos dosnombres de espacio, son los que utilizaremos en nues-tra aplicación.

Ahora bien, la parte o método que utilizaremospara leer los archivos de recursos, pertenece al nom-bre de espacio System.Resources, y su uso es cómosigue:

Advierta en esta porción de código dos cosasfundamentales.

La primera es que el nombre de recursos, debe tenerel mismo nombre que nuestra página web. Si nuestrapágina web se llama WebForm1, el nombre de recursosdeberá denominarse WebForm1.es-ES, WebForm1.en-US, etc. El fichero efectivamente se denominaWebForm1.es-ES.resources, pero la extensión la obvia-

remos al hacer referencia al archivo de recursos.La segunda cosa a tener en cuenta, es que la lla-

mada al fichero de recursos se hace mediante el méto-do GetString seguido del nombre del control (en estecaso) del que queremos extraer la información.

Esta es la parte básica general para tratar los fiche-ros de recursos en nuestras páginas y aplicaciones web,ahora bien, para complicar un poco más el aprendi-zaje, utilizaremos un truco que si bien no lo es tanto,sí es una característica que pasa desapercibida pormuchos desarrolladores.

Nuestra aplicación está preparada ya para que elusuario pueda cambiar el idioma de la web y se mue-va más cómodamente por ella, sin embargo, imagi-nemos que nuestra aplicación web se muestra siem-pre en español por defecto y que nosotros seamos unusuario angloparlante. La verdad es que resulta incó-

dotN

etM

anía

<<

18

dnm.asp.net<<

A aquellas partes que podemos definir como partes fijas,

las denominaremos recursos.Éstas son las partes más molestasdentro del mantenimiento web

en el método tradicional,y requieren por nuestra

de un esfuerzo bastante grande

Figura 5. Diseño de nuestra página webde ejemplo

Dim rm As ResourceManagerrm = ResourceManager.CreateFileBasedResourceManager(“WebForm1.es-ES”,Request.ServerVariables(“APPL_PHYSICAL_PATH”), Nothing)Label2.Text = rm.GetString(“Label2”)

Page 19: dnm004

modo tener que estar cambiando el idioma conti-nuamente cada vez que visitamos la web. Vale, pen-sará, ya lo tengo. Usaremos las famosas galletas o coo-kies. Bueno, es una alternativa válida, pero suponga-mos que no queremos utilizar esta posibilidad y quelo que queremos hacer es simplemente, que nuestraaplicación detecte si el navegador de nuestro usuarioestá en español o en inglés. Si está en español, le mos-traremos la aplicación o página web en español, encaso contrario, se la mostraremos en inglés. Bien, puesvamos a completar nuestra aplicación para aprove-char esta técnica.

Detectando el idioma de nuestro navegador web

Para llevar a la práctica esta posibilidad, abrire-mos el navegador web Microsoft Internet Explorer yseleccionaremos del menú Herramientas>Opciones deInternet… En la ventana que se nos abrirá, haremosclic sobre la solapa General. En esta solapa, haremosclic sobre el botón Idiomas.

Aquí agregaremos dos idiomas, el Español – Españay el Inglés – Estados Unidos, dejando este último en laposición más alta, que indica que el de la parte supe-rior prevalecerá sobre el de la parte inferior, tal y comose muestra en la figura 6.

Ahora bien, nos queda la parte en la cuál nuestraaplicación se entenderá con el navegador web parasaber qué idioma es el que está seleccionado en undeterminado navegador web cliente, y esto lo logra-remos utilizando el nombre de espacioSystem.Globalization.

El código para utilizar esta característica es el quese detalla a continuación:

Ahora lo que nos queda es simplemente probarnuestra aplicación. En un primer lugar, la aplicaciónweb tendrá una apariencia similar a la que se mues-tra en la figura 7.

Bien, una vez visto que la ejecución de la aplica-ción se da de acuerdo a lo establecido, regresaremosal menú del cambio de idioma de Microsoft InternetExplorer y pondremos en la parte superior de idiomaal idioma Español o si lo prefiere para hacer esta prue-ba, puede eliminar el idioma Inglés. Cuando haga estecambio, refresque o vuelva a ejecutar la aplicación nue-vamente. Observará que la aplicación ahora, se mues-tra en español, tal y como se muestra en la figura 8.

ConclusionesEn este artículo, hemos aprendido a crear recur-

sos con .NET, así cómo la forma de utilizarlos y ges-tionarlos en nuestras aplicaciones web.

dotN

etM

anía

<<

19

dnm.asp.net<<

Figura 6.Añadiendo idiomas a Microsoft Internet Explorer

Figura 7. Ejecución de la aplicación web con el idioma Inglés por defecto

Dim MiCultura As CultureInfoIf MiCultura.CreateSpecificCulture(Request.UserLanguages(0)).ToString = “en-US” Then‘ Idioma: InglésElse‘ Idioma: EspañolEnd If

Page 20: dnm004

Adicionalmente, hemos aprendido a utilizar carac-terísticas de valor añadido como la selección del idio-ma del navegador web para mostrar la página web enel lenguaje o idioma del cliente por defecto.

En el caso de esta aplicación, los ficheros de recur-sos residen en el mismo directorio de la aplicación,sin embargo, es recomendable situarlo en otro direc-torio para estructurar los contenidos del sitio web demanera eficiente. Recuerde que en el caso de cambiarla ruta, deberá cambiar también la instrucciónRequest.ServerVariables(“APPL_PHYSICAL_PATH”)utilizada en este ejemplo a la hora de referenciar elarchivo de recursos.

No olvide que ASP.NET tiene muchas posibili-dades, entre ellas el uso de algunas de las que ya hecitado, como aplicar cookies para conocer ciertas con-figuraciones de un usuario cuando accede repetida-mente en el tiempo a nuestra aplicación web, o bien,el uso de variables de sesión para que la selección delusuario no se altere entre páginas web dentro de unasesión abierta en nuestra aplicación web.

dnm.asp.net<<

Figura 8. Ejecución de la aplicación web con el idioma Español por defecto

consejo

Sólo como algo anecdótico y de valor añadido a lo explicado, lo más normal es crear en estos casos, unavariable de sesión que permita almacenar el tipo de idioma que se recoge de la página principal o delcambio de idioma requerido por el usuario, para arrastrar esa selección al resto de páginas web de nues-tra aplicación. [[ << <<

noticias.noticias.noticias.noticias

Con motivo del primer ani-versario de WillyDev.Net,Willy Marroquín, su creador,organizó un evento para desa-rrolladores en Colombia conuna asistencia de más de 700personas, lo que le convierte,posiblemente, en la comuni-dad independiente de hablacastellana con mayor poder deconvocatoria, tanto en Amé-rica Latina como en España.

El evento “nuestro primer año al aire” se celebró con la participa-ción de Federico Raggi de MS Latam, José Berrio de INETA, RamónGonzález de Only4Gurus.Com, José Said Becerra de Borland y PabloNarváez de las Comunidades de Ecuador y más de 700 desarrollado-res de diferentes partes de Colombia (Bucaramanga, Cali, Santa Marta,Medellín, Bogota y demás), y algunos de fuera de Colombia (Ecuadorespecíficamente).

Más información: http://www.willydev.net/eventos/primeraniversario.

Primer año al aire de WillyDev.Net

Microsoft y Sun, conscientes de la necesidad deaportar una transición sin problemas para los actua-les usuarios de la máquina virtual de Jav (MSJVM),han acordado extender la licencia de uso del Java deSun. Esta extensión permite a Microsoft dar sopor-te al MSJVM hasta el 31 de diciembre de 2007, pro-porcionando a los clientes la posibilidad para hacerla transición de MSJVM de forma planificada y másefectiva.Para más información:http://www.microsoft.com/mscorp/java/

Microsoft extenderá elsoporte para su MáquinaVirutal Java en sus productos hasta finales de 2007

Page 21: dnm004

diseñado menos de 15 capas de acceso adatos a lo largo de mi vida. Y al menos la mitad delas veces, pensaba que eran soluciones inteligentes.Aunque la verdad es que, mirándolo en perspecti-va, me replanteo la utilidad de tantas horas, "inver-tidas", partiendo de cero en la búsqueda de estassoluciones, además de los problemas que algunasde ellas mostraron, en cuanto a flexibilidad, cuan-do cambiaba el diseño de la aplicación; por ejem-plo, cuando aparece otro cliente con una base dedatos distinta a la que utilizaste en el diseño; o cuan-do la aplicación, inicialmente diseñada para un clien-te Windows, se desea convertir a interfaz Web.

Era entonces, cuando notaba la fragilidad delos cimientos de algunas aplicaciones, a causa del

diseño interno de sus componentes, o de la formaen que éstos se relacionaban. Las causas de dichafragilidad variaban, dependiendo de mi experien-cia como desarrollador, o de la del grupo en que meencontraba: unas veces, era porque no había consi-derado que la aplicación se podía separar en capas;

otras, porque no había creado suficientes capas;porque no conseguía un nivel de aislamiento sufi-ciente entre las capas; otras,… en fin.

Un buen día, descubrí que existían soluciones, yadiseñadas, a problemas comunes. Para que este felizacontecimiento sucediera, tuve la suerte de: 1)tenerque resolver un problema común y 2)contar con unejemplar del clásico Design Patterns [dp-ghjv-94].

En el libro comentado previamente, se intro-ducen los patrones como elementos de softwarereutilizables. Dichos patrones surgen de los cono-cimientos de diseñadores expertos. Cuando undiseñador encuentra una buena solución a un pro-blema, no vuelve de nuevo a pensar otra soluciónpara un problema parecido, sino que aplica la queha obtenido anteriormente, con la ventaja de quesabe con certeza que dicha solución funcionacorrectamente.

Según se comenta en Design Patterns, buscan-do una buena definición sobre un patrón, podría-mos remontarnos al año 77: “Cada patrón describe unproblema que ocurre de forma recurrente en nuestro entor-no, además de aportar una solución a dicho problema detal forma que se pueda utilizar dicha solución millonesde veces, sin tener que usarla dos veces de la misma for-ma” (Christopher Alexander). Dicha definición per-tenecía al entorno de la construcción, pero es total-mente aplicable a la ingeniería del software. ¿Acasoun arquitecto se plantea si un edificio tiene cimien-tos o la entrada está en la planta baja? ¿Se plantea-ría si una casa tiene cocina y cuarto de baño? ¿Porqué en informática volvemos siempre a pensar enlos mismos problemas?

Introducción a los Patrones .NET:Observer

Por Liborio LópezMCSD .NETActive Ways

Hay muchos patrones de los que podríamos hablar pero, sin duda, gracias asu integración en el Framework, el patrón observer es el más utilizado de lospatrones clásicos, cuando trabajamos en .NET.

Creo que no he<<

dotN

etM

anía

<<

21

Cuando un diseñador encuentra una buena solucióna un problema, no vuelve de nuevo a pensar otra

solución para un problema parecido

Page 22: dnm004

Gracias a esta fuente, llegué al quesería el primer patrón que aplicaría deforma consciente: El Observer. Lo uti-licé diseñando un sistema de trazas parauna aplicación. Necesitaba que se pue-dieran enviar mensajes a determinadosdispositivos. Dichos dispositivos (fiche-ro, puerto TCP, ventana de comandos)

deberían poder activarse o desactivarseen tiempo de ejecución; y, obviamente,cada uno de ellos, transmitiría los men-sajes de forma diferente, lo que lo hacíadiferente del resto. Además, queríapoder utilizar ese sistema de trazas paraotras aplicaciones que desarrollara en elfuturo.

La conjunción de todos estos ele-mentos, me hizo caer rendido ante laelegancia y la sencillez que nos aportael inspirarnos en soluciones diseñadaspara funcionar, además de ser flexiblesen su interacción con otros elementosdel sistema.

La implementación por la quefinalmente opté en mi sistema de tra-zas, no es la que aparecía directamen-te en el libro. Era una especializacióna mi problema en la que había adop-tado los elementos que necesitaba deeste patrón.

El Observer se compone de un objeto,Subject, que tiene una lista de subscripto-res, Observers. Cuando el subject recibe unanotificación que implique determinadaacción, recorrerá toda su colección deobservers, y, delegará dicha acción en la lla-mada al metodo Update de cada uno dedichos observers. Cada uno de ellos reali-

zará una acción concreta, para ello con-sultará un objeto, concreteSubject, que man-tendrá el estado del que se actualizarántodos los observers.

Tal y cómo aparece documentado enel libro Design Patterns [dp-ghjv-94], laestructura de clases del patrón Observeres la que aparece en la figura 1.

Donde:

Subject

• Contiene un enlace a todos losobservers subscritos

• Proporciona un interfaz para rea-lizar y cancelar subscripciones

Observer

• Define una interfaz para obje-tos que deberán ser informadosde cambios en un Subject (seproducirá tras la llamada aSubject.Notify)

ConcreteSubject

• Almacena la información inte-resante para un ConcreteObserver(subjectState)

• Envía notificación (usando Notify)a los ConcreteObservers cuando suestado es modificado

ConcreteObserver

• Mantiene una referencia a suConcreteSubject para poder consul-

tarle el estado y actualizarse al reci-bir la llamada a su método Update.

Un ejemplo muy popular de la imple-mentación de este patrón es el modeloDocumento/Vista que podemos encontraren las MFC. Donde las corresponden-cias entre clases serían las siguientes:

Subject -> CDocument,ConcreteSubject -> CMyDocument,Observer -> CView,ConcreteObserver -> CMyView(ver figura 2).

dotN

etM

anía

<<

22

dnm.arquitectura<<

Un ejemplo muy popularde la implementación

de este patrón es el modelo

Documento/Vistaque podemos encontrar

en las MFCs

Figura 1. Estructura de clases del patrón Observer

Page 23: dnm004

De la misma forma que en el patrónobserver, la clase CDocument contieneuna lista con todas las CView que mues-tran la información que el documentoalmacena. El documento que guarda lainformación específica es CMyDocument,mantiene los datos que queremos mos-trar en las diferentes CMyViewXXX.Donde CMyViewXXX representan cla-ses que hereden de CView, por ejemplouna vista en forma de diagrama debarras, CMyViewBarras y otra en formade hoja de cálculo, CMyViewExcel.

Cuando una vista es actualizada, se lla-ma al UpdateAllViews de la clase CDocument(Subject.Notify) y se actualizan todas las vis-tas (ConcreteObserver.Update). Cada vistaaccederá a su documento, consultará losdatos actuales de él (subject.GetState()) yactualizará su interfaz gráfico, segúncorresponda (diagrama de barras u hoja decálculo, por ejemplo) dependiendo de lavista concreta que sea.

El uso de este patrón, viene englo-bado en los siguientes casos:

• Cuando el cambio que se produceen un objeto, implica cambiar otrosy los objetos a cambiar no se cono-cen inicialmente (caso del modeloDocumento/Vista).

• Cuando un objeto debe ser capazde avisar a otros objetos sin hacerpresunciones sobre el estado deéstos.

• Cuando se necesita soporte parabroadcasting.

El comportamiento anterior podría-mos reflejarlo en los diagramas desecuencia de las figuras 3 y 4.

Esto que hemos visto, es el modelogenérico del patrón observer. En su imple-mentación, tendríamos que hacer unaserie de consideraciones. Como porejemplo el mantenimiento de la variableConcreteObserver.subject. Ésta debe seractualizada con respecto al ConcreteSubjectque referencia y debe atender a la posi-ble necesidad de destrucción de dichoobjeto. Además, caso de que unConcreteObserver esté subscrito a variosConcreteSubject, éste debería ser infor-mado sobre qué ConcreteSubject es el que

está siendo actualizado para no malgas-tar tiempo con llamadas a otrosConcreteSubject que no han sido tocados.

Vayamos ahora con la especializa-ción por la que yo opté, en el diseño demi sistema de trazas. Para no llevar aconfusión entre el gestor de trazas, delque hablaba anteriormente, con la infra-estructura que proporciona para trazasel propio Framework, desarrollaré elejemplo, usando C#, entorno a un sis-tema de mensajería. Dicho sistema, serácapaz de enviar mensajes de un usuarioa todos los dispositivos subscritos alSubject. Nuestro sistema de mensajeríaes un claro ejemplo de la aplicación delpatrón observer como necesidad de bro-adcasting a todos los objetos subscritosa un Subject determinado. Con este sis-tema, deseamos enviar un mensaje dedeterminado usuario a todos los dispo-sitivos que se encuentren activos actual-mente (dentro del contenedor del

Subject). Para este caso mostraremosotro diseño de clases , basándonos en elpatrón observer. Ver figura 5.

En esta implementación hemos rea-lizado dos cambios fundamentales:

• Se ha sustituido la clase abstractaobserver por una interfaz IDispositivo.

• Ha desaparecido el ConcreteSubject,pasando la información de estadocomo parámetro de Notify. Lla-mando GestorMensajes al Subject.

dotN

etM

anía

<<

23

dnm.arquitectura<<

Figura 2

Figura 3. Secuencia de mensajes para registro

Figura 4. Secuencia de notificación de cambio

Page 24: dnm004

dotN

etM

anía

<<

24

dnm.arquitectura<<

La implementación en C# de este diagrama de cla-ses es la que aparece en el código fuente 1.

Como se puede ver, en nuestro diseño simplifica-do del patrón observer, nos hemos quedado con la ideade fondo del patrón, sus clases más importantes y lohemos aplicado al problema que teníamos planteado.También me gustaría anticipar que este modelo decomportamiento, broadcasting, lo encontraremos siem-pre que utilicemos el modelo de eventos de .NET. Enbreve, hablaremos de la relación entre el patrón obser-ver y .NET.

Como podemos ver en los ejemplos, el Observeren particular, y todos los patrones en general, apor-tan soluciones genéricas a problemas genéricos. Cómoespecialicemos cada patrón a la hora de afrontar unproblema concreto, es decisión nuestra.

Además de proporcionarnos una solución a unproblema común, el hecho de utilizar patrones nosaporta un lenguaje común para el equipo de trabajo.Es mucho más rápido y preciso describir una soluciónutilizando la nomenclatura propia del mundo de lospatrones, que el hecho de tener que definir cada unode ellos en una reunión de diseño. Por ejemplo, decirque usaremos un Proxy para acceder a un objeto remo-to, que tener que definir qué es un Proxy. O unSingleton para mantener el acceso a la conexión, queexplicar que mantendremos un objeto único en nues-tro sistema que nos gestionará el acceso a la conexión.O un Observer para mantener los dispositivos subs-critos a un sistema de mensajes, que tener que expli-car que dispondremos de una clase gestora de dispo-sitivos de traza que contendrá una lista de dispositi-vos subscritos, donde cada dispositivo implementaráun interfaz común…

Un patrón nos puede servir para documentar deci-siones tácticas de nuestra aplicación, por ejemplo, eluso de una Abstract Factory para proporcionar a la capade negocio un aislamiento sobre la construcción deobjetos de la capa de acceso a datos, tema que se tra-tará en otro artículo.

Pero los patrones pueden y deben ir más allá deestas decisiones tácticas y permitirnos tomar decisio-

nes estratégicas. De tal forma que nos permitan verla arquitectura de una aplicación como una combina-ción de patrones sencillos.

Y desde el momento en que podemos docu-mentar una aplicación como una combinación depatrones, podríamos plantearnos ir más allá.Podríamos buscar agrupaciones estándar de patro-nes, que podamos reutilizar en muchas solucionesdistintas. La mayoría de las aplicaciones empresa-riales, acceden a base de datos; están diseñadas encapas lógicas, entre las que se encuentra un inter-faz gráfico y la capa de negocio. Muchas propor-cionan servicios y/o están distribuidasY todas ellas,hay que instalarlas. En cada uno de estos problemasque surgen diseñando nuestra arquitectura, existenpautas comunes que podrían documentarse comoclusters de patrones, que agrupen otros patronessencillos. Esto da lugar a otro tipo de patrones, bue-na parte de ellos documentados en otro conocidolibro: Patterns of enterprise application architecture[peaa-f-02]. Estos modelos, nos pueden evitarmuchos quebraderos de cabeza a la hora de diseñarnuestra arquitectura. Además de proporcionarnosla confianza propia de soluciones que, ya están pro-badas y han demostrado su buen comportamientoen entornos empresariales.

En definitiva, un patrón pude ser útil a los desa-rrolladores por varias razones:

• Documentan mecanismos sencillos, que fun-cionan.

• Proporcionan un vocabulario común.• Permiten que una solución se describa de for-

ma concisa como una combinación de patrones.• Permiten reutilizar decisiones de arquitectura,

diseño e implementación.

Con la llegada de .NET han cambiado muchascosas para todos nosotros. Uno de estos grandes cam-bios, aunque quizás de los menos conocidos, ha sidola plena adopción, por parte de Microsoft, de los patro-nes de diseño.

Figura 5. Estructura de clases del sistema de mensajería

Page 25: dnm004

dotN

etM

anía

<<

25

dnm.arquitectura<<

// clase Subject que gestiona una lista de dispositivospublic class GestorMensajes{

public GestorMensajes(){m_dispositivos = new ArrayList();

}

// lista de dispositivos subscritosprivate ArrayList m_dispositivos;

// Subscribir dispositivos al gestor de mensajespublic void Attach(IDispositivo disp){

m_dispositivos.Add(disp);}

// Cancela la subscripción de un dispositivopublic void Dettach(IDispositivo disp){

m_dispositivos.Remove(disp);}

// boadcasting del mensaje a todos los disp subscritospublic void SendMessage(string usuario, string texto){

DatosMensaje msg = new DatosMensaje(usuario, texto);foreach (IDispositivo disp in m_dispositivos){

disp.SendMessage(msg);}

}}

// interfaz que implementan todos los concrete observerspublic interface IDispositivo {

void SendMessage(DatosMensaje msg);}

// observer que lanza mensaje a consolapublic class Consola : IDispositivo {

public void SendMessage(DatosMensaje msg){Console.WriteLine(“{0}: {1}”, msg.Usuario, msg.Mensaje );

}}

// observer que lanza mensaje a ficheropublic class Fichero : IDispositivo{

private string m_nombreFichero;

public Fichero(string nombre){m_nombreFichero = nombre;

}

public void SendMessage(DatosMensaje msg){StreamWriter writer = new StreamWriter(m_nombreFichero, true);writer.WriteLine(“{0}: {1}”, msg.Usuario, msg.Mensaje);writer.Close();

}}

// clase que contiene el Mainclass Class1{

// Prueba el sistema de mensajesstatic void Main(string[] args){

GestorMensajes gestor = new GestorMensajes();IDispositivo disp1 = new Consola();IDispositivo disp2 = new Fichero(“fich1.txt”);IDispositivo disp3 = new Fichero(“fich2.txt”);

gestor.Attach(disp1);// se envía un mensaje a la consolagestor.SendMessage(“usu1”, “mensaje 1”);gestor.Attach(disp2);// se envía un mensaje a la consola y fich1.txtgestor.SendMessage(“usu1”, “mensaje 2”);gestor.Attach(disp3);// se envía a cosola, fich1.txt y fich2.txtgestor.SendMessage(“usu1”, “mensaje 3”);gestor.Dettach(disp1);// se envía a fich1.txt y fich2.txtgestor.SendMessage(“usu1”, “mensaje 4”);

}}

Fuente 1

Page 26: dnm004

Dicha adopción se ha producido adiferentes niveles:

• En la implementación del Frame-work se han utilizado multitud deéstos, hoy veremos su integracióncon el Observer.

• Documentación de patronesempresariales y mejores prácticaspara el desarrollo de aplicacionescon .NET (Patterns & Best Practices:http://www.microsoft.com/resour-ces/practices/)

Volviendo al patrón al que hemosdedicado nuestra introducción, lasimplementaciones que hemos visto songenéricas, podrían haberse llevado a cabocasi en cualquier lenguaje de programa-ción orientado a objetos. Pero cada len-guaje o plataforma tienen sus pequeñaspeculiaridades que lo hacen diferente aotros.

Cuando estamos trabajando en.NET es necesario señalar que el patrónObserver es tan importante que perte-nece al “código genético” de la plata-forma. Es decir, está implementado den-tro del propio Framework y se usa deforma extensiva para la gestión de even-tos. Cabe notar que, el ejemplo quehemos visto del sistema de mensajería,no es más que la gestión de un evento,lanzado cuando llega un nuevo mensa-je al gestor.

Como sabemos, existe una clase en.NET que se llama MulticastDelegate.Dicha clase, entre otros, contiene unmétodo DynamicInvoke y una lista deinvocación. Su modelo de clases, sim-plificado, sería el de la figura 6.

Como se puede apreciar en el diagra-ma, las clases Delegate y MulticastDelegatenos proporcionan todos los elementosnecesarios en el Subject, de nuestro ladoqueda implementar nuestros ConcreteSubjecty los observers.

Implementar el ConcreteSubject en.NET es sencillo. Simplemente tene-mos que crear una clase que herede deMulticastDelegate e incluir un campode esta clase en nuestro ConcreteSubject,antecediéndolo de la palabra reservadaevent.

Así obtenemos un campo Gestor-Mensajes.NuevoMensaje dentro de nues-tra clase con un comportamiento idénti-co al de los eventos en .NET —es unevento— que sigue el modelo de trabajodel patrón Observer. En lugar de imple-mentar el patrón desde cero, hemos uti-lizado la infraestructura que nos propor-ciona el Framework con los delegados.

No tenemos más que consultar unevento proporcionado por el Frame-work, para poder comprobar su simi-litud con el patrón visto previamente.Si echamos un vistazo a la claseSystem.Windows.Forms.Button, podre-mos comprobar que contiene el even-to Click —heredado de System.Win-dows.Forms.Control —. Dicho evento,no es más que una instancia de la cla-se EventHandler, que hereda de Multi-castDelegate. Cada vez que subscribi-mos una función a este evento, lo hace-

mos a la lista de invocación de un dele-gado. De igual forma que con el patrónobserver, lo hacíamos a la lista de subs-criptores del Subject. Así, cuando selanza el evento, realmente se llama alInvoke del delegado —idéntico al Notifydel Subject—, recorriéndose la lista deinvocación y llamándose a todas lasfunciones subscritas a ella.

Cabe recordar que cuando subscri-bimos una función a un evento, no regis-tramos solamente la función, sino queademás hacemos lo propio con el obje-to que la contiene —como se puede veren el diagrama de clases de Delegate—.De esta forma tendremos un punteroseguro a función, con la garantía de queel recolector de basura nunca habrá des-truido el objeto de forma inesperada, yaque el propio Delegate mantiene unareferencia a dicho objeto. En el Invoke,realmente se itera por la lista dinámicade invocación y se llama a todas las fun-ciones subscritas. Es por ello, que todasestas funciones, deben tener la misma

dotN

etM

anía

<<

26

dnm.arquitectura<<

el Observer en particular, y todos los patrones en general,aportan soluciones genéricas a problemas genéricos.

Cómo especialicemos cada patrón a la hora de afrontar un problema concreto, es decisión nuestra

public delegate void MensajeriaEventHandler(string msg);

public class GestorMensajes{public event MensajeriaEventHandler NuevoMensaje;

}

Figura 6

Page 27: dnm004

signatura —sin tener en cuenta el nombre— que lafunción Invoke del delegado en que se basa el evento.

Siguiendo con nuestro sistema de mensajería. Nosiempre es necesario crear una nueva clase delegate. Sólotenemos que hacerlo cuando: Necesitemos proporcio-nar parámetros al Invoke y éstos, no se encuentren enninguno de los delegados ya incluidos en el Framework;O bien, queramos dar un nombre a la clase que estémás relacionado con el entorno de nuestra aplicación.En nuestro caso, implementaremos una clase delegadapropia, para que reciba un argumento que contenga losdatos del usuario y el texto del mensaje. Ver fuente 2.

Analizando el código anterior, se ha cambiado elDatosMensaje msg por dos parámetros que incluyen unobject y un MensajeriaEventArgs. La razón de este cam-bio, ha sido seguir el patrón de nomenclatura que man-tiene el Framework en relación a los eventos.

Si nos fijamos, todas las clases delegate que se handiseñado para usarse como objetos evento, tienen unnombre terminado en EventHandler. De ahí el nom-bre de nuestro delegado, MensajeriaEventHandler.Además el Invoke de estos delegados, siempre devuel-ve un void, además de recibir como parámetros unobject —objeto que lanza el evento— y una clase que

hereda de EventArgs, donde se incluyen todos los datosrelacionados con el evento. Además, esta clase quehereda de EventArgs, se llamará igual que la clase dele-gado en que se basa el evento, sustituyendoXXXEventHandler por XXXEventArgs.

De esta forma, para nuestro delegado Mensaje-riaEventHandler, existirá una clase MensajeriaEventArgsque contendrá los datos relacionados con nuestroentorno: El nombre del usuario que lanza el evento yel texto del mensaje.

Así queda desarrollada toda la jerarquía del Subjectde nuestro patrón observer. Para implementar la jerar-

quía del lado del observer, sólo tenemos que añadir alas clases seleccionadas una función que tenga la mis-ma signatura que el Invoke de MensajeriaEventArgs ysubscribirla al evento con la sintaxis propia del lengua-je elegido (+=, -= en C# ; AddHandler, RemoveHandleren VB.NET).

El modelo completo de clases, incluyendo unobserver que envía un mensaje a la consola y otro quelo hace a fichero sería tal y como se puede ver en lafigura 7.

Quedando el código de GestorMensajes, los obser-vers y el Main tal y como se puede ver en el fuente 3.

dotN

etM

anía

<<

27

dnm.arquitectura<<

// clase que hereda de MulticastDelegatepublic delegate void MensajeriaEventHandler(object sender, MensajeriaEventArgs args);

// Tipo del segundo parámetro del Invoke del delegadopublic class MensajeriaEventArgs : EventArgs{

// nombre del usuario que lanza el mensajeprivate string m_usuario;// mensajeprivate string m_mensaje;

MensajeriaEventArgs(string usuario, string mensaje){m_usuario = usuario;m_mensaje = mensaje;

}

public string Usuario {get {

return m_usuario;}

}public string Mensaje {

get {return m_mensaje;

}}

}

// clase Subjectpublic class GestorMensajes{

public event MensajeriaEventHandler NuevoMensaje;}

Fuente 2

Page 28: dnm004

public class GestorMensajes{public event MensajeriaEventHandler NuevoMensaje;

// Función que envia el mensaje a todos los observerspublic void Notify(object sender, string usuario, string mensaje){

// comprobamos si hay alguien subscritoif (NuevoMensaje != null){

MensajeriaEventArgs args = new MensajeriaEventArgs(usuario, mensaje);// lanzamos el evento para que llame a su// lista de invocaciónNuevoMensaje(sender, args);

}}

}

// observer que lanza mensaje a consolapublic class Consola{

public void SendMessage(object sender, MensajeriaEventArgs e){Console.WriteLine(“{0}: {1}”, e.Usuario, e.Mensaje );

}}

// observer que lanza mensaje a ficheropublic class Fichero {

private string m_nombreFichero;

public Fichero(string nombre){m_nombreFichero = nombre;

}

public void SendMessage(object sender, MensajeriaEventArgs e){StreamWriter writer = new StreamWriter(m_nombreFichero, true);writer.WriteLine(“{0}: {1}”,e.Usuario,e.Mensaje );writer.Close();

}}

class Class1{

static void Main(string[] args){

GestorMensajes gestor = new GestorMensajes();Consola disp1 = new Consola();Fichero disp2 = new Fichero(“fich1.txt”);Fichero disp3 = new Fichero(“fich2.txt”);

gestor.NuevoMensaje += new MensajeriaEventHandler(disp1.SendMessage);// se envía un mensaje a la consolagestor.Notify(null, “usu1”,”mensaje 1”);gestor.NuevoMensaje += new MensajeriaEventHandler(disp2.SendMessage);// se envía un mensaje a la consola y fich1.txtgestor.Notify(null, “usu1”,”mensaje 2”);gestor.NuevoMensaje += new MensajeriaEventHandler(disp3.SendMessage);// se envía a cosola, fich1.txt y fich2.txtgestor.Notify(null, “usu1”,”mensaje 3”);gestor.NuevoMensaje -= new MensajeriaEventHandler(disp1.SendMessage);// se envía a fich1.txt y fich2.txtgestor.Notify(null, “usu1”, “mensaje 4”);

}}

Fuente 3

dotN

etM

anía

<<

28

dnm.arquitectura<<

Page 29: dnm004

dotN

etM

anía

<<

29

dnm.arquitectura<<

Sin duda, gracias a su integración en el Framework,el patrón observer es el más utilizado de los patronesclásicos, cuando trabajamos en .NET. Siempre que nossubscribimos a un evento, estamos implementando unobserver, aunque no nos demos cuenta. Al principio,puede parecer más engorroso implementar el patrónutilizando la infraestructura de delegados. Pero no debe-mos olvidar que, cuando desarrollamos nuestras apli-caciones, estamos “extendiendo” el Framework, portanto, deberíamos habituarnos a su forma de trabajary a sus estilos. Por dos razones fundamentales: siem-pre que extendamos el Framework, nuestro código serámás fácil de entender por cualquier desarrollador .NET;y además estaremos adaptándonos a una filosofía detrabajo que es la recomendada por Microsoft, en lugardescubrir la plataforma a contracorriente.

En este primer artículo hemos hablado sobre elObserver por su importancia capital dentro delFramework de .NET. En posteriores ocasiones inten-taremos descubrir otros patrones menos conocidos,o casi tanto como éste, dentro de usos habituales ennuestras aplicaciones, además de clusters de patronesy Best Practices de Microsoft.

Desde aquí les invitamos a que nos envíen susexperiencias o consultas sobre patrones y prácticasrecomendadas.

[dp-ghjv-94] Design Patterns: Elements of reusableObject Oriented Software (1994). Erich Gamma,Richard Helm, Ralph Johnson, John Vlissides

[peaa-f-02] Patterns of Enterprise ApplicationArchitecture (2002). Martin Fowler

Figura 7

Page 30: dnm004

dotN

etM

anía

<<

30

Pintando con trazo grueso.La clase Brush

Cuando dibujamos figuras en la superficie de unformulario utilizando la clase Pen, habremos com-probado que el interior de las mismas queda “hue-co”, es decir, vemos el fondo del formulario.

Si además de dibujar una figura, queremos quesu interior quede relleno de un color o efecto basa-do en una combinación de colores, necesitamos rea-lizar las siguientes operaciones:

En primer lugar instanciaremos un objeto dealguna de las clases derivadas del tipo Brush, comoSolidBrush, TextureBrush, HatchBrush, etc., depen-diendo del efecto de relleno que queramos lograr.Brush es una clase abstracta, y como tal, no pode-mos instanciar objetos directamente de ella.

Seguidamente deberemos obtener del formula-rio el objeto Graphics, que representa el contextode dispositivo gráfico sobre el que vamos a dibujar.De esto se encarga el método Form.CreateGraphics.

Por último llamaremos a alguno de los méto-dos del objeto Graphics que comienzan por el nom-bre Fill, lo que dibujará la correspondiente figura,rellenándola con el color o efecto correspondienteal método usado. La siguiente tabla muestra algu-no de los métodos disponibles. Para un mayor deta-lle, recomendamos al lector la consulta de la docu-mentación sobre los tipos Brush disponible en ladocumentación de la plataforma .NET.

Método Tipo de figura

FillRectangle Rectángulo

FillEllipse Elipse

FillClosedCurve Curva cerrada, creada a partirde un array de tipos Point

FillPolygon Polígono

Tabla 1.

El fuente 1, crea una figura con forma ovalada,y rellena su interior de un color, utilizando los pasosdescritos anteriormente.

Fuente 1

Como comentarios adicionales sobre el ante-rior código, cabe destacar que hemos utilizado unobjeto SolidBrush, que es el más básico de todos los

Relleno de formas gráficas, texturas,degradados y otros efectos avanzados

con GDI+

Por Luis Miguel BlancoSoftware ArchitectAlhambra-Eidos

El conjunto de clases incluido en el espacio de nombres System.Drawing, pro-vee al programador de todas aquellas características necesarias para dotar alos gráficos de efectos adicionales, que permitan aportarles una mayor vistosi-dad.A lo largo de este artículo, realizaremos un repaso de los principales ele-mentos existentes en GDI+, de forma que sirvan de base al lector para la ela-boración de sus propios efectos.

<<

‘ definir colorDim oColor As ColoroColor = Color.FromName(“Green”)

‘ crear objeto brushDim oSolidB As New SolidBrush(oColor)

‘ obtener el dispositivo gráfico y crear dibujoDim oGraphics As Graphics = Me.CreateGraphics()oGraphics.FillEllipse(oSolidB, New Rectangle(25, 45, 150, 50))oGraphics.Dispose()

Page 31: dnm004

objetos de este tipo disponibles. El colorlo hemos creado usando el métodoColor.FromName, pasando una cadenacon el nombre del color a usar. No es elmodo más directo ni habitual, ya que lomás sencillo es utilizar la lista de miem-bros de esta estructura, que contiene demodo inmediato los colores. Muy im-portante también es la llamada aGraphics.Dispose al finalizar el proceso,para liberar los recursos gráficos quehayamos estado utilizando. El resulta-do de ejecutar este ejemplo lo podemosver en la siguiente imagen.

La claseTextureBrush.Gráficoscon tapices

Supongamos que tenemos un archi-vo con una imagen que nos gustaríaincluir como relleno o textura para unafigura que dibujemos en el formulario.

Con GDI+ nada más fácil. En pri-mer lugar, para obtener una referenciahacia la imagen, debemos crear un obje-to Bitmap, en cuyo constructor pasare-mos la ruta del archivo. A continuación,crearemos un objeto TextureBrush,pasándole como parámetro el objetoBitmap que apunta al archivo que usa-remos como base para el relleno de lafigura. El resto de pasos son los ya cono-cidos por el lector: obtener el objetoGraphics del formulario y llamar a cual-quiera de sus métodos Fill.

Como ejemplo de uso de este tipo deobjeto, en el fuente 2, creamos una curvacerrada a partir de un array de estructu-ras Point, usando el método Graphics.FillClosedCurve, rellenándola seguida-mente con el contenido de una imagenproporcionada por un objeto TextureBrush.

El resultado obtenido al ejecutar elfuente 2 será similar al que mostramosen la siguiente imagen.

Efectos avanzados con las clases Brush.Tramas y degradados

El espacio de nombres System.Drawing.Drawing2D contiene varias cla-ses derivadas de Brush que permiten, apartir de la combinación de varios colo-res, la aplicación de efectos tales comotramas y degradados en el proceso decreación de formas gráficas.

La primera de estas clases con la quevamos a tratar será HatchBrush, median-te la cual, podemos crear una figura que

muestre un efecto de trama combinan-do uno o dos colores.

El fuente 3 muestra la creación dedos figuras con este tipo de clase, a lasque aplicamos sendos efectos de trama-do. Para seleccionar el tramado usare-mos la enumeración HatchStyle. Recuerdeel lector que para usar este tipo de obje-to es necesario importar el espacio denombres System.Drawing. Drawing2D.

La siguiente imagen muestra elresultado.

‘ obtener imagen de archivoDim oBitmap As New Bitmap(“E:\Pruebas\MiTextura.gif”)

‘ crear textura de la imagenDim oTextureB As New TextureBrush(oBitmap)

‘ definir coordenadas de la figuraDim aCoordenadas(4) As PointaCoordenadas(0) = New Point(20, 20)aCoordenadas(1) = New Point(70, 100)aCoordenadas(2) = New Point(100, 75)aCoordenadas(3) = New Point(120, 75)aCoordenadas(4) = New Point(160, 40)

‘ obtener el dispositivo gráfico y crear dibujoDim oGraphics As Graphics = Me.CreateGraphics()oGraphics.FillClosedCurve(oTextureB, aCoordenadas)

oGraphics.Dispose()

Imports System.Drawing.Drawing2D‘....‘....Dim oHatchB1 As New HatchBrush(HatchStyle.HorizontalBrick, _

Color.Aquamarine, Color.DarkMagenta)

Dim oHatchB2 As New HatchBrush(HatchStyle.SolidDiamond, _Color.Aquamarine, Color.DarkMagenta)

Dim oGraphics As Graphics = Me.CreateGraphics()oGraphics.FillRectangle(oHatchB1, New Rectangle(40, 40, 100, 50))oGraphics.FillEllipse(oHatchB2, New Rectangle(40, 110, 100, 50))

oGraphics.Dispose()

dotN

etM

anía

<<

31

dnm.plataforma.net<<

Fuente 2

Fuente 3

Page 32: dnm004

dotN

etM

anía

<<

32

dnm.plataforma.net<<

La siguiente clase con la que traba-jaremos será LinearGradientBrush, lacual efectúa un degradado o fundido dedos colores, entre dos coordenadas ouna zona rectangular, esto depende delconstructor utilizado a la hora de ins-tanciar este objeto. El fuente 4 muestraun ejemplo de uso de esta clase.

La figura, con el efecto de degrada-do aplicado a los dos colores del obje-to, se muestra en la siguiente imagen.

Para terminar con este conjunto declases pasaremos a PathGradientBrush,cuya finalidad consiste en rellenar figu-ras con un color para la zona central, yun array de colores para los bordes. Estaclase incorpora un mecanismo que se

ocupa de aplicar el fundido entre loscolores central y exteriores. El siguien-te fuente de ejemplo 5 crea un objetoBrush de este tipo.

La propiedad SurroundColors nospermite establecer el array de colorespara el borde de la figura, mientras queen la propiedad CenterColor asignamosel color central hacia el que se realiza-rá el fundido o degradado de los colo-res exteriores.

La figura obtenida podemos verlaen la siguiente imagen.

La clase GraphicsPath.Creaciónde una figura compleja a partirde varias simples

Esta clase, situada en el espacio denombres System.Drawing.Drawing2D,representa a un contenedor de figuras.Tras crear un objeto de este tipo, utili-

Con un poco de imaginación y las clases de GDI+,podemos conseguir efectos realmente notables con menor

esfuerzo del que requería la creación gráfica a base de llamadas al API de Windows, gracias al modelo robusto

y cohesionado de clases que proporciona la plataforma.NET Framework

Imports System.Drawing.Drawing2D‘....‘....Dim oLinearGradB As New LinearGradientBrush(New Point(15, 10), _

New Point(100, 75), _Color.DarkGreen, Color.LightSkyBlue)

Dim oGraphics As Graphics = Me.CreateGraphics()oGraphics.FillRectangle(oLinearGradB, New Rectangle(15, 10, 80, 65))oGraphics.Dispose()

Fuente 4

Imports System.Drawing.Drawing2D‘....‘....‘ coordenadas para realizar el degradadoDim pntPuntos(4) As PointpntPuntos(0) = New Point(20, 70)pntPuntos(1) = New Point(80, 10)pntPuntos(2) = New Point(140, 70)pntPuntos(3) = New Point(100, 150)pntPuntos(4) = New Point(55, 150)

‘ array de colores para los bordes de la figuraDim aColores(1) As ColoraColores(0) = Color.AquaaColores(1) = Color.Turquoise

‘ crear objeto para el degradadoDim oPathGradB As New PathGradientBrush(pntPuntos)oPathGradB.SurroundColors = aColoresoPathGradB.CenterColor = Color.DarkGreen

Dim oGraphics As Graphics = Me.CreateGraphics()‘ dibujar figura usando el objeto‘ para el degradadooGraphics.FillPolygon(oPathGradB, pntPuntos)

oGraphics.Dispose()

Fuente 5

Page 33: dnm004

zaremos los métodos que comienzan por Add para aña-dir figuras al contenedor. Una vez terminada la com-posición del gráfico, y dependiendo de si vamos a dibu-jarlo con un objeto Pen, o un subtipo de Brush, emple-aremos el método DrawPath o FillPath respectivamentede la clase Graphics para plasmar la figura en la super-ficie del formulario. El fuente 6 muestra un ejemplode este tipo de objeto.

La combinación de figuras obtenidas se muestraen la siguiente imagen.

Dibujo de texto en formato gráfico.El método DrawString

Para dibujar en el formulario un texto con carac-terísticas gráficas, debemos utilizar el métodoGraphics.DrawString, especificando como parámetros,la cadena con el texto a mostrar, un objeto Font conel tipo de letra a visualizar, un objeto derivado de Brush

que tenga el tipo de trazo para pintar, y una estructu-ra PointF con las coordenadas en donde comenzará adibujarse el texto. El fuente 7 realiza este proceso.

El texto dibujado en el formulario tras ejecutareste código podemos verlo en la siguiente imagen.

Por supuesto que el ejemplo anterior muestra laforma más aburrida de pintar texto usando GDI+.Como hemos dicho, al usar DrawString estamos

dnm.plataforma.net<<

Imports System.Drawing.Drawing2D‘....‘....‘ crear el objeto GraphicsPathDim oGPath As New GraphicsPath()

‘ añadir figuras dentro del objetoDim aPuntos(2) As PointaPuntos(0) = New Point(100, 120)aPuntos(1) = New Point(130, 70)aPuntos(2) = New Point(160, 120)

oGPath.AddPolygon(aPuntos)

oGPath.AddEllipse(New Rectangle(105, 10, 50, 50))oGPath.AddEllipse(New Rectangle(45, 110, 50, 50))oGPath.AddEllipse(New Rectangle(165, 110, 50, 50))

Dim oGph As Graphics = Me.CreateGraphicsoGph.FillPath(New HatchBrush(HatchStyle.Sphere, Color.Aquamarine), _

oGPath)

oGph.Dispose()

Fuente 6

‘ objeto Font con el tipo de letraDim oTipoLetra As New Font(“Lucida Console”, _

45, FontStyle.Italic, GraphicsUnit.Pixel)

‘ objeto SolidBrushDim oSBrush As New SolidBrush(Color.Olive)

Dim oGraphics As Graphics = Me.CreateGraphics()‘ dibujar texto en modo gráficooGraphics.DrawString(“Hola mundo desde GDI+”, _

oTipoLetra, oSBrush, New PointF(10, 10))

oGraphics.Dispose()

Fuente 7do

tNet

Man

ía<<

33

Page 34: dnm004

empleando un objeto derivado de Brushpara el dibujo del texto. Si en lugar deutilizar la clase SolidBrush, tomamos porejemplo HatchBrush, no sólo dibujare-mos el texto, sino que aplicaremos almismo el efecto proporcionado pordicha clase. Además, podemos pasar aDrawString un objeto RectangleF, paradefinir con más precisión el área del for-mulario en la que vamos a dibujar.Veámoslo en el fuente 8.

Con estas ligeras variaciones, el tex-to obtenido sería como el mostrado aen la ventana de su derecha.

Como acabamos de comprobar, conun poco de imaginación y las clases deGDI+, podemos conseguir efectos real-mente notables con menor esfuerzo delque requería la creación gráfica a basede llamadas al API de Windows, graciasal modelo robusto y cohesionado de cla-ses que proporciona la plataforma .NETFramework.

dotN

etM

anía

<<

34

dnm.plataforma.net<<

Imports System.Drawing.Drawing2D‘....‘....Dim oTipoLetra As New Font(“Comic Sans MS”, _

55, FontStyle.Bold, GraphicsUnit.Pixel)

Dim oHBrush As New HatchBrush(HatchStyle.NarrowVertical, _Color.Cornsilk)

Dim oGraphics As Graphics = Me.CreateGraphics()oGraphics.DrawString(“Hola mundo desde GDI+”, _

oTipoLetra, oHBrush, New RectangleF(10, 10, 250, 400))

oGraphics.Dispose()

Fuente 8

bibliografía

A complete text-printing framework using GDI+

Editorial: WroxAutor: Andreas PapathanasisFormato: PDF/ 373 KbISBN: B00007EIMKPáginas: 40Publicación: Noviembre/2002

GDI+ Programming in C# and VB.NETEditorial: a!press Autor: Nick Symmonds ISBN: 1-59059-035-X Páginas: 589 Publicación: Junio/2002

Page 35: dnm004

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.❑ Giro postal a nombre NETALIA, S.L.❑ Transferencia bancaria a nombre de NETALIA, S.L. a:

La CaixaNúmero de cuenta 2100 4315 48 2200014696

(Indique su nombre en la transferencia)

❑ Domiciliación Bancaria Indique su número de cuenta:

❑ Tarjeta de crédito❑ VISA ❑ MASTERCARD ❑ AMERICAN EXPRESS

Número de su tarjeta: Fecha de caducidad: / (Imprescindible)

Firma y sello (imprescindible)

a de de 20

Suscripción a dotNetManía

Usted autoriza a la mecaniza-ción de estos datos. El res-ponsable y destinatario deéstos es Netalia, S.L. Ustedtiene derecho a acceder a susdatos, modificarlos y cance-larlos cuando lo desee. Susdatos no serán cedidos en nin-guna de las formas posibles aterceras partes y no se utiliza-rán más que para el buen fun-cionamiento de su suscripcióna la revista dotNetMania ypara informarle de las activi-dades comerciales que realicela editorial Netalia, S.L. Si nodesea recibir informacióncomercial de esta empresamarque la casilla siguiente ❑

❑ Nº1 ❑ Nº2 ❑ Nº3

Envíe este formulario por email a la dirección [email protected], o al fax (34) 91 499 13 64Tambié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 números) 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.

Page 36: dnm004

no tienen ningún sentidosi no están acompañados de un sistema de ges-tión de datos con garantías. Así pues, se ha desa-rrollado una versión reducida de SQL Serverpara la utilización con las PDA.

Bueno, veamos todas estas funcionalidadescon detenimiento.

El primer paso es crear un nuevo proyectode ejemplo con lo que cogeremos el tipoAplicación para Smart Device bien de la opciónVisual Basic, bien de la opción C#. Dado el tipode proyecto nos da la opción de elegir el tipo demáquina a la que va destinado dicho proyecto,con lo que nos da a elegir entre dos tipos: PocketPC o Windows CE.

La diferencia es que Windows CE es la ver-sión genérica del sistema operativo de Microsoftdestinado a la movilidad. En nuestro caso vamosa elegir Pocket PC que es la versión Microsoft delas PDA’s. Por supuesto, elegiremos la opción deaplicación para Windows.

Una vez elegido el nombre nos abre un pro-yecto similar a cualquier proyecto de aplicaciónpara Windows con algunas diferencias que hayque tener en cuenta. La primera es el tamaño dela ventana que por defecto, está adaptada a untamaño de 240 x 320 que es el tamaño estándarpara Pocket PC. Por supuesto se puede redi-mensionar pero tenemos que tener en cuenta elefecto que tendrá en la máquina.

dotN

etM

anía

<<

36

.NET 2003 acerca la programación a la movilidad

Por Antonio RojoSoftware ArchitectAlhambra-Eidos

Este tipo de desarrollos<<

<<

Características generales a tener en cuenta en este tipo de máquinas

• La primera y más estricta es el tamaño de la memoria de estasmáquinas que resulta muy reducido teniendo en cuenta queMicrosoft recomienda desarrollar las aplicaciones para máquinascon 16 megas de memoria. Para colmo, esta memoria se ve redu-cida al estar compartida ya que sirve tanto para ejecución de apli-caciones,como para almacenamiento de los archivos.Así pues pode-mos intuir que nuestro principal problema va a consistir en un cam-bio de mentalidad para el ahorro de memoria.

• A esto se añade la necesidad de cambio de mentalidad en cuan-to al manejo de la memoria en estos sistemas y esto viene dadoporque Windows CE, por defecto, no finaliza la ejecución de losprogramas, simplemente solicita memoria a los programas ysomos nosotros quienes tenemos que liberar espacio o, inclu-so, descargarnos de memoria con la salvedad de que debemosmantener el estado.Por defecto, las aplicaciones en un Pocket PC no se descargan dememoria, permanecen en ejecución hasta que el sistema opera-tivo necesite memoria para otra aplicación. Entonces solicitarámemoria a la aplicación que más tiempo lleve inactiva.Por supues-to podemos negarnos y lo solicitará a otra aplicación, pero esta-ríamos sobrecargando la escasez de memoria de la máquina.

Es por esta escasez de memoria por lo que Microsoft ha desa-rrollado la versión reducida del Framework orientada,especialmente,para las funciones que desarrollan este tipo de máquinas.Así quenos vamos a encontrar con alguna que otra limitación en cuanto alos controles que podemos utilizar pero serán casi inapreciables.

Tal como reza el título, la nueva versión de Visual Studio .NET nos presenta un tipo de pro-yecto cercano a la movilidad, tan cercano que programar para una PDA resulta sumamen-te sencillo. Este tipo de proyectos está desarrollado para los dos lenguajes estrella de .NET:Visual Basic y C#. No sólo nos permite crear proyectos para PDA sino que Microsoft hadesarrollado una versión reducida del Framework que ha llamado Compact Framework quesoporta casi la totalidad de las funcionalidades del Framework normal.

Page 37: dnm004

Vamos a revisar los controles de los que vamosa disponer en esta versión reducida del Frameworky notamos la primera diferencia: los controles quenos aparecen no son los normales sino los contro-les de dispositivo pero no echaremos en falta nin-gún control importante.

Hasta aquí todo es muy similar a un proyecto nor-mal de Windows pero existen algunas diferencias más.Vamos a desarrollar una mini aplicación de prueba enla que gestionaremos una libreta telefónica dondeguardaremos el nombre y el número de teléfono.

Así diseñaríamos una ventana inicial en la que pordefecto nos aparezcan todos los teléfonos dados de

alta hasta el momento ycrearemos opciones demenú para editar, dar dealta uno nuevo, etc.

En el diseño vamos atener que incluir un menú.Veremos que al introdu-cirlo y seleccionarlo se haalargado la ventana unpoco hacia abajo para ubi-car el menú (figura 1). Estoes así porque en un PocketPC el menú se encuentraen la línea inferior de lapantalla; además debemosacostumbrarnos a la esca-sez de espacio en pantalla.No obstante, la funciona-lidad es similar a una apli-cación tradicional para

Windows. Así pues, daremos de alta las opcionesexpuestas y pasaremos a diseñar la pantalla para el altay edición de registros. Dar de alta una nueva ventanaen un proyecto Pocket PC es idéntico a cualquier apli-cación, simplemente hay que agregar un formulario deWindows.

En este caso vamos a introducir dos campos: unopara el nombre y otro para el teléfono como podemosobservar en la figura 2.

Por suerte la cantidad de datos a mostrar es peque-ña y nos sobra media ventana ya que nos vamos a encon-trar con otro problema y es la ausencia de teclado en las

dotN

etM

anía

<<

37

dnm.movilidad<<

Figura 1

Figura 2

Page 38: dnm004

PDAs. Este problema se solventa mos-trando un teclado en la parte inferior dela ventana cuando los controles de edicióncogen el foco. Este teclado ocupa un ter-cio de la ventana así pues debemos tener-lo en cuenta a la hora de diseñar nuestraspantallas dejando la parte de abajo de laventana libre o bien poniendo en esa par-te controles que no sean de edición comolos combos, checks, etc.

Es cierto que el usuario puede ocul-tar el teclado pero sin él difícilmentepodrá introducir datos.

Bueno, ya hemos diseñado nuestrasdos pantallas, ahora vamos dotarlas de fun-cionalidad que de eso se trata. En esteapartado no vamos a notar ninguna dife-rencia con las aplicaciones normales paraWindows porque dispondremos de unevento Form_Load donde cargaremosnuestro listview de la primera ventana. Heelegido un listview para que veamos queapenas existen diferencias entre elCompact Framework y el Frameworknormal.

El primer paso que debemos teneren cuenta es que para trabajar con SQLServer CE, como había comentado alprincipio, debemos tenerlo instalado ennuestro ordenador para poder utilizarsus clases.

El SQL Server CE es una herra-mienta gratuita de Microsoft y podre-mos descargarla desde su web. Sinembargo, hay que tener en cuenta quedependerá de la versión de SQL Serverque tengamos instalada.

Para el caso que nos ocupa, la insta-lación por defecto será suficiente ya queno vamos a utilizar ninguna de las carac-terísticas especiales en este artículo.

Una vez instalado dispondremos deuna nueva biblioteca de clases destina-da a la gestión de base de datos paranuestro Pocket PC. Esta biblioteca dedatos es similar a las clases de ADO des-tinadas al manejo de SQL Server conlos mismos nombres tanto para las cone-xiones como las consultas etc. con la sal-vedad de que en vez de utilizarSqlServer, utilizaremos SqlCe, así porejemplo, para la clase conexión utiliza-remos SqlCeConnection.

En primer lugar debemos registrar elnuevo espacio de nombres instalado quecorresponde al siguiente: System.Data.SqlServerCe que se encuentra ubica-do en el archivo “C:\Archivos de progra-ma\Microsoft Visual Studio .NET2003\CompactFrameworkSDK\v1.0.5000\Windows CE\System.Data. SqlServerCe.dll”

Existen algunas diferencias entreSQL Server normal y SQL Server CE.La principal es que las bases de datos deSQL Server CE corresponden a un soloarchivo que, normalmente, tiene la exten-sión “sdf”. Por supuesto que la versión

CE es más limitada que SQL Normal yentre esas limitaciones es que no vamosa disponer de procedimientos almacena-dos y otras funcionalidades avanzadas deSQL Server. Sin embargo, vamos a dis-poner de una nueva clase que esSqlCeEngine que corresponde al motorde datos ya que es la única forma que dis-pondremos para crear la base de datos ypor ello va a ser lo primero que hagamos.

Al no disponer de un administradorde bases de datos en SQL Server CE lasaplicaciones que hagamos deberán tenerun apartado que se dedique a la creaciónde la base de datos que vaya a utilizar.

Vamos a ver un poco de código enel fuente 1 para comprender mejor loque vamos crear y acceder a una base dedatos SQL Server CE.

El fuente 1 corresponde al evento

de carga del formulario principal don-de vamos a comprobar si existe la basede datos y en caso de que no exista lacrearemos.

La primera sorpresa la encontra-mos en el nombre y ubicación de la

dotN

etM

anía

<<

38

dnm.movilidad<<

Muy importante

Si tenemos instalado SQLServer 2000 Service Pack3 debemos descargarnosdos archivos uno para SQLServer CE y otro para laadaptación de SQL ServerCE al service pack 3.

Dim sDatabaseName As StringDim sConnectionString As String

sDatabaseName = “My Documents\Listin.sdf”sConnectionString = “Data Source = “ + sDatabaseName + “;”If Not File.Exists(sDatabaseName) Then

Dim se As New SqlCeEnginese.LocalConnectionString = sConnectionStringse.CreateDatabase()

End If

Fuente 1

[ ]

Windows CE, por defecto, no finaliza la ejecución de los programas, simplemente solicita memoria

a los programas y somos nosotros quienes tenemos que liberar espacio o, incluso, descargarnos de memoria

con la salvedad de que debemos mantener el estado

Page 39: dnm004

base de datos en la línea sDatabaseName = “MyDocuments\\Listin.sdf” ya que, como podemosobservar, no se ha especificado ninguna unidad en laubicación. Esto se debe a que en Windows CE no exis-ten unidades de disco, todo el almacenamiento dememoria queda ubicado en un sistema global que semanejará por carpetas. Así pues, si introducimos unatarjeta de expansión de memoria se ubicará una nue-va carpeta que la haga referencia.

Por lo demás queda todo muy parecido al sistemadistribuido de archivos disponiendo, como vemos enel fuente 1, de las carpetas convencionales de Windows.

En la línea siguiente sConnectionString = “DataSource = “ + sDatabaseName + “;” podemos obser-var la sencillez a la hora de declarar la cadena de cone-xión. Simplemente definiremos el origen de datos conel nombre y la ubicación de la base de datos.

Una vez que comprobamos que no existe la basede datos la creamos habiendo instanciado un obje-to de la clase SqlCeEngine y ejecutaremos el méto-do CreateDatabase para que la cree.

Esta opción crea la base de datos pero no su con-tenido así pues debemos crear toda la estructura de labase de datos que vayamos a utilizar.

En nuestro caso es muy sencilla ya que solamenteva a contener una tabla que vamos a llamar Listin.Podemos ver en el fuente 2 que la creación de un coman-do es similar a las clases de ADO para SQL Server.

La única diferencia entre SQL Server CE y ADOpara SQL Server corresponde al nombre de las clases.

Con esta opción creamos la tabla que vamos a nece-sitar para guardar los datos de la aplicación.

A partir de ahora ya nos introduciremos en la pro-gramación normal de la aplicación con lo que vere-mos que no existe ninguna diferencia con la progra-mación de una aplicación convencional para Windows.

Veamos, en el fuente 3, el código necesario parala carga de los datos en el treeview y podremos obser-var que no existe ninguna diferencia.

Esto nos indica que, salvo tamaño de pantalla ymemoria reducida no vamos a tener grandes diferen-cias en la programación.

En el fuente 4, vemos el código necesario para lla-mar al formulario frmEdit desde la opción de menúcorrespondiente. Como podemos comprobar resulta

dotN

etM

anía

<<

39

dnm.movilidad<<

Private Sub CargarDatos()Dim cnGR As SqlCeConnectionDim cmGR As SqlCeCommandDim drGR As SqlCeDataReaderDim nItem As Integer = lvListin.Items.CountDim sDatabaseName As StringDim sConnectionString As StringDim s As StringsDatabaseName = “My Documents\\Listin.sdf”sConnectionString = “Data Source = “ + sDatabaseName + “;”

TrycnGR = New SqlCeConnection(sConnectionString)cmGR = New SqlCeCommand(“SELECT * FROM Listin”)cnGR.Open()cmGR.Connection = cnGRdrGR = cmGR.ExecuteReader()While drGR.Read()

s = drGR(“Nombre”)lvListin.Items.Add(New ListViewItem(s))s = drGR(“Telefono”)lvListin.Items(nItem).SubItems.Add(s)nItem += 1

End WhilecnGR.Close()

Catch ex As ExceptionMessageBox.Show(ex.Message)

End Try

End Sub

Fuente 3

Dim cn As New SqlCeConnection(sConnectionString)Dim cmd As New SqlCeCommand(_“CREATE TABLE Listin (Nombre nvarchar(40) NOT NULL,_Telefono nvarchar(12) NOT NULL)”)cmd.Connection = cncn.Open()cmd.ExecuteNonQuery()cn.Close()

Fuente 2

Page 40: dnm004

exactamente igual que en una aplicación Windowsconvencional.

Y finalmente, en el código del fuente 5, podemosver cómo sería la programación del alta de un nuevoregistro en la base de datos.

Llega el turno de las pruebas y depuración de laaplicación. Una de las ventajas del entorno es que novamos a necesitar una máquina Pocket PC para laspruebas y depuración de nuestras aplicaciones ya queVisual Estudio .NET lleva incorporado un emuladorde Pocket PC con las características básicas del siste-ma operativo. Esto no quiere decir que no podamosutilizar un PDA para las pruebas. Así pues, cuandovamos a ejecutar la aplicación desde el entorno dedesarrollo nos aparece una ventana (figura 3) paraseleccionar donde se implementarán las pruebas, undispositivo o el emulador.

El sistema operativo por defecto del emulador esWindows CE 2002 no lleva incorporado las rutinas del.NET Compact Framework y, por supuesto, tampocolleva incorporado las librerías correspondientes a SQLServer CE. No obstante esto no es un problema ya queel entorno de desarrollo detecta si la máquina destino tie-ne o no incorporado dichas librerías y las instalará auto-máticamente al iniciar la aplicación. Podemos ver la ins-talación de .NET Compact Framework en la figura 4.

Una vez instaladas las rutinas correspondientes,el entorno cargará y ejecutará nuestra aplicación. La

primera vez, como es de suponer, creará la base dedatos ya que no existirá.

dotN

etM

anía

<<

40

dnm.movilidad<<

Figura 3 Figura 4

Private Sub cmdAceptar_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) _

Handles cmdAceptar.ClickDim cn As New SqlCeConnection(“Data Source = My Documents\\Listin.sdf;”)Dim cmd As New SqlCeCommand(“INSERT INTO Listin (Nombre,Telefono) _

VALUES(‘“ & txtNombre.Text & “‘,’” & _txtTelefono.Text & “‘)”)cmd.Connection = cncn.Open()cmd.ExecuteNonQuery()cn.Close()Me.Close()

End Sub

Dim oWnd As New frmEditoWnd.ShowDialog()

Fuente 5

Fuente 4

Page 41: dnm004

Pero lo importante no es sólo que dispongamosde un emulador para las pruebas sino que la aplica-ción de depuración mantiene una conexión constan-te con el entorno, de forma que podremos efectuaruna depuración paso a paso chequeando el contenidode las variables tal como lo haríamos en una aplica-ción Windows convencional.

Es más, el entorno de desarrollo va a detectar siha finalizado la ejecución de la aplicación o no y es laprueba que vamos a hacer a continuación. Para ellovamos a dar de alta algún registro para ver que fun-ciona correctamente y posteriormente vamos a pul-sar en la parte superior derecha de la pantalla de apli-cación para que se cierre. (Figura 5).

Observaremos que la depuración sigue en ejecu-ción. Esto es así porque, como ya comenté al princi-pio, las aplicaciones en un Pocket PC no se descarganpor defecto, permanecen en memoria hasta que el sis-tema solicite memoria, a no ser que nosotros progra-memos una opción para finalizar la aplicación.

Para ello simplemente vamos a utilizar la mismainstrucción que se utiliza en una aplicación conven-cional y lo vamos a asociar a la opción salir de la apli-cación. Vemos el código en el fuente 6.

Esta opción va a cerrar la única ventana activa dela aplicación por lo que, automáticamente, se cerrarála aplicación entera y finalizará el depurador.

Ya solamente nos queda puntualizar un detalle quevamos a detectar en la pantalla de edición. El proble-ma que detectamos es la ausencia del teclado en pan-talla que debería salir en los controles de edición (figu-ra 6). Esto no es un problema con el emulador ya quefunciona correctamente nuestro teclado pero sí resul-ta problemático en una PDA normal ya que no sepodrá escribir. Para colmo no disponemos en la pan-talla del icono para activarlo.

Este problema se produce porque el sistema tien-de a asignar el mayor espacio posible a las ventanas dela aplicación dada la escasez de espacio en una panta-lla PDA. Así, por defecto, si no existen opciones demenú en la aplicación, libera la franja inferior de laventana dedicada a tal fin para asignársela a la venta-na de la aplicación. Eso puede resultarnos interesan-

dotN

etM

anía

<<

41

dnm.movilidad<<

Figura 5

Private Sub mnuSalir_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) _

Handles mnuSalir.ClickMe.Close()

End Sub

Fuente 6

Page 42: dnm004

te cuando la ventana que vamos a mostrar no poseacontroles de edición pero cuando éstos estén presen-tes, no va a suponer un problema no poder activar elminiteclado de la PDA.

Para solventar el problema vamos a incluir unmenú vacío en el formulario frmEdit para que el sis-tema no asigne el espacio a la ventana sino que lo dedi-que a las opciones por defecto. De esta forma apare-cerá en la parte inferior derecha (figura7) el icono parala activación y desactivación del teclado.

Como toda aplicación, necesitará una instalaciónde la misma para su distribución en múltiples PocketPC’s. Para ello debemos tener en cuenta que, dentrodel mundo de los dispositivos inteligentes, existenvarios tipos de microprocesador para gestionarlos.Esto implica que debemos generar un ejecutable dis-tinto para cada uno de ellos para poder efectuar la ins-talación.

Esto sería una tarea difícil si no fuera porque elentorno de desarrollo lo va a efectuar automática-mente por nosotros, simplemente debemos ejecutarla opción Generar Archivo .cab del menú Generar.

Esta opción generará varios archivos de instala-ción dependiendo del tipo de microprocesador den-tro del directorio .CAB de nuestro proyecto. Podemosver la generación resultante en la figura 8.

Windows CE reconoce automáticamente los archi-vos .CAB como instalaciones de aplicaciones así que elúnico paso a seguir es copiar el archivo correspondienteal microprocesador en el Pocket PC y hacer doble clic.

Bien es cierto que aunque esta opción nos crea unainstalación con los nombres de la aplicación por defec-

to, nosotros podemos personalizar la instalación. Paraello simplemente debemos actualizar los datos del archi-vo Test_PPC.inf que se encuentra dentro del directorioOBJ correspondiente, release o debug, dependiendo deltipo de compilación que estemos utilizando.

Dentro de este archivo se encuentran los pasosque el entorno de desarrollo sigue para generar todoslos ejecutables del proyecto.

En el fuente 7 podemos ver los dos apartados másinteresantes de la configuración de las instalaciones:El apartado Version donde podemos especificar el nom-bre de la compañía y el apartado CEStrings dondeespecificaremos el nombre de la aplicación.

dotN

etM

anía

<<

42

dnm.movilidad<<

Figura 6 Figura 7

Figura 8

Page 43: dnm004

noticias.noticias.noticias.noticia

Durante la celebración de la tercera edición de la Conferenciaanual de desarrolladores de dispositivos móviles (DevCon) deMicrosoft celebrada en San Francisco (para Europa se celebraráen Ámsterdam, junto con el Tech-Ed 2004 para Europa), la com-pañía reafirmó su apoyo a los desarrolladores de Windows dan-do a conocer el nuevo software Windows Mobile 2003 SegundaEdición, basada en el núcleo de Windows CE .NET, con unainnovación en hardware sin precedentes y que mejora el desa-rrollo de aplicaciones.

“Este nuevo miembro de la familiaWindows Mobile impulsará el lanzamiento deuna nueva generación de dispositivos móvilesmás numerosa, variada y mejor adaptada a lasnecesidades de los usuarios”, ha declaradoDavid Solana, responsable de la división de dis-positivos móviles de Microsoft Ibérica.

Microsoft también presentó a la comunidadde desarrolladores una versión técnica previa deVisual Studio 2005, para mostrarles sus nuevasmejoras. Esta versión incluye Microsoft .NETCompact Framework 2.0, que permite su insta-lación en dispositivos inteligentes. Posterior-

mente, se distribuirá a segmentos concretosde la comunidad de desarrolladores para queles ayude a planificar futuros proyectos, eva-luar las herramientas de desarrollo deMicrosoft y ofrecer información a la compa-ñía durante el proceso de desarrollo.

Asimismo, en el Embedded Systems Conference, celebradoentre el 29 de marzo y el 1 de abril en San Francisco, se presen-tó y se entregó el Technology Preview Kit para Windows CE5.0, antiguamente llamado Macallan. Desde el 16 de abril pue-de descargarse en: http://msdn.microsoft.com/embedded/pro-dinfo/future/techpreview/default.aspx.

Mobile DevCon: http://www.microsoft.com/windowsmobi-le/information/events/devcon.mspx

Embedded Systems Conference: http://www.esconline.com/electronicaUSA/tech_conf/esc/

Estos dos parámetros determinarán el nombrey la ubicación de la aplicación en nuestro PocketPC.

Es muy importante tener en cuenta que este archi-vo se genera automáticamente cada vez que ejecuta-mos la opción Generar Archivo .cab por lo que podre-mos perder las modificaciones del archivo.

Esto supone un problema ya que tenemos que estarguardando los datos del archivo cada vez que deba-mos generar las instalaciones y, auque lo modifique-mos, será inmediatamente sustituido por el que gene-ra sin que tengan efecto las modificaciones.

Para evitarlo lo mejor es crear un archivo nue-vo con las modificaciones y crearnos un archivo

BuildCab.bat similar al que genera el entorno dedesarrollo para ejecutar el archivo por lotes. Estearchivo BuildCab.bat se encuentra ubicado en elmismo directorio en donde se encuentra el archi-vo .INF.

ResumenEn el presente artículo hemos dado un repaso a la

programación de aplicaciones para dispositivos móvi-les principalmente para Pocket PC’s auque es perfec-tamente aplicable a cualquier dispositivo basado enWindows CE.

Hemos visto cómo han adaptado la depuración deeste tipo de proyectos para asemejarla lo más posiblea otros tipos de proyecto dando una homogeneidad atodo el entorno de desarrollo.

También hemos repasado la utilización de SQLServer CE como almacenamiento de datos de nues-tra aplicación.

Quizás, en un próximo artículo, veamos cómo actua-lizar datos desde un ordenador a nuestro PDA y vice-versa tanto en tipo real como trabajando con descone-xión de datos y actualizando al finalizar el día.

dnm.movilidad<<

[Version]Signature=”$Windows NT$”Provider=”My Company”CESignature=”$Windows CE$”

[CEStrings]AppName=”Test”InstallDir=%CE1%\%AppName%

Fuente 7

Microsoft presenta la nueva versión de Windows MobileLa compañía anuncia la última edición de su sistema operativo para dispositivos móviles (Pocket PC y Smartphone) y la beta de Visual Studio 2005 Community.

David Solana,Responsable de la

División deDispositivos Móvilesde Microsoft Ibérica

Page 44: dnm004

dotN

etM

anía

<<

44

Petición del Certificado de Sitio Seguroal CA

1. Abra la Consola de Administración de IIS, eli-ja el site a asegurar, pulse en Propiedades, vayaa la pestaña de Seguridad de Directorios y enComunicaciones Seguras pulse en Certificadode Servidor.

2. Aparecerá el asistente para Certificados deServidor Web, pulse Siguiente y seleccioneCrear Certificado Nuevo. Pulse Siguiente.

3. Seleccione que la Petición se prepare pero se envíemás tarde.

4. De a la petición un nombre fácil de recordar yconfigure el tamaño de bits de la clave de cifra-do, por ejemplo, 1024), y pulse Siguiente.

5. Escriba el nombre de la Organización y de laUnidad Organizativa y pulse Siguiente.

6. Escriba un nombre común, que puede ser elnombre DNS del Servidor Web o, si el servi-dor está en la intranet, el nombre NetBIOSdel equipo.

7. Introduzca la información geográfica, pulseSiguiente y guarde el archivo de petición de cer-tificado con extensión .TXT

8. Pulse dos veces Siguiente y luego en Finalizar.

Nota: Abra inmediatamente el archivo de petición decertificados con el bloc de notas y copie el cifrado desolicitud de certificado.Tendrá un aspecto parecido alsiguiente:

Configuración de sitio Web seguro con Certificado de clientes

Por Pedro Gómez Alhambra-Eidos

<<

Figuras 1 y 2

Page 45: dnm004

Solicitar un certificado desde el sitio Web del CA

1. Conecte con el sitio de administración del CAdesde http://servidorCA/certsrv.

2. Marque la opción de tarea de Solicitar un certi-ficado.

3. Elija la opción de Configuración Avanzada deUsuario.

4. En la solicitud de certificado avanzada, mar-que la opción de Enviar una solicitud de certifi-cados usando un archivo cifrado de base64 CMC oPKCS #10 o una solicitud de renovación usando unarchivo cifrado de base64 PKCS #7.

5. En cifrado de Base64 Solicitud de certificado(CMC o (PKCS #10 o PKCS #7), pegue elcifrado de solicitud de certificado que antescopió. En Plantilla de Certificado elija ServidorWeb y pulse el botón Enviar. Si aparece unaventana de confirmación pulsamos Sí.

6. Nos aparece la ventana de Certificado emitidoy pulsamos en Descargar Certificado.

7. Guarde el archivo en una ubicación. La exten-sión del archivo es .CER.

Proceso de Petición pendiente e Instalación del Certificado en el Sitio Web

1. Vuelva al Administrador de IIS, elija el site aasegurar y desde las Propiedades, en la Pestañade Seguridad de Directorio, pulse Certificado deServidor.

2. Aparece el Asistente para Certificados. PulseSiguiente y marque Procesar la petición pendien-te e instalar el Certificado.

3. Escriba la ruta de acceso y el nombre del archi-vo con extensión .CER. que antes guardamos.Elija el puerto SSL (por defecto 443), lea elresumen y pulse en Finalizar.

4. Vuelva a las Propiedades del sitio que queremosasegurar y en la pestaña de Seguridad de Directorio

Figura 3

Figura 5

Figura 6

Figura 4

dotN

etM

anía

<<

45

dnm.servidores.iis<<

Page 46: dnm004

dotN

etM

anía

<<

46

dnm.servidores.iis<<

pulse en el botón Modificar debajo de Comuni-caciones Seguras.

5. Marque Requerir Canal Seguro para que el sitioWeb siempre utilice SSL y pulse Aceptar.

Prueba del sitio Web seguro1. Abra el explorador y escriba http://direcionsi-

tioseguro y aparecerá una página advirtiendoque se debe acceder a través de SSL.

2. Escribimos en la dirección URL https://direc-ciónsitioseguro y aparecerá la página que hemosasegurado.

Solicitar Certificado de UsuarioA continuación, los clientes pedirán un certifica-

do para poder conectarse a la página Web segura.Estos pasos los realizará el usuario después de haberhecho login en su equipo. Los pasos a seguir son lossiguientes:

1. Abra la página http://servidorCA/certsrv y mar-que la tarea de Solicitar un Certificado.

2. Marque Certificado de Usuario y pulsamos enEnviar.

3. Si le sale un aviso de seguridad, pulse Sí y espe-re a que se termine de generar el certificado.

4. Una vez que se ha emitido el Certificado, ins-tálelo.

5. Puede salirle una advertencia. Pulse Continuary le saldrá una pantalla diciendo que el certifi-cado está instalado.

6. En el navegador, el usuario debe comprobarque su certificado está instalado, para lo cual,desde el menú Herramientas, Opciones de Internety en la pestaña de Contenido, pulse en Certificadosy deberá salir el certificado emitido anterior-mente para el usuario.

7. El siguiente paso es exportar el certificado a unarchivo, para lo cual pulse en Exportar. Le apa-rece un asistente, pulse en Continuar y expor-te solamente la clave pública, no la privada.

8. Marque el formato de archivo de exportación,por ejemplo: "X.509 Codificado base 64 (.CER)".

9. Guarde el archivo y pulse Siguiente.10. Le aparecerá un mensaje indicando que La

Exportación se realizó con Éxito y entoncesfinalice.

11. Cierre las opciones de Internet del navegador.

Configuración del site para pedir Certificado de Usuario

1. El administrador abrirá la herramienta de Ad-ministrador de Servicios de Internet, y en la pes-taña de Seguridad de Directorio a la que accededesde las Propiedades del Site a asegurar, pulse

Figura 7

Figura 8

Figura 9

Page 47: dnm004

dnm.servidores.iis<<

en el botón Modificar que está en ComunicacionesSeguras.

2. Marque Requerir Certificado de Cliente y enHabilitar Asignación de Certificados de Cliente ypulse en Modificar. Le aparecerá la siguienteventana:

3. En este ejemplo asignarácada certificado a una cuen-ta específica, por lo que en lapestaña 1 a 1 pulse en Agre-gar.

4. Busque el archivo de certi-ficado que ha creado antesy enlácelo con la cuenta deusuario que quiera.

5. Pulse en Aceptar y repita lacontraseña.

6. Pulse en Aceptar tres vecespara terminar el proceso.

Prueba de la cuenta de Certificado1. El usuario abre su navegador e intenta conectar-

se al sitio Web http://sitioseguro y aparecerá lapágina que indica que se debe conectar por uncanal seguro SSL.

2. Escriba la URL correcta: https://sitioseguro yle aparecerá una Advertencia de Seguridad. Pulseen Aceptar y le pedirá que seleccione el certifi-cado a utilizar para que finalmente vea la pági-na segura.

Figura 10

Figura 11

Figuras 12 y 13

noticias.noticias.noticias.noticias

VMware Inc. ha anunciado la versión Workstation 4.5 de su producto de virtualización para PCsque permite a los desarrolladores y técnicos de sistemas tener un entorno de pruebas de aplicacio-nes sobre diferentes sistemas operativos en un PC pero sobre varias máquinas virtuales.

Entre las novedades se incluyen:• Se incrementa hasta 4Gb la memoria que puede usar cada máquina virtual • Soporte experimental para Longhorn, lo que signifca que podrás instalar y ejecutar las ver-

siones beta de éste.• Soporte mejorado para Guest usando kernels de las series 2.6 de Linux.• Soporte para PXE (Preboot eXecution Environment)• Instalación de dispositivos USB en las máquinas virtuales para no administradores.• Chequeo automático de actualizaciones del producto.• Soporte para nuevos sistemas operativos como Novell Netware 5.1, 6 y 6.5 y SuSe Linux 9.0.

VMWare anuncia VMWare Workstation 4.5

Page 48: dnm004
Page 49: dnm004

dotN

etM

anía

<<

49

casi diez (¡pardiez, quéviejo soy!) me hallaba en Montevideo (RepúblicaOriental del Uruguay, ¡cómo suena el nombre de esepaisito!) en casa de un muy buen amigo y organiza-mos el desarrollo de una paella en el exilio para endul-zar la tarde de otro buen amigo, Julio Rodriguez, unconocido intelectual uruguayo, de clara orientaciónmarxista en su análisis de la realidad y que, a la sazón,era (y lo sigue siendo para fortuna de todos) suegrode mi otro buen amigo en cuya casa desarrollábamosel mencionado proyecto de paella. El asunto es queen la tertulia posterior al despliegue, implantación yexplotación de la paella, sumidos ya en los vaporesetílicos de no recuerdo bien qué licor, Julio comen-zó a defender su punto de vista sobre lo que consi-deraba una época histórica en la cual el desarrollotecnológico estaba a punto de traernos un buen ejem-plo de superación del modelo capitalista de produc-ción aplicado al entorno de las tecnologías de la infor-mación. Su argumento era sencillo, en aquel momen-to (1995) vivíamos el auge de la fortaleza y la inde-pendencia de los desarrolladores de software. Paradesarrollar software, decía Julio, no se necesitan gran-des y costosos recursos que tengan que ser puestospor las empresas; una persona aislada y con una esca-sa inversión puede llevar a cabo dicha tarea, siendo,por tanto, la propietaria de sus herramientas nece-

sarias para la producción y sacando, por tanto, todoel jugo a su trabajo sin que ningún intermediario seaproveche del mismo. Desde ese punto de vista, Juliovenía a poner al desarrollo de software como unmodelo claro de la evolución del sistema capitalistaque, por sus propios automatismos y sin necesidadde práctica violenta, nos llevaba a la superación delmismo. Tenía, en ese sentido, una visión mesiánicadel rol que los desarrolladores de software podíanjugar en el proceso de evolución de la humanidad.La verdad es que yo le llevaba la contraria desde miposición mucho más escéptica tanto respecto a laposibilidad de que los desarrolladores, esa panda dedesarrapados anarquistas a la que me digno de per-tenecer, pudieran hacer revolución alguna, como aque el modelo capitalista permitiera realmente quedicho proceso se llevara a cabo. Julio, por supuesto,me daba cien -qué digo cien, mil- vueltas en todo loreferente a conocimientos históricos y de funda-mentación del análisis, pero en cambio, yo le apor-taba mi mejor conocimiento de la personalidad deesa rara especie a la que nos estábamos refiriendocomo sujeto de la historia: el desarrollador de softwa-re. La historia trajo luego la evolución del procesotecnológico, la crisis del modelo de Internet, la satu-ración de personal en las empresas, el paro, los con-tratos basura, etc. En fin que, desgraciadamente, el

Sobre el uso de la Programación Extrema (XP) para desarrollar

una paella en el exilio

Por Antonio QuirósGeneral Area ManagerAlhambra-Eidos

Hace unos cuantos años,<<

Perdone el lector que comience contándole un cuento de viejo cuentista. Lohago como ejercicio de calentamiento antes de empezar a escribir, ya que si nolo realizo así el verso no me sale con la suficiente fluidez. Es como cuando elcantaor de flamenco templa las cuerdas vocales emulando con su tiri-tiri-tiri…el sonido de una corneta, antes de comenzar con la seguiriya. En fin, que no meenrollo con el previo al cuento y paso al cuento previo al artículo.

Page 50: dnm004

<<

Principios del Manifiesto ÁgilLa Programación Extrema es una de las lla-madas metodologías ágiles, los puntos cru-ciales que definen a estas metodologías ysus diferencias con las más procedimenta-les, los tenemos resumidos en el denomi-nado Manifiesto Ágil, promovido por la aso-ciación The Agile Alliance (agilemanifes-to.org). Los puntos del manifiesto son:• Nuestra principal prioridad es satisfacer al

cliente a través de rápidas y continuasentregas de software valioso para él.

• Damos la bienvenida a los cambios derequerimientos, incluso cuando se pro-ducen de modo tardío en un proyecto.Los métodos ágiles procesan los cambiospara que los clientes aprovechen las ven-tajas competitivas que suponen.

• Entregar software libre de fallos con fre-cuencia, entre los límites de dos semanasy dos meses, con preferencia a los tiem-pos más cortos entre entregas.

• Usuarios y desarrolladores deben traba-jar juntos cada día en el proyecto.

• Construir proyectos a través de personasmotivadas. Darles el entorno y soportarsus necesidades, así como confiar en ellospara conseguir el trabajo hecho.

• El método más conveniente y eficaz paracompartir información dentro de un pro-yecto es el diálogo cara a cara.

• El software que funciona es la primeramedida del progreso.

• Los procesos ágiles promueven el desa-rrollo sostenible. Los promotores, desa-rrolladores y usuarios deberían ser capa-ces de mantener una constante paz de for-ma indefinida.

• La continua atención a la excelencia téc-nica y al buen diseño realzan la agilidad.

• Simplicidad —el arte de maximizar la can-tidad de trabajo no hecho— es esencial.

• Las mejores arquitecturas, requerimien-tos y diseños emergen desde los equiposauto organizados.

• A intervalos regulares, los equipos reflexio-nan sobre cómo conseguir más efectividad,luego afinan y ajustan su comportamiento,de acuerdo a lo reflexionado.

dotN

etM

anía

<<

50

dnm.arquitectura<<

mundo capitalista terminó fagocitandoun modelo cuya semilla no podía per-mitir en su seno. Querido Julio,¡Cuánto lamento que no llevaras razónaquella tarde!

Porqué saco esta historia a colaciónahora, cuando el título de este artículoparece llevar aparejado que terminaréhablando de la Programación Extrema.Pues lo hago, porque, desde mi puntode vista, en los fundamentos de dichomodelo de programación se encuentrala semilla de la revolución de los desa-rrolladores frente a sus explotadores tra-dicionales (empresarios, jefes de pro-yecto, analistas, clientes, etc.)1 y, portanto, la concreción teórica del mode-lo, tal como Beck y Fowler la realizan2,no pasa por ser una metodología tradi-cional diseñada por burócratas de laISO o el IEEE sino pergeñada por lospropios desarrolladores de software ensu intento de autogestionar el propioproceso que constituye su trabajo. Losque estén acostumbrados a leer densosmanuales sobre las distintas metodolo-gías usadas en el proceso de desarrollode software (Métrica, normas ISO, etc.)entenderán perfectamente lo que digo.En general, se trata de contraponermetodologías con una alta carga pro-cedimental, donde lo que importa es laritualización del proceso para dar garan-tías contractuales a las partes implica-das, frente a metodologías donde lo queimporta es la calidad del producto finalobtenido.

Una introducción a laProgramación Extrema

En la programación extrema novamos a encontrar, como en otrasmetodologías una tediosa descripciónde fases, hitos, técnicas, interfaces, for-mularios, roles, comisiones de control,etc. Sí vamos a encontrar, en cambio,una buena dosis de valores, funda-mentos, buenas prácticas recomenda-das, etc. En general, se hace hincapiéen todo aquellos que facilita en un pro-yecto la adopción de un modelo decolaboración claro y no burocratizadocon el cliente y de un modelo de equi-po que intenta reforzar la calidad delsoftware realizado. Para ello se huyeno sólo de los ya mencionados sistemasaltamente procedimentales, sino tam-bién de las técnicas de fabricación deproducto tendentes a congelar las espe-cificaciones en un momento de tiem-po para poder racionalizar el procesode desarrollo y que éste no se vea alte-rado por el cambio. Nuestro mundoestá absolutamente atropellado en loque a velocidad se refiere, los procesosde negocio son absolutamente cam-biantes y, por tanto, el cambio, ese cam-bio tan odiado muchas veces en los pro-cesos de desarrollo de software, debeser integrado en los mismos como unelemento esencial.

Esto es lo que intenta recoger laprogramación extrema con principiosy prácticas como los del diseño perma-nente, la entrega continua de pequeñosmódulos operativos aunque no tenganla funcionalidad completa, etc. En tablaaparte puede verse la relación de lo queconstituyen las doce prácticas funda-mentales en que se basa esta metodo-logía de programación.

Algunas categorías fundamenta-les en XP

Lo primero en un sistema a desa-rrollar es concretar una metáfora delmismo (historias compartidas entre la

Las pruebas son fundamentales en el sistema.

XP es una metodologíaguiada por pruebas

1 Le pido al lector que aguante aún mi verborrea y no se mosquee tan pronto, ya que terminaréexplicando estas abyectas declaraciones y pidiendo disculpas a todos por mis opiniones extremas.

2 Beck, Kent, Extreme Programming Explained: Embrace Change,Addison Wesley, 1999. Fowler,Martin, Refactoring: Improve the Desing of Existing Code,Addison Wesley, 1999.

Page 51: dnm004

parte empresarial y técnica del proyec-to y que describen como debería fun-cionar la solución a desarrollar). Lametáfora ayuda a tener una visión úni-ca de las cosas por todas las partes impli-cadas y sirve de gran ayuda en el dise-ño inicial del proyecto.

La metáfora no deja de ser la pri-mera de las denominadas historias de losusuarios. Las historias de los usuarios secorresponden en XP con los tradicio-nales requerimientos para una aplicación.Las historias deben ser claras, com-prensibles y compartibles por usuariosy programadores y sobre todo simples.Cualquier historia debe poder ser desa-rrollada en muy poco tiempo (de una atres semanas). Si es más compleja debedividirse hasta lograr este objetivo.

Con XP ser definen cuatro varia-bles en cada proyecto: coste, tiempo, cali-dad y alcance. De las cuatro una se reser-va siempre para ser definida por elequipo de desarrollo, así si en clientequiere un coste, un tiempo y un nivelde calidad, el equipo de desarrollo debereservarse la posibilidad de jugar con elalcance del proyecto. Si por el contra-rio, se definen coste, calidad y alcance,el equipo de desarrollo deberá poderdefinir el tiempo de duración del pro-yecto. El objetivo es ser realista y nopedir imposibles.

Los desarrollos deben ser dinámi-cos en cuanto al diseño y deben conce-birse para ser realizados de formamodular e iterativa, Deben hacerseentregas frecuentes de software opera-tivo aunque no completamente funcio-nal, de forma que los usuarios vayansiendo protagonistas del proceso deconstrucción y vayan obteniendo resul-tados poco a poco sin largas esperas.

Las pruebas son fundamentales en elsistema. XP es una metodología guiadapor pruebas. El desarrollo de cada módu-lo lleva aparejado el desarrollo previo oen paralelo de las pruebas unitarias paravalidar el mismo. El equipo de desarro-llo, que debe estar implicado fuerte-mente en el proyecto y que es el pro-pietario colectivo del código (sin rolesdiferenciales en cuanto a la propiedad),se debe responsabilizar de mantener elproducto libre de fallos. Cualquiermódulo incorporado debe haber pasadotodas las pruebas y tras la integración del

mismo en el sistema global, éste debe sercapaz de pasar, igualmente todas laspruebas; si no lo consigue, el desarro-llador es responsable de dejar el sistemaen su estado estable anterior.

La clave de un proyecto gestiona-do con XP es la comunicación. Comu-nicación interna entre los miembros delequipo de desarrollo, que deben asumircomo un solo hombre, la metáfora delproyecto y comunicación con el clien-te que debe implicarse totalmente en elproceso y dar respuesta puntual e inme-diata a cada requerimiento de los desa-rrolladores. En general, junto con elde la comunicación, se mencionan otrostres valores fundamentales de la pro-

gramación extrema: simplicidad, reali-mentación y coraje. Lo del coraje llamala atención; hace referencia a la capaci-dad de mejora continua del código, deforma independiente a que ya funcio-ne. Lo opuesto al viejo si funciona no lotoques, aquí habría que decir, si funcio-na, mejóralo.

Se parte, igualmente, de que losequipos pequeños son más eficaces. Enellos se da una mejor comunicación ypor tanto un mejor resultado de cali-dad. Se trata, pues, de adecuar la pla-nificación de un proyecto a su realiza-ción por equipos de estas característi-cas, responsabilizados de historias con-cretas de los usuarios

<< dotN

etM

anía

<<

51

dnm.arquitectura<<

La Programación Extrema y .Net

Organizar proyectos basados en XP es independiente de la tecnología, sinembargo, existen ya bastantes experiencias del cruce de ambos mundos.Aeste respecto pueden consultarse experiencias interesantes, por ejemplo, através de los Weblog de Benjamín Mitchel (benjamínm.net), de Robert Hurlbut(weblogs.asp.net/rhurlbut) o de Eddie Garmon (weblogs.asp.net/egarmon).

En cuanto a bibliografía, podemos consultar las siguientes obras:• Extreme Programming Adventures in C# de Ron Jeffreis publicado en

la serie Microsoft Professional.• Test-Driven development de James W. Newkirk y Alexei A.Vorontsov

publicado en la serie Microsoft Professional

Pero quizá lo más importante lo tengamos en el sistema NUnit para laconfección de pruebas en desarrollos .Net. Con NUnit podemos escribirlas pruebas que diseñamos para cada clase a la vez que diseñamos la clase,de este modo estamos acercándonos al principio XP de la importancia delas pruebas.Actualmente se encuentra en la versión 2.1, está escrito total-mente en C# y proviene de una evolución del mismo producto pero paraJava (JUnit).Puede verse en www.nunit.org.Parte de este proyecto está sus-tentado en los autores del libro Test-Driven development antes reseñado.

…el cambio, ese cambio tan odiado muchas veces en los procesos de desarrollo de software,

debe ser integrado en los mismos como un elementoesencial

Page 52: dnm004

dotN

etM

anía

<<

52

dnm.arquitectura<<

<<

Las doce buenas prácticas de la programación extrema

• Planificación. La planificación es fruto de un conti-nuo diálogo entre el cliente y el equipo de desarro-llo. Los desarrolladores estiman las cargas de trabajoy el cliente toma decisiones sobre entregas vincula-das a oportunidades de negocio.

• Versiones pequeñas. Hay que fabricar un produc-to operativo cuanto antes, aunque no esté funcional-mente completo, e ir iterando sobre él para mejo-rarlo continuamente.Esto elimina la insatisfacción queproduce en el cliente los largos proyectos sin entre-gas y minimiza el efecto del cambio permanente.

• Diseño simple. Es el viejo Principio de la Navaja deOccam. No hay que multiplicar los entes sin necesi-dad,o sea,que entre dos soluciones que hacen lo mis-mo es mejor la más sencilla. Las complejidades dediseño que intentan anticiparse a necesidades futurasno son bienvenidas en XP. Se trata de seguir el deno-minado paradigma KISS (Keep It Small and Simple).

• Metáfora. Una metáfora (historia compartida entrela parte empresarial y técnica del proyecto y que des-cribe como debería funcionar la solución a desarro-llar) es esencial en cada proyecto. La metáfora ayudaa tener una visión única de las cosas por todas las par-tes implicadas y sirve de gran ayuda en el diseño ini-cial del proyecto.

• Pruebas. La elaboración de cada clase, de cada pro-ceso, debe ser posterior, o como mínimo simultánea,a la elaboración de las pruebas diseñadas para ver silo desarrollado funciona correctamente. Una carac-terística no probada, simplemente no existe. La pro-gramación dirigida por pruebas es uno de los gran-des pilares de XP.

• Refactorización. Este principio no tiene que ver conla gestión del cambio de requerimientos, sino con uncontinuo proceso de refinamiento del código.Todaaplicación, con el fin de ganar en calidad, debe estarsujeta a un continuo proceso de reescritura del códi-go sin cambiar la funcionalidad, de forma que en cadapaso ganemos en simplicidad, calidad y eficacia.

• Programación en parejas. Siempre se trabaja enparejas.Dos programadores por cada máquina hacien-

do lo mismo. Los promotores de XP insisten en queesto no hace perder productividad y aumentar cos-tes sino todo lo contrario. En cada pareja y en cadaiteración un desarrollador debe aportar la visión tec-nológica y otro la estratégica.

• Propiedad colectiva del código. La responsabilidadsobre el proyecto es colectiva, todo el equipo del pro-yecto es propietario de todo el código del mismo.Cualquiera, por tanto, puede cambiar fragmentos decódigo desarrollados por otros miembros del equipo.Por supuesto que los cambios que se hagan deberánsuperar las pruebas diseñadas para los procesos a queafecten y deberán atender al proceso de la refactoriza-ción, es decir a simplificar y mejorar el código escrito.

• Integración continua. La integración de las piezasen el sistema debe ser permanente.Cada componentedesarrollado debe integrarse en el sistema, comomucho, en el plazo del día de trabajo. Por supuestoque el código integrado debe haber pasado las prue-bas pertinentes. Si tras integrarlo el sistema deja depasar la totalidad de las pruebas, los desarrolladoresdel código integrado deben responsabilizarse de dejar-lo nuevamente estable.

• 40 horas semanales.Hacer más de este trabajo enuna semana incide en una pérdida real de la produc-tividad.Nunca se deberán hacer horas extras más deuna semana seguida.

• Cliente in-situ: El cliente debe estar integrado entodo momento con el equipo de desarrollo y dispo-nible en el momento para cualquier aclaración que lese requerida. Si el cliente no está dispuesto a dedicaruna persona para esta labor es que no tiene suficien-te interés en el proyecto y, por tanto, podrá aceptarlas suposiciones que los programadores realizan paracompletar los procesos. Este principio parte de darmayor importancia a la transmisión oral de informa-ción que a la escrita.

• Estándares de codificación. Sin ellos no es posi-ble la propiedad colectiva del código y la refactoriza-ción eficaz. El principio de mantener la legibilidad delcódigo entre todo el equipo de programación es elque subyace a este planteamiento.

Page 53: dnm004

dotN

etM

anía

<<

53

dnm.arquitectura<<

¿Puede XP ser una metodología seria?

Yo creo que sí, pero el problema es que el cam-bio cultural que necesitaríamos hacer en lo que almodelo de colaboración entre cliente y proveedor serefiere es tan amplio que en la mayoría de las oca-siones se hace imposible organizar un proyecto XPcuando lo que tenemos es un encargo a medida deun cliente. En estos ámbitos a veces es más impor-tante supeditar el valor de la consecución de un soft-ware de gran calidad al de tener un procedimientode acción totalmente claro. Es decir que no sabríaexpresar hasta qué punto en algunos proyectos el éxi-to no se mide más por la consecución clara de hitos,aunque éstos sean ficticios, y por la paz interna delproyecto durante el desarrollo, que por la calidadtotal del producto obtenido. La planificación se cons-tituye ahí en el valor predominante y, por tanto, XPquizá no sea la mejor herramienta en dicho contex-to. Otro tipo de desarrollos sí que son claramentesusceptibles de ser organizados con XP; por supues-to, aquellos en los que la filosofía de XP haya sidoasumida por el cliente del proyecto, pero tambiénaquellos en que no haya un cliente claro para el soft-ware a desarrollar, me refiero a soluciones empa-quetadas donde la calidad del producto final es bási-ca y se sobrepone a otras cuestiones derivadas de laplanificación. Otro aspecto crucial es el de la asun-ción del cambio; cuando este principio es básico ysupone una oportunidad de negocio, XP es, sin duda,la mejor herramienta.

… y qué hay de nuestra paella

Pues, en fin, que tras hacer un diseño ágil de lamisma, en la primera interacción, nombramos BigBoss del proyecto a mi mujer y una pareja de coci-neros (ella y yo) nos encargamos de construir la pri-mera versión, teniendo en cuenta que nuestro estó-mago ya estaba listo y las pruebas, por tanto, per-fectamente diseñadas. En todo momento contamoscon la colaboración de nuestros usuarios, ávidos detener una primera versión funcionando. Incluso, alterminar dicha primera versión la sometimos a unleve proceso de refactorización, ya que una de lashistorias de los usuarios fue modificada sobre la mar-cha (se trataba de que el producto final deberíasoportar ser completado con alioli). En fin que docu-mentamos el producto ilustrando y formamos a nues-tros usuarios sobre las distintas formas de cocción,tiempos, tipos de arroces, ingredientes, caldos, etc.Por último, desplegamos el producto sobre la mesay lo sometimos a las más drásticas pruebas funcio-nales, consistentes en traspasarlo desde la paellera(mejor no cuento la historia de cómo conseguimosdicho trasto en Montevideo) a nuestros estómagos.El proyecto fue un éxito. No hubo discusiones eco-nómicas, usuarios y desarrolladores trabajamos codocon codo en todas las fases y, desde luego, el clien-te quedó tan satisfecho que reclama continuamen-te nuestros servicios desde entonces. Aún no tengoclaro al ciento por ciento si las virtudes de XP parahacer paellas son extrapolables al mundo del desa-rrollo de software.

bibliografía

Extreme Programming Explained:Embrace ChangeKent BeckEditorial: Addison-WesleyPáginas: 224ISBN: 0201616416Publicado en octubre de 1999

Refactoring: Improving the Design of Existing CodeMartin Fowler, Kent Beck, John Brant,William Opdyke,Don RobertsEditorial: Addison-WesleyPáginas: 464 ISBN: 0201485672Publicado en Junio 1999

Page 54: dnm004

dotN

etM

anía

<<

54

dnm.comunidad.net<<dnm.comunidad.net

Panorama

de Spanish MSDN, un sitio úni-co para 18 países distintos de habla hispana, nos plan-teamos un nuevo reto, buscar un recurso colaborati-vo para la comunidad de desarrolladores basado enlos siguientes aspectos:

• Ofrecer una guía de recursos continuamenteactualizada.

• Facilitar la publicación de nuevos contenidos acualquier desarrollador.

• Dar prioridad a las demandas sobre nuevos con-tenidos de los desarrolladores, incluyendo unmecanismo que permite adherirse a otros usua-rios a las demandas de contenido existentes.

• Sistema de puntos canjeables por los autores decontenido en función de la popularidad y cali-dad de los objetos publicados.

• Sistema de puntos para los oradores de losGrupos de Usuarios.

• Un sistema de federación que integra múltiplescomunidades online y offline. Los sitios fede-rados pueden incorporar un Servicio Web quepermite a los usuarios acceder al servicio websin salir de su sitio favorito.

El sistema ofrece una serie de servicios paragarantizar la calidad del contenido técnico: catego-rización del contenido, un sistema centralizado deevaluación, sistema de demanda de nuevos conte-nidos, búsqueda entre los sitios afiliados y tambiénun sistema obtención de puntos, a cambio de cola-boraciones, canjeables en la tienda virtual dePanorama Shop.

Panorama es el primer servicio que reconoce yretribuye la experiencia y los conocimientos de lacomunidad de desarrolladores. Un servicio que per-mite a cada desarrollador publicar su propio conte-nido, artículo, código o incluso presentaciones enGrupos de Usuarios, siendo calificados por sus igua-les y obtener premios por sus contribuciones.

El sistema se basa en los siguientes elementosclave:

• PuntoNETs. Se asignan en función de las cola-boraciones y la valoración de la misma por lacomunidad. Son intercambiables por premiosen panorama Shop.

• Sitios Web que ofrecen las funcionalidades delsistema. Uno de los sitios afiliados es MSDNen Español.

• Grupos de Usuarios. Disponen de un adminis-trador que actualiza las actividades del grupo yasigna los .NET.

• La Comunidad de Usuarios. Una vez dentro dePanorama, el usuario puede interactuar con elsistema de la siguiente forma:—Buscar contenido con texto libre o bien en

las categorías existentes.—Evaluación de los objetos publicados.—Demandar nuevo contenido.—Publicar nuevo contenido. Para dar de alta

nuevos contenidos en Panorama, debenpublicarse previamente en alguno de los sitiosfederados, donde serán revisados por el edi-tor del sitio.

• Objetos. Son las distintas colaboraciones de con-tenido a la comunidad. Algunos ejemplos pue-den ser—Artículos—Ejemplos de código—Eventos—Recursos externos—Presentaciones

Panorama es un proyecto basado en la utilizacióndel medio de comunicación más ágil y con más cre-cimiento actualmente: la información online. Permitela integración de actuales y futuros proyectos así comolos recursos existentes tanto online como offline.

Alfonso Rodríguez es Responsable de MSDNComunidades.

Más información en: http://www.panoramabox.com/

<<Después de la consolidación

El objetivo de Panorama es aportar a la comunidad de desarrolladores de habla hispa-na un nuevo servicio que permita transformar a los sitios con información sobre la tec-nología .NET, en el mejor recurso para los desarrolladores. Un lugar de visita obligadadonde conseguir información, formación y soporte.

Page 55: dnm004

dotN

etM

anía

<<

55

dnm.opensource.net<<

Creando la capa de acceso a datos con Data Tier Generator

que es conveniente separar la parte denuestro software que se encarga de acceder a los datos(normalmente alojados en una base de datos) del res-to del mismo. De esta forma se facilita notablemen-te el mantenimiento y las pruebas de unidad que sonconvenientes pasar al producto. Un caso muy comúnes cuando tenemos que cambiar el SGBD (SistemaGestor de Base de Datos) al que accede nuestra apli-

cación a otro diferente, por ejemplo, de Oracle a SQLServer. Al tener el código ordenado en capas, todaslas líneas de código están más localizadas y es másfácil encontrarlas y modificarlas para adaptarlas alnuevo SGBD.

Data Tier Generator (en adelante DTG) se encar-ga de crearnos de forma totalmente automática esta

capa de acceso a datos. Aunque siempre habrá que haceralgunas modificaciones para adaptar el código genera-do a nuestras necesidades concretas, sin lugar a dudases una gran ayuda para nuestro trabajo cotidiano.

El funcionamiento no es complejo. Nosotros nosencargamos de crear la base de datos. Luego ejecu-tamos DTG y este nos pide los datos básicos paraacceder a la misma, tales como servidor, nombre deusuario, etc…

Finalmente le damos al botoncito, y… voilá! Nosha creado dos carpetas: SQL Scripts y Data AccessClasses. Todo gracias a la base de datos de catálogodel sistema de SQL Server.

En la primera de ellas se habrá guardado un archi-vo de script SQL. Este script se encarga, al ejecutar-lo, de crear procedimientos almacenados en la basede datos, concretamente seis de ellos por cada unade las tablas, para realizar las operaciones más habi-tuales sobre ellas.

Los nombres de los procedimientos almacenadosson de la forma:

proc + <Nombre_tabla> + <Operacion>

Donde <Operacion> es cada una de las siguientes:

• Insert • Update • Delete • Select all • Select by RowGuidCol and/or Identity • Select by foreign key

<<Al menos, se cree

Parece ser que la separación en capas a la hora de construir aplicaciones se haconvertido casi en un estándar de facto, dejando de lado esas arquitecturasmonolíticas y tan difíciles de “meter mano” del pasado.

Fernando Nogueras

Page 56: dnm004

dnm.opensource.net<<

La segunda de las carpetas creadas,Data Access Classes, contiene tantosarchivos como tablas tenemos en la basede datos. Cada uno de estos archivostiene extensión .CS y es una clase escri-ta en C# que tiene métodos para acce-der a cada uno de los procedimientosalmacenados creados en el script SQLdel que hablabamos antes.

Estas clases van a conformar nues-tra capa básica de acceso a datos quehace de puente entre el proveedor dedatos y la lógica de negocio.

Vamos a ver todo esto aún más cla-ro en un ejemplo, por si aún queda algu-na duda sobre como funciona el pro-grama.

Imaginemos que tenemos una basede datos que contiene una tabla que sellama Pedidos. Al ejecutar DTG sobrenuestra base de datos se nos crearán

scripts para los procedimientos almace-nados: procPedidosInsert, procPedidosDelete,procPedidosSelectAll, etc… y una clase lla-mada clsPedidos con métodos que se lla-marán: Insert, Delete, SelectAll, etc…

Así, si queremos insertar un nuevopedido sólo tendremos que llamar aclsPedidos.Insert y pasarle los parámetrosrequeridos, que no son más que loscampos de la tabla Pedidos. Este méto-do ya se encarga, utilizando ADO.NET, de montar los parámetros SQLnecesarios y de llamar al procedimien-to almacenado procPedidosInsert.

Hay que señalar que las clases quegenera son abstractas y que no necesi-tamos instanciarlas para llamar a susmétodos.

Como podemos ver, este generadorde código es bastante útil y sencillo deutilizar. Nos crea una capa de acceso a

datos simple pero funcional, que luegopodemos modificar o ampliar nosotrospara hacer, por ejemplo, una capa de másalto nivel que se encargue de crear y recu-perar entidades en forma de objetos apartir de esta capa que se comunica conel proveedor de datos.

El único inconveniente que puedover en este proyecto es que los métodosde selección de registros, es decir, aque-llos que llaman a procedimientos alma-cenados con SELECT, devuelven unSQLdataReader siempre. Pero, comotodo proyecto open source, podemosbajarnos el código fuente y ampliarlopara que soporte dataSets. Tampocoestaría mal que además de SQL Serversoportara Oracle e incluso otros SGBD.

Podeis bajar la última versión y elcódigo fuente desde http://csharpdata-tier.sourceforge.net/.

noticias.noticias.noticias.noticias

A primeros del mes pasado, Microsoft publicó el proyecto Windows InstallerXML (WiX) toolset como “shared source”, bajo licencia CPL (Common PublicLicense), en Source Forge (http://sourceforge.net), el mayor sitio para el desa-rrollo y alojamiento de proyectos de código abierto del mundo.

Windows Installer XML (WiX) es un conjunto de herramientas para cons-truir paquetes de instalación de Windows desde código fuente XML.

La licencia CPL (http:// www.opensource.org/licenses/ cpl.php), curiosamente desarrollada por IBM como evolución de la IPL(IBM Public License), permite que una aplicación y su código fuente puedan ser usados y modificados libremente, siempre y cuan-do el código resultante sea distribuido bajo los mismos términos, de manera que el software pueda ser compartido entre toda lacomunidad de desarrolladores.

El proyecto puede descargarse desde: http://sourceforge. net/projects/wix/Para más información: http:// blogs.msdn. com/robmen/, el blog de Rob Mensching, desarrollador de Microsoft que

administra el proyecto.

¿Quiere ser un desarrollador de Windows Installer XML?

DotNetNuke, líder en el mercado de portales open source de plataforma Microsoft,ha lanzado recientemente la versión 2.0. DotNetNuke 2.0 ofrece un framework mástrabajado que ayuda a incremetar la eficiencia en la organización, con nuevas capa-cidades añadidas, incluyendo un modelo de presentación en dos capas (skinning),soporte para múltiples database, y extensibilidad para el run-time.

Para más información: http://www.dotnetnuke.com

Lanzamiento de la versión 2.0 DotNetNuke

Page 57: dnm004

dotN

etM

anía

<<

57

<<

Programación en XML para Microsoft .NETDino Esposito (Wintellect)

Editorial Mc-Graw-HillISBN: 84-481-3814-7Páginas: 552Publicado: Junio-2003

Probablemente lo más extenso y específico que se haya publicado sobre el tratamientode XML en .NET. Ya conocíamos a Esposito por otros trabajos de divulgación y artí-culos en el MSDN, pero creemos que para el desarrollo de soluciones en las que XMLsea crucial, ésta es una obra de referencia.

Analiza todo el modelo System.XML, los lectores, la validación de documentos, escri-tores XML, el modelo XML-DOM, XPath, XSL y XSL/T, seriación de datos (seriali-zation) y finaliza con varios capítulos sobre el tratamiento de datos, el sistema de acce-so remoto y Servicios Web.

Shared Source CLI (Essentials)David Stutz,Ted Neward y Geoff Shilling

Editorial: O’ReillyISBN: 0-596-00351-XPáginas: 378Publicado: Marzo 2003

Un libro para los buenos conocedores de .NET Framework que quieran explorar lasposibilidades que ofrece el motor accesible, llamado Rotor y las especificaciones delestándar ECMA CLI (Common Language Infrastructure).

Con unos autores de una calidad innegable, contiene un CD con el código fuente com-pleto de Rotor, videos y presentaciones de un gran interés. No obstante, el conocimientode C++ resulta imprescindible para comprender en su totalidad el código fuente.

dnm.biblioteca.net<<

dnm.biblioteca.net

Page 58: dnm004

dotN

etM

anía

<<

58

Longhorn potenciará enormemente el desarrollo para dispositivos móviles

Según comenta el conocidogurú Chris Sells (http://www.sellsbrothers.com/) elnuevo sistema operativo Longhorn que ha visto la apa-rición de una nueva versión Alpha en el evento WinHECde Seattle potenciará considerablemente el desarrollo dedispositivos móviles, siguiendo un modelo de progra-mación casi idéntico al del resto de aplicaciones. Paramostrar algunas de las capacidades del nuevo sistema, haconstruido una versión del solitario de Windows, en laque explica algunas de las características más interesan-tes de Avalon (el subsistema gráfico), paso a paso (artícu-lo disponible en http://msdn.microsoft.com/long-horn/?pull=/library/en-us/dnfoghorn/ html/fog-horn04142004.asp)

Los nuevos DVD’s (Blu-Ray video disk),estarán hechos de papel en un 51%

Sony y Toppan Printing, lasdos compañías japonesas crea-doras de este nuevo formatoque permitirá grabar hasta 25Gb., afirman que serán más

baratos y menos dañinos para el entorno. Tambiénpodrán aprovechar las técnicas de reciclado de papel.Además la destrucción de un DVD de este tipo podráhacerse mediante unas tijeras o un destructor de papel,

para preservar la seguridad de los datos. Los detalles dela producción se mostrarán en Optical Data Storage2004, conferencia que tiene lugar este mes en California.

Google funciona a base de un sistema de ficheros contecnología propietaria, y el nuevo buscador de Amazonse basa en él

Coincidiendo con la mar-cha de uno de los ingenie-ros del equipo original deUNIX a Google, Rob

Pike, Topix.NET publica un documento con algunas delas interioridades de estructura del popular buscador:100.000 servidores en lugar de servidores enormes, y unatecnología propietaria de almacenamiento y búsquedaque permiten un 1 PetaByte de almacenamiento, un sis-tema tolerante a fallos donde los haya y la implantaciónde nuevos algoritmos de búsqueda (Ver:http://blog.topix.net/archives/000016.html.) .Curiosamente, esto coincide con los excelentes resulta-dos que parece que se obtienen con el nuevo buscador deAmazon, basado en Google (ver http://www.newscien-tist.com/news/news.jsp?id=ns99994893) con su nuevoservicio www.A9.com, que permite la anotación margi-nal en sitios Web, para su personalización, dispone deuna barra de herramientas similar a la Google Toolbar, eincluso han incluido la posibilidad de buscar en el con-tenido de los libros, mediante el servicio Search Insidethe Book.

no

ticia

s.n

oti

cia

s

Dare Obasanjo, uno de los mayores expertos en XML,ha publicado un escueto pero notable documento sobrebuenas prácticas para el uso de XML en .NET (inclu-ye muchos enlaces de interés): http://www.25hoursa-day.com/weblog/ PermaLink.aspx? guid=b121bed1-1d33-4fff-90fd-8eac4978c3d7. También es merecedo-ra de una visita su completa página de artículos(http://www. 25hoursaday.com/ writings.html)

Karsten Januszewski también anticipa algunas de lascaracterísticas más importantes que tendrá el nuevoRegistro de Sistema en Longhorn: http://blogs.msdn.com/karstenj/archive/ 2004/04/13/112493.aspxTambién dispone de información adicional en susotros archivos: http://blogs.msdn.com/karstenj/archive/2004/03.aspx

Blogs del mes

Fernando Guerrero, probablemente el ponentey consultor español más popular:http://www.callsql.com/

Tomás Restrepo uno de los pocos bloggers de habla hispanaque aparece citado por los más importantes gurús.http://www.winterdom.com/

Chris Brumme, enhttp://blogs.msdn.com/cbrumme, poco colorido,mucha calidad

dnm.desvan<<

documentos en la red

Marino Posadas

Page 59: dnm004
Page 60: dnm004