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

Documentos relacionados