Sobrecarga de operadores y conversiones personalizadas (con C#)
Transcripción
Sobrecarga de operadores y conversiones personalizadas (con C#)
Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET nº9 noviembre 2004 • Precio: 6,00 € (España) Sobrecarga de operadores y conversiones personalizadas Entrevista a Steven Godfrey Informes y trazado de gráficas 3D en ASPNET • Introducción a las pruebas de carga y stress de aplicaciones Web con Application Center Test • Optimización de memoria en aplicaciones .NET• Seguridad de Internet Information Server (y IV) Comunidad CLM.NET: El nacimiento de una comunidad .net en la tierra de don Quijote. Arquitectura Algunos tipos de arquitecturas Laboratorio Novedades en Delphi 2005 opinión Héroes con contrato eventual dnm.editorial dotNetManía Desarrolla con MSDN Dedicada a los profesionales de la plataforma .NET Año I •Número 9 • Noviembre 2004 Precio: 6€ (España) Editor Paco Marín ([email protected]) Asesor Técnico/Coordinación Marino Posadas ([email protected]) Redactores Antonio Quiros, Guillermo 'guille' Som, Jorge Serrano Pérez, José Manuel Alarcón Aguín, Luis Miguel blanco y Manuel Imaz. Colaboradores habituales Ángel Esteban, Braulio Díez, Eladio Rincón, Erich Bühler, Fernando Nogueras, Jorge Crespo Cano, José Miguel Torres, Miguel Egea, Miguel Katrib Mora (Grupo Weboo), Octavio Hernández, Pablo Abbate, Pedro Pozo, Pepe Hevia y Salvador Ramos. Además colaboran en este número David López y Peter Varhol Edición y Suscripciones .netalia c/ Robledal, 135 28529 Rivas-Vaciamadrid (Madrid) Tf. (34) 91 666 74 77 Fax (34) 91 499 13 64 Publicidad Mediadev Sophie Mancini ([email protected]) Tf. 93 426 22 57 - 670 99 74 64 Fax. 93 423 11 40 Imprime Gráficas Vallehermoso www.graficasvallehermoso.com ISSN 1698-5451 Depósito Legal M-3.075-2004 << Desde Microsoft Ibérica se ha apoyado a la comunidad de desarrolladores a través de MSDN Comunidades desde su creación hace ya seis años, bien con artículos técnicos, eventos por distintas ciudades, aportando información sobre otras comunidades de desarrolladores, revistas, libros, foros, etc. Pero esta vez es la primera que se va a hacer con un “plan preconcebido”. Desde el 5 de octubre está en marcha “Desarrolla con MSDN” un proyecto que durará un año lectivo y que guiará a quien quiera aprender .NET, a través de webcasts y/o alrededor de 100 eventos presenciales por 24 ciudades españolas, con una inversión mareante de nada menos que dos millones de euros. Se trata de hacer una aplicación para la gestión de una franquicia de tiendas de venta y alquiler de DVDs, donde todos los desarrolladores que lo deseen pueden participar con su propio código fuente, en los foros, webcasts y eventos presenciales. Asimismo habrá artículos, manuales y tutoriales gratuitos y descuentos de un 40% en libros cuya materia tenga que ver con los módulos. Le remito al artículo que publicamos el mes pasado, donde se presentaba en primicia esta iniciativa de la mano de David Carmona, responsable técnico de este invento, o a la web oficial en desarrollaconmsdn.com. En cuanto al contenido de este mes, tenemos un colaborador especial, es Peter Varhol Product Manager de Devpartner en Compuware. Os recomiendo su artículo sobre la gestión de la memoria en .NET. En cuanto al “no cotenido”, si el mes pasado dábamos entrada a una nueva sección, dnm.mvp.online y en este número toca una despedida, concretamente de dnm.opensource. Para nosotros era y es un tema de bastante interés, especialmente las pequeñas utilidades que no sólo nos servirán en nuestro trabajo, sino que también cumplen un claro objetivo pedagógico al entragar sus fuentes y poder aprender la manera de hacer ciertas cosas. A pesar de lo cual hemos decido cerrarla como una sección independiente y englobarla en la sección dnm.laboratorio que nos permitirá evaluar herramientas sin importar el tipo de licencia. Por último, y aunque con retraso, permitáme que le presente a Indexer que a partir de ahora será la mascota de dotNetManía. Es este perro tan listo y paciente del jersey rojo que tiene abajo; y también a sus compañeros de trabajo Ernesto y Eduardo (de izquierda a derecha), menos listos pero le ponen voluntad. De la mano de Jorge Crespo Cano esperamos añadir una pizca de humor a cada número (no va a ser nada fácil porque esto de .NET es muy serio ¿no?). Puede ver más información en dotnetmania.com sobre la tira y su autor. <<dotNetManía Administración Pilar Pérez ([email protected]) 3 9 dnm.sumario Héroes con contrato eventual 9-10 ¡Qué difícil es ser héroe por obra o servicio o a tiempo parcial! El mundo tecnológico ha encumbrado hasta lo inexplicable a muchos de sus protagonistas para dejarlos caer sin red en un abismo tenebroso donde sólo los más fuertes logran superar la pérdida de autoestima en la que se ven inmersos... Entrevista a Steven Godfrey 11-12 Steven Godfrey es un veterano profesional de las TI, que ha participado en proyectos de todo tipo desde sus tiempos en Digital hasta su posición actual como Secure Solutions Business Manager de Hewlett-Packard. Informes y trazado de gráficas 3D en ASPNET 14-20 No más de 10 minutos y la utilización de algunas técnicas ingeniosas pueden hacer que los gráficos de barra y tarta se vuelvan tridimensionales en ASP.NET. Sobrecarga de operadores y conversiones personalizadas (con C#) 21-29 Una de las características que tiene el lenguaje C# desde su aparición es la posibilidad de crear sobrecargas de operadores, tanto aritméticos como lógicos, en nuestros propios tipos. En este artículo veremos algunos consejos que nos serán útiles a la hora de implementar esta característica. dnm.sumario Introducción a las pruebas de carga y stress de aplicaciones Web con Application Center Test 30-33 Al desarrollar una aplicación Web suelen surgir dudas sobre su rendimiento y sobre si proporcionará todo lo que se espera de ella. Application Center Test puede ayudarnos a despejarlas siempre que planifiquemos adecuadamente nuestras pruebas. Optimización de memoria en aplicaciones .NET 34-38 Microsoft .NET Framework y el Common Language Runtime (CLR) marcan un cambio significativo en cómo los desarrolladores construyen aplicaciones para la plataforma Windows. El programador se libera de la tediosa tarea del manejo de la memoria usando características de .NET que lo gestionan automáticamente: para ello, .NET Framework ubica memoria a petición y la reclama al sistema una vez que está libre. Seguridad de Internet Information Server (y IV) 39-42 En las anteriores entregas de esta serie de artículos hemos tocado los grandes grupos temáticos relacionados con la seguridad de IIS. Todavía nos quedan por ver, sin embargo, algunos que no se pueden clasificar de forma tan clara y que vamos a tratar ahora para terminar. Algunos tipos de arquitecturas 43-45 Después de habernos detenido en nuestros dos artículos anteriores en los fundamentos del concepto de arquitectura de software (ver números de agosto y septiembre) podemos ir viendo algunos tipos de arquitectura, tratando de agrupar esos tipos en conjuntos a los que podamos asignar cierto nivel de generalización como los que muestran Mary Shaw y David Garlan en su clásico libro Software Architecture (1996). Novedades en Delphi 2005 46-50 Lo primero que salta a la vista de Delphi 2005 es su voluntad integradora, pues incluye bajo un único entorno de desarrollo la posibilidad de crear software tanto para Win32 como para .NET Framework, utilizando como lenguajes de programación Delphi o C#. dnm.mvp.online 51-53 dnm.trucos 54 dnm.comunidad.net 55 CLM.NET: el nacimiento de una comunidad .net en la tierra de don Quijote. dnm.biblioteca.net 57 ASP.NET 2.0 (Dino Esposito). Microsoft .NET Framework Class Library Reference (Microsoft). dnm.desvan 58 dnm.noticias 6 noticias.noticias.noticias.noticias.noticias.noticias << dotNetManía << dnm.noticias Desarrolla con MSDN Microsoft presenta un ambicioso programa de apoyo a la comunidad de desarrolladores de la plataforma .NET Microsoft ha presentado la iniciativa “Desarrolla con MSDN” con la que la espera formar gratuitamente en las últimas tecnologías con la plataforma .NET a todos aquellos desarrolladores que lo deseen. Este plan cuenta con una inversión de dos millones de euros y durará diez meses a contar desde el pasado mes de octubre. Durante este tiempo habrá una serie de módulos cuyo hilo conductor será el desarrollo de una aplicación para la gestión de una supuesta franquicia de tiendas de venta y alquiler de DVDs llamada MSDN Vídeo, en la que se aplicarán las últimas tecnologías. Dichos módulos y el calendario puede verse en la figura. Para la compresión de cada módulo se impartirán, a lo largo del año, alrededor de 100 eventos en 24 ciudades españolas, así como webcasts en directo para el que no pueda o quiera asistir. Los web- casts quedan grabados para poder verlos cuando quiera. Si vemos la parte teórica en los eventos, la parte práctica se debate en los foros y chats; aquí es donde las personas que lo sigan pueden ayudarse entre sí u obtener ayuda de personal técnico de Microsoft e incluso de algunos MVPs. También se podrá recibir soporte vía email. Habrá también descuentos de hasta un 40% para libros relacionados con los módulos y tutoriales, manuales de referencia y artículos técnicos gratuitos como material didáctico. Para quien lo desee existe la sección de concurso donde puede desarrollar un cliente para los servicios web ofrecidos por MSDN Vídeo en cualquiera de estas categorías: Aplicación web, Aplicación Smart Client o Aplicación Visual Studio 2005. Puede ganar un viaje al PDC del próximo año. Más información en: www.desarrollaconmsdn.com o puede leer el artículo de David Carmona, responsable técnico de este proyecto, del mes pasado en dotNetManía. Promoción Bonus Pack Visual Studio .NET Desde el 2 de noviembre de 2004 hasta el 31 de enero de 2005, por cada licencia de Visual Studio .NET* adquirida en caja o por Open Multilicencia se entregará sin coste adicional un Bonus Pack para Visual Studio .NET El Bonus Pack para Visual Studio .NET incluye: • El libro “Así es Microsoft .NET”, de David S. Platt editado por MS Press/ McGraw-Hill en español. • Cupón 20% de descuento para el curso oficial MOC 2373 “Programación con Visual Basic .NET” de cinco días a realizar en uno de los centros de formación colaboradores. • Vale canjeable por una suscripción gratuita de 6 números a dotNetManía. • Cupón de 40% de descuento en la adquisición de libros en inglés sobre .NET de MS Press. • Kit de recursos ASP.NET v2 en español incluyendo: documentación y guías, starter kits, víde- os y presentaciones, componentes gratuitos y artículos técnicos. • Cupón 15% de descuento en la adquisición de la suite “Infragistics NetAdvantage 2004 vol. 3” y 20% de descuento en servicios de consultoría. • Cupón válido para una prueba gratuita de 90 días de alojamiento web en tecnología ASP.NET. Y si además la compra ha sido a través de Open Multilicencia y a nombre de la misma empresa e incluye cinco o más licencias de cualquier versión de Visual Studio .NET* se añade un curso gratuito a medida de tres días de duración (15 horas) sobre desarrollo en plataforma .NET (el tema que más les interese o convenga: Introducción a .NET, migración de Visual Basic 6.0 a Visual Basic .NET, desarrollo Web con ASP.NET, etc). Más información en: www.microsoft.com/spanish/msdn/vstudio/se. * Versiones Professional Special Edition, Enterprise Developer o Enterprise Architect en la edición 2003. << dnm.noticias Compuware desvela su estrategia para el entorno de desarrollo de Microsoft La empresa asegura la ausencia de errores en el proceso de integración de nuevas tecnologías en infraestructuras ya existentes para entorno Microsoft Compuware ha anunciado sus planes estratégicos de desarrollo de su línea de productos DevPartner diseñada para el entorno de desarrollo basado en Microsoft. Concretamente la empresa ha desvelado que integrará a lo largo de los próximos doce meses las herramientas de su familia DevPartner con Visual Studio de Microsoft, y con el claro objetivo de dar soporte y solucionar los problemas que surgen en los procesos de migración y de desarrollo de nuevas aplicaciones que necesitan convivir con infraestructuras tecnológicas ya existentes o integrar códigos legados. Con ello, Compuware soluciona uno de los mayores problemas que tienen las empresas cuando tienen que abordar este proceso, que es asegurar una alta fiabilidad y rendimiento de las mismas. Los fallos en este proceso pueden traducirse en grandes costes adicionales, retrasos e incluso perdidas de ingresos. Con las nuevas herramientas de DevPartner, Compuware permite a las empresas que esta transición se haga de manera sencilla con productos y servicios que ayudan a los desarrolladores a emplear las mejores prácticas en el proceso de producir aplicaciones de alta calidad. Con su familia de soluciones DevPartner, Compuware proporciona análisis detallados de la calidad y rendimiento de las aplicaciones y enriquece a nivel de consejos técnicos para resolver cualquier problema que se le puedan plantear a los desarrolladores. Compuware ha recopilado información detallada de diversas fuentes, tales como Microsoft Developer Network, y ha embebido esta información dentro de las capacidades de análi- sis de Devpartner, proporcionando a los desarrolladores un experto automatizado capaz de advertirles, localizar y corregir problemas de las aplicaciones. Esta innovadora aproximación permite a los desarrolladores centrarse en un mayor conocimiento del negocio y poder desarrollar aplicaciones más lógicas para el mismo. Compuware ampliará la línea de productos DevPartner con nuevas herramientas de mayor valor para los desarrolladores y los equipos de pruebas usando tecnología de Microsoft. La empresa comercializará dos nuevos productos en los próximos meses e inmediatamente después de que Microsoft Visual Studio 2005 esté disponible. Entre las novedades de estos nuevos productos, destaca la capacidad de análisis de seguridad y vulnerabilidad de las aplicaciones que permitirá localizar rápidamente y fijar posibles vulnerabilidades potenciales de seguridad de las aplicaciones ASP.NET. Con ello las empresas podrán desarrollar, probar y poner en producción aplicaciones que sean capaces de rechazar ataques o pérdidas de información. La segunda novedad de DevPartner es la de proporcionar a los equipos de desarrollo y calidad una única forma de asegurar la calidad de las aplicaciones ante errores de código. Para ello, la nueva herramienta será capaz de emular fallos y con igual incidencia que si la aplicación estuviera ya funcionando de manera real. Con ello, los desarrolladores también tendrán capacidad de predicción y de análisis pudiendo así depurar las aplicaciones ante sus reacciones a los errores. Altova ha anunciado que añadirá soporte de XSLT 2.0, XPath 2.0, así como soporte nativo de XQuery 1.0 en las nuevas versiones 2005 de sus productos XMLSpy, MapForce, StyleVision y Authentic, cuya salida definitiva se espera para el 1 de noviembre de 2004. Entre las novedades de XMLSpy 2005 se encuentra: • Soporte de XSLT 2.0. Ofrece edición completa, transformación visual, diseño de hojas de estilo y capacidades de depuración del nuevo y potente estandar XSLT 2.0 para transformar y formatear contenido XML. • Cumplimiento de estándares avanzados. • Soporte XPath 2.0. Facilidades para construir, testar y evaluar expresiones XPath 2.0 que son usadas para localizar y procesar contenidos dentro de una jerarquía lógica de un documento XML. • Soporte de XQuery. Proporciona soporte nativo de la nueva especificación XQuery 1.0 para extraer información de documentos XML y bases de datos. Proporciona capacidades de desarrollo, edición, depuración y ejecución. • SchemaAgent. Contiene un convincente nuevo paradigma para modelado y administración de esquemas complejos y sus componentes en grupos de trabajo a través de una potente herramienta visual basada en cliente servidor. Más información en: http://www.altova.com. dnm.noticias << dotNetManía Altova anuncia soporte para los nuevos estándares XSLT 2.0, XPath 2.0 y XQuery en las versiones 2005 7 << dnm.noticias Compuware IT Governance en España Compuware, tras adquirir ChangePoint en mayo pasado, introduce en España Compuware IT Governance Compuware ha comenzado a comercializar en nuestro país la solución Compuware IT Governance de ChangePoint. Esta solución, a grandes rasgos, capacita a las empresas para poder racionalizar sus inversiones en TI y conocer el impacto real de las mismas en la organización, con lo que permite controlar los costes y gestionar con rigor la distribución de los esfuerzos y presupuestos de los departamentos de TI. Cabe destacar que Compuware IT Governance es la única que está disponible en castellano y es multidivisa. Va dirigida tanto a Pymes como a grandes empresas. La preocupación por los responsables de tecnologías de la información por elegir los modelos necesarios para reducir los riesgos y aumentar la productividad es una constante casi desde los inicios de esta industria. Según Ayman Gabarin, vicepresidente de ChangePoint para Europa, “los CIO´s necesitan ser capaces de medir claramente y demostrar el valor que aportan a su empresa. Con esta nueva solución podemos ofrecerles una visión y una comprensión incomparables de su personal, proyectos, recursos y sistemas”. A grandes rasgos, esta solución permite a las organizaciones de TI: • Ajustarse a las prioridades de negocio aplicando una disciplina en la gestión de activos a todas las inversiones en TI, incluidos proyectos, aplicaciones e infraestructura. • Automatizar los principales procesos de negocio y aplicar métodos destinados a reducir costes, al tiempo que se aumenta la eficiencia y la calidad de los trabajos informáticos. • Mejorar y acelerar la toma de decisiones en tiempo real y con mayor visibilidad sobre el rendimiento operacional. • Alinear las actividades de los empleados con los objetivos de la empresa para mejorar el rendimiento de la organización. • Mejorar la eficiencia de los recursos, incluyendo un análisis de los perfiles de los usuarios, de la demanda y la capacidad, así como de la gestión de la planificación y esfuerzo. • Reducir tareas administrativas, eliminando los errores redundantes en la gestión manual de procesos. • Incrementar la satisfacción de los clientes al obtener información valiosa de estos y retroalimentarla online. • Asegurar la correcta implantación de los procesos y la implantación de software por medio de informes y seguimiento diario de los usuarios. << dotNetManía Microsoft pone en marcha el University Tour para 2004-2005 8 Desde el año 2002, Microsoft Ibérica viene celebrando lo que se ha dado en llamar University Tour, consistente en una serie de eventos a lo largo del año académico a través de algunas de las universidades españolas. Dichos eventos tienen una doble misión: por un lado, la de adquirir conocimientos y experiencia práctica en .NET Framework, desarrollo Web y aplicaciones de movilidad; y por otro, la de dar a conocer y promover los programas académicos de Microsoft. El University Tour comenzó en octubre de 2004 y por el momento hay confirmadas 27 universidades hasta abril de 2005. La lista de sesiones propuesta es: • Introducción a .NET Framework. • XML y servicios Web. • Desarrollo .NET para dispositivos móviles. • Desarrollo Web con ASP .NET. • Bases de Datos con SQL Server 2005. Si desea más información sobre las universidades que se vistarán o ver las transparencias y ejercicios que se propondrán, puede consultar en: http://www.microsoft.com/ spanish/msdn/estudiantes/eventos/universitytour.asp. NOTICIAS BREVES Solución a la vulnerabilidad descubierta de ASP.NET Recientemente Microsoft ha informado sobre una vulnerabilidad de la seguridad que afecta a todas las versiones de ASP.NET -pero no de ASP- bajo Microsoft Windows 2000, Windows 2000 Server, Windows XP Professional y Windows Server 2003, por la cual un intruso podría acceder a páginas protegidas con contraseña simplemente alterando la URL debido a que la rutina de creación de nombres canónicos no la analiza correctamente. Se recomienda ponerle remedio cuanto antes y para ello puede leerse el artículo “Lo que debería saber sobre una vulnerabilidad registrada en Microsoft ASP.NET” en http://www.microsoft.com/spain/seguridad/content/incident/aspnet.mspx o el artículo de la KB 887459 “Comprobar mediante programación la existencia de problemas de creación de nombres canónicos con ASP.NET” en http://support.microsoft.com/?kbid=887459. Existe también un módulo HTTP para instalar que está documentado en la KB 887289 “El módulo HTTP comprueba la existencia de problemas de creación de nombres canónicos con ASP.NET” en http://support.microsoft.com/?kbid=887289. Si lo desea, también puede encontrar información referente a esto en otros sitios de terceros como en las newsletters de Wintellect en http://wintellect.com/ resources/newsletters. C# también tendrá “editar y continuar” C# tendrá “editar y continuar” en Visual Studio 2005, tal y como ya se anunció para el nuevo Visual Basic .NET. Una de las cosas más demandadas, primero por los programadores de Visual Basic, que lo echaban en falta en la nueva versión (es algo que ya tenía Visual Basic 6 y que no tuvo Visual Basic .NET), y ahora también por los desarrolladores de C#. La característica “editar y continuar” sirve para poder modificar nuestro código mientras estamos en modo de depuración y continuar con la ejecución. Ver en: msdn.microsoft.com/library/en-us/ dnvs05/html/edit_continue.asp dnm.noticias Por Antonio Quirós General Area Manager Alhambra-Eidos Héroes con contrato eventual ¡Qué difícil es ser héroe por obra o servicio o a tiempo parcial! El mundo tecnológico ha encumbrado hasta lo inexplicable a muchos de sus protagonistas para dejarlos caer sin red en un abismo tenebroso donde sólo los más fuertes logran superar la pérdida de autoestima en la que se ven inmersos. del mito tecnológico durante los años noventa. Nuestra sociedad, al igual que la griega o la romana, desarrolló un velo de creencias y valores adecuado para engañar a las personas y curarlas de su vacío esencial. En esa época fue el mito tecnológico y, al igual que los argonautas o los que tomaron la sagrada Ilion, los desarrolladores de entonces se convirtieron en héroes capaces de destilar ideas geniales que les hacían ricos casi en plena adolescencia. Fundaban empresas en los garajes de sus casas y las vendían por decenas de millones de dólares a los pocos meses. Quien no se hacía rico antes de los veinticinco era un desecho social, alguien que profesionalmente no valía nada. Pero al mithos siempre le sustituye el logos. La razón termina imperando y todos aquellos héroes terminaron cayendo en la red del sentido común. Los héroes del pasado quedaron como ejemplos poco fáciles de seguir para los que en el presente pretendían imitarlos. El nuevo siglo trajo el crepúsculo de los dioses del silicio. El mercado se hundió. Todo se atropellaba y la máquina que daba trabajo y dinero se paró en seco de forma que los recién titulados se amontonaban chocando unos con otros antes las puertas cerradas de las empresas. Con el tiempo se comenzaron a oír los chirridos de los oxidados goznes y algunas puertas mostraron sus tímidas rendijas. • Tú puedes pasar pero con un contrato a tiempo parcial y cuatro duros de salario -es lo que hay, decía el empleador de turno, si lo quieres bien y si no ya sabes-. • Tengo un contrato por obra o servicio para tres meses ¿te interesa? -ofrecían los arruinados ejecu- tivos de las empresas subcontratadas por las subcontratas de las multinacionales que a la vez tenían una contratación con la administración pública. Los desarrolladores de software fueron los héroes del mito tecnológico durante los años noventa Mientras tanto los chavales miraban al pasado mítico, a sus antiguos héroes, y se maldecían mil y mil veces por haber nacido unos años más tarde o por no haber sabido llegar en tiempo y forma al periodo de bonanza. Saltando de contrato eventual en contrato eventual, sorteando proyectos por obra o servicio; eternos becarios condenados a no poder hacer ni casa ni familia, con la autoestima por los suelos y el bolsillo vacío, pasando diez entrevistas a la semana para terminar por no encontrar nada o nada mejor de lo que se tenía previamente. El modelo laboral americano se impone así por la puerta falsa en nuestro mundo. Aunque la ordenación laboral europea se tilde a sí misma de proteccionista para el trabajador, la verdad es que luego la realidad de un mercado debilitado lleva las cosas a situaciones distintas a las previstas en el modelo. Nos echamos las manos a la cabeza cuando los empresarios piden la flexibilización del despido, pero hay sectores donde dicha flexibilización es un hecho traído de facto por la situación del mercado. <<dotNetManía << Los desarrolladores de software fueron los héroes 9 << dnm.opinion Como responsable de un área empresarial donde se desarrolla software y desde la que me veo obligado a seleccionar personal, tengo que participar en este juego cada día. Y no se crean que me gusta. Quizá alguna gente de la que trabaja conmigo pueda pensarlo, pero la realidad es que no es así. No lo era tampoco cuanto me veía obligado a sustituir continuamente a los profesionales que se me marchaban de la empresa ganando el doble de lo que nosotros les pagábamos cuando tenían sólo dos o tres meses de experiencia laboral desde que salieron de la facultad. Ni pasados míticos, ni presentes lamentables, como siempre un razonable término medio suele ser más gratificante para todo el mundo. <<dotNetManía La obra o servicio y el divorcio caminan paralelos en nuestra sociedad, ya nada es para siempre, ni la pareja, ni el puesto de trabajo 10 Los clientes contratan poco y los costes se ajustan cada vez más por lo que las empresas tienen que ser rigurosamente conservadoras respecto a los niveles salariales. No hablo ya de la mayor madurez de las compañías en el entorno legal de la contratación: Acuerdos de Nivel de Servicio leoninos, exigencias de cumplimiento más que rigurosas, etc. Únase a esto que la inestabilidad del mercado es todavía patente lo que hace que todo el mundo se cuide de ofrecer amores para toda la vida. La obra o servicio y el divorcio caminan paralelos en nuestra sociedad, ya nada es para siempre, ni la pareja, ni el puesto de trabajo. Sólo la hipoteca es para siempre, esa hipoteca que, además, sólo nos dan sin tenemos un trabajo fijo. Además, el asunto termina siendo una cuestión de políticas más o menos acertadas o de gestores con más o menos rigor financiero. Como responden muchos futbolistas cuando les preguntan porqué la defensa fue un coladero o los brillantes delanteros no rascaron bola, habrá que decir aquello de “El fútbol es así”. Qué cómodo sería acusar de explotadores a los empresarios que sólo quieren ganar más y más dinero y arruinar a los pobrecitos trabajadores o, por el contrario, tachar de vagos y maleantes a los empleados que no dan ni palo al agua y arruinan a las empresas. Un modelo de mercado poco maduro aún, falto de equilibrio y de experiencia histórica, un marco de relaciones económicas alucinado con el modelo de la nueva economía que se pensaba transformador de la realidad social a unos niveles inusitados, en fin, un utopismo tecnológico generalizado que sólo ha traído desequilibrio. La madurez vendrá ahora, como siempre, tras la superación de la crisis. Yo soy optimista moderado. Pienso que de lo negativo siempre se extraen experiencias positivas y que se aprende más de lo difícil que de lo fácil. Entre todos, empresas y trabajadores, tenemos que reflexionar sobre lo ocurrido y arrimar el hombro para que la circunstancia no vuelva a darse, o al menos que no vuelva a darse con la misma crudeza. En fin, no hay que deprimirse, al fin y al cabo cuando Agamenón contrató a Ulises sólo le estaba ofreciendo un contrato por el claro servicio de meter su caballo en Troya y finiquitar a los habitantes de la patria de Príamo. Terminado el proyecto, le dio los preceptivos ocho días de despido y lo lanzó a la mar contra sirenas, cíclopes, vientos traidores y demás peligros sin parangón con aquellos que hoy tenemos que sortear. Ulises tardó en volver a encontrar trabajo y éste fue vencer a los pretendientes de su señora que tejía un velo eterno para matizar su aburrimiento. Y ahí los tenemos a todos, contratantes y contratados han quedado en la historia. Quién puede decirnos que nosotros, que practicamos el noble arte de ofrecer y aceptar o declinar la realización de obras algo menos míticas que las de Homero, no quedaremos también como ejemplo y modelo para generaciones venideras. Quizá algún rapsoda ciego esté ya escribiendo en Word las primeras palabras de nuestra epopeya: “Canta, ¡Oh Musa! la cólera de aquel analista que tras sacar adelante varias decenas de proyectos fue despedido de su empresa y erró durante años de contrato de obra en contrato de obra buscando su esperada Itaca”. Por Marino Posadas MVP Visual Developer C# Alhambra-Eidos www.elavefenix.net Entrevista a Steven Godfrey Steven Godfrey es un veterano profesional de las TI, que ha participado en proyectos de todo tipo desde sus tiempos en Digital hasta su posición actual como Secure Solutions Business Manager de Hewlett-Packard.Tuvimos ocasión de abordarlo en el pasado Tech-Ed para que nos comentara el estado actual de las soluciones de seguridad corporativa que aporta la solución HP Protect Tools, y que -de paso- nos comentara sus opiniones acerca de la seguridad en nuestros días. esta entrevista a dotNetManía. Sabemos que tu tiempo es escasísimo. Al objeto de centrar la charla de cara a nuestros lectores, ¿puedes concretarnos tu actividad actual dentro de Hewllett-Packard? Es un placer. Actualmente, soy el encargado de seguridad en la línea de negocio de servidores HP en el Reino Unido. Pero es un momento coyuntural, ya que Microsoft ha decidido que los productos que nosotros tenemos en Inglaterra se conviertan en productos a nivel mundial asociados con la seguridad. Creo que hemos abierto puertas para Microsoft que les permite estar en sitios donde ellos no estaban con anterioridad. La historia, en realidad, comenzó hace 7 años cuando el Ministro de Defensa británico, visitó Digital y nos preguntó si podríamos poner los mecanismos de seguridad nuestros dentro de Windows NT 3.51. En la actualidad tenemos cerca de medio millón de usuarios en el Reino Unido. En realidad tenemos un conjunto de cinco productos relacionados con la seguridad. La marca comercial es HP Protect Tools, y cubrimos desde la seguridad añadida en Windows tradicional o Windows Mobile, hasta la administración de contraseñas y otros temas afines. Por darte un ejemplo, con la mayoría de los sistemas, tú puedes tener un puerto USB activado o desactivado, pero con nuestro Gestor de Dispositivos (Device Manager), conseguimos que una salida de este tipo pueda estar disponible para ciertas labores solamente, como por ejemplo, conectarlo a una impresora o un ratón, pero impidiendo que se active para un dispositivo de almacenamiento masivo. Nosotros pensamos que en realidad, la seguridad consiste en añadir un tipo de valor al software existente. La segunda pregunta que quería hacerte es acerca de lo que consideras los más importantes “agujeros” de seguridad en los sistemas informáticos actuales, y en concreto, respecto al adware y el spyware. <<dotNetManía << Antes de nada, gracias por conceder 11 <<dotNetManía << dnm.directo.entrevistas 12 Sin duda, el correo electrónico es el más importante. Es el gran tema pendiente de resolución. Pero estos que citas son igualmente una amenaza. De hecho en nuestra propia organización, tenemos un sistema que nos mantiene al día de las últimas novedades respecto al “malware” de forma automática. Parece que siempre te refieres a la informática corporativa. ¿Existe alguna solución de las que mencionas pensada para PC's individuales? No, no tenemos ninguna. Son todo aplicaciones corporativas. Hablando un poco del futuro, hace un par de meses Rafal Luckawiecki comentaba acerca de las posibilidades de la criptografía cuántica en la seguridad. ¿Crees que esa es la línea a seguir? Lo comento, porque una empresa de Boston ya ha empezado a utilizarla en la práctica en conexiones con M.I.T… No conozco la tecnología, y es difícil de decir. Pero el problema, es que, una cosa es que las cosas estén listas a nivel experimental, y otro muy distinto que estén disponibles para el usuario de a pie. Y creo que son soluciones que podrían llevar probablemente 7 ó 10 años hasta que todo el mundo las use. Por eso, nosotros nos centramos principalmente en el día a día, en potenciar aplicaciones que se encuentran en amplia difusión en este momento. En otras palabras, pensamos que, con las aplicaciones actuales, pueden todavía realizarse muchas cosas que son potencialmente peligrosas o inseguras, o no acordes con ciertas políticas empresariales. Nuestras soluciones atacan ese frente, para garantizar una informática más controlada y fiable, y esto puede incluso llegar a incluir soluciones que te permitan encriptar tu disco duro completo. Existen iniciativas de potenciación de la seguridad, como Trustworthy computing, a la que recientemente se incorporó Microsoft. ¿Quiénes pertenecen a la iniciativa? El nombre actual ha cambiado a Trusted Computing Group, (https:// www.trustedcomputinggroup.org), y aparte de Microsoft y HP, están Intel, IBM, Oracle y otras compañías que desarrollan sistemas de seguridad para los PC. tú haces algo tan seguro que no sea utilizable, el usuario siempre hará algo para saltarse esta barrera. Así que, lo que hemos hecho, es abordar el problema con dos posiciones distintas: cerrar la puerta completamente, bloquearla, que es una solución que la mayor parte de la gente no va a aceptar por las consecuencias que implica, o bien mantener una puerta cerrada, pero no bloqueada, de forma que produzca los efectos disuasorios que deseamos. Esto suele ser lo más aceptable. Soy consciente que una de las respuestas a esto que voy a comentar es “utiliza Protect Tools”, pero, hablando en general, ¿cuál sería tu decálogo de seguridad de cara a la empresa media? (risas) Claro, por supuesto, pero no hablando en general, creo que deberían cuidarse los sistemas, tanto desde el punto de vista interno como externo. Por ejemplo, una persona que no pertenezca a tu organización, ya no debería tener acceso al sistema (esta es una de las grandes debilidades). Y a esto habría que añadir el control de la información que pueda salir de la empresa vía CD's o dispositivos portátiles de almacenamiento, y por supuesto el control del correo. Lo que plantea otro Tenemos un conjunto de cinco productos relacionados con la seguridad. La marca comercial es HP Protect Tools, y cubrimos desde la seguridad añadida en Windows tradicional o Windows Mobile, hasta la administración de contraseñas y otros temas afines Un inconveniente que muchos usuarios aprecian desde el punto de vista del uso de software de seguridad (especialmente los antivirus), es que enlentecen la máquina de tal forma, que a veces hacen casi inviable su utilización, y cuando menos, consiguen que un hardware potente pierda mucho de su rendimiento… El límite entre seguridad y usabilidad es siempre el mayor de los retos. Si curioso problema: si la gente no sabe realmente que ha sido atacada, piensa que no lo ha sido. No debemos asumir “a priori” que la seguridad está bien establecida hasta que no sepamos con total fiabilidad que -de veras- lo está. Bien, Steven, pues muchas gracias por tu tiempo y por tus consejos, que ahí quedan para todos los lectores de la revista. Gracias a vosotros, por supuesto. dnm.directo.eventos << dnm.directo.eventos Del 28 al 30 de septiembre se llevó a cabo en Frankfurt, Alemania, la Décima Conferencia Europea de Desarrolladores Borland, evento al que pude asistir en representación de Danysoft, socio principal de Borland para España y Portugal. Durante esos tres días pudimos conocer de primera mano las novedades que sacará la compañía al mercado en los próximos meses, ver en funcionamiento versiones preliminares de dichos productos y oír decenas de conferencias muy interesantes, impartidas por personalidades mundialmente conocidas como Lino Tadros y Ray Konopka (USA), Marco Cantú (Italia), Bob Swart (Holanda), Brian Long (Reino Unido) o mi compatriota Hadi Hariri, uno de los principales cerebros detrás de librerías tan familiares a los desarrolladores Delphi como IntraWeb e Indy. La presentación oficial La inauguración oficial de la Conferencia corrió a cargo del presidente de Borland, Dale Fuller, y del carismático director de relaciones con los desarrolladores, David Intersimone (conocido mundialmente como David I.). En su discurso de bienvenida, Dale Fuller recalcó la salud y solidez financiera de la empresa, que lleva ya 18 trimestres consecutivos obteniendo beneficios, y cómo Borland continuará dedicando todos sus esfuerzos a ofrecer cada vez mejores productos a desarrolladores, analistas y gestores de proyectos. A continuación, disertó sobre la nueva filosofía que está comenzando a promover la empresa y que responde a las siglas SDO (Software Delivery Optimization, u Optimización de la Entrega del Software). Se trata de una extensión lógica y natural, dijo Fuller, de la estrategia que viene desarrollando Borland alrededor de ALM (Application Lifetime Management, o Gestión del Ciclo de Vida de las Aplicaciones), que tiene como objetivo fundamental hacer más predecible la entrega en tiempo y forma del software (algo en lo que no se han logrado grandes progresos a pesar de todos los avances en áreas como el diseño orientado a objetos o los propios lenguajes de programación), haciendo más fácil a los gestores de empresas el estado real de los proyectos y evaluar los costes asociados a cambios en los requisitos, en los equipos de desarrollo y otros factores. A ese respecto, David I. anunció que se está trabajando en un proyecto cuyo nombre en código es Themis, que integrará al resto de las herramientas de gestión de ciclo de vida (Caliber RM, Together, StarTeam) la más reciente adquisición de la empresa, Estimate Pro, producto para la planificación de proyectos y la simulación de escenarios “what-if”. Otros productos de más largo alcance, ahora mismo conocidos como Hyperion y Prometheus, integrarán a la suite aún más herramientas de alto nivel actualmente en desarrollo. La presentación técnica Para la presentación técnica, que se realizó el miércoles 29, David I. hizo subir al escenario a los directores EMEA de las diferentes líneas de producto, que contaron las principales novedades relacionadas con los productos a su cargo. Corne Human, responsable de la línea de productos para el análisis de requisitos, disertó sobre las nuevas posibilidades que abre a los jefes de proyecto Estimate Pro, principalmente como herramienta de negociación. También presentó las novedades fundamentales que incorporará la nueva versión de Caliber RM, de próxima aparición. En lo referente al área de análisis y diseño orientado a objetos, Paul Kuzan comentó las novedades presentes en la nueva versión de los productos Together, relacionadas con la implementación de patrones (GoF y otros) y la incorporación de recursos para el análisis de calidad del código fuente, como las métricas y las auditorías. También anunció nuevas versiones de Together para Visual Studio .NET y para el entorno Eclipse. Y entonces llegó el momento de presentar los productos relacionados con el desarrollo y pruebas. Inicialmente, Jon Harrison, responsable de JBuilder, presentó los nuevos JBuilder 2005 y OptimizeIt Server Trace. Entre las novedades más importantes de JBuilder 2005 están el soporte para el próximo J2SE 1.5 (primer entorno en el mundo que lo ofrece) y el soporte para el desarrollo visual de páginas web utilizando Java Server Faces, en lo que también es pionero. El plato fuerte estuvo a cargo de Jason Vokes, que desveló las principales características que incluirá la próxima versión de Delphi, conocida hasta ahora bajo el nombre en código Diamondback. El producto fue calurosamente recibido por los desarrolladores de Delphi, que constituían clara mayoría entre los asistentes al evento. Jason tuvo aún que hacer otra presentación más detallada al día siguiente, y la mayoría de los ponentes sobre temas relacionados con Delphi adaptaron sus presentaciones para utilizar la versión beta distribuida entre los asistentes. Las novedades fundamentales que incorporará Delphi 2005 se describen en un artículo independiente en este número de la revista. Jason Vokes y Jon Harrison En las próximas semanas tendremos más noticias relacionadas con esta nueva versión. Manténgase al tanto la página web, www.danysoft.com al tf 902123146 o al email [email protected] dnm.eventos << dotNetManía eventos.eventos.eventos.eventos.eventos Conferencia Europea de Desarrolladores Borland 2004 13 Por Erich Bühler .NET Framework y VB.NET MVP www.VBLibros.com Informes y trazado de gráficas 3D en ASP.NET (I) No más de 10 minutos y la utilización de algunas técnicas ingeniosas pueden hacer que los gráficos de barra y tarta se vuelvan tridimensionales en ASP.NET. << Más allá del mundo 2D A nivel de aplicaciones informáticas, el mundo en tres dimensiones se ve muchas veces restringido a videojuegos y a algunas aplicaciones sofisticadas ciertamente lejanas a un desarrollador que busque esto en un gráfico de tarta o barras. Las bibliotecas para trazado en 3 dimensiones son en general confusas, complejas de entender y por si esto fuera poco se necesita una gran inversión de tiempo y esfuerzo para llegar a construir algo de relativa utilidad. Es por ello que no es sencillo integrar las funcionalidades en el software sin tener por delante un verdadero quebradero de cabeza. En esta primera entrega ofreceré algunas técnicas sencillas para brindar excelentes efectos de volumen y espesor empleando GDI+, así como también la forma de hacer uso de esta tecnología en ASP.NET. Mucho de lo que aprenderemos nos será de utilidad en la segunda parte donde conoceremos ASP.NET Reports Starter Kit, un conjunto de tecnologías gratuitas para realizar gráficos e informes en la Web. Vamos entonces a comenzar viendo un resumen de las características de GDI+ para luego abordar la integración con la Web y especialmente con ASP.NET. se emplea la edición compacta de la infraestructura .NET (.NET Compact Framework), la que brinda en realidad un sub-conjunto de la totalidad de las funcionalidades. La tabla 1 nos muestra los espacios de nombre donde se localizan las clases de GDI+. Espacio de nombres System.Drawing Hace posible realizar trazados simples, aunque no por ello deja de resolver gran parte de los casos. System.Drawing.Design Ofrece clases para personalizar el cuadro de herramientas y el editor de clases. Se utiliza para extender la interfaz gráfica en tiempo de diseño. System.Drawing.Drawing2D Se utiliza para dibujar trazados avanzados en dos dimensiones y vectoriales. System.Drawing.Imaging Permite una gestión muy avanzada de imágenes y meta-archivos. System.Drawing.Printing Hace posible controlar todo lo relacionado con la impresión.tiempo de diseño. System.Drawing.Text Si necesita crear, modificar, o utilizar fuentes entonces las clases de este espacio son las que deberá emplear. <<dotNetManía Breve introducción a GDI+ 14 GDI+ se especializa en el trazado de dibujos 2D aunque se pueden lograr excelentes resultados 3D. El ser parte intrínseca de la infraestructura nos asegura que las versiones .NET de otros dispositivos (PocketPC, teléfonos inteligentes, etc.) contarán también con esta biblioteca. Sin embargo en dispositivos móviles de mano Descripción Tabla1. Resumen de espacios en GDI+ << dnm.asp.net //Obtiene el contexto gráfico. Graphics Superficie = this.CreateGraphics(); Cuando se trabaja en formularios de Windows normalmente el código que dibuja escribe dentro del evento Paint, ya que ante cualquier necesidad de repintado se re-ejecutará el mismo automáticamente (ver fuente 1). El objeto de contexto gráfico tiene varios métodos que hacen posible de forma sencilla trazar diversas formas. La tabla 2 nos muestra alguna de las alternativas. Método DrawArc Utilidad Plasma una línea en forma de arco. DrawBezier, Dibuja líneas curvas o de Bezier (esto DrawBeziers, último lo veremos más adelante). DrawCurve private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { //Obtiene el contexto gráfico, el argumento E contiene //la referencia al objeto de contexto gráfico. Graphics Superficie = e.Graphics; //Crea el lápiz a utilizar. Pen Lápiz = new Pen(Color.Red,10); //Rectángulo que comienza en la posición 30,30 //y tendrá un ancho y alto de 100, 100 píxeles Superficie.DrawRectangle(Lápiz,30,30,100,100); } Fuente 1 para la mayor parte de los miembros de trazado (FillPie, FillPolygon, etc.), con el fin que sea sencillo rellenar una figura. A su vez se ofrecen varias estructuras independientes que pueden ser utilizadas en los métodos de dibujo o relleno para, por ejemplo, suministrar un conjunto de coordenadas, el tipo de trama para un relleno, un tipo de brocha o lápiz, etc. La tabla 3 nos muestra algunas de las estructuras comúnmente utilizadas. Método Utilidad SolidBrush Define un relleno sólido. HatchBrush Define un relleno con textura. Bitmap Representa un mapa de bits. LinearGradientBrush Relleno multicolor. Point Representa un punto en las coordenadas del eje horizontal y vertical. DrawEllipse Traza un círculo o elipse. Size Define un ancho y alto. DrawImage Plasma una imagen. Rectangle Representa un área rectangular. DrawLine Dibuja una línea. DrawPath Almacena la definición de líneas, curvas y rellenos. DrawPie Dibuja una sección de un gráfico de tarta. DrawPolygon Traza un polígono. DrawRectangle Dibuja un rectángulo. DrawString Plasma una cadena de caracteres. Tabla 2. Resumen de métodos de dibujo También se cuenta con una contrapartida para cada método de dibujo llamado Fill<tipo de dibujo> Tabla 3. Resumen de estructuras adicionales El ejemplo del fuente 2 trata de consolidar lo que hemos visto hasta el momento, en él se hace uso de una imagen para rellenar una elipse y una textura en degradé para rellenar un cuadrado. Al dibujar un trazado también debe tener en cuenta que las estructuras de rectángulo (Rectangle) tienen un valor agregado, ya que muchos dibujos tienen necesariamente que estar contenidos por uno de éstos. Espero que hasta este momento todo le haya resultado intuitivo, en el próximo apartado veremos cómo aplicar estas técnicas cuando se trabaja en proyectos Web, esto es, ASP.NET. <<dotNetManía Aquellos que se encuentran destacados son los que normalmente se emplean y el resto se han incluido a modo informativo debido a que raramente se usan. Si se quiere pintar sobre un objeto lo primero que hay que tener es una buena dosis de pintura, un poco de inventiva y por supuesto acceso al objeto que se desea colorear. Al igual que en la vida real la regla de oro en GDI+ es que siempre que se quiera pintar sobre algo primero hay que ganar su acceso. Esto se logra en todos los casos mediante el objeto de contexto gráfico. La mayor parte de los controles (botones, ventanas, etc.) cuentan con uno, lo que posibilita su acceso y posterior trazado sobre el mismo. Si de un elemento no se puede obtener el objeto de contexto gráfico entonces no se podrá modificar su aspecto. 15 << dnm.asp.net en realidad éste haya sido creado dinámicamente. Veamos entonces paso a paso cómo llevar adelante esta tarea. // Obtiene el contexto gráfico. Graphics Superficie = e.Graphics; // Crea el objeto y carga la imagen. Bitmap Imagen = new Bitmap(“imagen.bmp”); //Indica al cliente que se va a enviar un JPG Response.ContentType = “image/jpeg”; // Locación y tamaño del dibujo. Point ÁnguloSuperior1 = new Point(5,5); Point ÁnguloSuperior2 = new Point(85,110); Size Tamaño = new Size(200,150); //Crea una mágen de Bitmap de 600x300 puntos const int ancho = 600, alto = 300; Bitmap objBitmap = new Bitmap(ancho, alto); // Estructura de rectángulos. Rectangle Rectángulo1 = new Rectangle(ÁnguloSuperior1, Tamaño); Rectangle Rectángulo2 = new Rectangle(ÁnguloSuperior2, Tamaño); // Crea la brochas a utilizar, Wrap.TileY indica que se debe // repetir la imagen hacia abajo TextureBrush Brocha1 = new TextureBrush(Imagen, WrapMode.TileFlipY); LinearGradientBrush Brocha2 = new LinearGradientBrush(Rectángulo1, Color.Blue, Color.White, LinearGradientMode.Vertical); //Dibuja los rectángulos que contendrán a las figuras. Superficie.FillRectangle(Brocha2, Rectángulo1); Superficie.FillEllipse(Brocha1, Rectángulo2); Fuente 2 Figura 1. Resultado del trazado GDI+ <<dotNetManía Cómo dibujar en ASP.NET 16 Un problema común con el que se encuentran los desarrolladores cuando quieren dibujar sobre un formulario Web ASP.NET utilizando las características de GDI+ es que éstos no cuentan con un objeto de contexto gráfico. La siguiente línea no es válida en aplicaciones Web, esto quiere decir que se producirá un error durante la compilación. //Obtiene el contexto gráfico. Graphics Superficie = this.CreateGraphics(); Pese a los esfuerzos de Microsoft por hacer parecer un formulario Web a uno de Windows, no debemos olvidarnos que el primero no es más que una página de conteniendo HTML con secciones dinámica, mientras que el segundo es un gráfico real. Afortunadamente los arquitectos de .NET framework pensaron también en este problema y aunque se requiere un poco más de ingenio, el resultado final es el mismo que se tiene en formularios de Windows. Básicamente la solución se basa en crear mediante código una estructura en memoria del servidor Web que represente un mapa de bits. De aquí se obtendrá posteriormente el objeto de contexto gráfico.Una vez hecho esto será posible dibujar sobre esta superficie utilizando los mismos métodos de GDI+ vistos anteriormente. Como último paso se deberá enviar el resultado -la imagen- al explorador, el que creerá que está mostrando un archivo gráfico similar a uno almacenado en una carpeta del servidor, aunque La primera línea indica al explorador que absolutamente todo el contenido del formulario Web será una imagen JPG. Si se desea que la página además muestre contenidos de texto o gráficos en otros formatos entonces es recomendable hacer uso de marcos o de uno o más IFRAME que apunten a otros formularios Web, con el fin que se exhiban todos los tipos agrupados dentro de una misma página. Ahora bien, si solamente se desea mostrar el gráfico no tome en cuenta esto último. La tercera línea configura el ancho y alto en píxeles de la imagen virtual creándose así un objeto de tipo Bitmap, el que contendrá al mapa de bit (por ahora en memoria). Se debe tener presente que este objeto hace referencia al conjunto de bits que representan a la imagen pero no al formato final que se utilizará para guardar o enviar a la misma. Figura 2. Resultado del trazado GDI+ Tenemos entonces el espacio donde dibujar, el siguiente paso será obtener el objeto de contexto gráfico pero en este caso de la imagen previamente creada. // Obtiene el objeto de contexto // gráfico de la imágen. Graphics objGráfico = Graphics.FromImage(objBitmap); La clase Graphics contiene la superficie donde dibujar aunque también provee << dnm.asp.net //Envía la imagen como JPG al navegador. objBitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); En el primer parámetro se debe indicar a dónde enviar la imagen, en este caso OutputStream representa una referencia al cuerpo del mensaje de respuesta HTTP. Cualquier dato escrito aquí será finalmente transferido al navegador. Por su parte, el segundo parámetro especifica el formato en el que se desea guardar o enviar la información; he seleccionado JPG por ser el mejor candidato en relación de tamaño/visualización. Otra opción al envío dinámico podría ser guardar el archivo en el disco del servidor y luego poner una etiqueta de imagen en el formulario Web que apunte al lugar donde el archivo ha sido almacenado. Sin embargo la opción más sencilla es siempre crear la imagen dinámicamente y enviarla al explorador. Así cualquier trazado GDI+ puede ser adaptado fácilmente para ser mostrado en la Web. Es importante recordar que cuando se utiliza esta técnica es necesario establecer un color de fondo a la imagen, ya que de lo contrario el valor predeterminado será en todos los casos el negro. // Establece color de fondo blanco // para la imágen. objGráfico.FillRectangle(new SolidBrush(Color.White), 0, 0, ancho, alto); La primera ilusión… barras 3D La gráfica de la figura 3 fue creada utilizando rellenos y formas de GDI+, sin embargo no resulta demasiado sofisticada ya que se remite únicamente a 2 dimensiones. Pese a ello será nuestro punto de partida para comprender como lograr las 3 dimensiones utilizando algunas técnicas sencillas. Figura 3 Lo primero que debemos hacer es dotar de perspectiva a la imagen; para esto vamos a comenzar por lo más fácil. Un pequeño cambio a la línea base dará la sensación de profundidad. Lógicamente esta aproximación es correcta ya que se trata Convertir trazados de formularios de Windows a formularios Web ASP.NET 1. Indicar el tipo de imagen que se enviará al cliente Web mediante el tipo de contenido (MIME). 2. Crear un objeto de mapa de bit de las dimensiones deseadas 3. Obtener el objeto de contexto gráfico 4. Realizar los trazados deseados o copiar el código que dibujaba sobre un formulario de Windows 5. Guardar la imagen indicando su formato y el destino, que será en todos los casos el cuerpo del mensaje http. Tabla 4. Resumen los pasos necesarios para convertir un trazado sobre un formulario de Windows a un formulario Web ASP.NET de figuras rectangulares; en otro tipo de trazados esta técnica no será válida, aunque existe un truco para cada forma. //Crea los puntos para una línea de //base con efecto 3D Point punto1 = new Point(70, 245); Point punto2 = new Point(440, 245); Point punto3 = new Point(460, 265); Point punto4 = new Point(80, 265); Point[] puntos = {punto1, punto2, punto3, punto4}; //Lo rellena de color gris objBrush = new SolidBrush(Color.LightGray); //Lo dibuja en el objeto de //contexto gráfico. objGráfico.FillPolygon( objBrush, puntos); Fuente 3 Figura 4 El código superior define un conjunto de puntos, los que forman un polígono romboidal que será trazado mediante la invocación al método FillPolygon, así como rellenado con el color y la textura de objBrush. Es posible también emplear esta técnica con las barras que componen la gráfica, sin embargo suele llevar bastante código y ser una tarea engorrosa el cálculo de cada uno de los puntos del rombo para cada una de las barras del gráfico. Para resolver este inconveniente existe una técnica conocida como de repetición que ofrece una manera sencillísima de abordar este tema en pocas líneas. Básicamente la idea consiste en dibujar solamente el rombo inicial, esto es, la forma de perspectiva que queramos que tenga nuestra barra pero sin altura. Luego se deberá repetir la misma, una sobre la otra, tantas veces como se quiera que tenga de altura la barra. <<dotNetManía varios métodos estáticos (que se pueden invocar directamente) para extraer el contexto gráfico de un objeto. En este caso FromImage consigue el contexto de la imagen, lo que nos permitirá dibujar en ella. Ya es posible utilizar las características de trazado que vimos en el apartado anterior, aunque aquí se dibujará en el mapa de bits en memoria en vez de ser directamente sobre la superficie del formulario. Por último es necesario enviar la imagen al explorador; esto se hace mediante el método Save del mapa de bits, tal como si se estuviese almacenando la misma en un archivo local. 17 << dnm.asp.net encargada de contener al gráfico en su totalidad o a un segmento de la misma. La figura 7 se obtiene como resultado del fuente 6. for(int Contador = 0; Contador < Altura; Contador++) { //Dibuja un rombo con textura de rejilla. objGráfico.FillPolygon(new HatchBrush( HatchStyle.Percent50, objBrush.Color), puntosRombo); //Le quita uno a la posición de dibujo del rombo para dibujar el //próximo más arriba. for(int iLoop = 0; iLoop < puntosRombo.Length; iLoop++) puntosRombo[iLoop].Y -= 1; } Fuente 4 El primer bucle se encarga de repetir el polígono tantas veces como la altura indicada, mientras que el segundo mueve la coordenada Y de todos los puntos de la forma a un valor inferior (realiza el desplazamiento hacia arriba). La textura de relleno utilizada es de color al 50 por ciento ya que como veremos en breve esto nos permitirá aplicar un efecto adicional a la barra. El resultado final obtenido es el de la figura 5. Figura 6 Figura 7 El efecto final es el que muestra la figura 6, como podrá apreciar es aún más impactante que las versiones anteriores. Me he tomado también el atrevimiento de agregar un panel con las distintas referencias a colores y su descripción. Recuerde que todos los fuentes aquí mencionados están disponible en la Web de dotnetManía. Lápiz = New Pen(Color.Black) ‘Crea el rectángulo que contendrá ‘al gráfico de torta. Rectángulo = New Rectangle( 10, 10, 200, 200) ‘Define el relleno. Brocha = New SolidBrush(Color.Blue) Figura 5 <<dotNetManía Por último es necesario dar algo de luminosidad para mejorar el aspecto de profundidad y afortunadamente conseguir esto es muy simple, solamente hay que indicar mediante la estructura condicional IF que el rombo superior (el último trazado) se dibuje empleando color al 100%. 18 La segunda ilusión… gráfico de tarta 3D La superficie de un gráfico de tarta representa el 100% de lo que se desea representar. En GDI+ se puede lograr este tipo de trazados mediante el método DrawPie del objeto de contexto gráfico. Básicamente se debe definir un área rectangular que será la if(Contador == Altura - 1) { //Pone el rombo superior sin rejilla para dar el efecto 3D. objGráfico.FillPolygon(objBrush, puntosRombo); }else { //Dibuja un rombo sobre el otro con textura de rejilla. objGráfico.FillPolygon(new HatchBrush(HatchStyle.Percent50, objBrush.Color), puntosRombo); } Fuente 5 ‘Dibuja los trozos. superficie.DrawPie( Lápiz, Rectángulo, 0, 90) superficie.DrawPie( Lápiz, Rectángulo, 90, 90) superficie.DrawPie( Lápiz, Rectángulo, 180, 90) superficie.DrawPie( Lápiz, Rectángulo, 270, 90) ‘Rellena un trozo. superficie.FillPie( Brocha, Rectángulo2, 0, 90) Fuente 6 He incluido la versión en Visual Basic ya que sé que muchos de ustedes no trabajan en C#, y de esta forma podremos apreciar que el funcionamiento de GDI+ es exactamente el mismo sin importar el lenguaje en el que se esté trabajando. Siendo 0 grados la horizontal, cada uno de los trozos comienza en el pun- << dnm.asp.net A la izquierda en la figura 8 tenemos el esqueleto, mientras que a la derecha podemos ver la tarta resultante. Lo obtenido es bastante bueno tomando en cuenta lo sencillo que resulta, sin embargo hay una técnica con la que se puede lograr un efecto aún más impactante, el que veremos en el próximo apartado. Gráfico de tarta 3D mediante deformación La técnica de deformación es un poco más compleja de programar pero con ella se obtiene un resultado desta- ‘Crea las coordenadas del rectángulo que contendrá ‘los trozos de la tarta. RectánguloSuperior = New Rectangle(40, 40, 200, 100) ‘Crea las coordenadas del rectángulo que contendrá ‘la sombra o grosor. RectánguloInferior = New Rectangle(40, 70, 200, 100) ‘Indica el tamaño del rectángulo y lo dibuja. Rectángulo = New Rectangle(40, 90, 200, 30) Superficie.FillRectangle(Relleno, Rectángulo) ‘Dibuja la elipse inferior Superficie.FillEllipse(Relleno, RectánguloInferior) ‘Rellena los trozos con diferentes colores Relleno.Color = Color.Blue Superficie.FillPie(Relleno, RectánguloSuperior, 0, 45) ‘Dibuja los demás segmentos ... Fuente 7 cable. La figura 9 nos muestra lo que se puede construir, como verá es un resultado más que destacable. Básicamente la deformación consiste en dibujar primero cada uno de los fragmentos de la tarta en un color más oscuro al que se hará finalmente, esto es así ya que representarán la sombra o espesor del dibujo. Luego es necesario imprimir nuevamente cada trozo pero ahora un píxel más abajo y repetir esta acción unas 15 veces por cada uno de los elementos; cada iteración deberá imprimir el trozo en Figura 8 una nueva posición del eje vertical pero manteniendo el mismo eje horizontal. El resultado final como podrá apreciar en la figura 10 no es demasiado atractivo pero será la base de nuestro futuro dibujo. He abreviado el código fuente (ver fuente 8 en la siguiente página) y quitado unas pocas líneas que no son importantes para comprender el funcionamiento. Básicamente el bucle itera por los elementos de la matriz que contienen los valores a “graficar”. Para calcular la totalidad de elementos se debe dividir el número retornado por la propiedad Length entre 2, ya que es una matriz de 2 dimensiones (valor y Figura 9 Figura 10 descripción de cada elemento). A continuación se invoca la rutina ObtenerColor que retorna un color de acuerdo al valor de índice pasado como argumento. Esta sencilla rutina asegura que cada fragmento de la tarta tendrá un color diferente. El bucle <<dotNetManía to indicado por el tercer argumento y se extienden o barren en sentido horario la distancia en grados expresada en el último parámetro. Para brindar perspectiva a un dibujo de este tipo se debe estirar hacia sus lados, o lo que es igual, contenerse dentro de una figura de menor alto que ancho. Sin embargo si bien la mejora es notoria, solamente este punto no será convincente, o por lo menos no podremos decir que se trate de una forma 3D. Para resaltar aún más el resultado es necesario hacer uso de un segundo truco para añadirle grosor a la tarta. Para ello se debe emplear una vieja técnica que consiste en trazar, algunos píxeles por debajo, una elipse con los mismos atributos de tamaño que la tarta inicial (ver fuente 7). Ésta representará en breve su sombra o espesor, y por ello se debe rellenar de color gris. Posteriormente se tiene que dibujar un rectángulo que pase por el medio de esta elipse, para por último trazar cada uno de los trozos de la tarta comenzando en el punto medio del lado superior del rectángulo. Si ya le he mareado, le recomiendo ver la figura 8. 19 << dnm.asp.net interior imprime cada trozo 15 veces, desplazando a éste 1 píxel hacia abajo en cada nueva impresión. Si se desea un espesor diferente entonces se tendrá que configurar un valor distinto para la variable PosiciónY. Como último paso es necesario dibujar la tarta en la posición inicial pero ahora empleando los colores originales, con el fin de que se destaque de la sombra creada anteriormente. Esto dará un resultado similar al de la figura 9, aunque todavía sin el trozo extraido. No entraré en mayores detalles, pero como consejo y con el fin de que la sombra sea dibujada correctamente es siempre recomendable aplicar primero el desplazamiento a los trozos de la derecha en sentido horario para luego hacer lo mismo con los de la izquierda, esta vez en sentido antihorario. //dibuja los trozos de acuerdo a los valores de la matriz. for(int númeroColumna = 0; númeroColumna<(arrayMesesGraficar.Length/2) ; númeroColumna++) { SolidBrush Relleno = new SolidBrush(ObtenerColor(númeroColumna)); for(int PosiciónY = 0; PosiciónY < 15; PosiciónY++) { objGráfico.FillPie( new HatchBrush(HatchStyle.Percent50, Relleno.Color),40,20 + iLoop2, 200, 100, gradoComienzo, gradoBarrido); } gradoComienzo += gradoBarrido; } Fuente 8 if (númeroColumna==2) { //Quita el trozo. objGráfico.FillPie( new HatchBrush( HatchStyle.Percent50, Relleno.Color ), 10,50 + PosiciónY,200,100, gradoComienzo, gradoBarrido ); } else { //El resto de los trozos se dibujan en el lugar correcto. objGráfico.FillPie( new HatchBrush( HatchStyle.Percent50, Relleno.Color), 40,20 + PosiciónY,200,100, gradoComienzo, gradoBarrido ); } Fuente 9 <<dotNetManía Quitando un segmento de la tarta 20 Quitar un trozo de la tarta es la parte más sencilla ya que simplemente se necesita alejar el segmento deseado del centro de la tarta, esto es, moviendo el rectángulo que lo contiene a otra posición de X e Y. Por ejemplo, el fuente 9 aleja el trazado de la sombra del segundo segmento. Recuerde que se debe escribir un IF similar para dibujar los segmentos superiores, esto es, los que no son sombra. El resultado final ahora sí será el de la figura 9. Espero que este artículo le haya sido de utilidad para conocer por una parte cómo utilizar GDI+ en formularios Web ASP.NET mientras que por la otra haya aprendido cómo aplicar varios trucos sencillos para dotar efecto 3D a distintos tipos de gráficas. En la próxima parte conoceremos ASP.NET Reports Starter Kit, lo que nos ayudará aún más para cumplir nuestro objetivo de explotar al máximo las características de .NET framework. Por Guillermo ‘Guille’ Som Visual Basic MVP desde 1997 www.elguille.info Sobrecarga de operadores y conversiones personalizadas (con C#) Una de las características que tiene el lenguaje C# desde su aparición es la posibilidad de crear sobrecargas de operadores, tanto aritméticos como lógicos, en nuestros propios tipos. En este artículo veremos algunos consejos que nos serán útiles a la hora de implementar esta característica. Todos usamos de forma habitual operadores en nuestros proyectos. Si queremos sumar dos enteros usamos el operador de la suma (+), que queremos comprobar si un valor es menor que otro, usamos el operador menor que (<). En principio podríamos pensar que esto es así porque sí, porque el compilador es inteligente y sabe cómo realizar esas operaciones. Bueno, sí, podría ser, pero realmente el compilador, o mejor dicho el motor en tiempo de ejecución, más conocido como CLR (Common Language Runtime), sabe cómo realizar esas operaciones porque se han definido, es decir, existe código que las realiza. Para todos, o casi todos, los tipos definidos en el .NET Framework existen funciones que le indica al compilador y al CLR cómo realizar dichas operaciones de suma, resta, etc. Pero si queremos usar esos operadores en nuestros propios tipos (clases o estructuras), el compilador no sabrá cómo realizar dichas operaciones, por la sencilla razón de que no le hemos indicado cómo hacerlo. Teniendo la definición de la estructura Punto del fuente 1, si hacemos una operación aparentemente sencilla como la suma de dos objetos de ese tipo, tal como se muestra en el siguiente trozo de código: Punto p1 = new Punto(10, 25); Punto p2 = new Punto(100, 22); Punto p3 = p1 + p2; El compilador se quejará y nos indicará que: “El operador '+' no se puede aplicar a operandos del tipo public struct Punto { public int X; public int Y; // public Punto(int x, int y) { X = x; Y = y; } // public override string ToString() { return X.ToString() + “, “ + Y.ToString(); } } Fuente 1. La estructura Punto 'Punto' y 'Punto'”. Y esto es así porque realmente el compilador no sabe qué hacer para sumar dos objetos del tipo Punto. Si estás pensando que el compilador podría ser un poco más perspicaz y deducir cómo hacer esa operación; imaginemos que en lugar de sumar dos objetos del tipo Punto, quisiéramos sumar dos objetos de tipo Cliente... salvo que le enseñemos al compilador cómo manejar las probetas... tan solo la naturaleza será capaz de sumar dos clientes para obtener uno nuevo... Por tanto, lo que tenemos que hacer es enseñar al compilador a sumar dos objetos del tipo que hemos definido, para que sea capaz de generar el código IL (Intermediate Language) correspondiente y de esta forma el CLR sepa también qué es lo que tiene que hacer <<dotNetManía << Sobrecarga de operadores 21 << dnm.lenguajes.net [ Al estar declarado el método Add como un método estático, para usarlo tendremos que indicar el nombre del tipo y el resultado asignarlo a una variable de ese mismo tipo, tal como se muestra en el fuente 3. Si ejecutamos dicho código obtendremos la siguiente salida: ] NOTA A lo largo de este artículo usaremos una estructura (aunque también podría ser una clase) en la que implementaremos las sobrecargas y conversiones personalizadas; dicha estructura, llamada Punto, tendrá dos campos públicos X e Y los cuales representarán las coordenadas de un punto, la definición inicial es la mostrada en el fuente 1. cuando se encuentre con esa operación de suma. Cómo funciona la sobrecarga de operadores Para entender mejor cómo funcionan las sobrecargas de los operadores, podemos comparar una sobrecarga con un método que realice la misma operación que el operador que queremos sobrecargar. Por ejemplo, si queremos crear un método que simule el operador de suma (+) podríamos escribir el método mostrado en el fuente 2. public static Punto Add( Punto p1, Punto p2) { return new Punto( p1.X + p2.X, p1.Y + p2.Y ); } <<dotNetManía Fuente 2. Un método para sumar dos objetos de tipo Punto 22 Como podemos comprobar, este método recibe por parámetro dos objetos del tipo Punto y devuelve un nuevo objeto de ese mismo tipo en el que hemos hecho la operación que estimemos oportuna para la suma de dos Puntos. También hemos declarado el método como estático, de forma que pertenezca al propio tipo y no a una instancia particular. Esto último no es un capricho, ya que es un requisito que los operadores sobrecargados sean métodos estáticos, por la sencilla razón de que los operadores se usarán de forma independiente, sin que haya ninguna instancia de por medio. Algo que es hasta lógico, porque dicha suma no se rea- Punto p1 = 10, 25 Punto p2 = 100, 22 Punto p3 = 110, 37 lizará sobre ninguna instancia en particular, sino que se hará sobre dos objetos cualesquiera del tipo en el que estamos definiendo el operador. [ Una vez que sabemos cómo sumar dos objetos del tipo Punto, vamos a definir el operador + (suma) para nuestro tipo, el cual quedaría tal y como se muestra en el fuente 4. NOTA ] Si quisiéramos usar el método Add como un método de instancia, (perteneciente al objeto creado en la memoria), lo recomendable es que sólo reciba un parámetro, el cual se usaría para incrementar el contenido del objeto actual, ese método de instancia tampoco debería devolver nada. La definición mostrada en el fuente 2 sería el código equivalente al operador sobrecargado para la suma, el cual nos servirá para comprender mejor cómo funcionan las sobrecargas de los operadores. De todas formas, en algunas ocasiones, sería recomendable que existiesen ciertos métodos estáticos, pertenecientes al propio tipo, que tuviesen su contrapartida con métodos de instancia. Punto p1 = new Punto(10, 25); Punto p2 = new Punto(100, 22); Punto p3 = Punto.Add(p1, p2); Console.WriteLine(“Punto p1 = {0}”, p1); Console.WriteLine(“Punto p2 = {0}”, p2); Console.WriteLine(“Punto p3 = {0}”, p3); Fuente 3. Cómo usar el método Add de la estructura Punto // operador + public static Punto operator +( Punto p1, Punto p2) { return new Punto( p1.X + p2.X, p1.Y + p2.Y); } Fuente 4. La definición del operador suma Si bien todo el código y la forma de declarar la sobrecarga de operadores y las conversiones personalizadas entre nuestros tipos y otros tipos (incluso del propio .NET Framework) están centradas en el lenguaje C#, todo lo aquí explicado también nos será de utilidad para aplicarlo a la nueva versión de Visual Basic 2005, la cual también nos permitirá sobrecargar operadores y realizar nuestras propias conversiones de tipos, pero eso será seguramente tema de otro artículo. << dnm.lenguajes.net Como podemos comprobar, el código interno es el mismo que el del método Add, pero ahora al indicarle al compilador de C# qué es lo que tiene que hacer para sumar dos objetos de nuestro tipo, podemos usar el código del fuente 5, el cual, sin lugar a dudas, es mucho más intuitivo que el anterior, en el que usábamos el método Add y el resultado obtenido es el mismo que el del fuente 3. Punto p1 = new Punto(10, 25); Punto p2 = new Punto(100, 22); Punto p3 = p1 + p2; Console.WriteLine("Punto p1 = {0}", p1); Console.WriteLine("Punto p2 = {0}", p2); Console.WriteLine("Punto p3 = {0}", p3); Fuente 5. Cómo usar el operador suma (+) de la estructura Punto Tal como hemos podido comprobar es fácil definir nuestras propias sobrecargas de operadores, por tanto, ya estamos preparados para definir los operadores de nuestras clases y estructuras. La forma de declarar una sobrecarga de un operador siempre es la misma: public static <valor devuelto> operator <operador>( <valor a la izquierda del operador>, <valor a la derecha del operador>) Esta sería la forma de definir los operadores binarios, es decir, los que operan con dos valores, uno de ellos, el que indicamos primero, es el que aparece en la parte izquierda del operado y el otro, el que indicamos segundo, es el que aparece en la parte derecha del operador, en cualquier caso, ambos parámetros deben ser por valor, es decir, no se permiten parámetros out o ref. Y, por supuesto, el valor devuelto por la función será el usado para indicar el resultado de dicha operación. Crear sobrecargas en clases o en estructuras Algunos detalles a tener en cuenta Antes de ver otras formas de definir los operadores de nuestros propios tipos, debemos conocer otros aspectos y efectos colaterales que se nos pueden presentar. Por ejemplo, supongamos que queremos sumarle a un tipo Punto un valor entero, de forma que incrementemos el valor interno de X; podríamos definir el operador + (suma) de forma que reciba un parámetro del tipo Punto y un entero, tal como se muestra en el fuente 6. public static Punto operator +(Punto p1, int x) { return new Punto(p1.X + x, p1.Y); } Fuente 6. Definición de la suma para un tipo Punto y un entero Esta sobrecarga permitiría escribir algo como: Punto p1 = new Punto(100, 25); Punto p2 = p1 + 15; Pero si intentamos hacer esta otra operación: Punto p2 = 15 + p1; El compilador producirá un error, indicándonos que no hay ninguna sobrecarga que reciba esos parámetros. Y, en parte, es hasta lógico ya que el compilador no sabe cómo sumar un tipo entero y un tipo Punto, ¿verdad? Podrías pensar que sí, que sí lo sabe, ya que lo hemos definido. Pero realmente, lo que hemos definido es cómo sumar un Punto y un entero, no al revés, y en este caso, el orden de los sumandos sí altera el valor de la suma. Para comprender mejor porqué se produce este error, volvamos al código del método Add, el cual lo habíamos declarado como: En estos ejemplos estamos usando una estructura para definir los operadores sobrecargados. Pero realmente no hay ninguna razón especial para usar una estructura en lugar de una clase a la hora de decidir cual es mejor para crear nuestros tipos con sobrecargas de operadores. Lo que ocurre es que generalmente vamos a definir nuestros propios operadores en tipos que de alguna forma están pensados para manejar datos numéricos, y en estos casos es posible que el uso de una estructura sea más eficiente e intuitivo que el de una clase. Por supuesto, ya sabemos quién es el que finalmente decide que tipo de datos crear: nosotros mismos después de haber evaluado cual rinde mejor. Por tanto sabemos que sólo admitirá como parámetros dos valores de tipo Punto. Ahora escribamos otra sobrecarga del método Add para que sea similar a la sobrecarga del operador + que acabamos de definir, el código sería el del fuente 7. Viendo esta definición tenemos claro que la única forma de usarla sería pasándole un valor de tipo Punto y otro de tipo int, en este mismo orden, pero no al revés. <<dotNetManía public static Punto Add(Punto p1, Punto p2) 23 << dnm.lenguajes.net public static Punto Add(Punto p1, int x) { return new Punto(p1.X + x, p1.Y); } Fuente 7. El método Add para sumar un Punto y un entero Si quisiéramos pasar primero un valor de tipo entero y después el de tipo Punto, tendríamos que declarar el método Add tal y como se muestra en el fuente 8. public static Punto Add(int x, Punto p1) { return new Punto(p1.X + x, p1.Y); } Fuente 8. El método Add para sumar un entero y un Punto Está más claro de esta forma, ¿verdad?, ya que ahora hemos definido una sobrecarga del método Add que acepte un entero como primer parámetro y un Punto como segundo. Por tanto ahora tendríamos tres sobrecargas del método Add que acepta los siguientes tipos de datos: 1- Dos valores de tipo Punto. 2- Un valor de tipo Punto y otro de tipo int. 3- Un valor de tipo int y otro de tipo Punto. Pues lo mismo ocurre con las sobrecargas de operadores, el compilador sólo sabrá usar los que hayamos definido y cuando se encuentre uno para el que no tiene una definición, se quejará y nos mostrará un error. Por tanto, si queremos que nuestra estructura pueda sumar un valor de tipo Punto y un valor int sin importar el orden que se use, tendríamos que definir la sobrecarga correspondiente, tal como se muestra en el fuente 9. public static Punto operator +(int x, Punto p1) { return new Punto(p1.X + x, p1.Y); } Fuente 9. La sobrecarga para sumar un entero y un Punto [ ] NOTA Cuando definamos operadores sobrecargados, debemos tener en cuenta que al menos uno de los parámetros debe ser del mismo tipo en el que lo estamos definiendo. De igual forma, sólo podremos sobrecargar operadores existentes, es decir, si en C# no existe un operador para elevar un valor a una potencia, no podríamos "inventarlo". En la tabla 1, extraída de la documentación de Visual Studio .NET, se muestran tanto los operadores que podemos sobrecargar como los que no. ¿Cómo es posible?. Por la sencilla razón de que si el compilador sabe cómo hacer ciertas conversiones entre tipos, intentará hacerlas en el caso de que no se encuentre con una conversión específica. Por ejemplo, si queremos hacer la suma mostrada en el fuente 10, podríamos pensar que se producirá un error, ya que no hemos definido ninguna sobrecarOperadores Posibilidad de sobrecarga +, -, !, ~, ++, --, true, false Estos operadores unarios sí se pueden sobrecargar. +, -, *, /, %, &, |, ^, <<, >> Estos operadores binarios sí se pueden sobrecargar. ==, !=, <, >, <=, >= Los operadores de comparación sí se pueden sobrecargar, pero siempre se harán por parejas. &&, || Los operadores lógicos no se pueden sob recargar, pero se evalúan con & y |, que pueden sobrecargarse. [] El operador de indización de matrices no se puede sobrecargar, pero se pueden definir indizadores. () El operador de conversión explícita de tipos no se puede sobrecargar, pero se pueden definir nuevos operadores de conversión. Los operadores de asignación no se <<dotNetManía Algunas cosas que el compilador hace por nosotros 24 Pero, (sí, en las sobrecargas también hay peros), esta forma de actuar del compilador puede cambiar o puede funcionar con otros tipos para los que no hemos definido de forma explícita una sobrecarga. +=, -=, *=, /=, %=, &=, |=, ^=, pueden sobrecargar, pero +=, por <<=, >>= ejemplo, se evalúa con +, el cual sí se puede sobrecargar. =, ., ?:, ->, new, is, sizeof, Estos operadores no se pueden typeof sobrecargar. Tabla1. Los operadores de C# << dnm.lenguajes.net long n = 1234567890123456789L; Punto p1 = new Punto(100, 25); Punto p2 = p1 + (int)n; Fuente 12. C# sabe cómo manejar los overflows de números enteros short s = 15; Punto p1 = new Punto(100, 25); Punto p2 = p1 + s; Fuente 10. Sumar un Punto con un valor short El compilador buscará en la lista de sobrecargas del operador + uno que se adecue a esos tipos de datos, y realmente no encontrará una sobrecarga que coincida, pero sí que encontrará la del tipo int, y como resulta que el compilador sabe perfectamente cómo convertir de short a int, (esto se conoce como promoción de short a int), pues no habrá problemas, ya que hará la conversión de short a int y después usará el resultado de esa conversión con la sobrecarga que hemos definido en la que el segundo parámetro es un valor de tipo int. Pero si en lugar de un short usamos un valor de tipo long, en este caso se producirá una excepción, ya que el compilador no puede convertir (promocionar) un valor long en uno de tipo int de forma implícita. Aunque siempre nos queda el recurso de hacer una conversión (cast) para convertir el valor long en un valor int y así poder hacer la suma, tal como podemos ver en el código mostrado en el fuente 11. long n = 15; Punto p1 = new Punto(100, 25); Punto p2 = p1 + (int)n; Fuente 11. Para sumar un Punto con un long, debemos convertirlo a entero Este código es válido, al menos para el compilador, si bien en tiempo de ejecución si el contenido de la variable n es demasiado grande, se truncará a un valor entero. Por ejemplo, el código del fuente 12 asignará el valor 2112455033 a la propiedad X de la variable p2. Conversiones personalizadas Sabiendo que el compilador intentará hacer conversiones para usar las sobrecargas que tengamos definidas, nos encontramos con otra forma de crear sobrecargas automáticas de operadores: creando nuestras propias conversiones entre otros tipos y el que nosotros estamos creando. [ indicarle al compilador que sabemos que es posible que haya pérdida de información, pero aún así queremos hacer dicha conversión. En nuestras clases (tipos) también podemos definir conversiones tanto implícitas como explícitas, por ejemplo, si queremos convertir un entero en un Punto, podríamos definir una conversión implícita de forma que el valor entero lo asignemos al campo X de nuestro tipo. La declaración sería la mostrada en el fuente 13. NOTA Las conversiones personalizadas se definen de la siguiente forma: public static <tipo de conversión> operator <tipo devuelto>(<tipo a convertir>) Que podría servir para realizar una conversión (cast) de esta forma: (<tipo devuelto>)<tipo a convertir> ] Por tanto, siempre se ven involucrados dos tipos de datos, uno de los cuales debe ser del mismo tipo que define la conversión y el otro debe ser un tipo diferente, ya que no tendría mucho sentido convertir, por ejemplo, un tipo Punto en otro tipo Punto. Tipos de conversiones Como sabemos, existen dos tipos de conversiones: las implícitas y las explícitas, es decir, si no necesitan un cast o sí lo necesitan. Por ejemplo, el compilador de C# sabe convertir un int en long (promoción) y como sabe que esa conversión no produce pérdida de información, porque un entero de 64 bits (long) puede contener sin problemas un entero de 32 bits (int), por tanto lo hace de forma implícita. Sin embargo, lo contrario no es algo “natural”, (convertir un long en un int), por la sencilla razón de que al ser la capacidad de un long muy superior a la de un int, es posible que algunos valores de un long no “quepan” en un int, porque, como acabamos de ver, un int se almacena en 32 bits de espacio, mientras que para almacenar un long necesitamos el doble: 64 bits; en estos casos, la conversión la haremos de forma explícita, es decir, tenemos que public static implicit operator Punto(int x) { return new Punto(x, 0); } Fuente 13. Conversión implícita de entero a Punto Sin embargo la conversión de un objeto de tipo Punto a un entero sí que producirá pérdida de información, por tanto la conversión la deberíamos declarar como explícita, de forma que un usuario de nuestro tipo sea consciente de que posiblemente se pueda producir pérdida de información. La declaración de la conversión de Punto a int sería la mostrada en el fuente 14. Esta sobrecarga la usaríamos de esta forma: Punto p1 = new Punto(100, 25); int x = (int)p1; <<dotNetManía ga del operador suma que reciba como segundo operando un valor de tipo short. 25 << dnm.lenguajes.net Sobrecarga de operadores unarios public static explicit operator int(Punto p) { return p.X; } Fuente 14. Conversión explícita de Punto a entero. Con estas dos conversiones personalizadas, ya hemos “enseñado” al compilador de C# cómo convertir un Punto en un entero y viceversa, si bien al ser la última (la de entero a Punto) la que se usa de forma implícita, (sin conversión o cast), podemos aprovechar ese conocimiento del compilador para ahorrarnos algunas sobrecargas, por ejemplo las dos sobrecargas del operador + en las que se usa un valor int ya no serían necesarias, porque cuando el compilador se encuentre con un código como este: Punto p2 = p1 + 10; <<dotNetManía Buscará una sobrecarga del operador + en el que se utilice un Punto y un entero; al no encontrarla, comprobará si hay alguna otra forma de usar ese operador y se encontrará con la sobrecarga que suma dos valores de tipo Punto, y como ahora sabe cómo convertir de forma implícita un entero en un Punto, usará esa conversión personalizada para realizar la suma usando la sobrecarga que opera con dos valores de tipo Punto. Estos pequeños detalles debemos tenerlos en cuenta cuando vayamos a crear sobrecargas de operadores y conversiones personalizadas en nuestros tipos. 26 [ La sobrecarga del operador + que hemos visto, es la sobrecarga de un operador binario, es decir, un operador que utiliza (u opera con) dos valores, uno el que está a la izquierda del operador y el otro el que está a la derecha. Pero también podemos sobrecargar operadores unarios, como por ejemplo el operador de incremento (++) o de decremento (--); en estos casos sólo se usa un valor y éste debe ser del mismo tipo que el tipo que lo define, por tanto, el valor devuelto y el parámetro deben ser del mismo tipo en el que están definidos, en nuestro caso, del tipo Punto. En el fuente 15 podemos ver el código de la sobrecarga del operador ++ de nuestra estructura. public static Punto operator ++(Punto p) { return new Punto(p.X + 1, p.Y + 1); } Fuente 15. Sobrecarga del operador ++ Esta sobrecarga nos servirá tanto cuando usemos el operador ++ como prefijo o sufijo: p++ o ++p, tal como podemos ver en el fuente 16. Punto p1 = new Punto(100, 25); Console.WriteLine(“p1++ = {0}”, p1++); Console.WriteLine(“++p1 = {0}”, ++p1); Fuente 16. Uso del operador de incremento TRUCO ] Sabiendo que el compilador siempre que sea necesario promocionará, (convertirá un tipo de menor capacidad en otro que tenga mayor capacidad de almacenamiento), podemos ahorrarnos algunas sobrecargas y conversiones personalizadas. Por ejemplo, si definimos una conversión de long a Punto, no será necesario crear las conversiones para sbyte, byte, short, int y uint; de igual forma, si definimos una conversión de un valor double a Punto, no será necesario crear una para float. Todo esto, siempre y cuando no necesitemos hacer comprobaciones extras en la forma en que se harán las conversiones. Los parámetros usados en las sobrecargas de operadores deben ser siempre por valor Este código producirá el siguiente resultado: p1++ = 100, 25 ++p1 = 102, 27 La primera línea nos muestra el mismo valor que originalmente hemos asignado a la variable p1, pero como podemos comprobar en la segunda línea, dicho incremento se ha realizado. Para "comprender" el resultado, realmente hay que saber cómo funciona el operador ++, ya que cuando se usa como sufijo, se usa el valor que contiene y después se incrementa, sin embargo cuando se usa como prefijo (delante de la variable), primero se incrementa el valor y después se usa dicho valor. ¿Qué sentido tiene sobrecargar true o false? Tal como pudimos comprobar en la tabla 1, tanto true como false se consideran operadores unarios, además de que se pueden sobrecargar. La primera impresión podría ser que podemos cambiar el valor que devuelven estos operadores, pero no es así, lo que sí podemos cambiar es el comportamiento de los mismos, es decir, cuando se considera que nuestro tipo devuelve un valor verdadero o uno falso. Por ejemplo, supongamos que nuestra estructura Punto la quisiéramos usar en una comparación o como resultado de una operación lógica, el compilador producirá un error si no definimos el comportamiento de estos operadores con respecto al contenido de nuestra clase o estructura. Supongamos que en la estructura Punto queremos considerar que debe devolver un valor verdadero si cualquiera de los valores de los dos campos << dnm.lenguajes.net [ ] NOTA A pesar de que pueda parecer lógico (así era, si no recuerdo mal, en la beta de .NET Framework 1.0), que si hemos sobrecargado el operador + (suma), no sería necesario sobrecargar el operador de incremento (++), ya que la operación a realizar sería sumar uno al valor de la variable, pero el compilador de C# sólo usará las sobrecargas de ++ y -si lo hemos definido en nuestro código, de no ser así se producirá un error de compilación indicándonos que no existe una sobrecarga para el operador ++ o --. X e Y contiene un valor distinto de cero; la declaración de la sobrecarga del operador true quedaría tal como se muestra en el fuente 17. public static bool operator true(Punto p1) { return (p1.X != 0 || p1.Y != 0); } Fuente 17. Definición de la sobrecarga de true Pero si sobrecargamos el operador true, también tendremos que sobrecargar el operador false, ya que estos, al igual que los operadores de comparación, deben sobrecargarse por pares, con idea de que el compilador sepa lo que debe hacer cuando se quiera comprobar si el contenido de un Punto es falso. Por tanto, la definición de la sobrecarga de false podría quedar tal y como se muestra en el fuente 18. public static bool operator false(Punto p1) { return (p1.X == 0 && p1.Y == 0); } El caso del operador de igualdad (==) sigue esta misma regla, y también debemos sobrecargar el operador de desigualdad (!=), pero como todos los tipos de .NET se derivan de Object, y ese tipo incluye un método relacionado con la igualdad de objetos: el método Equals, que sirve para comprobar si la instancia actual es igual al objeto pasado como parámetro, también deberíamos escribir nuestra versión de ese método. Aunque si no lo declaramos, no pasará nada, el código compilará, aunque recibiremos una advertencia indicándonos que deberíamos hacerlo: Punto define el operador == o el operador != pero no reemplaza a Object.Equals(object o) Pero si lo hacemos, las recomendaciones son de no llamar directamente al operador == desde el código de Equals, ya que el parámetro pasado a ese método puede ser un valor nulo y se produciría una excepción, aunque realmente no se llamaría a nuestra sobrecarga, por la sencilla razón de que al ser un valor nulo, la excepción se produciría antes. Lo importante es que deberíamos reemplazar ese método de forma que produzca el mismo resultado que si usáramos el ope- public override bool Equals(object obj) { if(obj is Punto) return this == (Punto)obj; else return false; } Fuente 18. Definición de la sobrecarga de false Sobrecarga de operadores de comparación Otros operadores que podemos sobrecargar son los operadores usados para realizar comparaciones, aunque en estos casos las sobrecargas hay que hacerlas por pares, por tanto, si sobrecargamos el operador mayor que (>) también debemos sobrecargar el operador menor que (<). rador de igualdad, si bien es cierto que en la mayoría de las ocasiones la implementación de Equals producirá el mismo resultado. Además, siguiendo con las recomendaciones de diseño, nunca debería producirse una excepción en este método ni en los operadores sobrecargados. En el código fuente 19 vemos cómo deberíamos sobrecargar el método Equals, es decir, comproba- <<dotNetManía Fuente 19. Definición del método Equals 27 << dnm.lenguajes.net mos que el parámetro sea un valor de tipo Punto y lo comparamos usando nuestra sobrecarga del operador de igualdad, en caso de que no lo sea, devolvemos un valor falso. Además, el método GetHashCode se utiliza para identificar de forma única a un objeto, y como el propio .NET lo utiliza para sus propias comprobaciones, también deberíamos crear nuestra propia versión de dicho método, sobre todo si nuestro tipo formará parte de colecciones tipo Dictionary, ya que .NET usará el valor devuelto por el método GetHashCode para crear valores únicos en las claves de los elementos de la colección. En el caso de que no sepamos cómo definir este método, la recomendación es usar el valor GetHashCode del método ToString que hayamos definido en nuestro tipo, el cual en la mayoría de los casos será más eficiente que el devuelto de forma predeterminada (base.GetHashCode()). Por ejemplo, si dos variables de tipo Punto contienen los mismos valores en los campos X e Y, el valor de GetHashCode será el mismo hayamos o no definido ese método, pero si los contenidos de esos campos son diferentes, al usar la implementación predeterminada, se devolverá siempre el mismo valor, sin embargo, si lo definimos tal y como se muestra en el fuente 20, el valor devuelto será distinto, tal como podemos comprobar si ejecutamos el código mostrado en el fuente 21. public override int GetHashCode() { return this.ToString().GetHashCode(); } Fuente 20. Definición del método GetHashCode Punto p1 = new Punto(100, 25); Punto p2 = p1 + 2; Console.WriteLine(“p1.GetHashCode {0}”, p1.GetHashCode()); Console.WriteLine(“p2.GetHashCode {0}”, p2.GetHashCode()); Fuente 21.Prueba para determinar el valor devuelto por GetHashCode <<dotNetManía Operadores que no se sobrecargan, pero usan las sobrecargas definidas 28 Algunos operadores no se pueden sobrecargar, como por ejemplo el operador de asignación (=), ni otros compuestos como la asignación y la suma (+=), y similares, sin embargo, estos últimos no será necesario sobrecargarlos si ya tenemos la sobrecarga del operador que interviene junto con el de asignación; en el código de la clase Punto, hemos sobrecargado [ NOTA Según las recomendaciones de diseño de .NET, el operador de igualdad (==) no debería reemplazarse en los tipos por referencia (clases). Por otra parte, si se sobrecargua algún operador aritmético es recomendable definir el operador de igualdad, sea un tipo por referencia o por valor. el operador para sumar, y como resulta que el compilador de C# siempre sabe cómo hacer una asignación, también sabrá cómo usar el operador +=, ya que esto es lo mismo que sumarle al objeto de la derecha lo que haya a la izquierda y después volver a almacenarlo en el que esté a la izquierda del operador, por tanto, si hacemos esto: p1 += p2; El compilador hará esta otra operación: p1 = p1 + p2; No todos los lenguajes de .NET soportan la sobrecarga de operadores, en esos lenguajes habrá que usar unos métodos equivalentes que el compilador crea de forma automática Y como resulta que existe una sobrecarga para sumar dos objetos de tipo Punto, el compilador no tendrá problemas para efectuar esa operación, otra cosa bien distinta sería que no tuviésemos una sobrecarga adecuada, en cuyo caso nos mostrará el típico mensaje de error indicándonos que no existe una sobrecarga para la operación que queremos realizar. Interoperabilidad con otros lenguajes de .NET Hay que tener en cuenta que la sobrecarga de operadores sólo se podrán usar con lenguajes que la soporten, por ejemplo, si definimos una librería que contiene algún tipo en el que se han definido sobrecargas de operadores y conversiones personalizadas y dicha librería la queremos usar por ejemplo con ] << dnm.lenguajes.net Visual Basic .NET, éste lenguaje no podrá aprovecharse de esas sobrecargas, por tanto deberíamos tener presente esta posibilidad y definir métodos equivalentes a las sobrecargas y conversiones que hemos definido. En la tabla 2, también extraída de la documentación de Visual Studio .NET, se muestran los operadores sobrecargables además de los métodos que deberíamos definir como alternativos y los métodos que crea el compilador para realizar esas operaciones, los cuales también podemos usar en esos lenguajes que no soporten la sobrecarga de operadores ni las conversiones personalizadas. Por ejemplo, si creamos una librería de clases con la estructura Punto y la usamos desde un proyecto de Visual Basic .NET, para usar el operador suma tenDim p1 As New Punto(100, 25) Dim p2 As Punto = Punto.op_Addition(p1, 10) ‘ Console.WriteLine(“p1= {0}, p2 = {1}”, p1, p2) Fuente 22. Código de VB usando el método equivalente a la sobrecarga de la suma [ NOTA La próxima versión de Visual Basic .NET soportará la sobrecarga de operadores y las conversiones personalizadas, por tanto con esa versión si se podrán utilizar las sobrecargas definidas en una librería creada con C#. ] dríamos que usar un código parecido al mostrado en el fuente 22. Pero como la estructura Punto también tiene un método Add para realizar las mismas operaciones, el código de Visual Basic quedaría mejor tal como vemos en el fuente 23. Dim p1 As New Punto(100, 25) Dim p2 As Punto = Punto.Add(p1, 10) ‘ Console.WriteLine(“p1= {0}, p2 = {1}”, p1, p2) Fuente 23. Código de VB usando el método Add Método alternativo Método creado por el compilador No está definido ToXxx o FromXxx op_Implicit No está definido ToXxx o FromXxx op_Explicit + (binario) Add op_Addition - (binario) Subtract op_Subtraction * (binario) Multiply op_Multiply / Divide op_Division % Mod op_Modulus ^ & (binario) | << >> == > < != >= <= -++ - (unario) + (unario) ~ Xor BitwiseAnd BitwiseOr LeftShift RightShift Equals Compare Compare Compare Compare Compare Decrement Increment Negate Plus OnesComplement op_ExclusiveOr op_BitwiseAnd op_BitwiseOr op_LeftShift op_RightShift op_Equality op_GreaterThan op_LessThan op_Inequality op_GreaterThanOrEqual op_LessThanOrEqual op_Decrement op_Increment op_UnaryNegation op_UnaryPlus op_OnesComplement Tabla2. Los operadores, los métodos alternativos y los métodos internos Por supuesto, también podremos usar el resto de operadores sobrecargados, pero siempre usando los métodos creados por el compilador, cuya nomenclatura vemos en la tercera columna de la tabla 2. Conclusiones La sobrecarga de operadores y las conversiones personalizadas nos permiten dar una nueva funcionalidad a los tipos creados por nosotros, pero como hemos comentado, algunos de los lenguajes de .NET no soportan esta característica, por tanto deberíamos proporcionar una funcionalidad paralela a la sobrecarga, al menos para evitar usar métodos poco amigables. También debemos saber que a pesar de que en C# (y los lenguajes que soporten la sobrecarga de operadores y las conversiones personalizadas) podemos aprovechar las conversiones personalizadas para no tener que definir sobrecargas extras, en los lenguajes que no soporten las sobrecargas de operadores no podrán aprovecharse de ellas y para poder usarlas, tendremos que definirlas de forma explícita. Espero que ahora tengas una idea más clara de cómo crear sobrecargas de operadores así como las conversiones personalizadas en C#, en otra ocasión veremos cómo utilizar estas características usando la nueva versión 2005 de Visual Basic.NET. El código fuente con la definición de la estructura Punto así como los ejemplos de cómo usarla tanto desde C# como desde Visual Basic. lo puede bajar de www.dotnetmania.com. <<dotNetManía Operador 29 Por David López Analista Sinergia Tecnológica Introducción a las pruebas de carga y stress de aplicaciones Web con Application Center Test Al desarrollar una aplicación Web suelen surgir dudas sobre su rendimiento y sobre si proporcionará todo lo que se espera de ella.Application Center Test puede ayudarnos a despejarlas siempre que planifiquemos adecuadamente nuestras pruebas. <<dotNetManía << ¿Qué es el Application Center Test? 30 Para responder a estas dudas disponemos de Application Center Test (ACT). ACT es una herramienta de Microsoft incluida en Visual Studio .NET Enterprise Developer y Enterprise Architect diseñada especialmente para realizar pruebas de carga y stress, que permite obtener información para detectar problemas de rendimiento y escalabilidad. A pesar de estar especializada en este tipo de pruebas ACT también permite realizar pruebas funcionales gracias a los test dinámicos, lo que puede resultar útil para aplicaciones de complejidad media-baja. Si necesitamos test funcionales más sofisticados existen otras herramientas en el mercado que posiblemente harán mejor esta labor. Bien, ¿pero qué son las pruebas de carga y stress? En una prueba de carga se prueba la aplicación bajo condiciones normales y de pico, lo que permite verificar que se cumplirán los objetivos deseados. En las pruebas de stress se fuerza a la aplicación a funcionar más allá de las condiciones para las que fue diseñada. Con estos tipos de pruebas podemos calcular ciertas características de nuestra aplicación, entre ellas: • Punto de ruptura del servidor, a partir del cual deja de servir peticiones. • Problemas de sincronización. • Pérdida de datos por congestión de la red. • Errores producidos por condiciones de carrera. • Número máximo de usuarios concurrentes. • Uso de los recursos. • Tiempo de respuesta • Peticiones atendidas por segundo Se puede considerar que el predecesor directo de ACT es Web Application Stress Tool (WAST). Si has usado previamente WAST te alegrará descubrir las mejoras que aporta ACT, entre ellas la grabación de macros. Realizar pruebas de carga y stress contra un servidor web es imprescindible para saber que cuando esté en producción será capaz de atender todas las peticiones que le lleguen, o al menos para conocer el umbral a partir del cual dejará de hacerlo El funcionamiento de ACT reside en simular un gran número de usuarios abriendo múltiples conexiones al servidor y enviando peticiones HTTP. Algunas de las características más interesantes de ACT son: • Se integra con Visual Studio .NET. • Permite probar cualquier página Web que responda a una petición HTTP (.asp, .aspx, .php...). << dnm.plataforma.net Cómo encaja ACT en el ciclo de vida de la aplicación La interpretación de los resultados de ACT dependerá de los objetivos de rendimiento que nos hayamos marcado para nuestra aplicación, así que es imprescindible establecer estos objetivos muy pronto dentro del ciclo de vida, dentro de la fase de diseño. Estos objetivos tienen que ser establecidos, documentados y acordados por las partes involucradas en la implementación, implantación y uso de la aplicación. Una vez establecidos estos objetivos es aconsejable utilizar ACT en cada nueva versión de la aplicación, para saber si nos estamos alejando o acercando a los objetivos establecidos. De esta manera podremos establecer medidas correctoras cuando el coste de éstas es todavía pequeño. Configuración del entorno de pruebas Antes de comenzar a crear nuestros test debemos asegurarnos de disponer de un buen entorno de pruebas. Nuestro objetivo tiene que ser disponer de un entorno que permita extrapolar los datos al de producción. Para ello ambos entornos (pruebas y producción) han de parecerse al máximo a nivel hardware y software. Es cierto que esto puede ser en muchas ocasiones costoso, pero es la única manera de asegurar que los datos que obtengamos nos permitirán emitir juicios adecuados sobre nuestro sitio Web. En algunas empresas la propia máquina de pruebas es la que más tarde pasa a ser la máquina de producción. Es evidente que de esta manera aseguramos que el hardware y software es el mismo, pero perdemos una máquina sobre la que seguir probando posteriores versiones del site. Sería, por lo tanto, aconsejable disponer de dos entornos idénticos para simultanear producción y pruebas. Por otro lado hay que tener en cuenta que disponer de unas máquinas para pruebas que sean una réplica exacta no garantiza el resultado de los test si el entorno no está perfectamente controlado. Si tenemos tráfico en la red ajeno a la prueba, aplicaciones funcionando no deseadas, etc... estaremos falseando los datos. Tenemos que asegurarnos de estar probando lo que deseamos y no una mezcla variada de configuraciones y circunstancias. El mero hecho de estar simulando las peticiones HTTP desde la misma máquina cliente introduce cierto factor de distorsión en las pruebas que es inevitable, de ahí la necesidad de controlar perfectamente el resto de variables (hardware y software) del entorno. Escatimar en el entorno de pruebas o no controlarlo adecuadamente puede acarrearnos desagradables consecuencias al poner la aplicación en producción Hasta ahora hemos hablado de la máquina que alojará la aplicación bajo pruebas, pero otra pieza fundamental de ACT es la máquina cliente que lanza las peticiones HTTP. ACT es una aplicación muy intensiva en procesador, lo que puede hacer que se sature rápidamente. Es importante que a lo largo de la prueba vigilemos que la máquina cliente no es el factor limitador, es decir, la saturación debe encontrarse siempre en la máquina servidor y no en la máquina cliente. En ocasiones la potencia de un servidor implica tener que disponer de varias máquinas cliente para poder llegar a saturarlo. Esto ocurre especialmente en las pruebas de stress, en las que se debe intentar mantener el procesador del servidor por encima de un 80% de uso, algo que raramente se consigue con una única máquina cliente. Configuración y uso de Application Center Test Hay dos formas de usar ACT: desde el IDE de Visual Studio .NET o como una aplicación independiente. Si escogemos utilizarlo desde el IDE su uso se simplifica, permitiéndonos editar y lanzar los scripts, pero si deseamos sacar todo el jugo a ACT es preferible usarlo como aplicación independiente. Podemos encontrar la aplicación en la carpeta “Microsoft Visual Studio .NET 2003 - Características empresariales de Visual Studio .NET - Microsoft Application Center Test” del menú de inicio de Windows. Vamos a comenzar por crear un test sencillo. En nuestro caso la página Web que hemos creado simplemente muestra la cabecera de nuestra revista y un titular obtenido de un fichero .XML. Es evidente que el acceso a dicho archivo supone una penalización en cada petición HTTP que hagamos. Figura 1 El asistente de ACT nos permite crear un test vacío o a partir de una sesión de Internet Explorer, que es nuestro caso. Al pulsar en “Iniciar grabación” se abrirá una ventana de Internet Explorer Figura 2 <<dotNetManía • Graba scripts de pruebas desde una sesión de Internet Explorer. • Soporta SSL. • Acumula los resultados de los test para su análisis. • Gestiona cookies. • Soporta diferentes tipos de esquemas de autentificación. • Y lo mejor de todo: ¡ya lo tenemos en Visual Studio .NET! 31 << dnm.plataforma.net y comenzará la grabación de la prueba. Cuando hayamos finalizado la navegación necesaria para la generación de nuestro test no tenemos más que pulsar “Detener” en la misma ventana y ACT creará el script que nos permitirá reproducir la prueba. En ocasiones será necesario retocar dicho script para adaptarlo a nuestras necesidades, pero esta tarea es sencilla con ciertos conocimientos de VBScript. Una vez creada la prueba vamos a proceder a lanzarla contra nuestro servidor, pero antes configuraremos los parámetros para simular las conexiones HTTP según nuestros deseos. Es importante que la duración de la prueba sea lo suficientemente grande como para permitir que el rendimiento de la máquina se estabilice. Desde el momento en el que pulsemos “Iniciar prueba” y hasta que demos por buenos los resultados obtenidos es extremadamente importante no manipular el entorno con el fin de adulterar al mínimo el fruto de nuestro trabajo. Recordemos que el mero hecho de introducir un programa de pruebas ya está modificando los resultados en cierta medida (¿alguien recuerda el principio de indeterminación de Heisenberg en clase de física?) Supongamos que esperamos muy poco tráfico hacia nuestra Web, que estará colgada en una intranet, así que ponemos un servidor poco potente. Para comenzar a evaluar el rendimiento de nuestra aplicación vamos a simular 10 usuarios simultáneos con una duración del test de 5 minutos. tadores de rendimiento. Estos contadores de rendimiento nos permiten monitorizar los valores que alcanza un determinado componente del ordenador a lo largo de la prueba y ver en qué momento cada uno de ellos ha llegado al pico de rendimiento. Para comprobar que el ordenador cliente no está limitando el resultado de las pruebas añadiremos un contador de rendimiento que nos indique el porcentaje de procesador en uso a lo largo de la prueba. Sería deseable un porcentaje de uso de procesador en el ordenador cliente inferior al 85% para asegurarnos de no tener la máquina saturada. A la hora de colocar un contador de rendimiento podemos especificar el intervalo en segundos entre mediciones. Hay que tener en cuenta que un valor muy alto hará que las medidas de los contadores sean irrelevantes, mientras que un valor bajo sobrecargará el ordenador cliente, pudiendo alterar el resultado. Figura 4 Figura 7 Cómo analizar los resultados <<dotNetManía 32 Además de los informes ACT dispone de otra herramienta útil en nuestra búsqueda de información: los con- informe por cada una de ellas listo para ser interpretado. Para ver los resultados no tenemos más que hacer doble click encima de cada informe. Si queremos visualizar simultáneamente varios informes podemos seleccionarlos todos. Aquí se muestran las gráficas de las dos pruebas realizadas, mostrando en azul oscuro el número de peticiones totales y en azul claro el número de ellas que fueron erróneas. El gráfico de la figura 6 representa la prueba con 10 conexiones simultáneas, mientras que el de la figura 7 es el resultado de la prueba con 20 conexiones simultáneas. Figura 6 Ahora nos preguntamos qué ocurriría si un día tenemos el doble de usuarios accediendo a nuestra página, así que para contestar a esta duda vamos a doblar el número de usuarios simultáneos (20) y repetimos la prueba. Figura 3 Figura 5 Tan importante o más que saber crear los test es saber interpretarlos de la forma adecuada. Un buen análisis de los resultados de las pruebas puede permitir extraer conclusiones interesantes sobre cómo optimizar nuestra aplicación. Ahora que hemos ejecutado nuestras dos pruebas tendremos almacenado un En la primera de las pruebas hemos obtenido un promedio de 161'42 solicitudes por segundo, mientras que en la segunda ellas hemos obtenido 224'69. ¿Es nuestro servidor capaz de soportar ese número de peticiones? Me temo que no. En el caso de los 10 usuarios simultáneos el 100% de las peticiones fueron atendidas correctamente, mientras que con 20 usuarios sólo lo fueron el 46'03%. El uso de procesador en el ordenador cliente no ha excedido del 70%, así que el límite se encuentra en el servidor, no en el ordenador de pruebas. Con estos datos podemos contestar a la pregunta planteada anterior- << dnm.plataforma.net Coste = ( N * S * media(CPU) ) / media(RPS) obteniendo 161 RPS con 10 conexiones simultáneas y un uso de CPU fue del 90%, así que: Coste = (1 * 1200 * 0'9 ) / 161 ~ 6'7 MHz por petición HTTP Hasta aquí hemos lanzado nuestra batería de pruebas, hemos analizado los resultados para ver la carga que podía soportar nuestro servidor e incluso hemos calculado el coste por MHz de cada petición HTTP que atendemos. Bien, pero ¿cómo podríamos mejorar el rendimiento de nuestra aplicación? ¿la optimización propuesta como afectaría al rendimiento? Para contestar a estas preguntas vamos a introducir una modificación en nuestra página Web para que use la caché de ASP.NET. Colocaremos la siguiente directiva: <%@ OutputCache Duration="60" Location="Server" VaryByParam="none" %> De forma que la salida de la página se almacene en caché durante 60 segundos. Después de esto repetimos las pruebas obteniendo los siguientes resultados para 10 y 20 conexiones simultáneas respectivamente: Número de procesadores S Velocidad de los procesadores Figura 8 Media CPU Porcentaje medio de uso de la CPU Media RPS Promedio de peticiones por Figura 9 segundo En nuestro caso hemos utilizado un servidor con 1 procesador a 1.200MHz, Comparar los resultados de varias pruebas permitirá afinar el rendimiento del servidor y conocer sus limitaciones para anticiparnos a los problemas futuros ¿Cómo interpretamos estos resultados? Si nuestro objetivo es atender el 100% de las peticiones (10 conexiones simultáneas) entonces el uso de caché nos ha proporcionado un aumento del 45% en el número de peticiones atendidas por segundo, con una cierta penalización en TTLB. En cuanto a la relación coste de petición por MHz es ahora de: Coste = (1 * 1200 * 0'9 ) / 235 ~ 4'6 MHz por petición HTTP Conclusiones Donde: N segundo, pero mientras que con 10 conexiones se atendieron el 100% de peticiones en el segundo caso se atendieron sólo el 46'45%. El TTLB con 10 conexiones fue de 8'61 mseg. El uso de procesador se mantuvo sobre el 90%. El número de RPS en el primer caso fue de 235'09 y de 264'10 en el Application Center Test es una herramienta extremadamente útil para conocer el rendimiento que proporcionan nuestras aplicaciones Web y para proponer y medir posibles optimizaciones en ellas. Si queremos extraer todo el jugo de las pruebas debemos hacer hincapié en la definición de los objetivos que hemos de perseguir. Una vez establecidos estos objetivos disponer de un entorno adecuado y controlarlo durante el proceso de test son las garantías para obtener medidas veraces que permitan adoptar las medidas correctoras adecuadas. <<dotNetManía mente: nuestro servidor no sería capaz de soportar 20 conexiones simultáneas. Ahora bien, incluso con 10 conexiones, ¿cómo fue la experiencia del usuario? Este parámetro aparentemente tan subjetivo se puede medir mediante el tiempo medio hasta el último byte (TTLB), que es el tiempo que el usuario espera hasta recibir la petición por completo. Idealmente este parámetro se tendría que decidir antes de terminar la aplicación como una medida de la posible aceptación de la velocidad de navegación. En el caso de la primera prueba, el valor promedio obtenido es de 4'84 milisegundos. Otro parámetro interesante para analizar podría ser el tiempo medio hasta el primer byte (TTFB), que es el tiempo entre la petición y el momento en el que comienza a llegar la información solicitada. Esto incluye, por ejemplo el tiempo que necesita el servidor Web para ejecutar la página. La diferencia entre el TTLB y el TTFB es el tiempo que tardó el servidor en ejecutar la página y el tiempo real de transmisión. Existen otros parámetros que podemos controlar desde ACT, como uso de memoria, red, disco... que podemos añadir según las variables que deseemos analizar. A nivel de costes podría interesarnos conocer el precio que estamos pagando por cada una de esas conexiones. Matt Odhner plantea en su estupenda presentación “Web services testing using Application Center Test” del Teched 2002 una fórmula de cálculo del coste por MHz: 33 Por Peter Varhol DevPartner Product Manager Compuware Corporation Optimización de memoria en aplicaciones .NET Microsoft .NET Framework y el Common Language Runtime (CLR) marcan un cambio significativo en cómo los desarrolladores construyen aplicaciones para la plataforma Windows. El programador se libera de la tediosa tarea del manejo de la memoria usando características de .NET que lo gestionan automáticamente: para ello, .NET Framework ubica memoria a petición y la reclama al sistema una vez que está libre. << Pero en la escritura de aplicaciones no hay nada gratuito. Lleva tiempo averiguar qué memoria está disponible, recuperarla, y devolverla al heap para su uso posterior. Las aplicaciones que utilizan adecuadamente la memoria, aumentan el problema, forzando al sistema a trabajar más y más frecuentemente para recuperar memoria. Con el tiempo, este tipo de comportamiento se traduce en debilidades y comportamientos incorrectos, a veces sutiles y difíciles de encontrar, que perjudican el rendimiento, y reducen la escalabilidad y la fiabilidad. Pero hay soluciones y es cuestión de averiguar dónde se manifiestan los problemas y por qué ocurren. Incluso en un mundo de código administrado, los desarrolladores pueden ayudar a evitar las dificultades y mejorar el rendimiento de sus aplicaciones, si comprenden los mecanismos de gestión de memoria en .NET y cómo usan la memoria las aplicaciones. un grafo de todos los objetos que son accesibles a partir de estos objetos base. Lleva tiempo averiguar qué memoria está disponible, recuperarla, y devolverla al heap para su uso posterior. Las aplicaciones que utilizan adecuadamente la memoria, aumentan el problema, forzando al sistema a trabajar más y más frecuentemente para recuperar memoria. <<dotNetManía Trabajando con el garbage collector 34 El garbage collector (recolector de basura), funciona comenzando con las raíces, con aquellos objetos que no están embebidos dentro de ningún otro. Por ejemplo, los punteros estáticos y globales son elementos básicos. El garbage collector comienza por ahí, y traza referencias a otros objetos del heap, creando Cualquier objeto que no se encuentre en este grafo, es considerado como no utilizado y es devuelto al heap. El garbage collector realiza esta labor recorriendo el heap e identificando los objetos que no forman parte de esos grafos; marca estas direcciones de memoria, y hace un seguimiento hasta que ha terminado de << dnm.plataforma.net De la misma forma, si un objeto sobrevive a la recolección de la generación 1, es promovido a la generación 2. Cuando tiene lugar la recolección se comprueban sucesivamente las 3 generaciones. Si la comprobación de generación 1 libera suficiente memoria, el proceso termina. Si no, el garbage collector continúa con la generación 1 y -a continuación, si se sigue necesitando- con la 2. En la práctica, los objetos de la generación 2 son los más longevos, y a menudo no se recolectan y destruyen hasta que la aplicación no termina. También es posible trabajar con el garbage collector para optimizar el uso de memoria mediante “referencias sutiles” (weak references). Al contrario de lo que sucede con las “referencias fuertes” (strong references), .NET Framework puede recolectar referencias sutiles si la memoria es baja. Se establece una referencia fuerte subclasificando e inicializando un objeto Por razones de eficiencia, el garbage collector también usa un concepto llamado generaciones (generations) para reclamar la memoria. Hay un total de 3 generaciones denominadas 0, 1 y 2 Según los nuevos objetos van siendo añadidos al montón, van pasando, como vimos a la generación 0. Cuando llega el momento de una nueva recolección, el garbage collector determina qué objetos viejos han sido añadidos desde la última recolección y comprueba las referencias a estos objetos para verificar si apuntan a algún objeto nuevo. Si una raíz u objeto apunta a otro de la vieja generación, el garbage collector puede ignorar cualquier referencia más interna de los objetos viejos, reduciendo así gran parte del tiempo requerido para construir el grafo de objetos accesibles. Recolectar los objetos nuevos primero, reduce los fallos de páginas y mejora el rendimiento por que los objetos nuevos se almacenan de forma contigua en el heap. y posteriormente aplicando una referencia sutil mediante la llamada adecuada al Framework. Si el uso de memoria no se incrementa significativamente, la referencia sutil es suficiente para evitar que el objeto sea recolectado. Cuando la memoria escasee, el garbage collector puede realizar su labor y solicitar el espacio necesario. Optimización y recolección de basura Como puede imaginarse, el proceso de recolección de basura requiere recursos de CPU. Tiene la ventaja de mejorar significativamente la velocidad de las asignaciones de memoria respecto a los lenguajes no administrados, ya <<dotNetManía recorrer el heap o la parte seleccionada del mismo. Durante ese proceso, el garbage collector compacta el heap, de forma que la fragmentación de memoria no impida nuevas ubicaciones de objetos debido a la falta de espacio en bloques de memoria grandes. Como consecuencia, esta compactación deja espacio libre al comienzo del heap, donde puede ser reubicada simplemente moviendo el puntero del heap. De esa forma, el garbage collector no tiene que recorrer una lista enlazada para encontrar bloques de memoria, de forma que la asignación de memoria resulta un proceso rápida comparado con otros lenguajes. Por razones de eficiencia, el garbage collector también usa un concepto llamado generaciones (generations) para reclamar la memoria. Hay un total de 3 generaciones denominadas 0, 1 y 2. Cuando los objetos se ubican en memoria al comienzo de la ejecución de un programa, el garbage collector se refiere a esta parte del heap como generación 0. Los objetos de reciente creación, también van a parar a esta generación 0. Estos objetos recientes, todavía no han sido examinados por el garbage collector. De forma que, lo primero que hace el garbage collector, es recorrer esta generación para comprobar si puede reclamar más memoria, y de forma más rápida que su tuviese que recorrer todo el heap. Si hay referencias al objeto cuando tiene lugar la siguiente recolección, el objeto es movido a otra zona llamada generación 1. De esta forma, sólo una parte del heap -aquella que es más susceptible de liberar memoria- necesita ser comprobada cada vez en una estra- tegia que mejora enormemente el rendimiento de las recolecciones individuales. A medida que el heap recibe más objetos, se va llenando hasta necesitar una recolección de basura. Cuando el garbage collector analiza el heap, construye un grafo de los objetos activos, y recolecta el resto. Los objetos que sobreviven a la recolección son ahora más antiguos y se consideran como generación 1. El garbage collector mantiene una tabla de los objetos y de cuándo fueron accedidos, para identificar qué objetos no han sido modificados y son, por tanto, candidatos para la recolección. 35 << dnm.plataforma.net que simplemente tiene que asignar un bloque al comienzo del heap, y mover el puntero de memoria a la siguiente dirección libre. Sin embargo, el proceso potencialmente penaliza algunas de las ventajas. Hacer el seguimiento de referencias de objetos y compactar la memo- Problemas en la gestión de memoria Una vez que se las analiza, las actividades del garbage collector parecen bastante lógicas, pero pueden surgir varios problemas al analizar los detalles. Por ejem- <<dotNetManía También es posible trabajar con el garbage collector para optimizar el uso de memoria mediante “referencias sutiles” (weak references).Al contrario de lo que sucede con las “referencias fuertes” (strong references), .NET Framework puede recolectar referencias sutiles si la memoria es baja 36 ria lleva más tiempo que la liberación manual. Además, las aplicaciones multiproceso complican aún más esta situación. Cuando el garbage collector comienza a reclamar memoria, recupera objetos liberados y mueve el puntero del heap. Cuando un subproceso inicia una recolección de basura, ningún otro subproceso puede acceder a objetos. De hecho todos ellos se detienen hasta que concluye el proceso de recolección. Como puede imaginarse, la recolección automática de memoria y el papel del CLR modifican fundamentalmente la manera de escribir aplicaciones. En el pasado, el desarrollo implicaba el movimiento de bloques de datos en diferentes ubicaciones, manipulando sus punteros. Hoy, el desarrollo significa procesar datos utilizando la creación y personalización de objetos utilizando métodos para actuar sobre los datos que esos objetos representan. La auténtica manipulación de datos en memoria (aunque existe) está oculta al desarrollador, en varias formas. Esto quiere decir que los desarrolladores todavía tendrán que preocuparse acerca de la gestión de memoria, pero en formas muy distintas. En lugar de preocuparse por los detalles particulares de ubicación de zonas de memoria, se centrarán más bien en las correctas estrategias para su utilización. plo, pequeños cambios en la implementación de una solución, pueden originar tremendos cambios en el rendimiento de la aplicación. A continuación analizamos algunos de los casos más significativos. Uno de los más típicos consiste en la creación de demasiados objetos. Como ubicar nueva memoria resulta simple en .NET, podemos olvidar que una sencilla línea de código puede implicar un montón de asignaciones, cosa que no será observada hasta que se requiera su recolección. Algunos de estos problemas están asociados a la creación de objetos temporales para la resolución de procesos de cómputo, como la creación de cadenas temporales (para la construcción de nuevas cadenas por adición, por blemas. Por ejemplo, un problema que puede darse es el de los objetos “huérfanos”, lo que sucede con referencias inadecuadas o con objetos que no son borrados adecuadamente. Si uno de estos objetos está -de alguna formavinculado a una estructura raíz, no será recolectado, incluso si la aplicación ya no lo necesita. Un ejemplo de este tipo es cuando se coloca en caché una referencia a un objeto en una variable miembro estática, y se nos olvida liberarla. El número de objetos ubicados en el montón seguirá creciendo a medida que la aplicación sigue en funcionamiento. Lo que significa dos cosas: primero, que el tiempo necesario para realizar la recolección crecerá; segundo, que -eventualmente- podría copar toda la memoria disponible. Si se crea un objeto que apunta a muchos otros, se forzara al garbage collector a seguir todos los punteros a esos objetos, alargando el tiempo de la recolección. Esto es especialmente negativo en estructuras de larga duración, por que el garbage collector realizará su proceso cada vez que el objeto se modifique. Estrategias para la gestión de memoria Esto significa que la gestión de memoria requiere un buen nivel de comprensión de los procesos de la aplicación, así como de la forma en que .NET Framework manipula la memoria. Así que la construcción de Los desarrolladores todavía tendrán que preocuparse acerca de la gestión de memoria, pero en formas muy distintas. En lugar de preocuparse por los detalles particulares de ubicación de zonas de memoria, se centrarán más bien en las correctas estrategias para su utilización ejemplo, o para la manipulación de enumeradores). Incluso con la estrategia del garbage collector pueden darse ciertos pro- aplicaciones se convierte en una labor de balance entre los pros y contras de ciertas implementaciones y la manera en que afectan a la facilidad de << dnm.plataforma.net Aplicación del análisis de memoria El problema es que se necesita conocer cómo se usa la memoria y cómo ese uso varía cuando se modifica el código fuente. .NET, suministra parte de esa información y podemos acceder a ella mediante los denominados perfmon counters (contadores de rendimiento). Los perfmon counters son útiles para evaluar la gestión de memoria, incluyendo el porcentaje de tiempo que necesita el garbage collector, los tamaños de las generaciones, y el tamaño total del heap. Esto puede ayudar a la hora de determinar cuáles son los objetos de tamaño más inadecuado o la cantidad de información que se procesa en las generaciones y el tamaño del propio heap. Sin embargo, los perfmon counters a veces resultan inadecuados. Carecen del nivel de detalle que se necesita a la hora de la toma de decisiones. No dan indicaciones del porqué el garbage collector toma el tiempo que toma El problema es que se necesita conocer cómo se usa la memoria y cómo ese uso varía cuando se modifica el código fuente. .NET, suministra parte de esa información y podemos acceder a ella mediante los denominados perfmon counters (contadores de rendimiento) para realizar sus tareas, así como tampoco indican qué objetos son temporales y cuáles son de larga duración, ya que la información que suministran es sumaria, y detalla los niveles individuales de utilización. Lo que podemos utilizar en su lugar es una herramienta que pueda llevar a cabo tareas de análisis con control de objetos individuales en el tiempo. Una de esas herramientas es Compuware DevPartner Studio, que incorpora todas esas capacidades, permitiendo un análisis individual y detallado en el tiempo del comportamiento de las aplicaciones. Devpartner Studio, suministra tres vistas fundamentales de la memoria: RAM (memory) footprint (huellas bási- cas en la RAM), objetos temporales, e inconsistencias de memoria (memory leaks). El primer mecanismo nos muestra quién asignó la memoria, de qué objetos se compone, y qué componentes mantienen referencias a ellos. En el gráfico de la figura 1, se nos muestra cómo la memoria está siendo utilizada fundamentalmente por objetos String . Esta situación podría hacernos revisar la utilización de cadenas en una aplicación, por ejemplo. Pero estas huellas básicas, también suministran información adicional. Puede observarse como la aplicación usa cada vez más memoria a medida que sigue su funcionamiento. Por un simple proceso de observación de la memo- Figura 1. La vista RAM footprint nuestra dinámicamente cuánta memoria se asigna y por quién. La figura muestra el conjunto de memoria de trabajo asignada al lanzar la aplicación. <<dotNetManía manipulación, la eficiencia y la facilidad de implementación. ¿Qué tipos de estrategias están disponibles? Desde el punto de vista más simple, uno siempre puede llamar al método Collect() de System.garbage collector, cada vez que piense que necesita realizar una recolección de objetos. Esto suministra un método básico. Esta estrategia es simple aunque muchas veces no resulta óptima. De acuerdo con el MSDN, “se debería evitar la llamada directa a métodos de recolección”, porque hacerlo así, podría originar efectos colaterales inesperados. Por ejemplo, podríamos forzar una recolección en un proceso que, de por sí, ya fuese lento. Esto significa que se requiere un buen conocimiento de las técnicas y un cierto nivel de experimentación para dilucidar el momento adecuado para una recolección manual. La mejor estrategia es doble: comprender cómo .NET Framework gestiona la memoria y tener una imagen precisa de cómo su aplicación la usa. Puede aplicar estos dos tipos de información para diseñar, implementar y modificar su aplicación para optimizar el uso de la memoria. 37 << dnm.plataforma.net Obteniendo lo mejor de la memoria .NET <<dotNetManía Figura 2. El análisis detallado de los objetos temporales permiten ver como se llama a objetos y métodos y desde dónde. 38 ria, podemos determinar qué objetos son potencialmente peligrosos. Para ello, es posible lanzar y detener ese análisis de forma que podamos tomar instantáneas de la situación en diferentes ocasiones. Puede utilizarse el análisis de objetos temporales, para hacer el seguimiento de objetos temporales inusuales, o que permanecen demasiado tiempo en la memoria. Esos problemas son fáciles de resolver, mediante sencillos cambios en el código como cambios en la construcción que los origina, o el momento de su creación. Incluso podemos ver cuáles son los objetos que asignan o que utilizan más memoria, descender a un análisis de métodos y de cuántas veces son llamados a lo largo de un proceso, averiguar desde dónde son llamados y quién les llama (ver figura 2). El gráfico de llamadas suministra una información visual de esta situación, ofreciendo una visión muy precisa de la situación. La tercera de las vistas que se ofrecen, tiene que ver con los memory leaks, antes citados. Cuando se carga, examina donde están ubicados tales objetos, y averigua cuáles mantienen referencias, y por tanto no están siendo tratados por el garbage collector. DevPartner Studio sigue tales objetos y determina los que no están siendo liberados adecuadamente. Esta información también puede llevarnos a modificaciones en el modo de diseño, gracias a esta ayuda. La migración a .NET no significa que no tengamos que preocuparnos por la memoria en absoluto. El problema es que el tipo de situaciones que se plantean son extrañas para la mayoría de los desarrolladores, haciendo difícil que éstos puedan hacer el seguimiento adecuado de los posibles fallos que tengan lugar en las aplicaciones, a pesar del modelo de memoria utilizado. Hasta que no se puedan aplicar los principios de gestión de memoria en su propio beneficio, las aplicaciones corren el riesgo de tener bajo rendimiento, falta de escalabilidad y errores de memoria. Pero comprenderlo no es suficiente. Una estrategia buena para una aplicación puede no serlo para las demás. Tiene una importancia crítica comprender cómo se usa la memoria, tanto a nivel individual como global. También resulta esencial el estudio del uso de la memoria y el garbage collector en el ciclo de ejecución de la aplicación observando los cambios dinámicos y los efectos que esto tiene en el tiempo. Figura 3. La vista de Memory Leaks muestra los objetos que son asignados así como el número de instancias creadas y liberadas, permitiendo hacer un seguimiento de los que no se liberan adecuadamente. Atículo traducido por Marino Posadas Por José Manuel Alarcón Aguín ASP y ASP.NET MVP krasis.com Seguridad de Internet Information Server (y IV) En las anteriores entregas de esta serie de artículos hemos tocado los grandes grupos temáticos relacionados con la seguridad de IIS.Todavía nos quedan por ver,sin embargo,algunos que no se pueden clasificar de forma tan clara y que vamos a tratar ahora para terminar. sos conjuntos de funcionalidad relacionados con la seguridad de aplicaciones Web en Internet Information Server. En las dos primeras entregas hablamos de autenticación y autorización, los dos conceptos fundamentales de cualquier sistema de seguridad. Así, se explicaron los diferentes métodos de autenticación ofrecidos por IIS y aprendimos a limitar el acceso a los recursos del servidor Web para que sólo los usuarios autorizados pudieran hacer uso de las zonas protegidas. Se analizó la manera de fortalecer la seguridad utilizando los permisos de acceso en dos puntos clave: el propio IIS y el sistema de archivos NTFS que, en última instancia, es el que decide si las aplicaciones y usuarios tienen acceso a los recursos solicitados. Una adecuada política en este sentido es el primer paso para conseguir un buen nivel de protección. Por fin, en la tercera parte, se analizaron algunas herramientas gratuitas que elevan la seguridad de IIS, bien configurándolo mejor (IISLockdown Tool, plantillas de seguridad personalizadas), bien aumentando sus capacidades de bloqueo de ataques con una capa intermedia (URLScan). Entretanto, algunas otras técnicas o consejos de protección de IIS que no encajaban bien en estos grupos se han quedado en el tintero, por lo que trataremos de repasar las más interesantes en este último texto. Menos es más Este tópico alcanza su máxima validez al hablar de la protección de sistemas informáticos. Y es que es obvio: cuántos menos elementos tengamos que proteger menores serán las posibilidades de ataque y mayores las probabilidades de permanecer seguros. La primera regla en este sentido es también bastante obvia, pero no por ello huelga enunciarla: “siempre que sea posible utilice los servidores exclusivamente para una tarea”. En nuestro caso, si podemos permitírnoslo, lo único que debería estar funcionando en el equipo servidor debería ser IIS y los servicios de sistema imprescindibles. Con las grandes capacidades que ofrecen los sistemas operativos de servidor de Microsoft y al precio que está el hardware “se ponen los pelos como escarpias” sólo de pensarlo, pero desde el punto de vista de la seguridad es lo más indicado. Siempre será más fácil proteger un equipo así que otro que además ejecute Exchange, SQL Server, sirva archivos e impresoras a la red local, etc…, con su multitud de puertos abiertos, protocolos, programas que pueden fallar o tener agujeros de seguridad desconocidos. Por ejemplo, IIS ofrece algunas extensiones y tipos de archivo que apenas se utilizan en las aplicaciones Web pero que siguen estando disponibles <<dotNetManía << Hasta la fecha hemos tenido la oportunidad de analizar diver- 39 << dnm.servidores.iis para ser invocados a través de HTTP. Si hemos utilizado la utilidad IIS Lockdown Tool vista en la parte precedente, ya estarán en su mayoría desactivadas. En cualquier caso es conveniente que lo verifiquemos. En concreto hay algunas como la .HTR que apenas se utilizan en aplicaciones modernas pero son fuente de conocidos métodos de ataque a servidores IIS y es bueno desactivarlas. Para ello acceda a las propiedades del servicio WWW de IIS y en la pestaña Directorio Particular, acceda a la configuración (Figura 1). Desde la paleta de asignaciones podrá retirar las extensiones que no utilice: • Si no utiliza la inicialización de claves vía Web, elimine la asignación para archivos .HTR. • Si no usa las plantillas del conector de datos de Internet (IDC, una tecnología muy primitiva más antigua incluso que ASP y que nadie utiliza ya), quite IDC. • Si no emplea archivos de inclusión del lado del servidor puede retirar las asignaciones siguientes: .STM, .SHTM y .SHTML. • La impresión por Internet se utiliza en pocas ocasiones. Si este es su caso elimine la asignación para .PRINTER. • Si tiene instalado Index Server para búsqueda de documentos vía Web, y no lo va a utilizar, desinstálelo y/o elimine las asignaciones para los archivos .HTW, .IDA e .IDQ. Los subsistemas de Windows Como seguramente le resultará conocido Windows NT/2000/2003 ofrece varios subsistemas que permiten emular diferentes entornos de ejecución para los procesos. El subsistema más importante es Win32, ya que es en el que se ejecutan todas las aplicaciones escritas específicamente para Windows. Sin embargo existen otros, como Virtual Dos Machine (VDM) para emular MSDOS, WOW (Windows On Windows, para ejecutar aplicaciones antiguas de Windows de 16 bits), OS/2 y también POSIX (Portable Operating System Interface for Computing Environments, un conjunto de interfaces estándar mantenidas por el IEEE e influenciadas enormemente por las premisas de los sistemas operativos UNIX). Los dos últimos es casi seguro que no los va a utilizar nunca, así que puede proceder a eliminarlos y restar así un punto débil más de su sistema servidor. Hacerlo no es una tarea directa pero se puede conseguir con unos pocos pasos que implican tocar el registro y eliminar algunos archivos si tiene estos subsistemas instalados (tenga cuidado al realizar este tipo de operaciones): • Elimine los archivos os2.exe, os2ss.exe y os2srv.exe ubicados en los directorios %systemroot%\system32\dllcache y %systemroot%\system32. • Elimine la carpeta %systemroot%\ system32\os2. • Para el subsistema POSIX borre los archivos psxss.exe, psxdll.dll y posis.exe dentro de system32. • Elimine las siguientes claves del registro de configuraciones con regedit.exe: HKLM\System\CurrentControlSet\Control\Se ssion Manager\Environment\OS2LibPath HKLM\System\CurrentControlSet\Control\Se ssion Manager\Subsystem\Optional HKLM\System\CurrentControlSet\Control\Se ssion Manager\Subsystem\OS2 HKLM\System\CurrentControlSet\Control\Se ssion Manager\Subsystem\Posix Si estamos seguros de no necesitar tampoco los subsistemas WOW o VDM, podemos eliminarlos de la siguente manera: • WOW: suprima ntvdm.exe y krnl386.exe . Borre la clave del registro HKLM\System\CurrentControlSet\Control\WOW. • VDM: basta con eliminar los archivos ntio.sys , ntdos.sys y command.com. Cuidado con esto último no vaya a ser necesario el uso de algún programa antiguo. Es posible que actúe el sistema protector de archivos del sistema, restaurando los archivos que se hayan borrado. Si es así inténtelo desde el modo VGA (o modo a prueba de fallos) o desde la consola de recuperación. <<dotNetManía Retoques en el registro que ayudan a la seguridad 40 Figura 1. Conviene eliminar todas aquellas asignaciones de ejecución relacionadas con extensiones que no vamos a utilizar. La mayoría de los ataques a servidores, independientemente de su sistema operativo, comienzan por la recopilación de toda la información posible sobre el objetivo, un trabajo éste bastante laborioso que implica el uso de diversas técnicas de interrogación de sistemas y enumeración. Un dato muy interesante a la hora de planificar el ataque a un sistema Windows es, sin duda, la lista de cuentas de usuario, con sus nombres, veces que se han utilizado y demás. Esta información es sencilla de conseguir con herramientas automatizadas al alcance de cualquiera, y si nos vemos necesitados, incluso usando la << dnm.servidores.iis CurrentControlSet\Services\LanManServ er\Parameters\RestrictNullSessAccess para que tome el valor 1. Si se establece el mismo valor en la clave: HKLM \System\CurrentControlSet\Control\ LSA\RestrictAnonymous se impedirá la enumeración de cuentas de usuario aún sin haber restringido el establecimiento de sesiones nulas. Ambos ajustes son muy recomendables en servidores de producción. Otra fuente posible de problemas de seguridad son los recursos compartidos para administración que Windows crea por defecto. Éstos tienen el mismo nombre que las unidades de disco disponibles en el sistema seguidas por el símbolo del dólar (C$, D$, etc…). Al modificar una clave del registro se pueden eliminar automáticamente sin necesidad de ir haciéndolo uno a uno, evitando además que surjan nuevos recursos de este tipo si más tarde se agregan nuevas unidades. La clave a tocar es HKLM\SYSTEM\CurrentControlSet\Services\lanmanserver\para meters\AutoShareServer, y el valor ade- cuado que elimina los recursos compartidos del sistema es 0. Otro punto conflictivo que ya se comentó es la impresión a través de Internet. Aunque la desactivemos usando la herramienta de administración de IIS, es posible que al reiniciar el equipo tras una tarea de mantenimiento o algo similar, de forma inadvertida se vuelva a activar el servicio. Esto puede deberse a una política de grupo mal con- figurada por defecto. Para asegurarnos de que no ocurre y de que la impresión por Internet no se vuelve a activar de manera inadvertida podemos establecer la clave HKLM\Software\Policies\ Microsoft\Windows NT\Printers\DisableWebPrinting\DisableWebPrinting para que contenga el valor 1. Ataques DoS y el registro Saltarse la seguridad no se refiere exclusivamente a entrar sin permiso en un sistema. Si un atacante fuese capaz de impedir de algún modo que el servidor haga su función estará dañando gravemente nuestros intereses y para ello normalmente no es necesario saltarse los mecanismos de autenticación y autorización. A este tipo de ataques se les denomina DoS (Deny of Service), o ataques de denegación de servicio. Normalmente se realizan utilizando dos técnicas: • Ataque por inundación con SYN: se envían multitud de peticiones SYN al servidor que luego no se contestan, dejando a éste con los recursos reservados en espera de una respuesta que nunca llegará. Si se consigue que el servidor reserve los recursos suficientes a base de peticiones engañosas masivas de este estilo, llegará un punto en el que se quede sin recursos para atender a las peticiones legítimas, obteniendo el estado de denegación de servicio buscado. • Ataque distribuido para denegación de servicio (DDOS): esta técnica consiste, grosso modo, en un refinamiento de la anterior que utiliza a miles de ordenadores de Internet como espejos en los que reflejar peticiones SYN hacia un único servidor objetivo, amplificando enormemente el efecto del ataque. En este caso además es más difícil parar el ataque ya que se magnifica mucho su capacidad y además es casi imposible detectar quién es el verdadero instigador del mismo, puesto que no lo realiza directamente sino a través de ordenadores “zombies”. La implementación de TCP/IP de Windows trata de proteger al sistema de este tipo de ataques disminuyendo el tiempo que es necesario que transcurra entre una petición y su correspondien- te respuesta para darla por inválida y por lo tanto liberar los recursos asociados. La clave del registro de configuraciones que controla este comportamiento es: HKLM\System\CurrentControlSet\Service s\Tcpip\Parameters\SynAttackProtect. Su valor por defecto 0, es adecuado para condiciones normales. Si le asignamos el valor 1 las conexiones se liberan antes todavía y la protección ante ataques SYN es mejor. El valor 2 refuerza más aún la protección porque, aparte de disminuir más el tiempo de liberación, limita ciertas opciones de los sockets. Figura 2. N-Stealh (nstalker.com) contempla más de 20.000 ataques y vulnerabilidades de los servidores Web más importantes, e incluso nos ayudará a probar nuestros cortafuegos e IDS. Seguridad concerniente a las aplicaciones En ciertos ámbitos técnicos existe una gran obsesión con la seguridad de las comunicaciones y de los sistemas de terceros, pero al mismo tiempo se olvida por completo la seguridad del propio código. En demasiadas ocasiones se tiende a pensar que por tener un carísimo cortafuegos, sistemas de detección de intrusos, etc… se está muy bien protegido. Aunque desde luego es fundamental tener controlados estos aspectos, igual de crucial es escribir código con las garantías suficientes de calidad que eviten que la seguridad, finalmente, se vea comprometida en la propia aplicación que con tanto esmero estábamos protegiendo debido a técnicas de programación pobres e inadecuadas. A lo largo de mi vida profesional me he encontrado (y me seguiré encontrando sin duda) con aplicaciones que utilizan Internet como medio de comunicación <<dotNetManía línea de comandos. Si disponemos de NetBIOS habilitado sobre TCP/IP y el cortafuegos no limita el acceso a través de este medio la información se consigue en pocos segundos. Esto es hasta cierto punto frecuente encontrárselo en algunas empresas que tienen un servidor conectado directamente a Internet, y de todos modos siempre existe la posibilidad de sufrir un ataque interno por lo que todo lo que podamos poner de nuestra parte para que esto sea inviable, mejor que mejor. La técnica favorita para enumerar este tipo de información consiste en utilizar la archiconocida sesión nula de administración de Windows. Se puede eliminar la posibilidad de establecer sesiones nulas estableciendo la siguiente clave del registro: HKLM\System\ 41 << dnm.servidores.iis y que son gravemente vulnerables, a pesar de la encomiable labor de los administradores de sistemas que ha protegido las comunicaciones y los servidores a la perfección. He de confesar que yo mismo he cometido errores de esta índole en aplicaciones desarrolladas hace años, con menos experiencia a mis espaldas. Aparte de una buena educación en seguridad de aplicaciones y un código pensado desde el inicio con la seguridad en mente y revisado después desde esta misma perspectiva, no está de más que los administradores de red echen una mano por si, aún así, se le escapa alguna verificación a los programadores. Existen multitud de aspectos que se deben controlar dependiendo del tipo de <<dotNetManía Figura 3. X-Scan (xfocus.org) no es tan potente como N-Stealh pero tiene gran interés, porque complementa los análisis del servidor Web con otro tipo de informes: NetBIOS, rastreo de puertos, vulnerabilidades de servidores de correo y de SQL Server, etc… 42 aplicación que estemos escribiendo: desde desbordamientos de buffer hasta posibles problemas de canonización de cadenas, pasando por los tan manidos ataques de inyección SQL o Cross Site Scripting. Aparte de estas técnicas fundamentales que es preciso conocer, siempre hay que estar al tanto de cuestiones que nos puedan afectar en el código indirectamente. Por ejemplo, la mayor parte de las aplicaciones deben hacer uso de un sistema gestor de bases de datos. Muchas veces el método utilizado para comunicarse con estos sistemas es usando un controlador ODBC. Esto es especialmente frecuente cuando no hay un verdadero gestor de datos detrás, sino que se utiliza una base de datos Access o similar. Lo que muchos programadores no saben es que es posible encadenar comandos de MS-DOS dentro de consultas enviadas a través de ODBC a Access. Ello se debe a que el controlador JET para ODBC contiene un intérprete de expresiones VBA que facilita mucho ciertos trabajos de programación con los datos, pero que es un peligro de seguridad si no verificamos desde el código las consultas que se envían. Por fortuna el controlador ODBC para Jet tiene un modo de ejecución seguro que evita que los comandos peligrosos tengan efecto (este tipo de modos de aislamiento se suelen denominar genéricamente Sandboxes, “patios de juegos”). Para entrar en este modo basta con asignar el valor 3 a la clave del registro: HKEY_LOCAL_ MACHINE\Software\Microsoft\Jet\4.0\eng ines\SandboxMode puede sustituir el valor “4.0” por la versión del controlador ODBC que tenga instalado. Si dispone de varias versiones instaladas es suficiente con que ajuste la mayor de ellas. Si no existe la clave Sandbox puede crearla manualmente. En el artículo de la Knowledge Base de Microsoft, Q239104 - Jet Expression Can Execute Unsafe Visual Basic for Applications Functions, accesible en: http://support.microsoft.com/default.aspx?sci d=KB;en-us;q239104, se muestran ejemplos de este comportamiento y se da información mucho más detallada de los posibles valores de esta clave del registro y de sus efectos. Es una lectura muy recomendable si trabajamos con JET sobre ODBC. Huelga decir a estas alturas que cualquier cambio que haga en el registro es necesario que lo compruebe suficientemente en un servidor de pruebas antes de decidirse a hacerlo en la máquina de producción. A veces estos ajustes pueden tener implicaciones secundarias que no se evidencian en primera instancia. Compruebe su propia seguridad Por fin, tras estos cuatro meses de estudio sobre seguridad de IIS, sólo nos resta verificar que todo el trabajo realizado no ha sido en vano. Si de veras le preocupa la seguridad y ha seguido las técnicas y consejos explicados en estos artículos le resultará interesante ponerse en la piel de un posible atacante e intentar comprometer usted mismo sus propios sistemas. Es un ejercicio interesante y muy didáctico, que ayuda a fijar los conceptos aprendidos. Existe en el mercado una amplia bibliografía sobre seguridad y ataques a sistemas que vale la pena leer. También se pueden encontrar en Internet cantidad de herramientas (gratuitas y comerciales) de ataque de sistemas que, al igual que están accesibles para usted también están al alcance de cualquier cracker aburrido. Conviene que se haga con algunas de ellas y las utilice para atacar sus propias máquinas y verificar así que las está protegiendo como es debido. En las figuras que ilustran este texto puede ver algunas de ellas en acción. Por fin, aunque su trabajo sea exclusivamente de programador, no está de más que se suscriba a listas de correo electrónico sobre seguridad y sistemas. Son una herramienta de inestimable ayuda a la hora de mantenerse al día en este cambiante mundo. No se duerma en los laureles: cada día parecen nuevos agujeros de seguridad y técnicas de asalto a sistemas. Le conviene conocerlas para poder protegerse de ellas. Figura 4.A través del análisis de los registros de acceso (logs) de IIS es posible detectar intentos de ataque mediante peticiones HTTP e incluso detectar ataques exitosos que habían pasado inadvertidos. Herramientas como Logs2Intrusions (trsecurity.net) o Cyclops (nstalker.com) pueden resultar de mucha utilidad. En resumen En estos cuatro capítulos hemos intentado proporcionar la información más interesante relacionada con la protección de Internet Information Server. Para ello hemos tocado las facetas teórica y práctica de la configuración segura del servidor, y hemos repasado algunas de las herramientas que complementan en este sentido a las propias características de seguridad del producto. Esperamos que le hayan resultado de interés y que, sobre todo, le ayuden en su trabajo, que es lo que al final cuenta. Por Manuel Imaz Consultor Independiente [email protected] Algunos tipos de arquitecturas Después de habernos detenido en nuestros dos artículos anteriores en los fundamentos del concepto de arquitectura de software (ver números de agosto y septiembre) podemos ir viendo algunos tipos de arquitectura, tratando de agrupar esos tipos en conjuntos a los que podamos asignar cierto nivel de generalización como los que muestran Mary Shaw y David Garlan en su clásico libro Software Architecture (1996). << Estilos arquitectónicos Al generalizar los tipos en estilos podremos ver elementos comunes entre los primeros, que es una de las actividades a la que se aplica cualquier disciplina cuando quiere sacar conclusiones un poco más genéricas que las que podría deducir al analizar sólo casos particulares. Para comenzar, los autores aclaran que utilizan tres términos como equivalentes: patrón de arquitectura, modismo arquitectónico (architectural idiom) y estilo arquitectónico, y presentan 5 de estos estilos: Sistemas de flujo de datos De esta forma, es evidente que un estilo arquitectónico define una familia de sistemas en términos de un patrón de organización estructural. En particular, de acuerdo a los autores, un estilo arquitectónico define tanto un vocabulario de tipos de componentes y conectores -como en el caso de filtros y tubos- como un conjunto de restricciones sobre cómo combinar esos componentes y conectores. Veamos algunos de estos estilos: Máquinas virtuales Secuencial en lote Intérpretes Tubos y filtros Sistemas basados en reglas Sistemas de llamada y Sistemas centrados en retorno los datos Sistemas orientados al Sistemas de hipertexto objeto Capas jerárquicas Pizarras Componentes independientes Procesos comunicativos Sistemas de eventos Figura 1. Estilo de tubos y filtros Una de las metáforas utilizadas para el nombre -filtro- no es quizás muy adecuada, porque sugiere que los que ocurre dentro del proceso es retener algunos de los datos y dejar pasar a otros, cuando lo que pasa en realidad es una verdadera transformación de los datos de entrada. La descripción realizada para este tipo de estilo es que cada componente tiene un conjunto de entradas y un conjunto de salidas; cada componente lee corrientes de datos en sus entradas y produce corrientes de datos en las salidas. Normalmente esto se produce aplicando una transformación local a las corrientes <<dotNetManía Programa principal y Bases de Datos subrutina 43 << dnm.arquitectura de entrada y realizando una computación incremental, de tal manera que la salida comienza antes de haberse consumido toda la entrada. Esto en cuanto a la organización, pero si consideramos las restricciones -en particular las invariantes- del estilo, es que los filtros deben ser entidades independientes, es decir ninguna depende del estado o condiciones de ninguna otra. Otra invariante importante es que los filtros no conocen la identidad de los otros, ya sean anteriores o posteriores en la cadena de transformaciones. Las especificaciones se restringen a lo que aparece en las corrientes de entrada, o a garantizar lo que se producirá como corrientes de salida, pero nunca podrán identificar lo que hay al final de estos tubos de entrada y salida. Otro estilo importante es el de abstracción de datos u orientación al objeto, dentro del grupo de los denominados de llamada y retorno. Los componentes de este estilo arquitectónico son los objetos -también considerados originalmente como instancias de tipos abstractos de datos, aunque ahora diríamos clases-. Los objetos son ejemplos de un tipo de componentes que algunos llaman gestor porque es responsable de preservar la integridad de un recurso, es decir la representación. Los objetos interactúan a través de invocaciones de funciones y procedimientos. Figura 2.Tipos abstractos de datos y objetos <<dotNetManía Hay dos aspectos importantes en relación con este estilo: 1) Un objeto es responsable de preservar la integridad de su representación (normalmente, manteniendo algún invariante de la misma) y 2) La representación permanece oculta respecto de los demás objetos. 44 Patrones arquitectónicos Ya se habrá percibido a lo largo de estos artículos la variedad de denomina- ciones y -sobre todo- la dificultad para compartir las definiciones sobre arquitectura. En la sección anterior vemos la propuesta de llamar a los estilos patrones, pero optaremos por reservar este término a algo que está en un nivel distinto de lo que llamamos estilos. Si tuviéramos que relacionar el estilo con algo, podríamos decir que está vinculado a la forma más general en que está organizado un sistema de software, independientemente de consideraciones más específicas (los tipos de objeto que estamos considerando, por ejemplo). En el ejemplos anterior, podemos describir el estilo mostrando entidades genéricas llamadas objetos, y no nos interesa saber a qué tipos de datos abstractos o clases pertenecen. De esta manera, el estilo está asociado a formas generales de organización -sistemas orientados al objeto- mientras que los patrones estarán asociados a formas más concretas, que tienen que ver con la especialización que adoptan los objetos y clases de acuerdo al tipo de aplicación o entorno tecnológico, a técnicas conocidas por su eficiencia para resolver ciertos problemas, etc. Por ejemplo, pensando que el entorno de ejecución de una aplicación puede estar distribuido en distintos elementos -nodos- es aconsejable y beneficioso descomponer la aplicación en capas, correspondientes a los nodos donde podría tener que ejecutarse. Los beneficios de dicha descomposición son varios, entre los cuales se mencionan: 1) Se puede comprender una capa como un todo coherente, sin necesidad de conocer las restantes; 2) Se puede sustituir una capa con implementaciones alternativas de los mismos servicios básicos; 3) Se minimizan las dependencias entre las capas; 4) Las capas son un buen sitio para la estandarización y 5) Una vez implementada una capa, se la puede utilizar para muchos servicios de alto nivel. La descomposición más habitual -es decir el patrón usualmente empleado- es dividir la aplicación en tres capas: 1) Lógica de presentación, que se ocupa de toda la interacción entre el usuario y el software, pudiendo tratarse de un sistema de menús muy simple o una interfaz gráfica de usuario relativamente compleja; 2) La lógica del dominio, también conocida como la lógica de negocio, que es todo lo que necesita conocer la aplicación para poder trabajar con el dominio en cuestión. Implica realizar cálculos basados en datos de entrada o almacenados, validación de cualquier dato proveniente de la capa de presentación y la ejecución de algoritmos específicos en función de los comandos de la presentación; y 3) La lógica de fuente de datos, que se ocupa de comunicarse con otros sistemas que se encargan de tareas en representación de la aplicación. Estos pueden ser monitores de transacciones, otras aplicaciones, sistemas de mensajes, etc. Otro ejemplo de patrón arquitectónico podría ser el de Módulo Tabla, uno de los múltiples patrones presentado por Martin Fowler en “Patterns of Enterprise Application Architecture” (2003). El enfoque tradicional de la orientación al objeto está basado en objetos que tienen una identidad. Es decir que si tenemos una clase Empleado, cualquier instancia de la misma corresponde a un empleado particular. Este esquema funciona bien porque una vez que tenemos una referencia a un empleado, podemos ejecutar operaciones, seguir relaciones y recoger información sobre el mismo. Pero uno de los problemas con este modelo es la interfaz con las bases de datos relacionales. En muchos casos este enfoque se asemeja al del pariente loco, que vive encerrado en un ático y del cual nadie quiere hablar: con frecuencia este enfoque requiere un trabajo considerable de programación para llevar los datos y extraerlos de la base de datos y transformarlos a otro tipo diferente de representación. La ventaja de este patrón es que organizamos la lógica del dominio con sólo una clase por tabla de la base de datos, ya que una única instancia de la clase contiene los diversos procedimientos que se aplicarán a los datos. La diferencia fundamental con un esquema clásico -llamado también Modelo de Dominio- es que, si tenemos varios pedidos, este último modelo empleará un objeto por cada pedido, mientras que el Módulo Tabla tendrá sólo un objeto para manejar todos los pedidos, con lo cual aumentamos la granularidad de los objetos de la aplicación. Como hemos podido ver, la diferencia entre los estilos y patrones arquitectónicos está en el nivel de abstracción en el que nos movemos. Los estilos se apli- << dnm.arquitectura Arquitecturas orientadas a servicios Hasta ahora nos hemos centrado en la aplicación, considerándola como una unidad de ejecución de un procesador o -cuando la visión se amplía y la distribuimos entre nodos- un grupo de procesadores. Por eso también tenemos que considerar patrones arquitectónicos para que esa descomposición sea adecuada y eficiente en función de los factores considerados. Pero el concepto de aplicación sigue ampliándose, ya no se reduce a un grupo humano que interactúa con el software dentro de los límites de la empresa u organización. La Web nos ha conducido a generalizar lo que en un origen estaba en algún nodo corporativo y a pensar que algunos de los componentes de la aplica- ción pueden estar donde sea más rentable o adecuado que estén. Si necesitamos acceder a algún sitio de la Web para poder ejecutar nuestra aplicación, diremos que estamos utilizando un servicio de Web. Algunas definiciones genéricas que encontramos en la Web nos plantean que un servicio de Web puede ser incluso el FTP (File Transfer Protocol), que se podía acceder en los 1990 sólo desde un comando Unix, pero que desde 1995 podía accederse desde un navegador Web. Esto se denominaba una “evolución” de los servicios Web y todavía no tenían nada que ver con el uso de XML. Por otro lado, la orquestación es considerada como la coordinación de eventos de un proceso, también superponiéndose con el concepto de coreografía. La orquestación dirige y gestiona el ensamblado sobre demanda de múltiples servicios componentes para crear una aplicación o proceso de negocio compuesto. La orquestación tiende a ser considerada como una única fuerza coordinadora, mientras que la coreografía también se aplica a una coordinación compartida a través de múltiples sistemas autónomos. La tendencia actual -después de haberse evaluado varias especificaciones en com- El estilo está asociado a formas generales de organización -sistemas orientados al objeto- mientras que los patrones estarán asociados a formas más concretas Si nos obligaran a resumir este concepto, podríamos decir que un servicio Web es “una función de negocio autocontenida que opera en Internet”. En algunos sitio de la Web (http://www.service-architecture.com) se considera que los servicios son lo que conectamos utilizando los servicios Web, Un servicio es el punto final de una conexión. Además, un servicio tiene algún tipo de sistema de computación subyacente que soporta la conexión ofrecida. La combinación de servicios -internos y externos a la organización- configura una arquitectura orientada a servicios. Al ser más compleja la coordinación de todos estos servicios para obtener como resultado una aplicación, también es necesario apelar a conceptos -metáforas- utilizados en actividades de coordinación de conjuntos: coreografía y orquestación. Y también es cierto que aparecieron es ese orden. El W3C creó un grupo de trabajo con la intención de desarrollar un estándar para describir los vínculos y patrones de uso entre los servicios de Web. El grupo considera a la coreografía un equivalente de los conceptos de orquestación, de colaboración, coordinación, etc. petición- está convergiendo en considerar la propuesta conjunta de IBMMicrosoft-Bea como especificación BPEL4WS (Business Process Execution Language for Web Services) como el estándar principal para la orquestación de los servicios Web. Es decir que no sólo se trata de la organización en componentes y sus vinculaciones, de añadir incluso las decisiones más importantes, sino que a partir de ahora se trata de una coordinación compleja de eventos para lograr un resultado en el que se integran servicios que están distribuidos en diversos sitios de la Web (la propia instalación de la empresa, la de sus clientes, proveedores y partenaires) junto a las propias intervenciones de los usuarios en un todo -proceso de negocio genérico- que combina servicios de software y acciones humanas. En el nuevo modelo de empresa ágil y eficiente, el software deberá implementarse como componentes para una fácil reutilización y adaptación a las arquitecturas orientadas a servicios. La orquestación es una lógica de negocio que secuencia, coordina y gestiona conversaciones entre servicios Web. <<dotNetManía can a un nivel muy alto de abstracción, en el cual no interesa saber cuál es la semántica de los elementos que estamos utilizando, sólo hablamos de filtros, tubos u objetos sin interesarnos por lo que están representando. En el caso de los patrones, tenemos en cuenta el significado de los filtros, tubos u objetos, tal como hemos visto en los patrones de descomposición en capas -en el que se habla de presentación, dominio de aplicación y de datos- o en el de Módulo Tabla, que diferencia entre un objeto que representa un elemento -una línea de una tabla o registro- u otro objeto que representa la totalidad de la tabla. Otro aspecto importante que menciona Fowler -pero que adjudica a Ralph Johnson- es que la arquitectura es algo subjetivo, una comprensión compartida del diseño de un sistema por parte de los desarrolladores de un sistema. En general, esta comprensión compartida está expresada en términos de los principales componentes del sistema y de sus interacciones. Pero es también sobre las decisiones, en especial aquellas que deben tomar correctamente al principio del proyecto porque se las considera difíciles de cambiar. Este componentes de subjetividad se debe al hecho de que si algo resulta más fácil de cambiar de lo que imaginábamos al comienzo, deja de ser una decisión arquitectónica o sobre la arquitectura. 45 Por Octavio Hernández C# .NET MVP Grupo Danysoft Novedades en Delphi 2005 Lo primero que salta a la vista de Delphi 2005 es su voluntad integradora, pues incluye bajo un único entorno de desarrollo la posibilidad de crear software tanto para Win32 como para .NET Framework,utilizando como lenguajes de programación Delphi o C#. <<dotNetManía << En la conferencia 46 de desarrolladores Borland celebrada a mediados de septiembre en San José, California, se habló por primera vez oficialmente en sociedad de Delphi 2005, la nueva versión de Delphi que estará en el mercado a partir de noviembre o diciembre de este año y que pretende ser una versión revolucionaria del producto (la versión definitiva, a decir de sus creadores), pues integra dentro de sí toda una serie de características que anteriormente formaban parte de productos diferentes, y además incluye una gran cantidad de novedades que sin duda serán bien recibidas por la fiel comunidad de programadores de Borland. Con esta versión se pone broche de oro a una década durante la que se han venido sucediendo versiones cada vez más potentes del producto, desde que la primera versión (aún para Windows 3.1) apareció en el mercado en 1995. De lo que ha significado Delphi para el mundo del desarrollo del software habla claramente el hecho de que los principios fundamentales en los que se basaba ya aquella versión -un lenguaje orientado a objetos y una filosofía de desarrollo visual basado en componentes reutilizables- constituyen hoy los pilares en los que se apoyan los sistemas de programación más populares, incluyendo Visual Studio .NET. Este artículo describe las principales características que incorporará el nuevo producto, según lo que hemos podido comprobar personalmente “jugando” con la versión de evaluación que ha llegado a nuestras manos y escuchar de primera mano de sus creadores. Presentación del producto Lo primero que salta a la vista de Delphi 2005 es su voluntad integradora, pues incluye bajo un único entorno de desarrollo la posibilidad de crear software tanto para Win32 (dando así continuidad a Delphi 7) como para .NET Framework, utilizando en este último caso como lenguajes de programación el tradicional Delphi (extendiendo la herencia de Delphi 8 para .NET) o C# (lo que antes se ofrecía como un producto independiente, Borland C# Builder). O sea, que el producto al que nos enfrentamos es la materialización de la idea de un único Borland Developer Studio (BDS) a la que ya apuntaba la estructura de directorios de las versiones actuales de los productos para .NET Framework. Cabe esperar que en un futuro no lejano se incorporen a ese entorno unificado más lenguajes, como C++ Builder (versión VCL) o el mismísimo Visual Basic .NET. Figura 1. Las personalidades de Delphi 2005 << dnm.laboratorio.net ¿Qué tipos de proyectos se pueden desarrollar con Delphi 2005? Prácticamente todos los tipos de proyectos que podían crearse con las versiones precedentes de los productos incorporados a la suite, tanto en el caso de proyectos para Win32 como para .NET Framework, aplicaciones de escritorio como aplicaciones o servicios web, o componentes reutilizables. Un vistazo al nuevo Almacén de Objetos (figura 4) nos convencerá de ello. Figura 4.El Almacén de Objetos de Delphi 2005 Figura 2.La instalación de Diamondback La apariencia inicial del entorno de desarrollo una vez instalado el producto se muestra en la figura 3. Se trata de un entorno altamente configurable, repleto de características que permiten elevar la productividad, y que al mismo tiempo respeta las combinaciones de teclas, estructuras de menú, etc. de versiones anteriores, de modo que los usuarios puedan adaptarse a él fácilmente y adecuarlo a sus preferencias. A continuación, comentaremos brevemente las principales novedades que incluirá Delphi 2005, que hemos agrupado en categorías relacionadas. Los usuarios actuales de Delphi 7 y 8 encontrarán aquí materializadas muchas de las sugerencias que han venido haciendo durante los últimos dos años al fabricante. Novedades en el entorno de desarrollo Bajo este punto hemos clasificado a diversas características que se han añadido al entorno de desarrollo y que en general son aplicables a todas las personalidades incluidas en Delphi 2005. Refactorización y otras posibilidades de mejoramiento del código fuente Figura 3.El entorno de desarrollo (apariencia inicial) La refactorización es uno de los términos más populares en el mundo del desarrollo en la actualidad. Bajo este término se aglutina a todo un conjunto de técnicas dirigidas a modificar de un modo automático o semiautomático el código fuente de un proyecto para mejorar su calidad (arquitectura, estructura, claridad). Delphi 2005 ofrece varios tipos de refactorización, entre los que se encuentran: • Extraer método. Este asistente permite convertir un conjunto de líneas de código fuente seleccionadas en un método independiente, mejorando así la estructura del código. Un sofisticado análisis de flujo permite al asistente determinar qué parámetros de entrada o salida deberán asociarse al método. • Declarar variable. El análisis sintáctico “al vuelo” del código fuente permite ahora detectar el uso de variables no declaradas, y seleccionando la opción correspondiente, Delphi 2005 nos sugerirá el nombre y tipo de la variable a declarar e insertará para nosotros la declaración en el lugar correspondiente. • Extraer cadena de recursos. Este asistente permite extraer las cadenas de caracteres “cableadas” en el código fuente hacia un fichero de recursos para simplificar la posterior internacionalización o localización del código. • Renombrar. La capacidad de renombrar un identificador a lo largo de todo un proyecto (que puede incluir módulos escritos en diferentes lenguajes) es otra posibilidad que ayuda a mejorar la legibilidad y mantenibilidad del código. Otra nueva característica relacionada con ésta es la conocida como edición síncrona: al cambiar el nombre de una variable, automáticamente cambian todas las apariciones de ese identificador en el bloque de código seleccionado. Mejoras generales en el entorno Entre las numerosas mejoras, destacaremos que varias ventanas del entorno integrado (por ejemplo, el Gestor de Proyectos, la Paleta de Componentes, el Diseñador VCL, <<dotNetManía Durante la instalación de Diamondback (el nombre de guerra bajo el que se ha conocido el producto hasta ahora), el usuario tiene la posibilidad de elegir una o más personalidades o perfiles de trabajo, según muestra la figura 1. La instalación del producto, basada en la tecnología MSI, es bastante similar a la de las versiones anteriores de los productos de desarrollo de Borland, si bien ahora es obligatoria la instalación previa de diversos prerrequisitos externos, entre los que se encuentra el .NET Framework 1.1, puesto que el nuevo entorno integrado se basa en código manejado. 47 << dnm.laboratorio.net el Panel de Estructura) han mejorado notablemente en apariencia y funcionalidad con relación a Delphi 8. La tecnología Error Insight permite subrayar instantáneamente los errores en el código fuente, mientras que Help Insight permite que al posar el ratón sobre un identificador cualquiera se muestre una pequeña ventana emergente con información asociada al símbolo en cuestión. Histórico de versiones del código fuente Delphi 2005 mantiene ahora un histórico de los cambios realizados a los ficheros fuente, a la manera de un sistema de control de versiones local, y nos permite comparar versiones de ficheros, volver a versiones anteriores, etc. Este mecanismo está disponible en todas las ediciones de Delphi 2005; en el caso de las ediciones superiores, funciona en perfecta coordinación con StarTeam, la herramienta de control de versiones de Borland. de los módulos de código manejado, el depurador no sólo muestra el código intermedio (MSIL), sino también el código nativo resultante de la compilación JIT de éste. <<dotNetManía Mejoras en el depurador 48 El depurador de Delphi 2005 incluye varias nuevas posibilidades: • Depuración simultánea de proyectos Win32 y .NET. Ambos depuradores han sido compatibilizados para hacer esto posible. • Vistas más detalladas de puntos de interrupción, variables locales y marcos de pila. • Visualización simultánea de código MSIL y código nativo para procesos .NET. En el caso Por supuesto, para los desarrolladores de Delphi constituye una gran ventaja la incorporación de C# como lenguaje de desarrollo en Delphi 2005. No Delphi 2005 mantiene ahora un histórico de los cambios realizados a los ficheros fuente y nos permite comparar versiones de ficheros, volver a versiones anteriores, etc. Herramientas para pruebas unitarias (unit testing) Delphi 2005 incluye mecanismos para la creación y ejecución de pruebas unitarias, recurso muy en boga actualmente gracias en gran medida al impulso que le ha proporcionado la teoría de la Programación Extrema de Kent Beck. Estas técnicas podrán ser aplicadas tanto a proyectos Win32 (DUnit) como .NET (NUnit). Mejoras para el desarrollo web Figura 5.La pestaña Historia posibilita una mejor gestión de cambios Posibilidad de utilización de C# Entre las nuevas facilidades que ofrece el entorno integrado para el desarrollo Web cabría destacar las siguientes: • En primer lugar, el editor HTML incluido en Delphi 2005 ha sido mejorado sensiblemente para facilitar el diseño visual de páginas web, tanto para Win32 como para ASP.NET. • Como ya sucedió con Delphi 8 para .NET, el entorno permite desarrollar y depurar las aplicaciones Web utilizando Cassini, un servidor web muy ligero que hace posible agilizar y simplificar nuestro trabajo. • Delphi 2005 incluye un nuevo Gestor de Despliegue para automatizar la tarea de desplegar los sitios Web mediante diferentes métodos (XCOPY, FTP). sólo tendrán a su alcance la posibilidad de estudiar el lenguaje por excelencia de .NET Framework y de crear desde cero todo tipo de proyectos con él, sino que además podrán importar todo tipo de proyectos desarrollados, por ejemplo, con Visual Studio .NET e incluso incorporar módulos creados con C# a sus proyectos .NET (¡el Motor Común de Lenguajes en acción!). Novedades en el lenguaje y el compilador de Delphi Ya en Delphi 8 para .NET, el lenguaje Delphi fue extendido con nuevas construcciones para dar cabida a los nuevos conceptos de programación incorporados por Microsoft a .NET Framework. Con Delphi 2005, las adiciones al lenguaje de programación (siempre respetando escrupulosamente la compatibilidad hacia atrás) aparecen para cumplir uno de los dos siguientes objetivos: a)Mantener en la medida de lo posible la compatibilidad 100% a nivel de código fuente entre Delphi para Win32 y Delphi para .NET; ahora prácticamente todas las construcciones añadidas en Delphi 8 (con contadas excepciones, como los atributos) están disponibles también bajo Win32. Entre ellas podemos mencionar: << dnm.laboratorio.net • Campos y propiedades de clase. En Delphi 7 sólo era posible definir métodos de clase (estáticos, en terminología C#). • Especificadores de visibilidad de miembros de clases. Delphi 8 añadió los especificadores de visibilidad strict private y strict protected a las ya tradicionales private y protected, que permitían la referencia desde otros elementos de código situados en la misma unidad (pero fuera de la clase). Los compiladores para Win32 y .NET también han sido unificados en la medida de lo posible e incluyen algunas nuevas posibilidades, como la expansión en línea de llamadas a funciones para aumentar el rendimiento. Por último, en los nuevos compiladores para .NET se han resuelto las incompatibilidades que impedían en versiones anteriores generar aplicaciones para .NET Compact Framework, informes y presente en Visual Studio .NET. • Para el desarrollo Web simultáneo bajo Win32 y .NET, se incluyen en Delphi 2005 ambas versiones de IntraWeb (edición Borland). • En lo que respecta al desarrollo Web ASP.NET, los controles DBWeb han sido mejorados y ampliados, incluyendo ahora los nuevos controles DBWebVideo y DBWebSound para el uso de recursos multimedia en aplicaciones web. en el acceso a Delphi 2005 es un fiel exponente de la filosofía de Borland, Novedades datos orientada a ofrecer al cliente no sólo la herramienta de Con la incorporación de DBGo a la desarrollo, sino toda una gama de productos para una com- VCL.NET comentada anteriormente, las cuatro tecnologías de acceso a datos displeta gestión del ciclo de vida de las aplicaciones por lo que con Delphi 2005 se podrán compilar aplicaciones para SmartPhone y Pocket PC, si bien éstas no se podrán depurar dentro del entorno. Novedades en las librerías Para hacer aún más atractivo el producto, se han incorporado varias nuevas librerías: • En lo que respecta a la VCL y la VCL.NET, se han incorporado a estas últimas algunos componentes que no estaban presentes en Delphi 8 para aumentar la compatibilidad entre ambas. • Delphi 2005 incluye ahora DBGo, la página de componentes para el acceso a datos a través de ADO, tanto para el desarrollo de aplicaciones Win32 como .NET. Esta es una de las peticiones que más hemos escuchado de los desarrolladores con relación a Delphi 8. • Para la generación de informes, Delphi 2005 no sólo incluye Rave Reports (tanto Win32 como .NET), sino que además incluye Crystal Reports .NET, estándar mundial en el desarrollo de Nuevos componentes para el acceso a datos El Proveedor de Datos de Borland (BDP) ha sido mejorado, y ahora adicionalmente ofrece acceso nativo de alto rendimiento (como en el caso de InterBase, Oracle, DB2, SQL Server y Access) a bases de datos Sybase. Adicionalmente, la página de componentes del BDP incluye varios nuevos componentes muy interesantes que en principio no están limitados a utilizar conexiones BDP, como RemoteConnection y RemoteServer (des- <<dotNetManía b)Seguir dotando al lenguaje de nuevos recursos que lo mantengan al nivel de la “competencia” (léase C# o Java). En esta categoría podemos mencionar: • Uso de Unicode en identificadores. ¡Ahora podremos utilizar la 'ñ' y las letras acentuadas en nuestros identificadores! • Espacios de nombres compuestos por múltiples unidades. Las unidades ahora podrán tener nombres del tipo MiEspacioDeNombres.MiUnidad; de este modo se hace posible aprovechar en Delphi todas las ventajas de los espacios de nombres. • Bucle for…in. Delphi 2005 incluye ahora (tanto para Win32 como para .NET) un nuevo tipo de bucle similar al foreach de C# para iterar por los elementos de un array, conjunto o colección. • Comentarios de documentación. Una sintaxis especial de comentarios, muy similar a la definida por Microsoft para C#, facilitará la generación de documentación XML para las unidades de Delphi. ponibles en Delphi 7 (BDE, DBExpress, DBGo - anteriormente ADOExpress - e IBExpress) quedan a disposición de los desarrolladores para ser utilizadas tanto de cara a la migración de proyectos Win32 hacia .NET como a la creación y posterior mantenimiento de aplicaciones “portables”, capaces de ser compiladas para ambas plataformas a partir de un mismo código fuente. En lo relativo al acceso a datos desde aplicaciones 100% .NET, resulta obligado mencionar varias novedades interesantes: 49 << dnm.laboratorio.net tinados a simplificar el acceso a conjuntos de datos remotos a través de .NET Remoting), así como DataHub y DataSync, cuyo objetivo es permitir la integración de datos provenientes de diferentes bases de datos a un único conjunto de datos en memoria y resolver las actualizaciones correspondientes. Por último, se incluye un nuevo componente, llamado BdpCopyTable, para simplificar las tareas de migración de datos en tiempo de ejecución. terísticas que sólo están presentes en la edición Architect, la más potente de todas, ideal para arquitectos y diseñadores de software. Integración con herramientas de Gestión del Ciclo de Vida Es de destacar aquí que Delphi 2005 es un fiel exponente de la filosofía de Borland, orientada a ofrecer al cliente no sólo la herramienta de Figura 6.El Explorador de Datos mejorado Mejoras en el Explorador de Datos y los asistentes de acceso a datos <<dotNetManía El Explorador de Datos de Delphi 2005 ha sido potenciado, y desde él es ahora posible realizar diversas tareas, como crear tablas y vistas, consultar o migrar datos, visualizar los parámetros de procedimientos almacenados y otras. Adicionalmente, se incluyen en el entorno algunos asistentes que estaban ausentes en Delphi 8 y que causaban pequeñas incomodidades a la hora de programar el acceso a datos, por ejemplo a la hora de crear cadenas de conexión para bases de datos accedidas a través de proveedores distintos del BDP, o al rellenar los parámetros de procedimientos almacenados. 50 Novedades en la edición Architect Hemos dejado para el final las carac- desarrollo, sino toda una gama de productos para una completa Gestión del Ciclo de Vida de las Aplicaciones (ALM - Application Lifetime Management). Como tal, el producto incluye la posibilidad de integración con Caliber ciones y control de versiones; y OptimizeIt para .NET, una herramienta muy útil de cara al perfilado y optimización del rendimiento de las aplicaciones. Versión 2 de la tecnología ECO En lo que respecta a la fase del análisis y diseño del software, Borland apuesta en el caso de Delphi y C# Builder por la tecnología ECO (Enterprise Core Objects), una tecnología que, en nuestra modesta opinión, ha alcanzado su madurez con la versión 2.0, que estará disponible en Delphi 2005. Con ECO, la productividad se eleva a nuevas alturas gracias al desarrollo guiado por los modelos. Al hacer uso de esta tecnología, una gran parte del código fuente (Delphi o C#), desde la capa de acceso a datos hasta la interfaz de usuario (ya sea basada en formularios Windows o formularios Web), puede ser generada y mantenida automáticamente a partir de los diseños UML. La persistencia de los objetos la garantiza la tecnología Objeto/Relacional de ECO, que permite mapear los modelos a bases de datos de cualquiera de los SGBD soportados. Integración con aplicaciones J2EE y CORBA a través de Janeva Figura 7.La página de componentes ECO en acción RM, la herramienta para la gestión de requisitos de la compañía; StarTeam, herramienta de gestión de configura- Por último, la edición superior del producto incluye una licencia de desarrollo de Janeva, una librería de clases .NET desarrollada por Borland para facilitar la comunicación con aplicaciones y componentes J2EE y CORBA. Adicionalmente, el entorno de desarrollo incorpora diferentes asistentes de integración que generan la práctica totalidad del código fuente necesario para gestionar esa comunicación. << dnm.mvp.online Jorge Serrano << Comenzamos a pleno rendimiento esta nueva sección, no sin Con la salida de Microsoft Windows XP SP2, son muchos los comentarios que se han escuchado en diferentes medios escritos y digitales a favor y en contra de esta nueva actualización del sistema operativo más utilizado en el mundo Esto es justamente lo que en esta ocasión quiero poner de relieve, los comentarios basados en la experiencia de uno de los MVPs hispanos sobre una información que apareció en Internet con relación al SP2 de Windows XP y que levantó cierta intranquilidad entre los usuarios de este extendido sistema operativo. Además, aprovecharemos el artículo para comentar un interesante truco para que el administrador elimine aquellas aplicaciones prohibidas o incómodas que se ejecutan en una red. Figura 1. Pantalla general del Centro de Seguridad de Windows XP SP2 Windows XP SP2, su extraña puesta en escena Con la salida de Microsoft Windows XP SP2, son muchos los comentarios que se han escuchado en diferentes medios escritos y digitales a favor y en contra de esta nueva actualización del sistema operativo más utilizado en el mundo, sin embargo, muchas de las voces contrarias, se han formulado bajo el desconocimiento en algunos momentos, y bajo la batuta orquestada de quien prefiere desinformar o quien tiene el prejuicio de hablar mal sobre un tema sin tener pruebas clarividentes. Por esa razón, José Manuel Tella Llop (MVP DTS), decidió aportar a la Comunidad sus comentarios y estudios acerca del sistema operativo Windows XP SP2 funcionando en redes P2P. El objetivo era claro, olvidar el mito surrealista acerca de los comentarios y problemas técnicos del uso de redes P2P en sistemas operativos Windows XP SP2, y acercar al usuario a la realidad absoluta de lo que hay por detrás. Windows XP SP2 y las redes P2P, mitos y realidades José Manuel reconoció su preocupación sobre las informaciones que estaban circulando por Internet, especialmente en las que se decía que en Windows XP SP2, existía una limitación clara sobre el número de conexiones TCP/IP, impidiendo el normal funcionamiento en diferentes aplicaciones como por ejemplo las aplicaciones P2P. Ante estas afirmacio- <<dotNetManía antes recordar el esfuerzo y dedicación que los MVPs tienen en todo el mundo, y que gracias a él, dan un soporte adicional y un valor añadido a otros usuarios de tecnologías Microsoft. Sus contribuciones en la Comunidad son en algunas ocasiones, sobresalientes. Muchas veces, los usuarios plantean sus problemas, dudas y consideraciones sobre los productos Microsoft en diferentes lugares, Internet, newsgroups, blogs, páginas web, etc., que son respondidas a diario por cientos de MVPs. Sin embargo, hay ocasiones en que las preguntas y dudas superan cierto nivel y es ahí dónde aparecen en escena algunos MVPs ofreciendo explicaciones o soluciones muy interesantes no sólo para quien plantea su pregunta, sino para otra amplio grupo de profesionales que quizás nunca se planteó determinadas cosas. De esta forma, en muchísimas ocasiones una duda o pregunta genera al MVP una inquietud mucho mayor. La inquietud lleva casi siempre a un proceso de investigación específico que da como resultado una serie de explicaciones muy útiles para el usuario. Explicaciones que muchas veces no se encuentra ni siquiera en ninguna página de Microsoft. 51 << dnm.mvp.online <<dotNetManía nes, José Manuel nos comenta lo siguiente, lo cuál transcribo para no perder ni un ápice la forma y contenido del mismo: 52 A pesar de que yo no soy partidario del uso que se da a los programas P2P y nunca doy soporte a los mensajes sobre ellos, creo que merece la pena aclarar el punto de la limitación de las conexiones del SP2 y su posible influenJosé Manuel Tella cia en los programas P2P. La noticia que circula por la red es mentira, simplemente porque, o bien a propósito, o bien por desconocimiento de lo que hablan, es incompleta: Windows XP SP2, por motivos de seguridad y para impedir o limitar la reproducción de gusanos estilo Blaster y Sasser, efectivamente limita a 10 el número de conexiones salientes TCP/IP. Veamos un poco la frase anterior: cualquier técnico en redes y TCP/IP, ante esa frase, simplemente diría: Windows XP no puede navegar en Internet. No puede funcionar en redes. 10 conexiones es un número ridículo para cualquier cosa. No es posible que Microsoft, ni nadie, haya puesto esa limitación. Realmente la noticia anterior es mentira: la frase exacta (que no la he visto todavía en ninguna de esas páginas de la red) es: Windows XP SP2 limita a 10 el número de apertura de sockets salientes POR SEGUNDO siempre y cuando sean además AL MISMO PUERTO DESTINO. Ligera matización sin duda, que cambia totalmente el panorama. Es decir, por ejemplo. Impide que un gusano que use las maneras de reproducirse del Blaster y Sasser, que en la actualidad abren miles de conexiones por segundo al mismo puerto destino (puertos RPC), sea capaz de reproducirse con la celeridad con que lo hicieron los gusanos anteriores en su día. Esto no limita en absoluto los programas P2P. Veamos el por qué: los programas P2P abren conexiones normalmente al mismo puerto destino, ya que los usuarios no suelen tocar el número de puerto que usan (es configurable), por lo que normalmente podemos afirmar que un 99% de las máquinas tienen el puerto por defecto (4662 TCP). Los usuarios pueden configurar cualquier puerto del 1024 al 65535, por lo que puede haber una distribución del rango de puertos que haría improbable el conectarse siempre al MISMO puerto. Pero, lo más importante: el propio eMule sólo permite 20 conexiones cada 5 segundos (4 por segundo) configurable también, pero este es el valor por defecto-, por lo que el SP2 permite incluso 2.5 veces más de conexiones que lo que necesita el propio programa P2P. La limitación de las conexiones por segundo es muy normal en todos los programas TCP/IP, sean o no programas P2P, ya que en otro caso, se corre el peligro de saturar las conexiones en la pila TCP, debido precisamente a los time-out de las conexiones finalizadas y que existen tal y como está definido en las RFC del TCP/IP (las normas TCP) que respetan al pie de la letra todos los sistemas operativos, sean o no de Microsoft. Las conclusiones ante esto son evidentes. Noticia tergiversada a propósito, bien por mala fe, o bien por incultura de los que publican dichos artículos. Meditad sobre la calidad de las páginas web que difunden dichas afirmaciones. Por otra parte, este parámetro del número de conexiones por segundo, está hardcoded. Es decir, está implementado en el driver TCP/IP y no puede configurarse en el registro de Windows (otra información incorrecta de algunas webs). Igualmente en otras páginas, se ha difundido un fix para parchear el driver tcpip.sys de Windows. Por ejemplo: http://www.lvllord.de Evidentemente el tocar a pelo un driver del propio sistema operativo implica quedarse sin soporte del producto. Esto puede que no haga meditar a las personas que lo instalan, pero que se planteen igualmente un par de cuestiones: • ¿Por qué montar una cosa que no es necesaria ya que el programa P2P necesita por segundo la cuarta parte de conexiones por segundo que el SP2 le permite?. • ¿Por qué usar un fix de procedencia dudosa que puede meternos cualquier otro regalo en nuestra máquina?. Recordemos, que si únicamente el fix hace lo que dice hacer, también podemos hacerlo nosotros a mano con un editor hexadecimal sobre el propio driver -un proceso totalmente elemental-. La noticia que circula por la red es mentira, simplemente porque, o bien a propósito, o bien por desconocimiento de lo que hablan, es incompleta: Windows XP SP2, por motivos de seguridad y para impedir o limitar la reproducción de gusanos estilo Blaster y Sasser, efectivamente limita a 10 el número de conexiones salientes TCP/IP << dnm.mvp.online Realmente la noticia anterior es mentira: la frase exacta (que no la he visto todavía en ninguna de esas páginas de la red) es: Windows XP SP2 limita a 10 el número de apertura de sockets salientes POR SEGUNDO siempre y cuando sean además AL MISMO PUERTO DESTINO En segundo lugar, crearemos un fichero de texto en el que pondremos el nombre de los programas que queremos eliminar o matar en las máquinas remotas. Un ejemplo de este fichero sería el contenido de progs.txt: eMule.exe Notepad.exe En tercer lugar, deberíamos crear un fichero de texto para indicar las máquinas sobre las que queremos actuar, ya sea el nombre de las máquinas o la dirección IP de ellas. Un ejemplo de este fichero sería el contenido de pcs.txt: \\maq01 \\192.168.120.23 Hablando de las redes P2P, esos programas incómodos para el administrador Aprovecando el tema que hemos tratado sobre el Windows XP SP2 y las redes P2P, he creído interesante tratar también un tema que el mismo José Manuel ha tratado alguna vez en relación con la pregunta de algún usuario de Windows. ¿Cómo podemos hacer para matar los programas P2P que se pueden estar ejecutando en nuestras redes en Windows XP Profesional y Windows 2003?. Una interesante pregunta que es devuelta con un no menos interesante truco que José Manuel nos presenta. El primer requisito que necesitaremos, es estar definidos como administradores de las máquinas remotas. Finalmente, crearemos un conjunto de instrucciones o batería de comandos con el nombre que queramos darle, por ejemplo, kill_process.cmd. En este fichero, añadiremos el siguiente contenido del fuente 1. Para finalizar, podemos crear una tarea programada, o podemos ejecutar el programa desde la línea de comandos MS-DOS de la forma kill_process administrador siendo administrador, el nombre del usuario administrador en las máquinas remotas. Acto seguido a ejecutar el comando, se nos solicitará la contraseña del administrador que será legible en pantalla, y acto seguido se ejecutarán las instrucciones del script eliminando los programas ejecutados, como podemos ver en la figura 2 en la que se ha eliminado el programa Notepad.exe. @echo off if {%1} EQU {} (echo Falta usuario&goto :EOF) setlocal enabledelayedexpansion set user=%1 set /p pass="password del usuario %1 : " cls for /f %%f in (pcs.txt) do call :proc00 %%f endlocal goto :EOF :proc01 for /f %%i in (progs.txt) do if {%2} EQU {%%i} taskkill /S %1 /U %user% /P %pass% /PID %3 goto:EOF Fuente 1 Figura 2. Script de eliminación de procesos después de haber sido ejecutado José Manuel Tella Llop es MVP DTS, reside en España y posee una página web en el sitio http://www.multingles.net/jmt.htm dónde encontrarás no sólo informaciones como las que hemos comentado en este artículo, sino también más artículos muy interesantes todos ellos. Podrás contactar con él en la dirección de e-mail [email protected]. <<dotNetManía :proc00 for /f "skip=2 tokens=1,2,* delims= " %%g in ('tasklist /S %1 /U %user% /P %pass%') do call :proc01 %1 %%g %%h goto :EOF 53 dnm.trucos 54 trucos.trucos.trucos.trucos.trucos.trucos.trucos.trucos << dotNetManía << dnm.trucos Llamar a un web service a través de POST ó GET Por Pedro Pozo (clikear.com) Cuando creamos un servicio web, el método que tenemos para ejecutarlo por defecto es a través de SOAP, sin embargo si intentamos ejecutar ese servicio web a través de POST o GET se produce un error. La solución es muy sencilla, para conseguir que funcionen los servicios web con POST o GET tan solo debemos descomentar unas líneas de código del fichero machine.config, este fichero podemos encontrarlo en C:\WIN- Cómo saber que versión de Office tenemos instalada DOWS\Microsoft.NET\Framework\<numero de versión framework .net>\CONFIG. Por tanto debemos abrir el fichero machine.config con el bloc de notas, por ejemplo, y descomentar las líneas: <add name="HttpGet"/> <add name="HttpPost"/> Guardaremos el fichero y ya estarán listos nuestros servicios web para poderlos ejecutar con POST o GET. Denegar a un usuario acceso a una página web Por Pedro Pozo (clikear.com) Por Pedro Pozo (clikear.com) Si estamos desarrollando una aplicación que necesita saber qué versión de Office tenemos instalada en nuestro ordenador, podemos utilizar dos formas para averiguarlo: 1) Añadir una referencia COM a “Microsoft Excel xx Object Library” o “Microsoft word xx Object Library” y luego añadiremos el siguiente código: Si deseas que un usuario no tenga acceso a una página en concreto, puedes hacerlo poniéndolo en el fichero webconfig, como en el ejemplo siguiente: Excel.Application appOffice; appOffice = new Excel.Application(); MessageBox.Show(appOffice.Version); appOffice.Quit(); 2) Otra solución más eficiente y más elegante es consultar el registro Windows. Deberemos incluir una referencia a Microsoft.Win32 y consultar el registro de windows como se muestra en el ejemplo: RegistryKey regVersion; string keyValue; string version=string.Empty; keyValue = "SOFTWARE\\Microsoft\\Office\\ 11.0\\Common\\ProductVersion"; regVersion = Registry.LocalMachine. OpenSubKey(keyValue,false); if (regVersion!=null) { version = (string)regVersion.GetValue ("LastProduct", 0); regVersion.Close(); } MessageBox.Show(version); Algunas curiosidades sobre SQL Server 2000 Por Pedro Pozo (clikear.com) El número máximo de usuarios de SQL Server es 16.379 y el número máximo de roles es 16.367, el número máximo de bases de datos por servidor <location path="mipagina.aspx"> <system.web> <authorization> <deny users="lista_de_usuarios_separados_por_comas" /> </authorization> </system.web> </location> Consultar texto en todos los procedimientos almacenados Por Pedro Pozo (clikear.com) Cuando en nuestra base de datos SQL SERVER tenemos muchos procedimientos almacenados puede resultar una labor muy tediosa tenerlos controlados. Aquí podemos ver una consulta que nos permite localizar cualquier texto dentro de los procedimiento almacenados de nuestra base de datos. SELECT so.name, sc.text FROM sysobjects so INNER JOIN syscomments sc ON so.id = sc.id WHERE so.type = 'P' AND sc.text LIKE '%cadena%' de SQL Server es de 32.767, el número máximo de foreign key por tabla es de 253, el número máximo de parametros de un procedimiento almacenado es 1.024, el número máximo de tablas de una SELECT es 256. dnm.comunidad.net << dnm.comunidad.net CLM.NET: el nacimiento de una comunidad .net en la tierra de don Quijote “En esto, descubrieron treinta o cuarenta molinos de viento que hay en aquel campo; y, así como don Quijote los vio, dijo a su escudero: La ventura va guiando nuestras cosas mejor de lo que acertáramos a desear, porque ves allí, amigo Sancho Panza, donde se descubren treinta, o pocos más, desaforados gigantes, con quien pienso hacer batalla” Quijote para comenzar este relato breve sobre la primera comunidad de usuarios de .NET de Castilla - La Mancha es significativo, primero porque el Quijote es un referente literario internacional, y esta -nuestra comunidad- nace con el humilde propósito de ser referente regional para los desarrolladores .NET; segundo, porque en una tierra como la nuestra, donde ya existen otras comunidades y que, en muchas ocasiones, se apuesta por otras plataformas para el desarrollo de aplicaciones y servicios, la aventura es poner en marcha una comunidad de usuarios en tecnología .NET; y tercero, y último, porque al igual que el ingenioso hidalgo, nos consideramos aventureros y emprendedores y queremos tener un espacio en Internet donde el desarrollo con .NET sea un acicate para la construcción de software con “denominación de origen” La Mancha. Nos alienta el gran grupo de seguidores que esta tecnología está despertando a nuestro alrededor, la rapidez en el desarrollo de aplicaciones y el know how que vamos adquiriendo con las constantes iniciativas formativas, investigadoras y profesionales en las que estamos envueltos. Nuestra historia comienza con un curso de postgrado universitario que el año pasado se denominó CTEDAPI (Curso Título Universitario en Desarrollo de Aplicaciones Para Internet) organizado y coordinado desde el grupo LoUISE (Laboratory of User Interaction and Software Engineering) del Instituto de Investigación en Informática de Albacete (Universidad de Castilla - La Mancha). Comenzamos a hacer nuestros pinitos con .NET y con LibroNET, la tienda virtual de libros en Internet, un caso práctico que guiaba los ejercicios y servía como buenas prácticas aplicado a un caso de eCommerce en un entorno Business To Consumer (B2C). Esta experiencia también sirvió para que los alumnos de Ingeniería del Software de quinto de informática hicieran sus prácticas como ingenieros Web y analistas de sistemas y los alumnos de programación visual, de tercero de informática, hicieran las veces de ávidos desarrolladores de la solución propuesta por los candidatos a ingenieros. En consecuencia surgió de estas experiencias un grupo bastante grande de potenciales desarrolladores .NET que necesitaban encarecidamente conocer la plataforma de desarrollo, la arquitectura (framework) y las técnicas de programación Web con ASP.NET y con C#. De aquí surgieron los foros de alumnos de la asignatura, que congeniaban con los alumnos del CTEDAPI y que compartían conocimientos, fatigas y debates sobre el desarrollo de software con .NET frente a otras opciones. Ahí surgió la idea -hacía falta, y había caldo de cultivo, una comunidad de desarrolladores .NET propia-. Y tras este planteamiento y observando que en nuestro entorno más cercano había posibilidades de comenzar a desarrollar con esta tecnología aplicaciones para Internet, tanto en la Universidad como en las empresas de tecnologías de la información de la región, decidimos dotar de un soporte Web a esta comunidad, creando el portal CLM.NET, para desarrolladores .NET tanto de la región como de aquellos que quieran participar en esta iniciativa castellano manchega. Este año el curso de postgrado CTEDAPI se ha hecho mayor y se ha conver- tido en el I master en tecnologías Web: Desarrollo de aplicaciones y servicios para la sociedad de la información, con tecnología y herramientas .NET, que quiere formar a ingenieros y arquitectos Web, especializados en el desarrollo y la implantación rápida de proyectos Web (RAD) y en el diseño y puesta en marcha de soluciones de empresa adaptadas a las necesidades reales de las mismas respectivamente. Y por eso este año también queremos que CLM.NET, el portal de la comunidad de desarrolladores de Castilla - La Mancha, sea de nuevo un punto de encuentro entre profesionales, estudiosos, investigadores y desarrolladores de aplicaciones Web con la tecnología .NET y, por supuesto os invitamos a participar en esta iniciativa que desde un principio viene apoyando Microsoft Ibérica, tanto con su colaboración directa en el curso, como con la participación de ingenieros y MVPs de renombre en esta -vuestra comunidad- Información de interés Master en tecnologías Web: http:// ctedapi.uclm.es. CLM.NET, comunidad de desarrollo .NET: http://161.67.15.167/?alias= clmnet (dirección provisional). Miguel López Director técnico de proyectos del grupo LoUISE, Instituto de Investigación en Informática de Albacete, Universidad de Castilla - La Mancha. Prado Morales Desarrolladora de soluciones Web, grupo LoUISE, Instituto de Investigación en Informática de Albacete, Universidad de Castilla - La Mancha. <<dotNetManía << Que haya elegido este fragmento del 55 Suscripción a dotNetManía ❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) y beneficiarme de la oferta del 10% de descuento por un importe total de 60 € para España; o por 75 € para el resto de Europa; o por 90 € para el resto del mundo (IVA incluido). ❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) por un importe de 45 € por ser estudiante (IVA incluido). Aporto fotocopia del carné de estudiante o sello del centro académico (IMPRESCINDIBLE). OFERTA VÁLIDA SÓLO PARA ESTUDIANTES RESIDENTES EN ESPAÑA. IMPORTES VÁLIDOS HASTA NUEVA OFERTA DATOS DE FACTURACIÓN CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . DATOS DE ENVÍO (sólo si son distintos de los datos de facturación) CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . FORMA DE PAGO ❑ Talón nominativo a nombre NETALIA, S.L. ❑ Transferencia bancaria a nombre de NETALIA, S.L. a: La Caixa - Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia) ❑ Domiciliación Bancaria (con renovación automática, previo aviso) Indique su número de cuenta: ❑ Tarjeta de crédito ❑ VISA ❑ MASTERCARD Número de su tarjeta: Fecha de caducidad: / (imprescindible) Firma y/o sello (imprescindible) a ❑ Nº2 ❑ Nº3 ❑ Nº4 de ❑ Nº5 Usted autoriza a la mecanización de estos datos. El responsable y destinatario de éstos es Netalia, S.L. Usted tiene derecho a acceder a sus datos, modificarlos y cancelarlos cuando lo desee. Sus datos no serán cedidos en ninguna de las formas posibles a terceras partes y no se utilizarán más que para el buen funcionamiento de su suscripción a la revista dotNetManía y para informarle de las actividades comerciales que realice la editorial Netalia, S.L. Si no desea recibir información comercial de dotNetManía marque la casilla siguiente ❑ de 20 ❑ Nº6 ❑ Nº7 Si desea algún otro número indíquelo Puede enviar los datos al email [email protected], al FAX (34) 91 499 13 64 o al teléfono (34) 91 666 74 77. También puede enviarlo por correo postal a la siguiente dirección: C/ Robledal, 135 28529- Rivas Vaciamadrid Madrid (España) ❑ Nº8 << dnm.biblioteca.net dnm.biblioteca.net ASP.NET 2.0 Dino Esposito Editorial: Microsoft Press ISBN: 0735620245 Páginas: 448 Publicado: Agosto-2004 Ya comentamos en su momento otra obra de este prolífico autor italiano (ver dotNetManía, nº4), que para muchos es ya una referencia en lo tocante al acceso de datos y construcción de sitios Web. Se trata de un compendio totalmente exhaustivo de las novedades que incluye la versión 2.0 de ASP.NET sin limitarse a un repaso superficial, sino profundizando en las implicaciones que cada nuevo aspecto tiene en el desarrollo. Microsoft .NET Framework Class Library Reference Microsoft Editorial: Microsoft Press ISBN: 0735615551 Páginas: Variable (una media de 2000 páginas por volumen) Volúmenes: 10 Publicado: Febrero-2003 Como el lector puede imaginar, es sencillamente, la obra de referencia. Su utilidad depende de los gustos, tal y como reflejan los comentarios de los lectores de Amazon y otras distribuidoras on-line. Se trata de toda la documentación impresa que está disponible en el MSDN incluyendo ejemplos de cada clase, cada objeto, etc. Si se prefiere tener la documentación en papel, y poder abarcar de un vistazo amplias zonas de los namespaces de .NET es recomendable. Aunque no se encontrará nada que no esté ya en el MSDN. <<dotNetManía << El análisis, no sólo cubre las novedades, sino los cambios estructurales, mejoras en el acceso a datos, nuevos controles ASP.NET de servidor, y un montón de consejos prácticos para la implantación de aplicaciones en el mundo real, con consideraciones de rendimiento, seguridad, distribución, y un largo etcétera. Y todo esto con un buen conjunto de ejemplos que el lector puede descargar. Totalmente recomendable. 57 noticias.noticias << dnm.desvan Marino Posadas Bill Gates predice cambios radicales en el mundo del entretenimiento En una entrevista concedida a The Hollywood Reporter (www. cnn.com/2004/TECH/ptech/10/14/industry.gates.reut/index. html), publicada por la CNN, la principal cabeza visible de Microsoft, afirmaba que “la Televisión tradicional se encuentra en una encrucijada, debida principalmente a la cada vez menor importancia de los canales y las horas de emisión, que no se adaptan a los deseos del público, más deseoso de obtener contenidos en cualquier momento y de cualquier naturaleza”. Gates, aprovechaba para anunciar que un factor importante de este cambio estará vinculado a la aparición del nuevo Microsoft Windows XP Media Center Edition 2005, que permitirá más opciones y más flexibilidad, tanto a los autores, como a las audiencias potenciales. Esta noticia, se complementa con lo publicado en eWeek (www.eweek.com/article2/0,1759,1675158,00.asp), referente a las características que tendrá el nuevo Media Center, incluyendo la posibilidad de extender este entretenimiento digital dentro de la iniciativa Digital Entertainment Anywhere, consistente en una solución wireless, capaz de extender a toda la casa la fuente digital de entretenimiento conectada, mediante un dispositivo llamado Media Center Expander Device. Pero éste no es ni mucho menos el principal caballo de batalla del Chief Software Architect de Microsoft. Hace unos días en otra entrevista, declaraba que -en la actualidad- pasa dos terceras partes de su tiempo tra- documentos en la red Uno de los más curiosos documentos asociados a <<dotNetManía Microsoft es el Funny Microsoft Q Articles (http://jill.jazzkeyboard.com/qarticles.html), referente a publicaciones de la KB (Knowledge Base), sobre distintas peculiaridades del software de MS y sus soluciones. Algunas resultan bastante evidentes, como “Q147373: Remove All Does Not Remove Everything”, o “Snow White & the Seven Dwarves DVD issue” (literalmente, “problema con el vídeo de Blancanieves y los siete enanitos”). 58 >> bajando en los departamentos de software (buena parte de las ideas del nuevo Longhorn fueron directamente promovidas por él) y una tercera parte vinculado a la fundación que lidera junto a su esposa Melinda, que -curiosamente- se fundó cuando el traspaso de poderes administrativos a Steve Ballmer estuvo completado a principios de 2000. Microsoft podría estar desarrollando versiones de servidor de Excel, Visio e InfoPath, como parte de Microsoft Office System Según Mary Jo Foley, del popular sitio Microsoft Watch, esta compañía podría estar desarrollando nuevas versiones de estos populares productos, pero en esta ocasión, pensados para la gama de servidores. En principio, se habló de versiones de Excel y Visio para servidores, pero posteriormente (ver www.crn.com/sections/news/ top_news.jhtml?articleId=49900500), la noticia se ha ampliado a InfoPath, dentro de lo que se ha dado en llamar Information Bridge Framework, una forma de acercar los datos a las aplicaciones cliente, aglutinando información ahora dispersa en aplicaciones como Outlook, Word, Excel y otras aplicaciones cliente de Office. Esta nueva versión de Office (Office 12 en nombre de código interno), esperada para 2006+, promete además, una integración sin precedentes con la nueva versión de Visual Studio Tools for Office que se distribuirá junto a Visual Studio 2005, y al nuevo Visual Studio Team System, el sistema de modelado y diseño de aplicaciones que se va a constituir en una de las más importantes novedades de la “suite”. Utilidades del mes A destacar este mes la nueva herramienta de búsqueda que promueve Google dentro de su política de extensiones del navegador. La nueva Google Desktop Search (http://www.desktop.google.com), pretende ofrecer una búsqueda más avanzada en el ordenador personal, si bien todavía se encuentra en fase beta, y tiene algunas incompatibilidades que deberían de comprobarse antes de su instalación. FaberToys: Conjunto de interesantes utilidades gratuitas, que ayudan al usuario exigente que quiere saber en todo momento lo que está pasando en su ordenador. Controla todos los procesos en ejecución, permite monitorizarlos, y saber qué DLL's se cargan en memoria y mucho más. Accesible en http://www.faberbox.com/fabertoys.asp?action=download