Page 1

www.dotnetmania.com

nº 65 diciembre 2009 6,50 €

Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework

dotNetManía dedicada a los profesionales de la plataforma .NET

Diseño por Contratos en .NET 4.0 Un deseo hecho realidad

dnm.laboratorio .net Suites de componentes para desarrolladores .NET dnm.ux La Humanización del Producto dnm.qa Comunicación entre formularios y sus componentes

Mundo paralelo • Mejorando la calidad de las interfaces Web (I) • Las posibilidades de SketchFlow • Servidores de símbolos y de origen en Team Build 2008 y 2010


editorial

dotNetManía Dedicada a los profesionales de la plataforma .NET Vol. VI •Número 65 • Diciembre 2009 Precio: 6,50 €

[OT] Adiós, María

Editor Paco Marín (paco.marin@netalia.es) Redactor jefe Marino Posadas (marino.posadas@dotnetmania.com) Redacción Alberto Población, Luis Fraile, Luis Miguel Blanco, Miguel Jiménez y Miguel Katrib (Grupo Weboo) Empresas colaboradoras Alhambra-Eidos Aventia-Renacimiento Danysoft Plain Concepts Raona Solid Quality Mentors

Además colaboran en este número Jorge Luis De Armas, José Luis Soria, Luis Alfonso Rey, Miguel López y Raúl Hernández Seda. Diseño y maquetación

.netalia Atención al suscriptor Pilar Pérez (pilar.perez@netalia.es)

Edición, suscripciones y publicidad

.netalia c/ Robledal, 135 28522 - Rivas Vaciamadrid (Madrid) www.dotnetmania.com

Tf. (34) 91 666 74 77 Fax (34) 91 499 13 64 Imprime Gráficas MARTE ISSN 1698-5451 Depósito Legal M-3.075-2004

Bienvenido al número 65, de diciembre de 2009, de dotNetManía. Adiós, María. Ya no hablaré más contigo, y la llamada que tenía pendiente no te la podré hacer, ya me han dicho que no me has podido esperar. No te lo tomo a mal, tranquila, que conociéndote, capaz eres de pedir disculpas por morir sin avisar. María, yo solo te quería llamar para darte ánimos, aunque todos sabemos que siempre acababas dándolos tú. Así era María. María Santos, quien fuera directora de publicidad de esta casa y esposa de un buen amigo y tan padre de esta revista como yo, Javier Izquierdo, ha fallecido en estos días tras una larga y dura enfermedad a los 34 años de edad. Dulce en el trato, inteligente, emotiva, mandona, muy mandona, María nos contagió optimismo con su espíritu inigualable. Desde luego, ella era un ser humano especial y singular. La veo capaz de acabar con la eterna disputa de Dios y el Diablo, ahora que tiene la oportunidad, y si no, al tiempo. Así era nuestra María, de esas personas que uno conoce y que conviene guardar en la memoria porque no habrá muchas oportunidades de conocer otras como ella. Pero, si hay alguien que la mereciera como esposa ése es Javier, que ahora tiene que pasar por este injusto y doloroso duelo. Por eso, quiero dedicarle a él, junto a María, el trabajo de este mes. Javier, toda la familia de dotNetManía está contigo. Ánimo, amigo. Y los demás aquí quedamos, pagando con una gran tristeza la enorme suerte de haberla conocido. A mí me ha merecido la pena. Adiós, María.

Cambiamos de tercio y volvemos, aunque me resulte complicado, a nuestra realidad. La función debe continuar. ¿Qué decir sobre la actualidad que nos ocupa? En este pasado mes de noviembre hemos tenido dos grandes eventos: Tech-Ed Europe en Berlín y PDC en Los Ángeles. Y en este orden, lo que ha hecho que el primero quede muy deslucido en lo que a desarrollo se refiere (quedando mejor para los hermanos de TI), ya que es en PDC donde estuvieron los mejores speakers y donde deben hacerse los lanzamientos. Este año hubo muchos y sonados: se desveló que enero de 2010 es la fecha elegida para el lanzamiento de Windows Azure y SQL Azure, y se presentaron Windows Server AppFabric y Azure Platform AppFabric, una nueva beta de ASP.NET MVC 2, Microsoft Office 2010 Beta y SharePoint 2010 Beta y, como anuncio más inesperado, la primera beta de Silverlight 4. En Berlín realizamos la entrevista a Steve Lipner, director senior de estrategia de seguridad en Microsoft. A ésta le seguirán dos más, que publicaremos próximamente. Apenas queda espacio para presentar como se merece al artículo de portada "Diseño por Contratos en .NET 4.0. Un deseo hecho realidad" del grupo Weboo de la Universidad de La Habana. Baste decir que, aunque solo sea por él, creo que merece la pena la inversión en este ejemplar. Pero no es lo único; dentro hay más. Espero que no se nos note mucho nuestro estado de ánimo en el trabajo de este mes; lo hemos hecho con el mismo cariño de siempre.

Paco Marín


sumario 65 Eventos

09-13

PDC '09, Tech-Ed Europe 2009, Mobility Roadshow 2009, Windows 7 Party y ALM ’09.

Entrevista a Steve Lipner

14-16

Durante el TechEd 2009, nuestro redactor Luis Fraile tuvo la oportunidad de entrevistar a Steve Lipner, Director Senior de estrategia de seguridad en Microsoft. Con él pudimos hablar acerca del Security Development Lifecycle y de cómo la seguridad debe influir en el desarrollo de nuestras aplicaciones para hacerlas más robustas.

Mundo paralelo

18-21

Desde hace mucho tiempo venimos oyendo acerca de la programación paralela, los hilos, tareas y conceptos relacionados, pero en la mayoría de los casos esto no ha ocasionado un impacto directo en la manera que tenemos de desarrollar. Sin embargo, esta situación está a punto de cambiar. En este artículo explicamos por qué.

Diseño por Contratos en .NET 4.0. Un deseo hecho realidad

22-32

Como continuidad de nuestra promesa de hablar sobre lo que vendrá con .NET 4.0 y Visual Studio 2010, el presente artículo está dedicado a una de estas novedades, cuyas ideas tal vez aún no sean muy conocidas por algunos desarrolladores: Code Contracts.

Mejorando la calidad de las interfaces Web (I)

34-40

Marcado estructural y semántico con XHTML, HTML 5 y Expression Web En esta serie de artículos vamos a profundizar en los fundamentos del diseño de interfaces Web de calidad con Microsoft Expression Web 3.0 utilizando los estándares actuales, y le echaremos un vistazo a los nuevos borradores de estándares para la Web (XHTML 2.0 y HTML 5); para ello, vamos a utilizar la nueva versión, la más potente y funcional de todas las que se han entregado hasta el momento, de Microsoft Expression Web, que incorpora interesantes capacidades para mejorar el diseño multi-plataforma (navegador), como SuperPreview, y mantiene un interesante conjunto de utilidades para comprobar la compatibilidad con los estándares para la Web y la accesibilidad de los documentos HTML.

Las posibilidades de SketchFlow

42-43

La posibilidad de crear prototipos funcionales de los proyectos que se vayan a desarrollar y la capacidad de poder añadir feedback a un prototipo de forma fácil e intuitiva son algunas de las características principales que ofrece SketchFlow, la nueva herramienta de creación de prototipos incluida en Microsoft Expression 3.

Servidores de símbolos y de origen en Team Build 2008 y 2010

44-47

Disponer de un servidor de símbolos, estando además éstos indexados con la información de acceso al código fuente correspondiente, es algo que puede ser de gran utilidad a la hora de depurar nuestras aplicaciones. Si automatizamos el mantenimiento de este servidor mediante Team Build, conseguiremos además que los símbolos indexados estén disponibles para todas nuestras compilaciones y con un mínimo trabajo extra.

dnm.ux

48-49

La Humanización del Producto

dnm.q&a

50-53

Comunicación entre formularios y sus componentes

dnm.laboratorio.net

54-56

Suites de componentes para desarrolladores .NET

dnm.biblioteca.net

57

Diseño y programación de bases de datos con SQL Server 2008 de Pedro López Belmonte y Aroa Solana (Luarna/Alhambra-Eidos) Tecnologias ASP.NET 4.0 (saltando desde la versión 2.0) de José Manuel Alarcón (Krasis Press)

dnm.desvan

58


<<dotNetManía

noticias noticias noticias noticias

noticias

6

Microsoft adquiere Teamprise Con la compra, a principios de este mes, de la solución Teamprise de SourceGear, Microsoft adquiere una potente tecnología con vistas a hacer posible que Visual Studio sea utilizado desde diferentes plataformas como solución unificada para la gestión del ciclo de vida de las aplicaciones. Concretamente, Teamprise hace posible el acceso a Team Foundation Server desde el entorno integrado Eclipse ejecutándose bajo Linux, Mac OS X o Unix. Teamprise se compone de tres herramientas que posibilitan el acceso a las características de TFS tanto desde Eclipse (a través del Teamprise Plugin for Eclipse), como desde la línea de comandos (mediante Teamprise Command-Line Client), o utilizando un entorno visual, Teamprise Explorer. El lector interesado puede obtener mucha más información sobre el producto en el ejemplar nº 62 de dotNetManía (septiembre de 2009), donde nuestro editor Luis Fraile entrevistó a Corey Steffen, director general de Teamprise. "Con Teamprise y TFS, los desarrolladores podrán colaborar y mantener definiciones de requisitos y work

items dentro de un mismo repositorio", ha dicho Doug Seven, Senior Product Manager de Visual Studio. "Esto hará posible que la infraestructura de TFS se utilizada por los desarrolladores que se mueven entre Eclipse y Visual Studio". Por su parte, Dave Mendlen, Senior Director of Developer Marketing en Microsoft, dijo: "Con esta adquisición, hemos creado un puente hacia los desarrolladores Java. Microsoft reconoce que existen equipos de desarrollo heterogéneos, y TFS les ayudará a partir de ahora a obtener excelentes resultados con independencia del entorno o plataforma que los desarrolladores utilicen". Microsoft continuará actualizando las herramientas de Teamprise para las futuras ediciones de TFS. Concretamente, se espera que la primera versión del producto bajo la marca Microsoft se ponga a disposición del público el próximo 22 de marzo, con soporte para TFS 2005, 2008 y gran parte de las funcionalidades de TFS 2010. Asimismo, el producto formará parte de la edición Ultimate with MSDN de Visual Studio 2010.

Liberado SQL Server 2008 R2 November Preview El pasado día 12 se puso a disposición del público general Microsoft SQL Server 2008 R2 November Community Technology Preview, días después de haber sido publicado para los suscriptores de MSDN y TechNet. Según se indica en el blog Data Platform Insider (http://blogs.technet.com/ dataplatforminsider), la CTP ya contiene prácticamente todas las características previstas para la versión final, incluyendo por primera vez las siguientes: • Soporte para Windows Server 2008 R2, incluyendo Hyper-V con Live Migration.

• Compresión de datos mejorada, con soporte para Unicode UCS-2. • Report Builder 3.0, con Report Part Gallery y nuevas visualizaciones. • Master Data Services (MDS) La única característica aún pendiente de inclusión es PowerPivot para Microsoft Excel y Microsoft SharePoint Server. La salida al mercado de SQL Server 2008 R2 se espera para la primera mitad de 2010. Más información y descargas en http://www.microsoft.com/sqlserver/2008/en/us/R2Downloads.aspx.

Danysoft La estrategia del producto Visual Studio cambiará en el año 2010. Consiga ahora Visual Studio con MSDN con descuentos de hasta el 50% Durante este período de transición tiene la oportunidad de adquirir, subir de nivel, o renovar su suscripción MSDN en mejores condiciones que las que tendrá si espera al lanzamiento de Visual Studio 2010. Ahora tiene, pues, la posibilidad de conseguir gran cantidad de características adicionales a un precio irrepetible. Por ejemplo, en las suscripciones MSDN Premium significa que obtendrá una edición superior de Visual Studio 2010, y el derecho a instalar y usar una copia de Microsoft Office Ultimate, Project Standard, SharePoint Designer, Visio Professional y Office Communicator, de los cuales, además, también recibirá sus nuevas versiones 2010. Además, puede beneficiarse de descuentos de hasta un 30% en la adquisición de suites o utilidades, obsequio de libros sobre Team System, etc. Descubra todas estas ventajas personalizadas para su empresa contactando sin compromiso con el servicio de atención al cliente Danysoft en el 902 123146 o en info@danysoft.com. raona

Formación SharePoint 2010 Durante los meses de septiembre, octubre y noviembre, Microsoft celebró en Atlanta, Dallas, Amsterdam y Berlín la primera formación oficial sobre SharePoint 2010, bajo el nombre SharePoint 2010 Ignite Technical Training. Una selección de partners de Microsoft de todo el mundo estuvieron invitados, entre los que se encontraba raona, que envió a tres formadores al evento que tuvo lugar en Berlín durante una semana. En el evento, dividido en dos (Implementer y Developer), se dieron a conocer todas las novedades que nos va a ofrecer SharePoint 2010 de la mano de auténticos expertos traídos por Microsoft. Hubo ocasión de probar los primeros Hands-on-Lab y participar en numerosas charlas de puesta en común de dudas y sugerencias. Según Miguel Tabera, Software Engineer de raona y asistente a este evento, "Ya estamos formando en SharePoint 2010 al resto de formadores e ingenieros de la compañía. Además, estamos trabajando con Microsoft para replicar la formación Ignite en España".


<< dnm.directo.noticias Novell ofrece la primera solución comercial para crear aplicaciones .NET para Linux con Visual Studio mos desarrollar y depurar en Linux de manera rápida y sencilla, y utilizando nuestro lenguaje y entorno de desarrollo preferidos".

Principales características Entre las características principales de Mono Tools for Visual Studio, podemos citar las siguientes: • Desarrollar y portar aplicaciones .NET a Linux, UNIX y Mac OS X haciendo el análisis, desarrollo, depuración y despliegue desde Visual Studio. • Creación de dispositivos virtuales a medida para aplicaciones .NET utilizando la integración con SUSE Studio Online, una herramienta innovadora que permite a los usuarios desarrollar y probar fácilmente dispositivos (appliances) basados en SUSE Linux Enterprise Server u openSUSE. • Herramientas integradas de análisis de migración, que ofrecen a los desarrolladores guías claras para desarrollar o portar sus aplicaciones a Linux, Mac OS X y UNIX. Muchos desarrolladores .NET actualmente no tienen idea de cómo enfocar la migración de aplicaciones a plataformas no-Windows, un reto que se resuelve fácilmente mediante Mono Tools. • Posibilidad de ejecutar y depurar aplicaciones en Mono Visual Studio, para aislar las incompatibilidades entre Mono y .NET y entre Linux y Windows. • Empaquetado automático para SUSE Linux Enterprise Server y openSUSE, para preparar las aplicaciones para su despliegue inmediato en Linux.

Precios y disponibilidad Mono Tools for Visual Studio está disponible en tres ediciones: Professional Edition (individual), cuyo precio es $99, Enterprise Edition (un desarrollador en una organización), que se vende por $249, y la Ultimate Edition ($2,499), que incluye cinco licencias de desarrollador y ofrece una licencia comercial limitada para redistribuir Mono en Windows, Linux y Mac OS X. Todas las versiones incluyen una suscripción de un año a las posibles actualizaciones que vean la luz. Para más información sobre Mono Tools for Visual Studio y descargar una versión de evaluación, visite http://ww.novell.com/monotools.

<<dotNetManía

El pasado 10 de noviembre, Novell anunció la disponibilidad de la primera solución comercial para facilitar el desarrollo de aplicaciones .NET para Linux, UNIX y Mac OS X utilizando Microsoft Visual Studio. Un nuevo módulo que extiende el entorno integrado de Visual Studio, Mono Tools for Visual Studio permite a los desarrolladores .NET utilizar el entorno familiar de Visual Studio para desarrollar y mantener aplicaciones multiplataforma. Al reducir de manera significativa el tiempo y costes del desarrollo para múltiples plataformas, Mono Tools permitirá tanto a los desarrolladores corporativos como independientes expandir de manera significativa sus oportunidades de mercado. Mono Tools for Visual Studio es una solución comercial que permite a los desarrolladores de C# y .NET seguir utilizando su entorno favorito, así como el amplio ecosistema de código, librerías y herramientas que le rodean para desarrollar o portar aplicaciones a Linux, UNIX o Mac OS X. Anteriormente, portar aplicaciones .NET exigía grandes inversiones en nuevas herramientas de programación y redefinir y recodificar en buena medida las aplicaciones. "Mono Tools for Visual Studio enriquece el ecosistema de Visual Studio, haciendo posible que más de seis millones de desarrolladores .NET obtengan valor adicional de sus herramientas y habilidades Microsoft", dijo Cyrill Glockner, director de Desarrollo de negocio en la división de Plataforma y Herramientas de Microsoft . Por otra parte, Miguel de Icaza, fundador del proyecto Mono y vicepresidente de Plataformas de Desarrollo en Novell, expresó que "Con Mono Tools for Visual Studio, estamos haciendo posible saltar la barrera entre Visual Studio, uno de los entornos de desarrollo más populares, y Linux, una de las plataformas de despliegue líderes. Integrando nuestras herramientas directamente en Visual Studio, estamos posibilitando a los desarrolladores .NET llevar rápidamente sus aplicaciones al mercado Linux". Y según Pablo Santos, CEO de Codice Software, "nuestros clientes exigen opciones para Linux, así como para UNIX, Mac OS X y Windows, por lo que el soporte multiplataforma es una característica crítica para nuestros productos. Plastic SCM, nuestro producto de gestión de configuración de software, está implementado principalmente en C# debido a que lo consideramos el lenguaje más productivo. Utilizando Mono Tools for Visual Studio, ahora pode-

7


<< dnm.directo.noticias

<<dotNetManía

La Asociación de Técnicos de Informática analiza la incidencia de la crisis en la calidad de software “Made in Spain”

8

Luarna Ediciones

Luarna inicia la distribución en España de iRiver Story

La reducción de los testeos y el hecho de que más del 50% de los informáticos españoles siguen careciendo de formación específica en calidad representan un serio reto para la industria española del software.

Este nuevo lector de libros electrónicos ya está disponible a través de la página Web de la editorial española www.luarna.com y se podrá adquirir, en breve, en grandes superficies y tiendas especializadas.

El que la calidad del software es rentable, está hoy más que demostrado. Estudios como el realizado por el experto David F. Rico muestran los retornos de inversión: del 37 a 1, por implantar inspecciones de software; del 5 a 1, por lograr la evaluación CMMI; del 8 a 1, por lograr la certificación ISO9001; o del 14 a 1, por implantar el modelo SW-CMM. Pero la llegada de la crisis, con la consiguiente paralización de muchos proyectos por falta de financiación, ha hecho que la eliminación o la reducción del tiempo dedicado a las pruebas de software se convierta en una práctica más que habitual en las empresas desarrolladoras, con el fin de reducir los costes. Se trata de una situación que está afectando tanto a las grandes empresas como a las pymes. “En uno de nuestros últimos estudios, más del 90,6% de los profesionales TIC consultados afirmó que sus empresas recurren a esta práctica cuando surgen retrasos o problemas financieros”, afirma Luis Fernández, Coordinador del Grupo de Calidad de la ATI. A este dato, que representa un serio riesgo para la calidad e imagen del software creado en España, se suma otro de gran importancia: y es que, de nuevo según datos de la Asociación, a fecha de hoy más del 50% de los profesionales TIC españoles siguen careciendo de formación específica en pruebas del software, una técnica esencial para la calidad de las aplicaciones empleada en todos los proyectos. “La creciente madurez del mercado español en materia de calidad, por otro lado, es la causa de que crezca la demanda y que se observe una cada vez mayor carencia de profesionales TIC con formación específica en calidad del software”, explica el responsable del

Se trata de un dispositivo para la lectura de libros electrónicos cuyo fabricante es la empresa multinacional iRiver y que apuesta por lo clásico, traduciendo al mundo digital la experiencia de tocar y sentir el papel. Basado en la tecnología de tinta electrónica, su pantalla de 6” E-Ink Vizplex ofrece a sus usuarios un manejo sencillo y una lectura cómoda gracias a su vista en vertical y apaisado. Este dispositivo no necesita conversión de archivos, ya que soporta una amplia gama de formatos tanto de ebooks (ePub, PDF, TXT) como de Office (XLS, DOC, PPT) o de música (MP3M, WMV). Además, los amantes del comic podrán disfrutar de este género con iRiver Story, ya que el dispositivo soporta los formatos de imagen JPG, BMP y PNG. iRiver Story cuenta con un grabador de sonido y un reproductor de audio para que sus usuarios disfruten tanto de la lectura como de la música. Sus 2GB de memoria interna permiten almacenar una gran cantidad de títulos de lectura y de audio, y en caso de que el usuario desee almacenar más contenido, este dispositivo admite tarjetas SD de hasta 32GB. Además, su batería de larga duración permite 5 horas de grabación, 20 horas de música o más de 9.000 cambios de página sin recarga. iRiver Story se encuentra disponible en el mercado español a través de la página Web www.luarna.com a un precio de 279€, con soporte, garantía y reparaciones directamente en España, a través de Luarna. Asimismo, la editorial digital cuenta con un amplio fondo que abarca los más diversos géneros, entre los que podemos encontrar libros para desarrolladores y profesionales TI. Entre los nuevos títulos se encuentran Administración de bases de datos con SQL Server 2008 de Pedro López Belmonte y Aroa Solana, en el que se abordan todos los aspectos de la administración de un sistema de bases de datos con SQL Server 2008, y Diseño y programación de bases de datos con SQL Server 2008, de los mismos autores, en el que se tratan las diferentes tareas necesarias para llevar a cabo el diseño de una base de datos, y su implementación en SQL Server 2008.

Luis Fernández, Coordinador del Grupo de Calidad de la ATI

Grupo de Calidad de la ATI, “y si la crisis ha conseguido maquillar en cierta medida esta carencia por el momento, la misma puede llegar a representar un serio problema de mercado en el corto plazo, de no adoptarse las medidas oportunas”. Medidas entre las que el experto destaca la necesidad de una acción conjunta por parte de las instituciones docentes, de las empresas y del Gobierno, en forma de ayudas y subvenciones para la formación en calidad. Uno de los medios más efectivos para garantizar la calidad de software, sin incurrir en grandes inversiones, es prestar un especial interés a la fase de pruebas de software. “Los estudios muestran que prácticamente 1/3 del esfuerzo de los proyectos informáticos se acaba dedicando a esas pruebas y a la corrección de errores”, explica el experto de la ATI. Para garantizar que dichas pruebas se llevan a cabo de manera adecuada, la ATI incide de nuevo en la necesidad de profesionales cualificados, cuya formación en calidad del software puede llevarse a cabo a través de canales alternativos con un coste reducido, entre ellos, recurriendo a la oferta de cursos y seminarios gratuitos de la Asociación. Más información en la Web de la asociación: http://www.ati.es.


eventos << dnm.directo.eventos

Microsoft PDC '09 Durante tres días consecutivos, entre el 17 y 19 de noviembre de 2009, Microsoft presentó en Los Ángeles las últimas novedades para desarrolladores. Sí, estamos hablando de la Professional Developer Conference 2009, o la PDC ‘09, como se conoce por sus siglas. Históricamente se ha utilizado esta conferencia como plataforma para anunciar muchos de los lanzamientos de la compañía, y este año no prometía menos; algunas novedades fueron sorpresas absolutas incluso para empleados locales de las subsidiarias a nivel internacional. Con dos keynotes retransmitidas en directo a través de Internet los días 17 y 18 se lanzaron todos los anuncios de novedades y nuevos productos. Es de destacar que la retransmisión se realizó a través de Silverlight y utilizando IIS Smooth Streaming, por lo que fue posible seguirlas en directo y con calidad de vídeo HD sin ningún error o interrupción. La primera keynote, a cargo de Ray Ozzie (Chief Software Architect) y Bob Muglia (President, Servers & Tools), estuvo destinada principalmente a la parte de servidores y servicios en la nube. Se anunció por fin la fecha de lanzamiento de Windows Azure y SQL Azure para enero de 2010, siendo ese primer mes gratuito y comenzando a facturarse los servicios a partir de febrero de 2010. Al escenario subieron varios partners de relevancia que habían participado en el proceso de migración y testeo de aplicaciones sobre Azure; entre ellos Wordpress, que ha incluido sus servicios (corriendo sobre PHP, Apache y MySQL) para que sean hospedados por Azure. Una de las novedades inesperadas fue la presentación de Microsoft Pinpoint como un catálogo de aplicaciones, servicios y compañías. Vamos, un marketplace en toda regla, que recuerda un poco a los antiguos métodos usados con UDDI en la época de bonanza de los servicios Web, pero con una orientación mucho más profesional y menos de "usar y tirar". Dentro de esta plataforma se presentó también otra de las grandes novedades de la keynote, Microsoft Codename "Dallas", una propuesta para ofrecer Data As A Service. La verdad es que esto sí que puede representar una grandísima ventaja a la hora de implementar mashups o aplicaciones que consuman datos globales (como por ejemplo países, direcciones y otros datos públicos candidatos de ser reutilizados una y otra vez) de fácil acceso, pero generalmente difícil integración o localización. Existen varias empresas que ya ofrecen catálogos de datos, la mayoría gratuitos, y dado que "Dallas" aún no está en su versión definitiva se está abierto a recibir más datos de proveedores Premium. Otra de las novedades fue la presentación de Windows Server AppFabric, anteriormente conocido como Dublin, que proporciona métodos simplificados para la construcción y gestión de servicios en aplicaciones compuestas de escritorio. Por otro lado, la versión para la nube, anteriormente conocida como Velocity y ahora bajo el nombre de Azure Platform AppFabric, proporciona funcionalidad de caché para las aplicaciones servidas a través de la Web.

Ray Ozzie, Microsoft Chief Software Architect Por último, ninguna novedad en cuanto a Visual Studio 2010: seguimos con la Beta 2 disponible. Pero sí se presentó una nueva beta de ASP.NET MVC 2, junto a un montón de menciones a Windows 7 y pruebas del mismo en diferentes equipos, portátiles, tablet-PCs y pantallas táctiles. Para el segundo día, la keynote contó con Steven Sinofsky, Scott Guthrie y Kurt Del Bene como ponentes, y muchas de las novedades más interesantes de cara al desarrollo se esperaban de la mano de Scott. Como plato fuerte se presentó Silverlight 4 Beta, toda una novedad puesto que era un candidato digno de ser presentado el próximo MIX 2010 de Las Vegas, que tendrá lugar en marzo. Conjuntamente, se anunciaron Silverlight 4 Tools for Visual Studio, Silverlight SDK y los diferentes runtimes (de desarrollo, eso sí) tanto para Windows como para OSX. Como era de esperar, Silverlight 4 incluye muchísimas novedades que le convierten en una excelente alternativa multiplataforma: por fin se incluye soporte para cámaras y micrófonos, soporte de impresión, aplicaciones out-of-browser con privilegios elevados que se ejecutan fuera de la sandbox, posibilidad de eliminación/personalización del chrome de la ventana en aplicaciones out-of-browser, acceso multiplataforma a recursos del sistema, soporte integrado para HTML, interoperabilidad con COM, soporte para la rueda del ratón, soporte para teclado en modo full screen, una nueva API de notificaciones y un sinfín más de detalles que hacen que se abra todo un nuevo mundo para el desarrollo de aplicaciones de escritorio multiplataforma. Más adelante se presentaron Microsoft Office 2010 Beta, con importantes novedades tales como la inclusión de conectores externos para Outlook, la capacidad de hacer broadcast de presentaciones directamente desde PowerPoint o PowerPivot 2010 for Excel, y SharePoint 2010 Beta. Como podéis ver, todo un elenco de nuevas versiones recién salidas del horno con las que jugar en el frio inverno que se nos avecina. Espero que lo paséis bien con todas ellas, o al menos con aquellas que os interesen ;). Texto: Miguel Jiménez hello@migueljimenez.net

<<dotNetManía

eventos

<<

9


eventos

eventos

Tech-Ed Europe 2009

<<

Un año más, dotNetManía estuvo presente en el Tech-Ed europeo. Este año tocaba en Berlín, coincidiendo con el 20 aniversario de la caída del muro, y hasta la capital alemana nos fuimos. Una de las novedades del evento de este año fue la vuelta al modelo de un único Tech-Ed para desarrolladores y especialistas de sistemas; esto hizo que se redujera el número general de sesiones para desarrolladores, que además estábamos en clara minoría con respecto a la cantidad de asistentes a las sesiones de sistemas. Y es que siendo esta vez el Tech-Ed una semana antes del PDC de Los Ángeles, pocas novedades se esperaban relacionadas con el desarrollo. Aún con todo, el Tech-Ed de este año colgó el cartel de “Sin entradas”.

<<dotNetManía

Una fecha histórica

10

Aunque no es propiamente algo reseñable para los desarrolladores, este año el evento coincidió con una fecha histórica: los 20 años de la caída del muro, algo a lo que se hizo referencia en las dos keynotes principales. Esto hizo que durante el lunes se viviese en Berlín un ambiente especial de celebración, que algunos, debido a la lluvia y el frío reinantes, vivimos desde un restaurante viéndola por televisión.

Novedades en el Tech-Ed Como ya hemos mencionado, este año para desarrolladores hubo pocas novedades, que se guardaron para el PDC, justo una semana después. Pero sí que vimos, durante la keynote de Jason Zander, algunas de las novedades de Visual Studio 2010 que fueron anunciadas conjuntamente con la salida de la Beta 2, como ya sabrá el lector habitual por nuestro artículo en el número anterior de esta revista. También durante la keynote se anunció que en breve dispondríamos de la nueva beta de SharePoint 2010, algo que se hizo realidad justo la semana siguiente, durante el PDC. Durante el evento se anunciaron las soluciones de algunos partners de Microsoft en lo referente a las herramientas para Visual Studio. Por ejemplo, Preemptive Solutions (empresa creadora de Dotfuscator) ya tiene listas unas herramientas que, integradas en Visual Studio 2010, nos permitirán mejorar nuestro código con alertas en tiempo real sobre la calidad del mismo. Por su parte, la empresa TeamFuze presentó una propuesta de integración de bases de datos Oracle dentro de las herramientas de ciclo de vida de Microsoft, mediante la creación de proyectos de bases de datos Oracle,


<< dnm.directo.eventos

Director General, Corey Steffen, en el nº 62 (septiembre de este año) de dotNetManía. Este anuncio hizo ver claramente la apuesta de Microsoft por la creación de un entorno de herramientas de ciclo de vida que pueda ser aprovechado no solo por los desarrolladores Windows, sino también por aquellos que utilicen Linux, UNIX o Mac OS, entornos como Eclipse o lenguajes como Java. En cuanto a las tecnologías de sistemas, este año se hizo especial énfasis en el llamado Green IT, los sistemas sostenibles. Actualmente los recursos cada vez son más caros, no solo económicamente, sino también para el medio ambiente, y cualquier avance en el sentido del ahorro energético es muy importante, algo que también debemos tener presente como desarrolladores. Otro tema muy relacionado con el anterior es la virtualización; cada vez más sistemas están virtualizados, con el ahorro de costes que ello conlleva, y tenemos que pensar en nuestras aplicaciones para estos nuevos entornos.

Sala de exhibición Como todos los años, hubo un pabellón entero dedicado tanto a partners como a la zona de “Pregunta al experto“, una de las secciones para mí más interesantes de este tipo de eventos, que se convierten en un punto de encuentro para la comunidad de desarrolladores. Este año por un lado estuvo el Technical Learning Center de Microsoft, donde estuvieron repre-

sentados los distintos productos de Microsoft y pudimos contactar con miembros de los grupos de producto de Redmond, así como con los speakers de las sesiones. Por otro lado estuvieron los stands de los partners, donde pudimos incluso correr un F1 virtual, además de informarnos sobre las novedades de empresas como Dell, Intel u otras más pequeñas como JetBrains, en cuyo stand estuvo el también colaborador de esta revista Hadi Hariri. En esta última zona, por supuesto, estuvo presente un stand de comunidades, donde fue posible contactar con responsables y miembros de organizaciones como INETA o Culminis, o tomar parte en el concurso Speaker Idol (nuestro compañero Miguel López participó).

creadores de nuestros productos preferidos, preguntarles dudas e involucrarse en la comunidad. Pero este año el Tech-Ed, sobre todo en lo tocante a los desarrolladores y debido probablemente a los factores antes mencionados, resultó un poco flojo. Vaya por delante que es una crítica totalmente constructiva; pero lo que se respiraba en el ambiente entre pasillos (una de las fuentes fundamentales de feedback) es que se debería volver a un Tech-

Ed separado para desarrolladores con muchas más sesiones, y por supuesto en fechas en las que se disponga de muchas más novedades, probablemente después del correspondiente PDC. En cuanto a la localización del evento, siempre es agradable acudir a una ciudad tan bella como Berlín; pero el recinto de este año nos ha hecho fortalecer las piernas a más de uno con las largas caminatas para poder asistir a las sesiones. De todos modos, como decía al principio, hay que ir y vivir este tipo de eventos, y la verdad es que la organización fue en todo momento excepcional, con personal siempre dispuesto a ayudar en lo que fuese necesario. Así que espero estar nuevamente en el Tech-Ed del año que viene.

Valoración general del evento Siempre es grato asistir a estos eventos no solo por las sesiones, sino por el networking, el poder acceder a los

Texto y fotografía: Luis Fraile lfraile@lfraile.net

<<dotNetManía

similares a los que hoy tenemos disponibles para bases de datos de SQL Server. Otra presentación similar que llamó la atención corrió a cargo de MicroFocus, que mostró la integración de sus herramientas para COBOL dentro de Visual Studio Team System. Personalmente, el anuncio que más me impactó fue la adquisición de Teamprise por parte de Microsoft. Quienes no conozcáis Teamprise podéis obtener mucha más información sobre este producto en la entrevista que hicimos a su

11


eventos

eventos Mobility Roadshow 2009 Organizado conjuntamente por Microsoft Ibérica y el Centro de Innovación en Movilidad de Boecillo, Mobility Roadshow 2009 recorrió las ciudades de Valladolid (20 de octubre, con 95 asistentes), Madrid (23 de noviembre, con 90 asistentes) y Barcelona (26 de noviembre, con 80 asistentes), con la finalidad de divulgar y acercar a los desarrolladores las tecnologías móviles de Microsoft y los nuevos dispositivos Windows Phone, de la mano de ponentes como Eduardo Ortega, Marta Rodríguez, Mario Ruiz, José Antonio Gallego y Alberto Escola. Después de una introducción y recomendaciones sobre los nuevos dispositivos Windows Phone, las jornadas comenzaron con una primera sesión dedicada al desarrollo con Windows Mobile 6.5 en general. A continuación, una charla sobre el desarrollo de widgets para Windows Phone, y antes de comer, la sesión "Desarrollo multimedia avanzado para Windows Mobile". Ya por la tarde, y para no caer en el sopor de la siesta, nos pusimos manos a la obra con los temas "Movilidad en Exchange 2010" y "Windows Mobile Smackdown". Para terminar, "Windows Mobile vs. Android vs. iPhone vs. Symbian vs. Blackberry". Adivine quién ganó :-). Como colofón a las jornadas, los asistentes, "armados" con un dispositivo con Windows Mobile y WiFi, tuvieron la ocasión de ganar una Xbox-360 participando en el con-

Eduardo Ortega en su presentación en Madrid curso Preguntón Mobile, en el que ganaba quien más preguntas relacionadas con Windows Mobile contestara correctamente. Más información en la Web del Centro de Innovación en Movilidad (http://www.micmovilidad.es) o en la Web del Grupo de Usuarios de Movilidad (http://www.mobilenug.com), donde podrá encontrar muchos recursos relacionados con el desarrollo para dispositivos Windows Phone.

Windows 7 Party de su precio de mercado. Más información sobre Windows 7 Party, y un listado de lugares y fechas de celebración en: www.microsoft.com/spain/academic/estudiantes/windows7party/dondeParty.aspx.

El reto: hacking de navegadores

El pasado 24 de noviembre, Microsoft inició en la ETSI de Telecomunicación de la Universidad Politécnica de Madrid el movimiento The Windows 7 Party, que se celebrará en 20 universidades de España. En estos encuentros masivos, los estudiantes universitarios de las facultades y escuelas adscritas podrán descargar Windows 7 gratuitamente. La iniciativa forma parte de los acuerdos que Microsoft tiene con varias universidades españolas, mediante los cuales ofrece a alumnos y profesorado sus últimas novedades. La Universidad Politécnica de Madrid fue el punto de partida, con una gran fiesta en la que los alumnos podían instalar gratuitamente Windows 7 y Explorer 8, o disfrutar de la versión más avanzada de Office 2007 a un precio especial para estudiantes de 52 euros, cifra muy por debajo

El entorno universitario podrá participar además en el reto que ha propuesto Microsoft entre profesores y alumnos universitarios en relación con el hacking de navegadores. En el desafío, los estudiantes tendrán que auto-aprobarse, alterando el enlace donde se envía el trabajo al profesor para su evaluación. Para más información, visite: www.browserschool.com.

MSDN Academic Alliance Este programa permite poner a disposición de profesores y alumnos de desarrollo de contenidos digitales toda la gama de herramientas de desarrollo y diseño, productos de servidor, SO, aplicaciones y librerías de información de Microsoft con el propósito de ser utilizados para investigación y docencia. Cada estudiante, profesor o personal involucrado en la administración de sistemas y la provisión de soporte para software de MSDN Academic Alliance puede instalar el software en sus ordenadores personales. Más información en msdn.microsoft.com/es-es/dd350178.aspx.


eventos

eventos ALM ’09 Por segundo año, Microsoft celebró en Madrid el evento dedicado a la gestión de ciclo de vida de las aplicaciones, y este año con aún más sesiones que el anterior. Tuvieron lugar más de 30 ponencias, distribuidas en seis tracks paralelos, que trataron acerca de herramientas, procesos, calidad y testing, experiencia de usuario y diseño, arquitectura y plataforma de aplicaciones y nos mostraron cómo sacar todo el partido a las herramientas de ciclo de vida de Microsoft, tanto con las soluciones de la propia empresa, como con herramientas de terceros. Y por supuesto, se aprovechó el evento de este año para revisar muchas de las novedades que se nos avecinan en relación con la estrategia de ALM en Visual Studio 2010. Durante la keynote central del día, Julio Fernández Gayoso, Sales and Business Manager para Western Europe de las herramientas de desarrollo de Microsoft, nos habló de cómo maximizar el retorno de la inversión en nuestras herramientas de desarrollo y de la estrategia de gobierno de las TI en Microsoft. Y

Al ALM'09 asistieron más de 500 personas

dentro del ciclo relacionado con el diseño y la experiencia de usuario tuvimos el privilegio de contar con la presencia de Michael Köster, también de Microsoft Western Europe, que nos habló acerca de la integración del diseñador en el ciclo de vida mediante Team Foundation Server (TFS). En lo que respecta a las novedades que incorporará Visual Studio 2010, una de las áreas de mayor innovación es la relacionada con las herramientas de testing y calidad; en el ciclo de sesiones correspon-

Enrique Fdez-Laguilhoat en un momento de su intervención

diente se presentaron las mejoras para metodologías Test Driven Development, y se mostró cómo sacar el máximo provecho de las herramientas de Manual Test and Lab Management incluidas en Visual Studio 2010 Ultimate. Aquí debemos mencionar también que tuvieron lugar sesiones dedicadas a presentar la integración con TFS de entornos heterogéneos, como los basados en Linux o Mac con herramientas como Eclipse, Ant o Maven y lenguajes como Java, mediante el recientemente adquirido Teamprise. Por supuesto, tuvo lugar un ciclo dedicado a la arquitectura de aplicaciones, en el que se presentaron novedades como los diagramas UML o las herramientas para definir las arquitecturas de nuestras aplicaciones, ya sea mediante el sistema top-down o bottom-up, e igualmente se habló de algo que ya tenemos muy cerca y que fue desvelado oficialmente en el PDC ‘09, el cloud computing con Windows Azure. Y en el marco del ciclo de ponencias de metodologías pudimos comprobar cómo han mejorado las plantillas de MSF Agile y MSF CMMI para sus versiones 5.0, incluidas en 2010, y conocer cómo sacar el máximo partido de estos procesos en el día a día de la gestión de nuestras aplicaciones. En resumen, el evento nos mostró cómo evoluciona la estrategia de gestión del ciclo de vida de las aplicaciones con las herramientas de Microsoft, y lo mucho que promete Visual Studio 2010 para su lanzamiento oficial, el próximo 22 de marzo. Texto y fotografía: Luis Fraile lfraile@lfraile.net


entrevista

Luis Fraile

Luis Fraile es MVP de Team System y colabora activamente en MAD.NUG (grupo de usuarios de .NET de Madrid). Actualmente es director técnico en Multidomo Networks, donde desarrollan un producto de software para la gestión de dispositivos domóticos y cámaras de vigilancia a través de Internet mediante interfaces Web, teléfonos móviles, Media Center, etc. Puede consultar su blog en www.lfraile.net.

entrevista a

Steve Lipner

Durante el TechEd 2009, nuestro redactor Luis Fraile tuvo la oportunidad de entrevistar a Steve Lipner, Director Senior de estrategia de seguridad en Microsoft. Con él pudimos hablar acerca del Security Development Lifecycle y de cómo la seguridad debe influir en el desarrollo de nuestras aplicaciones para hacerlas más robustas.

Encantado de tenerte con nosotros, Steve. Nuestra primera pregunta tradicionalmente es pedir que cuentes algo de ti a los lectores. Gracias, soy Senior Director de Security Engineering en Microsoft, lo que significa que mi equipo es el responsable del Security Development Lifecycle (SDL). Llevo en Microsoft unos 10 años, y he estado trabajando en el mundo de la seguridad cerca de 39 años. ¿Y en que estáis trabajando ahora mismo dentro del equipo de SDL? ¿Dónde se están aplicando actualmente esas directrices? Actualmente, SDL se aplica en prácticamente todos los productos de Microsoft. Mi equipo es el responsable de las nuevas versiones de SDL y de las herra-


mientas, que hacemos llegar tanto a nuestros clientes, como a los distintos equipos internos. Actualmente estamos distribuyendo la guía ágil de SDL (SDL Agile), y también estamos trabajando en nuevas herramientas que presentaremos durante los próximos meses. Acerca de SDL Agile: ayer estuve en la sesión de Bryan Sullivan en la que presentaba el SDL Agile, y no había demasiada gente. Sin embargo, cuando voy a sesiones de WPF, Silverlight o similares, las salas están repletas… ¿No estaremos perdiendo la perspectiva de algo tan importante como la seguridad en favor de otros conceptos como la experiencia de usuario?

ejemplo, los bugs de seguridad se traten como tal en cuanto a su trazabilidad y sus efectos; introducir los requerimientos de seguridad como work items para el equipo de desarrollo; e incluso obtener informes que nos indiquen qué puntos de la revisión de SDL hemos comprobado y qué requerimientos de seguridad se han completado. Para los desarrolladores que están empezando, y que quieren que su código sea seguro, ¿qué tipo de recursos están disponibles en MSDN, libros o formación que les puedas recomendar para empezar? Hay un par de cosas que recomiendo siempre. Una es mirar en http://www.microsoft.com/sdl, que

Una buena experiencia de usuario, por supuesto, es importante, pero también creemos que hacer un software seguro es importante. Una de las cosas que hemos conseguido en Microsoft durante los últimos 10 años es integrar la seguridad dentro del proceso de desarrollo, en vez de tratarla como algo externo al desarrollo. El año pasado, durante otra entrevista con Michael Howard y Adam Shostack, hablábamos acerca de esa integración de la seguridad dentro del ciclo de vida, y de la posibilidad de usar Team Foundation Server como elemento integrador. Este año hemos visto la nueva plantilla de proceso de TFS para el uso de SDL. ¿Qué pueden esperar los usuarios de esta plantilla? Esta nueva plantilla de proceso ha tenido mucho éxito en cuanto a número de descargas. Lo que la plantilla hace, básicamente, es tomar los requerimientos de SDL e integrarlos en Visual Studio para que, por

es donde publicamos nuevas herramientas, blogs, artículos y guías acerca de SDL. En cuanto a libros, recomendaría el libro "Writing Secure Code" (2da. edición) de Michael Howard y David LeBlanc. También recomendaría otro libro acerca de SDL que Michael y yo escribimos hace unos años, pero que sigue siendo válido, "The Security Development Lifecycle", y por último el libro "19 Deadly Sins of Software Security", de Michael Howard y otros, que es de fácil lectura. Siempre que hablamos de ciclo de vida, se discute acerca de qué significa que una tarea esté "completa". Sabiendo que una seguridad del 100% es imposible, ¿cuándo se puede decir que algo es "suficientemente seguro" como para publicarlo? Por supuesto, nunca se consigue la seguridad perfecta, pero la revisión final a nivel de seguridad nos da la información acerca de si el producto es lo suficientemente seguro, y la debemos basar en los reque-

<<dotNetManía

<< dnm.directo.entrevista

15


<<dotNetManía

<< dnm.directo.entrevista

16

rimientos de SDL. En Microsoft tenemos lo que conocemos con el bug bar, que forma parte de la guía y que nos habla de los tipos y la severidad de bugs que no son aceptables; creemos que otras compañías también disponen de algo parecido para saber cuándo es aceptable publicar un producto. El nivel de cero defectos en cualquier pieza de software compleja no es posible; pero podemos priorizar y enfocar nuestra labor hacia la eliminación de los bugs que son lo suficientemente severos como para causar un problema. Dentro de las novedades de Visual Studio 2010, tenemos muchas herramientas nuevas de testing, casi siempre a nivel funcional, pruebas de carga y similares. ¿Qué nos puedes contar acerca de herramientas de testing para automatizar las pruebas de seguridad? Este verano publicamos dos herramientas: MiniFuzz, que es una herramienta básica para detectar fallos en el código que puedan exponer vulnerabilidades en el código de tratamiento de ficheros que puedan provocar comportamientos no esperados de nuestra aplicación; y BinScope, que comprueba binarios para verificar que las opciones del compilador requeridas por SDL hayan sido usadas. Ambas utilidades son gratuitas y se pueden descargar desde el sitio de SDL en Microsoft (http://www.microsoft.om/sdl) y se integran con Visual Studio. Probablemente dentro de unos días, en el PDC de Los Ángeles, se anunciarán novedades relativas a Windows Azure y el software en la nube. ¿Cómo afectan estos nuevos tipos de desarrollos a SDL?

Hay un par de aspectos en los que SDL es importante para el desarrollo de software en la nube. Primero, es importante utilizar los conceptos de SDL a la hora de desarrollar una aplicación para la nube, de modo que una aplicación esté protegida de otras, también alojadas en la nube. Lo segundo, si eres una organización que tiene una aplicación en la nube, debes hacerla lo más segura posible, de modo que protejas a tus clientes y a sus datos. En este momento estamos preparando un documento (whitepaper) que trata acerca de estos temas con más detalle; será publicado en el sitio del SDL. El año pasado hice una pregunta similar a la siguiente a Michael y Adam. Microsoft suele estar en el ojo del huracán en lo que se refiere a la seguridad de sus aplicaciones, y la gente suele hablar mucho acerca de las vulnerabilidades del software de Microsoft. ¿Cómo estáis trabajando con los equipos de producto y cómo ha cambiado esto en los últimos años? Todo eso ha cambiado mucho en los últimos años; concretamente desde 2002, con la introducción de la iniciativa Trustworthy Computing, que se potenció en 2004 con la aparición de SDL. Con estas acciones y la introducción de la revisión de requerimientos de SDL en todos nuestros productos, realmente la seguridad ha pasado a tener un peso importante en el ciclo de vida de las aplicaciones dentro de Microsoft. Y no debemos dejar de mencionar que SDL se continúa actualizando constantemente, para incluir nuevas amenazas y nuevas buenas prácticas. Nuevamente, muchas gracias por la entrevista, Steve, y una última pregunta: ¿cómo ves el futuro de SDL? Por supuesto, cualquier otra cosa que quieras añadir para nuestros lectores será bienvenida. Estoy encantado de que vuestros lectores estén interesados en SDL, porque es algo en lo que hemos puesto un gran esfuerzo, para nuestro propio uso y para permitir a los desarrolladores construir aplicaciones más seguras. En cuanto al futuro, solo puedo asegurar que seguiremos trabajando en SDL y mejorándolo, para que las aplicaciones de Microsoft y de nuestros clientes sean cada vez más seguras.


plataforma.net

Luis Alfonso Rey

Mundo paralelo Desde hace mucho tiempo venimos oyendo acerca de la programación paralela, los hilos, tareas y conceptos relacionados, pero en la mayoría de los casos esto no ha ocasionado un impacto directo en la manera que tenemos de desarrollar. Sin embargo, esta situación está a punto de cambiar. En este artículo explicamos por qué.

Luis Alfonso Rey es un experto certificado que pertenece al área de servicios profesionales Danysoft, siendo ponente habitual en eventos Microsoft.

Casi desde la época inicial en que se popularizó la informática, la era de los primeros PC (8080/86/88), venimos oyendo acerca de la programación multiproceso, multitarea y multihilo. Si bien elementos como varios procesadores eran algo habitual en entornos de servidor, la creación de procesos e hilos y las ejecuciones asíncronas eran relativamente muy poco frecuentes en la programación de formularios. En definitiva, todo ese mundo nos es familiar, pero sin embargo a quien más, a quien menos, algo extraño. De hecho, la misma evolución del hardware es la que nos ha hecho tener una visión quizá demasiado uniforme de la programación. Habitualmente las innovaciones en el hardware se producían de forma muy previsible; nosotros desarrollábamos una aplicación que en una configuración específica se ejecutaba probablemente algo lentamente, pero con la siguiente evolución del hardware simplemente iba más rápido, siguiendo casi religiosamente la ley de Moore. Sin embargo, de un tiempo a esta parte los fabricantes de hardware han cambiado la estrategia, y donde antes simplemente fabricaban un nuevo procesador que superaba al anterior en

prestaciones y rendimiento, ahora aparece un procesador con más núcleos. Mejorar el micro ahora ya no es suficiente; así que hagámoslo más pequeño y metamos varios. Sin necesidad de estar hablando de servidores, cualquier equipo actual se apellida "Dual" o tiene el apodo "Quad", y se oyen voces de que los multiplicadores no se van a quedar ahí, sino que muy pronto se popularizarán los equipos de 8, 16 ó 32 procesadores. Todo lo anterior introduce una complicación añadida a la programación, ya que si antes un equipo nuevo nos garantizaba más agilidad para nuestras aplicaciones, hoy gran parte del aumento de la capacidad de proceso se debe a que tenemos un microprocesador multinúcleo, y esto no necesariamente se ve traducido en rendimiento. Para poder aprovechar la potencia de las nuevas generaciones de procesadores necesitamos poder utilizar todos estos núcleos y su capacidad de proceso, algo que hasta ahora estaba prácticamente reservado a aquellos que quisieran adentrarse en la profundidades de las API de los fabricantes o del sistema operativo, lo que elevaba la complejidad de nuestro desarrollo y ocasionaba que la mayoría de los desarrolladores desestimara estas opciones.


<< dnm.plataforma.net TPL Bajo el eslogan "Paralelización para las masas", .NET Framework 4.0 nos promete un servicio de programación paralela sencillo, compacto e integrado con tecnologías preexistentes en .NET. El secreto radica en la Task Parallel Library (TPL), que es la base de toda la programación paralela en .NET y que nos permite centrarnos más en el qué que en el cómo, habilitando la programación paralela de una manera muy similar a la secuencial y sobre todo sensible al contexto sin necesidad de recompilaciones; esto es, si la máquina en que se ejecuta la aplicación es multiprocesador o multinúcleo, ésta hará uso de la paralelización sin necesidad de que hagamos absolutamente nada. Los dos artefactos más importantes de esta librería son las clases Parallel y Task.

La clase Parallel Esta clase contiene métodos estáticos que nos van a permitir realizar acciones en ejecución paralela de manera muy simple. En concreto, esta clase cuenta con los métodos For, Foreach e Invoke. Los dos primeros son estructuras iterativas que convierten cada iteración en una tarea ejecutable independientemente en cualquier procesador, complementando en ambos casos versiones las versiones secuenciales originales (listado 1).

La clase Task representa la unidad mínima de asignación de trabajo a cualquiera de los procesadores de un sistema

Tareas La clase Task se puede definir como la representación de la unidad básica de paralelización; es decir, la unidad mínima de asignación de trabajo a cualquiera de los procesadores de un sistema. Además, las tareas ofrecen algunas otras características muy útiles, tales como la posibilidad de enlazar unas con otras, o la posibilidad de ser canceladas. Yendo al detalle técnico, una tarea es una clase derivada de System.Threading.Task o de la versión genérica de ésta, que puede ser invocada, además de mediante el método Parallel.Invoke, a través del método StartNew de la propia clase (listado 2).

C# foreach (var ele in coleccion) { Procesar(ele); } Parallel.ForEach(coleccion, ele => Procesar(ele));

var miTask = new Task(() => Console.WriteLine("Hola Mundo")); miTask.StartNew();

VB

VB

For Each ele In coleccion Procesar(ele) Next Parallel.ForEach(coleccion, Sub(ele) Procesar(ele))

C#

Dim miTask = New Task(Sub() Console.WriteLine("Hola Mundo")) miTask.StartNew() Listado 2.

Listado 1.

Parallel LINQ Otra las nuevas características de paralelización en .NET Framework 4.0 es PLINQ, un nuevo proveedor de LINQ implementado sobre la TPL. Para ello, se han reescrito todos los operadores de

<<dotNetManía

Por otra parte, el método Invoke es capaz de crear una tarea para ejecutarla en un procesador diferente al resto de la aplicación, utilizando el mayor número de núcleos/programadores (schedulers) o grado de paralelismo posible, gracias a la clase Task, la clase clave de toda la programación paralela.

19


<< dnm.plataforma.net

Tan solo invocando al operador AsParallel, se podrá convertir una consulta de LINQ to Objects en una consulta ejecutada en paralelo

ficación del grado de paralelismo o la invocación de la ejecución en paralelo ordenada, a fin de que los algoritmos que dependen de una entrada de datos ordenada funcionen correctamente. consulta estándar para operar sobre orígenes de datos paralelos. Gracias a ello, tan solo invocando al operador AsParallel del origen de datos, una consulta de LINQ to Objects se podrá convertir en una consulta ejecutada en paralelo (listado 3), si ello resulta rentable. De hecho, otra de las maravillosas características, al menos sobre el papel, que aporta PLINQ es una evaluación de costes que es capaz de determinar si la ejecución de una sentencia es más "barata" en el modo secuencial o paralelo (ya que éste último requiere un ligero overhead de gestión que para las consultas muy sencillas no compensa). Por otro lado, para aquellos que no renuncian a mantener el control, se puede forzar el modo de ejecución, además de otras muchas posibilidades, como la especi-

Estructuras de datos Además de todo lo mencionado anteriormente, TPL ofrece toda una serie de clases que nos van a facilitar también la algoritmia, así como el almacenamiento de los datos o su explotación mediante algoritmos paralelos. Para empezar, contamos con una serie de colecciones thread-safe, cuyo funcionamiento correcto está garantizado para entornos multitarea, evitando lecturas sucias, interbloqueos o efectos similares, como son BlockingCollection<T>, ConcurrentBag<T>, etc. Además, la librería ofrece una serie de clases a fin de facilitarnos la sincronización de tareas, como por ejemplo la clase Barrier, que actúa de punto de reunión para un conjunto de tareas, donde las que terminan primero "esperan" por las siguientes.

C# var consultaParalela = from elemento in origen.AsParallel() where elemento = 0 select elemento;

Conclusión

<<dotNetManía

VB

20

Dim consultaParalela = From elemento _ In origen.AsParallel() _ Where elemento = 0 _ Select element Listado 3.

.NET Framework 4.0 pretende popularizar la programación multitarea de una manera sencilla. Esto ya no es una frivolidad más o algo destinado a "gurús" del desarrollo, sino algo realmente importante si queremos aprovechar las nuevas características del hardware. Quizá con el tiempo la utilización de múltiples procesadores o múltiples núcleos vendrá implícita en las API de desarrollo, pero hasta ese día la manera más sencilla de descubrir el "Mundo Paralelo" es la Task Parallel Library de .NET.


plataforma.net

Jorge Luis De Armas Miguel Katrib

Diseño por Contratos en .NET 4.0 Un deseo hecho realidad Como continuidad de nuestra promesa de hablar sobre lo que vendrá con .NET 4.0 y Visual Studio 2010, el presente artículo está dedicado a una de estas novedades, cuyas ideas tal vez aún no sean muy conocidas por algunos desarrolladores: Code Contracts.

Miguel Katrib es doctor y profesor jefe de programación del departamento de Ciencia de la Computación de la Universidad de La Habana. Miguel es líder del grupo WEBOO, dedicado a la orientación a objetos y la programación en la Web (www.weboomania.com). Es entusiasta de .NET y redactor de dotNetManía. Colaborador de DATYS Tecnología y Sistemas. Jorge Luis de Armas (Jochy) es Arquitecto Principal y desarrollador de la empresa de software DATYS Tecnología y Sistemas. Es además colaborador y profesor invitado del grupo WEBOO de la Universidad de la Habana. (jldearmas.blogspot.com)

Aunque en .NET 4.0 solo estará disponible como biblioteca de ejecución (es decir, no integrado en la sintaxis de los lenguajes de programación, como sí lo fue desde el primer momento LINQ), Code Contracts [1] es un mecanismo para especificar requerimientos y garantías (contratos) que no se pueden representar solamente con metadatos establecidos por las signaturas de los métodos y los tipos. Estos contratos se expresan en forma de precondiciones, pos-condiciones e invariantes asociados a los objetos, y permitirán mejorar las capacidades de programación en tres aspectos fundamentales: • Análisis estático del código, o sea, la posibilidad de detectar errores de programación sin ejecutar el código. • Chequeo de inconsistencias en tiempo de ejecución. • Documentación del código.

Un poco de historia La verificación automática de programas ha sido un viejo anhelo de la Ciencia de la Computación; como demostración fehaciente de ello tenemos los trabajos pioneros de Dijkstra [2] y Hoare [3], que sentaron las bases para que ya desde hace tiempo en un lenguaje como CLU [4]1 aparecieran las aserciones.

1 2

Con el desarrollo de la programación orientada a objetos, y posteriormente la programación orientada a componentes, en donde la reusabilidad se convierte en la piedra angular, requerimos de mecanismos que nos den garantías no solo acerca de nuestro propio código, sino del código desarrollado por otros. No fue hasta la propuesta de Bertrand Meyer de Diseño por Contratos (Design by Contracts) en su lenguaje Eiffel [5] que el uso de las aserciones se integró verdaderamente a un lenguaje de programación2. La idea de Meyer, aunque genial, se basa en una metáfora muy simple. Entre el que diseña una clase y el cliente de la misma se establece un "contrato" que define los deberes y derechos de ambos. Estos deberes y derechos se van a representar, en la terminología de Eiffel, en forma de pre-condiciones, pos-condiciones e invariantes, tal y como se muestra en la tabla 1. Una pre-condición es una cláusula lógica que debe estar libre de efectos colaterales, y que debe cumplirse como requisito para ejecutar el método al que está asociada. Un uso frecuente de las pre-condiciones es validar los parámetros de entrada de los métodos (algo que no puede satisfacerse solo con la declaración y tipado estático de los parámetros). Una pos-condición es una cláusula lógica que debe cumplirse luego de la ejecución del método, y funge como garantía de lo que éste hace. Por tanto, las poscondiciones son evaluadas justo después de ejecutado el método y antes de retornar al código llamante.

Honor a Barbara Liskov, su creadora, que recientemente ha recibido el premio Turing por todas sus contribuciones. Esta fue la causa principal por la que en su momento nos enamoramos a primera vista de Eiffel (ver nuestros trabajos [6] y [7]).


<< dnm.plataforma.net

Diseñador de la clase

Derechos o beneficios

Pre-condiciones

Pos-condiciones e invariantes

Pos-condiciones e invariantes

Pre-condiciones

Tabla 1. Relación de deberes y derechos entre clientes y diseñadores de clases.

Finalmente, un invariante es una cláusula que establece las condiciones bajo las cuales el estado de un objeto es "correcto". Por tanto, los invariantes se validan luego de creados los objetos y después de ejecutar cualquier método3. indexing description: "Clase Monedero" class MONEDERO create Crea feature — Se exportan todos Saldo: DOUBLE; Depositar(cant: DOUBLE) is require cant >= 0; do Saldo := Saldo + cant; ensure Saldo = old Saldo + cant; end Extraer(cant: DOUBLE) is require cant >= 0; cant <= Saldo; do Saldo := Saldo - cant; ensure Saldo = old Saldo - cant; end Crea(saldoInicial: DOUBLE) is require saldoInicial >= 0; do Saldo := saldoInicial; ensure Saldo = saldoInicial; end invariant Saldo >= 0; end

Listado 1. Clase Monedero en Eiffel.

Un ejemplo: monedero en Eiffel El código Eiffel del listado 1 nos ilustra los tres tipos de aserciones. Aún cuando el lector no conozca la sintaxis de 3

4

cen directamente como parte de su sintaxis. Entre estos se pueden destacar Delphi Prism [8] (anteriormente llamado Oxygene) y Spec# [9]. Delphi Prism es un lenguaje comercial de la familia Pascal, inspirado en Delphi, donde el Diseño por Contratos se incorpora utilizando una sintaxis similar a la de Eiffel, aunque con algunas limitaciones. Su mayor insuficiencia es que no permite definir aserciones para las interfaces. Tampoco la relación con la herencia es la deseada, y la posibili-

Eiffel, creemos que pueda captar la esencia de este ejemplo. En él se presenta una clase Monedero que cumple tres funciones básicas: ver el saldo que contiene el monedero y depositar y extraer cantidades de dinero en el mismo. Note que los métodos Depositar y Extraer tienen como pre-condición, a cumplir por el código cliente que invoca al método, que el parámetro que se le pase tenga un valor positivo. Esta misma pre-condición le garantiza al desarrollador del método de la clase no tener que preocuparse de controlar esto dentro del código del método. El método Extraer tiene, además, otra precondición que indica que la cantidad a extraer debe ser menor o igual que el saldo disponible. Las pos-condiciones de Los autores de este trabajo con miembros del ambos métodos establecen el equipo de Pex en el reciente Tech-Ed Berlín 2009 compromiso del diseñador de la clase con el código cliente de la misma, de que luego de realizar la dad de hacer referencia a los valores orioperación de depósito o extracción el ginales (old) en las pos-condiciones se Saldo quedará establecido correctareduce solo a los tipos por valor. mente. Por otra parte, Spec# es un lenguaje Por último, el invariante garantiza experimental desarrollado por el propio que el saldo del monedero siempre se Microsoft Research a partir de C# (2.0) y mantenga mayor o igual que cero. para el cual además se implementó una herramienta para verificación estática del código conocida como Boogie. El listado 2 muestra la misma clase Monedero Contratos en otros lenguajes implementada en Spec#. Nótese el uso de Lamentablemente, en .NET originalnuevos elementos, como son las palabras mente no se incluyó el Diseño por Conclaves requires, ensures e invariant, así tratos4, y aunque hay implementaciones como los atributos [SpecPublic] y [Pure]. de Eiffel para .NET, lo cierto es que EifEs a partir de la experiencia del equipo de fel no se ha popularizado entre los desaSpec# que Microsoft ha desarrollado rrolladores de .NET. Ha habido varias Code Contracts, para generalizar los propuestas para implementar contratos resultados de Spec# de modo que puedan en diferentes lenguajes (comerciales y ser utilizados por cualquier lenguaje cuyo de investigación) que incluso los ofrecompilador genere código IL.

Usted puede leer en la propuesta de Meyer [5] sobre la conveniencia de evaluar los invariantes también antes de ejecutar cada método; discutir sobre esto se sale del espacio de este artículo. Tenemos que confesar que, en los orígenes de .NET, cuando preguntamos a miembros del equipo de Microsoft sobre el por qué de la no inclusión de Diseño por Contratos, nunca recibimos una respuesta convincente. Luego nos entusiasmamos con la aparición activa de Bertrand Meyer en algunos fórums de Microsoft, e incluso por la foto conjunta en la que apareció con Bill Gates. Pero después esas expectativas se desvanecieron.

<<dotNetManía

Cliente de la clase

Deberes u obligaciones

23


<< dnm.plataforma.net

using System; using Microsoft.Contracts; namespace Weboo { public class Monedero { [SpecPublic] private float m_Saldo; public Monedero(float saldoInicial) requires saldoInicial >= 0; ensures m_Saldo == saldoInicial; { m_Saldo = saldoInicial; } public float Saldo { [Pure] get ensures result == m_Saldo; { return m_Saldo; } } public void Depositar(float cant) requires cant >= 0; ensures m_Saldo == old(m_Saldo) + cant; { m_Saldo += cant; } public void Extraer(float cant) requires cant >= 0; requires cant <= m_Saldo; ensures m_Saldo == old(m_Saldo)-cant; { m_Saldo -= cant; }

ción adicional sobre los contratos, para que luego pueda ser utilizada por las herramientas. • Herramientas que trabajan sobre el código IL: - ccrewrite.exe modifica el código IL de un ensamblado para garantizar el chequeo de los contratos en tiempo de ejecución. - cccheck.exe realiza la verificación estática de los contratos (hasta donde es posible, claro, porque hay código que dependerá de valores de tiempo de ejecución). - ccdocgen.exe extiende el archivo de documentación (XML) que generan los compiladores a partir de los comentarios de documentación (/// en C#), incluyendo la información relativa a los contratos. - asmmeta.exe genera ensamblados de referencia auxiliares, que se utilizan durante la verificación estática o la conversión del código IL con cccheck.exe y ccrewrite.exe, respectivamente. • Ensamblados de referencia con información de contratos para los ensamblados estándar de .NET 4.0.

Los dos primeros elementos forman parte del nuevo espacio de nombres System.Diagnostics.Contracts y se implementan dentro de la versión de mscorlib.dll para .NET 4.0, mientras que los dos últimos se incluyen con el plug-in para integrar Code Contracts con Visual Studio [10]. Cuando este plug-in se descarga e instala, las herramientas mencionadas anteriormente son utilizadas automáticamente durante el proceso de generación de los proyectos. Es posible configurar para cada proyecto la forma en la que se desea utilizar la verificación de los contratos (figura 1). Es de destacar que el uso de Code Contracts no es exclusivo de .NET Framework 4.0 y Visual Studio 2010. El plug-in que Microsoft distribuye para instalar las herramientas antes mencionadas también permite utilizar Code Contracts con versiones anteriores de .NET y las diferentes ediciones de Visual Studio 2008. Para utilizar Code Contracts con versiones del CLR anteriores a la 4.0, hay que incluir explícitamente en nuestros proyectos la referencia al ensamblado Microsoft.Contracts.dll.

invariant m_Saldo >= 0; } }

Listado 2. Clase Monedero en Spec#.

<<dotNetManía

Code Contracts (contratos en .NET)

24

Code Contracts ofrece cuatro recursos fundamentales: • La clase estática Contract, que suministra un grupo de métodos estáticos que permiten especificar las precondiciones, pos-condiciones e invariantes. • Nuevos atributos que permiten colocar meta-información en el código de los diferentes lenguajes, de modo de poder ofrecer informa-

Figura 1.Ventana de configuración de Code Contracts en Visual Studio.


<< dnm.plataforma.net

El incluir Code Contracts en .NET 4.0 en forma de una librería, en vez de como una extensión sintáctica a los lenguajes que se distribuyen con .NET, es ventajoso desde el punto de vista de que hace posible utilizarla desde cualquiera de los lenguajes disponibles para .NET. Sin embargo, esto le resta elegancia a la propuesta y exige una mayor disciplina de uso de parte de los programadores5. Al trabajar sobre código IL, las herramientas son más generales y simples, pues no dependen de la sintaxis de un lenguaje particular ni de un compilador específico. En particular, el verificador estático utiliza interpretación abstracta, que es más rápida y predecible que la verificación estática de Spec#6 e incluso puede inferir invariantes de bucles y contratos de métodos. Como parte de la integración con Visual Studio, están disponibles plantillas de código (code snippets) para C# y VB.NET (figura 2) que nos ayudan al tecleo de los contratos, algo que siempre se agradece. En el listado 3 puede verse una implementación de Monedero utilizando Code Contracts. Note que las pre-condiciones y las pos-condiciones no se escriben con una sintaxis extensión de la de C#, sino invocando a los métodos Contract.Requires y Contract.Ensures dentro del código de los métodos. También se dispone de otros mecanismos complementarios para usar en las

using System; using System.Diagnostics.Contracts; namespace Weboo { public class Monedero { public Monedero(float saldoInicial) { Contract.Requires(saldoInicial >= 0); Contract.Ensures(Saldo == saldoInicial); Saldo = saldoInicial; } public float Saldo { get; private set; } public virtual void Depositar(float cant) { Contract.Requires(cant >= 0, "Depositar siempre una cantidad positiva."); Contract.Ensures(Saldo == Contract.OldValue(Saldo) + cant, "Después de depositar, el saldo debe ser igual al saldo anterior " + "más la cantidad depositada."); Saldo += cant; } public virtual void Extraer(float cant) { Contract.Requires(cant >= 0, "Extraer siempre una cantidad positiva."); Contract.Requires(cant <= Saldo, "No extraer nunca más de lo que hay."); Contract.Ensures(Saldo == Contract.OldValue(Saldo) - cant, "Después de extraer, el saldo debe ser igual al saldo anterior " + "menos la cantidad extraída."); Saldo -= cant; } [ContractInvariantMethod] protected void Invariante() { Contract.Invariant(Saldo >= 0); } } }

Figura 2. Plantillas de código C# para insertar precondiciones, pos-condiciones e invariantes.

5

6

pos-condiciones; tal es el caso del método Contract.OldValue, que permite referirse al valor que computó una expresión antes de ejecutar el método. Note que en el listado 3 se usa Contract.OldValue(Saldo) para referirse al valor de Saldo antes de ejecutar los métodos Depositar y Extraer. Otro recurso para usar en las pos-condiciones es referirnos al resultado devuelto por el método; esto se logra invo-

cando a Contract.Result<T> (ver listado 5), y mediante Contract.ValueAtReturn<T> podemos también hacer referencia a los valores de los parámetros de salida del método (si los tuviere). Para convertir de forma sencilla a esta notación de contratos un código de verificación del tipo if-then-throw que ya existiese dentro de algún método legado, se dispone del método Contract.EndContractBlock. Colocando una invocación a este método se marca el fin del segmento de código que hace de "pre-condición" (listado 4).

Los creadores de Code Contracts (que en buen número coinciden con los de Spec#) argumentan esto diciendo que lo diseñaron sobre la base de la experiencia con Spec# y lo que aprendieron sobre qué funciona y qué no (ver [11]). ¡La verificación estática de Spec# incluye un demostrador de teoremas!

<<dotNetManía

Listado 3. Clase Monedero en C# con Code Contracts.

25


<< dnm.plataforma.net

public Empleado(Departamento dpto) { if (dpto == null) throw new ArgumentNullException(); Contract.EndContractBlock(); Dpto = dpto; }

Listado 4. Uso de EndContractBlock para definir un bloque de contrato a partir de código legado.

Cuantificadores en los contratos En Code Contracts existe la posibilidad de usar, dentro de los contratos, el cuantificador universal Contract.ForAll y el cuantificador existencial Contract.Exists. Contract.ForAll tiene dos argumentos. El primero es una colección expresada por el tipo genérico IEnumerable<T>, mientras que el segundo es un predicado (método de un argumento que retorna un bool) expresado mediante el tipo Predicate<T>. El método retorna true si todos los elementos de la colección evalúan el predicado a true, y false en caso contrario. Mientras tanto, Contract.Exists tiene exactamente los mismos parámetros, pero retorna true tan pronto encuentra un elemento de la colección que evalúe el predicado a true; el resultado será false si el predicado no se cumple para ningún elemento.7 Note, por ejemplo que el resultado de: Contract.Ensures(Contract.ForAll( <colección>, <predicado>));

Es el mismo que el de: Contract.Ensures(<colección>.All( <predicado>));

<<dotNetManía

Del mismo modo, las dos construcciones siguientes producen el mismo resultado:

26

Contract.Ensures(Contract.Exists( <colección>, <predicado>)); Contract.Ensures(<colección>.Any( <predicado>));

7

La posibilidad de usar cuantificadores aumenta la capacidad expresiva de los contratos (vea en [6] otros ejemplos que hace un tiempo desarrollamos para el lenguaje Eiffel y adáptelos a Code Contracts). Muchos tipos relacionados con colecciones, y en especial la "maquinaria" de LINQ, se verían enriquecidos en su definición y documentación si incluyesen ahora contratos con cuantificadores. En el listado 5 mostramos cómo podrían añadírsele dos pos-condiciones a un método como GroupBy. Si, por

ejemplo, cambiamos la sentencia: return Enumerable.GroupBy(source, selector); por la instrucción: return Enumerable.GroupBy( source, selector).Skip(1); (note que estamos for-

zando que el resultado sea incorrecto al quitar uno de los grupos), violaríamos la segunda pos-condición. En ese caso, si el chequeo de las pos-condiciones está activado, la ejecución de GroupBy provocaría una violación de la segunda pos-condición, produciendo el mensaje que se muestra en la figura 3.

static class ContractedLINQMethods { public static IEnumerable<IGrouping<K, T>> GroupBy<T, K>( this IEnumerable<T> source, Func<T, K> selector) { Contract.Ensures( Contract.ForAll(Contract.Result<IEnumerable<IGrouping<K,T>>>(), x => x.All(y => selector(y).Equals(x.Key) && source.Contains(y))), "Todos los elementos de un grupo tienen la misma llave del grupo y " + "están en la colección original."); Contract.Ensures(Contract.Result<IEnumerable<IGrouping<K, T>>>(). Select(x => x.Count()).Sum() == source.Count(), "La suma de las cantidades de cada grupo es igual a la cantidad de la " + "colección original"); //...otras pos-condiciones para GroupBy return Enumerable.GroupBy(source, selector); } //...otros métodos de LINQ }

Listado 5. Poniendo contratos a métodos de LINQ.

static class ContractedLINQMethods { public static IEnumerable<IGrouping<K, T>> GroupBy<T, K>( this IEnumerable<T> source, Func<T, K> selector) { //... Contract.Ensures(Contract.ForAll(source, (x => Contract.Result<IEnumerable<IGrouping<K, T>>>(). Any(y => y.Contains(x)))), "Todo elemento de la colección original está en algún grupo."); //... } //... }

Listado 6. Añadiendo una nueva pos-condición a GroupBy.

Realmente el efecto de estos dos métodos puede lograrse usando los recursos de LINQ. No hay una razón clara del porqué de esta redundancia, que la propia documentación de Code Contracts menciona. Podemos especular que para crear cultura en los programadores o facilitar la implementación de alguna de las herramientas.


<< dnm.plataforma.net

Sin embargo, la pos-condición del método GroupBy que se muestra en el listado 6 provoca el

inesperado error de la figura 4, que se produce incluso antes de ejecutar nuestro método ContractedLINQMethods.GroupBy8.

objeto del tipo base, y la clase derivada pueda haber añadido pre-condiciones "más fuertes", Code Contracts no permite adicionar nuevas pre-condiciones a un método en una clase derivada9. En el caso de las pos-condiciones e invariantes, no es problema adicionarlos al heredar, pues crear poscondiciones o invariantes "más fuertes" da más garantías al cliente de la clase. El listado 7 muestra un ejemplo de clase MonederoConMemoria, que hereda de Monedero. public class MonederoConMemoria : Monedero { private List<float> trans; public MonederoConMemoria(float saldoMinimo) : base(saldoMinimo) { Contract.Requires(saldoMinimo >= 0); Contract.Ensures(Transacciones != null); Contract.Ensures(Transacciones.Count() == 1); Contract.Ensures(Transacciones.First() == saldoMinimo); trans = new List<float> { saldoMinimo }; }

Figura 3. Mensaje por violación de pos-condición.

public override void Depositar(float cant) { Contract.Ensures(Transacciones.Count() == Contract.OldValue(Transacciones.Count()) + 1); Contract.Ensures(Transacciones.Last() == cant); base.Depositar(cant); trans.Add(cant); } public override void Extraer(float cant) { Contract.Ensures(Transacciones.Count() == Contract.OldValue(Transacciones.Count()) + 1); Contract.Ensures(Transacciones.Last() == -cant); base.Extraer(cant); trans.Add(-cant); }

Figura 4. Bug al incluir pos-condición a GroupBy.

public IEnumerable<float> Transacciones { get { return trans; } }

Contratos y la herencia

<<dotNetManía

En Code Contracts los contratos se heredan. Es decir, las pre-condiciones y pos-condiciones se aplican a las respectivas redefiniciones que pueda haber de los métodos en clases derivadas. Sin embargo, para evitar conflictos asociados con el hecho de que un código no cumpla con una pre-condición, porque se esté usando un objeto de un tipo derivado en lugar de un

28

8

9

[ContractInvariantMethod] protected void Invariante() { Contract.Invariant(Transacciones.Sum() == Saldo); } }

Listado 7. Contratos y herencia. Clase MonederoConMemoria.

Este bug persiste en el beta 2 de VS 2010. En el momento de entregar este artículo a imprenta, ya lo habíamos reportado al fórum de Code Contracts para su solución. Pero parece que ésta quedará postergada para una próxima versión. Para más información, vea social.msdn.microsoft.com/Forums/en-IE/codecontracts. Una propuesta más elaborada es la del lenguaje Eiffel, que permite que la clase derivada pueda poner pre-condiciones "más débiles" (que exijan menos del código cliente). Pero controlar lo que significa "más débil" implicaría una implementación más compleja e impondría una práctica de uso más disciplinada, algo que al parecer los autores de Code Contracts consideraron no se compensaba con el valor práctico real que añadir pre-condiciones pudiese aportar.


<< dnm.plataforma.net

Contract.Invariant( Transacciones.Sum() == Saldo);

Contratos para tipos de interfaz Una interfaz es la definición más abstracta que puede haber de un tipo. Como es sabido, lamentablemente en las interfaces de C# (y de los lenguajes .NET) solo se describen las signaturas de los métodos y propiedades y no se puede escribir código10, por lo que el patrón que Code Contracts ha seguido hasta ahora no se puede aplicar a una interfaz, porque no se puede poner dentro de la misma código como Contract.Requires(...) o Contract.Ensures(...), ni tampoco añadir un método para los invariantes. La solución que ofrece Code Contracts a este problema exige una disciplina de uso. La definición de la interfaz hay que precederla del atributo: [ContractClass(typeof( <nombre de la clase con los contratos>))]

Con esto se indica cuál es la clase que implementa los contratos de la interfaz. A su vez, para indicar a qué interfaz corresponde, la definición de la clase que incluye los contratos de la interfaz debe estar precedida por el atributo: [ContractClassFor(typeof( <nombre de la interfaz>))]

En el listado 8 se muestra cómo poner contratos a una interfaz como IMyList<T>. Note que hay que replicar

cada uno de los métodos o propiedades de la interfaz a los que se quiera asociar contratos. Invitamos al lector a poner contratos a toda la interfaz IList<T>. El tipo definido por una clase que implemente una interfaz es un subtipo del tipo definido por la interfaz, de modo que todo lo dicho anteriormente

con relación a los contratos y la herencia se aplica también para las interfaces. Es decir, la implementación de una interfaz mantiene las mismas pre-condiciones definidas para los métodos de la interfaz y no permite añadir nuevas, pero sí pueden añadirse más pos-condiciones e invariantes.

using System; using System.Diagnostics.Contracts; namespace Weboo { [ContractClass(typeof(IListContracts))] interface IMyList<T> { void Add(T item); int Count {get;} T this[int index] { get; set; } Contains(T item); ... } [ContractClassFor(typeof(IMyList))] sealed class IListContracts: IMyList { public void IMyList.Add(T item) { Contract.Ensures(Contract.OldValue(((IMyList)this).Count) == ((IMyList)this).Count + 1); Contract.Ensures(((IMyList)this).Contains(item)); } public int IMyList.Count { get { Contract.Ensures(0 <= Contract.Result<int>()); } } public T this[int index] { get { Contract.Requires(index >= 0 && index < ((IMyList)this).Count); Contract.Ensures(((IMyList)this).Contains(Contract.Result<T>())); Contract.Ensures(Contract.OldValue(((IMyList)this).Count) == ((IMyList)this).Count); } set { Contract.Requires(index >= 0 && index < ((IMyList)this).Count); Contract.Ensures(((IMyList)this)[index] == value); Contract.Ensures(Contract.OldValue(((IMyList)this).Count) == ((IMyList)this).Count); } } //... [ContractInvariantMethod] public void IMyIListInvariant() { Contract.Invariant((IMyList)this).Count >= 0); } } }

Listado 8. Contratos e interfaces. 10

Desde siempre nos hemos lamentado de la limitación de que no pueda ponerse código en un tipo de interfaz, como si hacerlo introdujese "impurezas". El verdadero dolor de cabeza para implementar la capacidad de poner código en la definición de un tipo de interfaz es que en la interfaz se definan variables de instancia. Pero debería poder ponerse código siempre que dicho código solo utilice parámetros y otros métodos y propiedades de la interfaz. Esto propiciaría la reusabilidad y evitaría lo que frecuentemente debe haberle ocurrido al lector: tener que replicar un mismo código en las diferentes implementaciones de una interfaz. De hecho, algo similar es posible en otros lenguajes de programación a través del concepto de mixins.

<<dotNetManía

En esta nueva clase se redefinen los métodos Depositar y Extraer para además mantener una traza de todas las transacciones hechas. En ambos se hereda la precondición, pero se agrega una pos-condición que garantiza al cliente de la clase que la transacción se ha almacenado. Además, se ha agregado un nuevo invariante para garantizar que la suma de las transacciones realizadas es igual al saldo del monedero. Note el uso que se hace del operador Sum de LINQ en la especificación del contrato del invariante:

29


<< dnm.plataforma.net

¿Chequeo estático o en tiempo de ejecución? Code Contracts permite la verificación de los contratos tanto estáticamente como en tiempo de ejecución, lo cual podemos configurar en la pestaña correspondiente de las propiedades del proyecto (figura 1). La verificación estática puede ser muy útil, pues nos permite detectar errores (por incumplimientos en los contratos) sin tener que ejecutar los programas. El código del listado 9 muestra el uso de un MonederoConMemoria al que se le hacen varios depósitos y extracciones. Note, sin embargo que el primer valor que se intenta depositar es negativo, lo que viola la pre-condición; vea en la figura 5 cómo al compilar el proyecto en Visual Studio 2010 se nos muestra dicho incumplimiento del contrato en la ventana de mensajes.

La verificación estática debe utilizarse con cuidado ya que requiere buen conocimiento de Code Contracts, y en ocasiones es necesaria nuestra intervención (utilizando algunos atributos) para que la herramienta pueda verificar cada contrato. La herramienta de verificación estática, de nombre cccheck, aún tiene algunas limitaciones que están descritas en la documentación y que deben tenerse en cuenta durante el desarrollo. Durante la etapa de depuración, es recomendable la verificación de los contratos en tiempo de ejecución, de modo de poder desactivar los mismos cuando ya la aplicación esté en explotación y no afectar el rendimiento. Cuando utilizamos la verificación en tiempo de ejecución, si un contrato deja de cumplirse se disparará una excepción que muestra la condición que ha sido violada. El mismo ejemplo del listado 9, al ser ejecutado, dispara la excepción que se muestra en la figura 6.

using System; namespace Weboo { class Program { static void Main(string[] args) { MonederoConMemoria monedero = new MonederoConMemoria(200); float cant = 100; cant -= 150; monedero.Depositar(cant); monedero.Extraer(25); monedero.Extraer(100); monedero.Extraer(175); foreach (float v in monedero.Transacciones) Console.WriteLine(v); Console.ReadLine(); } } }

Listado 9. Uso de la clase MonederoConMemoria que viola la pre-condición de Depositar.

Documentación de los contratos de una clase

<<dotNetManía

Figura 5. Chequeo estático de contratos.

30

En muchos casos, la verificación estática evitaría tener que crear pruebas unitarias (unit tests)11. En un próximo artículo mostraremos cómo ambas técnicas (contratos y pruebas unitarias) pueden combinarse de una manera muy efectiva. Una herramienta de nombre Pex ha sido desarrollada por parte del equipo de Code Contracts para generar pruebas unitarias a partir de contratos. 11 12

Figura 6. Mensaje con los detalles de la violación del contrato en el ejemplo del listado 9.

Tan en boga en los últimos tiempos con el auge de las metodologías ágiles. La mayoría de los lenguajes para .NET incluyen esta facilidad, aunque la sintaxis puede variar.

Como es conocido, C# permite la definición de comentarios de documentación con el prefijo /// y utilizando un grupo de elementos XML predefinidos12. Estos comentarios son procesados por el compilador y exportados a un archivo .xml con el mismo nombre del ensamblado, si se incluye la opción correspondiente en las propiedades del proyecto. Este archivo es utilizado por el propio Visual Studio para mostrar ayuda contextual, y por otras herramientas como SandCastle [12] para generar documentación compatible con MSDN Library. Code Contracts permite ampliar la capacidad de documentar el código incluyendo una herramienta (ccdocgen.exe) que extiende el archivo XML de documentación con la información relativa a los contratos. El uso de la misma está integrado en Visual Studio, y basta marcar la opción correspondiente en la pestaña de Code Contracts de las propiedades del proyecto (ver figura 1). Note que para que se incluya la documentación de los contratos en el archivo XML de documenta-


<< dnm.plataforma.net

Figura 7. Archivo CHM con la documentación de las clases que utilizan en este artículo.

ción debe marcarse también la opción para generar el ensamblado de referencia de los contratos. Lamentablemente, por ahora Visual Studio no utiliza la información de los contratos incluida en el archivo XML para mostrar ayuda contextual. Sin embargo, junto con la herramienta se incluye un parche para actualizar SandCastle, de modo que éste incluya la información de los contratos en los diferentes tipos de documentos que permite generar. En la figura 7 se muestra un archivo de ayuda CHM generado con SandCastle para las clases Monedero y MonederoConMemoria que muestra los contratos para el método Extraer13.

<<dotNetManía

Conclusión

32

Desde los inicios de .NET hemos defendido la inclusión del Diseño por Contratos en .NET (ver [13]); celebramos que finalmente Microsoft se haya decidido a incorporarlo a la plataforma.

13

Es posible que se requiera algún tiempo para que los desarrolladores de .NET se habitúen a las buenas

prácticas de especificar su software usando contratos, pero una vez que se desarrolle este hábito se deberá apreciar un salto cualitativo considerable. Esperamos que muchas buenas prácticas y experiencias en el uso de contratos puedan trasmitirse a través de dotNetManía. No obstante, la forma de utilización del Diseño por Contratos puede no ser aún la ideal. La propuesta actual requiere ser aplicada siguiendo un grupo de convenios que deben ser garantizados por los programadores, pero que no son controlados por los compiladores ni ayudados por Intellisense. Puede que futuras versiones de C#, VB.NET e incluso F#, tengan incorporados los contratos como parte de su sintaxis, facilitando con ello las buenas prácticas de su uso y la ayuda que nos puedan brindar las herramientas. Mientras tanto, en una próxima entrega de dotNetManía esperamos poder brindar una solución basada en un DSL para definir más fácilmente contratos, que luego solo haya que "asociar" a una clase .NET.

Referencias [ 1] [ 2] [ 3]

Microsoft Corporation. Code Contracts User Manual, septiembre de 2009. Dijkstra, E.W. A Discipline of Programming, Prentice Hall, 1976. Hoare, C.A.R. An Axiomatic Basis for Computer Programming, Communications of the ACM, Volume 12, Number 10, octubre de 1969.

[ 4] [ 5]

Liskov, B. CLU Reference Manual, Springer, 1983.

[ 6]

Katrib M, Martínez I. Collections and Iterators in Eiffel, Journal of Object Oriented Programming, noviembre de 1993.

[ 7]

Katrib M, Coira J. Improving Eiffel assertions using quantified iterators, Journal of Object Oriented Programming, noviembre de 1997.

[ 8] [ 9] [ 10 ] [ 11 ] [ 12 ]

http://prismwiki.codegear.com/en/Main_Page.

[ 13 ]

Katrib M, Ledesma E, y Paneque L. Including Assertions in .NET Assemblies. .NET Developers Journal, septiembre de 2003.

Meyer, B. Applying Design by Contracts, Computer IEEE, octubre de 1992.

http://research.microsoft.com/en-us/projects/specsharp. http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx. http://blogs.msdn.com/somasegar/archive/2009/02/23/devlabs-code-contracts-for-net.aspx. http://sandcastle.codeplex.com.

En el recién finalizado Tech-Ed Berlín 2009, ponentes del equipo de Pex hablaron de una futura integración de Code Contracts con Intellisense, y mostraron una posible notación dentro del editor para "visualizar" los contratos. Interrogados sobre cuándo sería realidad ese futuro, declararon sus aspiraciones de que fuese con la salida final de VS 2010.


plataforma.net

Miguel López

Mejorando la calidad de las interfaces Web (I) Marcado estructural y semántico con XHTML, HTML 5 y Expression Web

En esta serie de artículos vamos a profundizar en los fundamentos del diseño de interfaces Web de calidad con Microsoft Expression Web 3.0 utilizando los estándares actuales, y le echaremos un vistazo a los nuevos borradores de estándares para la Web (XHTML 2.0 y HTML 5); para ello, vamos a utilizar la nueva versión, la más potente y funcional de todas las que se han entregado hasta el momento, de Microsoft Expression Web, que incorpora interesantes capacidades para mejorar el diseño multi-plataforma (navegador), como SuperPreview, y mantiene un interesante conjunto de utilidades para comprobar la compatibilidad con los estándares para la Web y la accesibilidad de los documentos HTML.

Asimismo, la serie proporcionará un conjunto de información actualizada sobre la importancia de la calidad interna (código) de los documentos que componen el corazón de la Web y que cualquier lenguaje de servidor debe, al final, generar, pues HTML es el lenguaje representable de forma estándar por esta plataforma, independientemente de si usamos ASP.NET, PHP, Java o cualquier otra tecnología de servidor. Miguel López es investigador del grupo de interacción LoUISE de la Universidad de Castilla-La Mancha y director gerente de Symbia IT, spin off de la misma. Ha escrito un libro y un curso sobre diseño Web accesible basado en estándares con Microsoft Expression Web. Es speaker habitual en la Universidad y en grupos de usuarios y vicepresidente de marketing de INETA Europe.

El A, B, C de la programación Web de cliente Con las tecnologías para enriquecer la experiencia de usuario con JavaScript (AJAX), se presentan nuevos problemas y nuevas soluciones desde el punto de vista de la Web como plataforma de acceso universal (Tim Berners Lee), y desde este punto plantearemos dicha problemática de diseño y programación de páginas Web con estándares: (X)HTML para definir la estructura de los contenidos, CSS como vehículo de presentación multiplataforma, para "decorar" y crear diseños impactantes (presentación), accesibles, usables y fáciles de modifi-

car o de adaptar a otros dispositivos, más allá de la pantalla del ordenador; y, por último, en la tercera entrega de la serie nos aventuraremos en el mundo de la programación de cliente con JavaScript como lenguaje para enriquecer la interfaz de usuario y mejorar la experiencia global desde un punto de vista estándar, apuntando la técnica de JavaScript no intrusivo, también denominada a veces como programación semántica de eventos, y sacándole todo el partido al árbol de elementos del documento (DOM). Para finalizar esta serie sobre la calidad de las interfaces Web tradicionales, introduciremos diferentes mecanismos y utilidades que nos ofrece Microsoft Expression Web para el análisis de la calidad de las interfaces Web: comprobación de la compatibilidad con diferentes esquemas de estándares, compatibilidad con diferentes navegadores Web o la generación de diferentes tipos de informes sobre errores e incongruencias que dificultan la facilidad de uso de los elementos básicos que componen cualquier aplicación Web: sus documentos HTML. El objetivo está claro: mejorar notablemente nuestras aplicaciones Web desde el punto de vista de la usabilidad y la accesibilidad, haciendo uso de la


<< dnm.plataforma.net

El drama Si echamos un vistazo a cómo ha ido evolucionando la Web en los últimos años, nos damos cuenta de lo complicado que ha resultado a veces obtener los mismos resultados (visualización de una página o sitio Web) en diferentes navegadores, y esto ha hecho que, la mayoría de las ocasiones, los diseñadores y desarrolladores hayan optado por centrarse en un navegador y diseñar un código que se visualiza a la perfección en ese navegador o incluso en una versión concreta. Esto es una posible solución, y no mala del todo, si pensamos que hasta Microsoft Explorer 8 ningún navegador había implementado al 100% las especificaciones de HTML 4.01 o de CSS 2.1 ¡Hasta Explorer 8! Eso es, hasta ayer ningún navegador permitía dibujar correctamente una página realizada con alguno de estos estándares; pero evidentemente, no siendo una solución mala, no es la solución más apropiada. Algunas de las razones son los problemas derivados del uso de un único navegador para poder acceder correctamente a todas las funcionalidades de un sitio Web. En primer lugar, no todo el mundo usa Internet Explorer 8, como tampoco Mozilla Firefox. Según datos de octubre de 2009, Microsoft Internet Explorer (versiones 6, 7 y 8 en conjunto) tiene un índice de uso del 37,5% de los usuarios, Mozilla Firefox un 47,5%, Google Chrome un 8%, Safari un 3,8% y Opera un 2,3%1. El análisis es inmediato: si crea un sitio Web optimizado para Mozilla Firefox, por ejemplo, de cada millón de usuarios que accedan al sitio solo 475.000 podrán acceder correctamente a todo el conteni-

1

do y la funcionalidad de sus páginas. Eso es menos de la mitad (transfórmelo en euros): ¡drástico! Pero ésta no es la única razón. Piense en los usuarios que acceden a la Web usando dispositivos móviles, o que disponen de versiones antiguas de los navegadores: ¡otro drama! O piense en los usuarios (¡que los hay!) que no dispongan de banda ancha y accedan a la Web desde un módem a baja velocidad. Las páginas diseñadas "al uso" (para un navegador concreto, con tablas para el diseño, usando imágenes de fondo para separar elementos, etc.) pesan más, tardan más en cargarse, empeoran la experiencia de los usuarios y esto no es nada bueno para su negocio; puede verlo como que está perdiendo dinero o, si lo prefiere, oportunidades de negocio.

• La segunda perspectiva es la presentación, cómo se presenta la información (visualmente). • La tercera y última perspectiva es la interactividad, el comportamiento; qué mecanismos usamos para enriquecer la experiencia interactiva y visual del usuario final.

Figura 2. Anatomía de un documento de hipertexto HTML.

Figura 1. Un sitio Web visualizado incorrectamente con dos navegadores diferentes (Safari para Windows e Internet Explorer 8 para Windows)

Lenguajes estándar de Internet Realmente, hoy en día no es complicado (y eso es lo que duele) resolver la mayor parte de los problemas que acabamos de identificar. Los estándares Web nacen y se perfeccionan con un fin muy claro: colaborar al acceso y al uso universal de la Web, para lo cual promueven una arquitectura de separación de las partes que conforman un documento Web (y con HTML 5, también de una aplicación Web). Desde el punto de vista de los estándares Web, una página o documento HTML podemos verlo desde tres perspectivas (figura 2): • La primera es la estructura, qué partes componen el documento.

Según los datos estadísticos del W3Schools.com.

En lo que sigue vamos a adentrarnos en la parte más importante, que define qué es y para qué sirve un documento HTML, vamos a analizar su estructura y describir cómo mejorar la calidad de la Web usando marcado estructural (X)HTML semántico.

Marcado estructural semántico con (X)HTML Desde la primera publicación del estándar HTML 2.0 en el año 1995 (¡no hubo versión 1.0!), el "lenguaje de programación de Internet" (como fue bautizado), que nos permite representar información en formato hipertextual (contenidos y enlaces), ha sufrido muy pocos cambios (una versión 3. Y unos pocos meses después, la ver-

<<dotNetManía

autoría de documentos HTML con Microsoft Expression Web y de las últimas técnicas y novedades en los estándares para este medio, rentabilizando la inversión de las empresas e incrementando el impacto de la información y las aplicaciones de Internet, haciendo que sean más atractivas, estables, rápidas y efectivas.

35


<< dnm.plataforma.net

sión actual 4.x :-). Hoy en día, el W3C trabaja en la especificación HTML 5.0 (se anunció el cierre del grupo de trabajo de XHTML 2.0 para finales de 2009), que aportará algunos cambios no demasiado importantes en la representación de la información (punto de vista estructural) y en la semántica que nos permitirán configurar documentos Web de manera que representen más fielmente la realidad actual y los usos de Internet a través de la Web (WWW). En la figura 3 puede ver un mapa actual de los lenguajes relacionados con Internet.

accesible por diferentes tipos de dispositivos u ofrecer contenidos optimizados para su carga más rápida (mejora de la experiencia de usuario); todo eso, lo creamos o no, es lo que hay detrás del estándar. Vamos a ver rápidamente algunas buenas prácticas que nos ayudarán a mejorar notablemente la calidad de las interfaces Web usando los estándares actuales y nuestras herramientas favoritas de desarrollo Web, Visual Studio 2010 o Microsoft Expression Web 3.x.

mento HTML o ASP.NET. En Visual Studio 2010, se puede modificar este documento predeterminado yendo al menú "Tools" | "Options" | "Text Editor" | "HTML" | "Validation" (figura 4). En Microsoft Expression Web, la opción se encuentra en "Tools"| "Page editor options" | "Authoring" | "Doctype and secondary schema" (figura 5).

Elegir un tipo de documento: modo de compatibilidad con estándares

<<dotNetManía

Figura 3. Un mapa actual de los lenguajes de Internet (W3C).

36

En 1990, Tim Berners Lee se planteó la creación de un lenguaje para construir documentos que se pudiesen visualizar por los usuarios (científicos entonces) usando Internet como medio de comunicación (modelo cliente/servidor, petición /respuesta). Eran los albores de la WWW (World Wide Web) y se habían dado los primeros pasos para estandarizar (normalizar) dichas comunicaciones a través del uso de la red Internet. Pocos años más tarde vería su aparición HTML 2.0, y con el estándar los grupos de interés trabajando en el lenguaje (primero el CERN, luego IETF -Internet Engineering Task Force-, y finalmente W3C). El lenguaje nace con el objetivo de favorecer el acceso universal a la información (independiente del dispositivo y de la plataforma), y éste es nuestro punto de partida, tanto si lo entendemos como alcanzar un público objetivo más amplio, obtener mayores beneficios económicos, ser

El primer paso para entender y seguir un estándar concreto es decidir qué estándar queremos usar, esto es, especificar "de alguna forma" cuál es el esquema contra el que vamos a escribir nuestro código. Uno de los principales problemas que tienen los creadores de aplicaciones para navegadores es decidir qué hacer cuando en una página aparecen errores de marcado, cuando se usan etiquetas no definidas o cuando las que existen se usan de forma incorrecta; por ejemplo, qué pasa cuando una etiqueta no se cierra correctamente. Por eso es importante seleccionar si usaremos HTML 4.01, XHTML 1.0 de transición, XHTML 1 estricto, etc. Si no se especifica un tipo de documento al crearlo, el navegador Web deberá interpretar, como bien pueda, todo lo que sigue, lo que técnicamente se conoce como el modo de navegación sin compatibilidad con estándares (quirks mode), y donde cada navegador hace lo que le parece. Podemos realizar esta tarea en la primera línea de cualquier documento Web, definiendo el tipo de documento (etiqueta DOCTYPE). Para facilitarnos esta tarea, las aplicaciones de Microsoft (Visual Studio 2010, Expression Web) utilizan una configuración por defecto que se aplica cada vez que creamos un nuevo docu-

Figura 4. Configurar el tipo de documento Web predeterminado en Visual Studio 2008.

Figura 5. Configurar el tipo de documento Web predeterminado en Expression Web.

Más adelante veremos cómo podemos configurar estas aplicaciones para crear documentos preparados para HTML 5.x, automatizando la tarea lo máximo posible.

La semántica importa HTML, como lo entendemos hoy (bien hablemos de HTML 4.x o de XHTML 1.x), trata de definir un conjunto de etiquetas (tags) que especifican qué rol o función semántica tiene cada


<< dnm.plataforma.net

elemento. Por ejemplo, el encabezado de nivel 1 <h1> le indica al documento que es el elemento textual más importante de la página (y en consecuencia sólo debería existir uno por página o sección de contenido), mientras que una etiqueta <em> indica que queremos enfatizar el texto al que la etiqueta envuelve, y una etiqueta <table> establece una estructura de datos tabular para mostrar información. El problema está en entender que podemos usar cualquiera de estos elementos para otros fines diferentes a los que representa su semántica. Por ejemplo, cuando alguien trata de usar una tabla con fines de definir un diseño (distribuyendo elementos de diseño en las celdas), está haciendo un mal uso del elemento tabla, pues su objetivo inicial no es ése. De nuevo, el problema es que lo podemos hacer y de hecho, muchos desarrolladores lo han hecho a lo largo de los años en vez de usar las técnicas de CSS que existen para ello; para colmo de males, HTML no dice nada acerca de qué hacer cuando ocurre un error, bien sea de semántica (uso de un elemento) o de código (error en una etiqueta, orden de etiquetas incorrecto, etc.). Por lo tanto, la segunda conclusión que debemos sacar es que la Web semántica puede estar más cerca de lo que a menudo pensamos, y que pasa, ineludiblemente, por usar correctamente las etiquetas del lenguaje (X)HTML, cada una de la forma que se establece en la especificación. Este es el primer y sencillo paso para comenzar a mejorar la estructura de nuestros documentos HMTL. Lo más importante a recordar es que no es necesario usar la especificación formal siempre; el significado de cada elemento suele ser intuitivo, y cuando haya duda o se quiera saber más sobre alguno en particular, es el momento de consultar el documento de referencia del W3C. Tanto Visual Studio 2010 como Expression Web utilizan Intellisense para facilitar esta tarea, y por lo tanto ya disponemos de compatibilidad para escribir correctamente el código con estas aplicaciones. El problema vendría si desea escribir código HTML 5, pero para abordarlo veremos más adelante una técnica que puede ayudarnos hasta que las aplicaciones incorporen el esquema correspondiente.

<<dotNetManía

Con MVC (Model-View-Controler) es más fácil

38

En .NET, somos hijos del paradigma de "arrastrar y soltar" (drag & drop); usamos los controles visuales de Visual Studio y les vamos añadiendo propiedades y estilos a medida que nos va pareciendo más o menos "estético". Esto ayuda más bien poco a controlar el

código HTML generado y garantizar la correcta separación de la estructura, la presentación y el comportamiento que ya hemos apuntado. Por eso, la programación con MVC (no hay "arrastrar y soltar") es más adecuada para resolver este problema y permitirnos tener un mayor control tanto de la estructura de nuestro sitio (navegación) como de sus componentes (los documentos Web), ayudándonos a definir un código más claro y bien organizado (aunque a algunos les parezca código "espagueti") y, lo más importante, más cuidadoso con los estándares Web (piense en los estándares Web como en mayor beneficio para su empresa y sus clientes).

HTML 5 ¿mito o realidad? Lo que viene ahora Un buzzword es una palabra "de moda", algo de lo que se habla mucho en el momento actual. Podemos sin lugar a dudas decir que, desde principios de año, HTML 5 (o HTML5, sin espacios) se ha convertido en una de estas palabras de las que todo el mundo habla. A comienzos de 2009, W3C anunciaba que al final de año se cerraría el grupo de trabajo de XHTML 2.0, que tantas bondades prometía. Parece claro que el organismo de estandarización internacional de la Web, presidido por Tim Berners Lee, quiere apostar decididamente por HTML 5 como lenguaje de Internet, pero, para los desarrolladores, ¿qué hay realmente detrás de HTML 5? ¿Qué novedades y características aportará con respecto a sus predecesores XHTML 1.x y HTML 4.x? Lo cierto es que no sería justo decir que HTML 5 es algo "nuevo". El grupo de trabajo del W3C ya lleva un par de años en ello (desde 2007), pero el anuncio del consorcio internacional para la Web y numerosas grandes empresas (principalmente Google, durante su encuentro anual IO Summit) de la apuesta decidida por HTML 5 han despertado el interés en esta nueva especificación del lenguaje de marcas para la Web de toda la comunidad relacionada con la publicación y el desarrollo en la Web. Por otra parte, debemos resaltar que aún no podemos hablar del estándar HTML 5, pues como tal aún no está aprobado, quedando algún tiempo todavía para que se dé por finalizado como estándar. Sin embargo, sí podemos decir que ya es posible codificar en HTML 5 y crear documentos compatibles con el borrador actual, ya que se trata, en lo que respecta al marcado, de lo mismo que tenemos en HTML 4.01 (de hecho, es un super-conjunto del mismo). Entre las novedades más importantes (figura 6), muchas nuevas incorporaciones en XForms y en una interesante idea llamada Web Applications


<< dnm.plataforma.net

recurrir a otros lenguajes (el elemento <canvas>, por ejemplo). Desde esta nueva perspectiva, HTML 5 sí que promete importantes cambios, pero manteniendo la compatibilidad con el HTML actual (lenguaje de marcado, semántica para representar la estructura de los documentos). Figura 6. Novedades y estructura de HTML 5.

One, que establece las bases para avanzar hacia un cambio de perspectiva con respecto a la Web actual, basado en documentos HTML (páginas Web) a un enfoque centrado en aplicaciones Web, donde aparecen nuevas características como el tratamiento de errores en HTML (algo no cubierto por ninguna especificación hasta el momento) o la creación de aplicaciones Web sin necesidad de

Novedades del lenguaje HTML 5 introduce algunas novedades importantes en la creación de documentos (área más madura) y aplicaciones (menos madura). A continuación se presentan alguna de las características destacables de la nueva especificación (borrador): • Nuevos elementos estructurales. Etiquetas que ayudarán a construir documentos HTML más consistentes, agrupando ele-

mentos que aparecen de forma generalizada en la mayoría de las páginas. Algunos de estos elementos son: <section>, <article>, <aside>, <header>, <footer>, <nav>. • XForms 1.0. Formularios con nuevos tipos de campos para mejorar la experiencia de los usuarios al trabajar con un elemento tan común como éste. Entre los nuevos tipos de campos que se perfilan para los formularios: datetime, number, range, email, url, search y color. • Multimedia. Se incorporan etiquetas para la representación de forma nativa de estándares multimedia como audio y vídeo (y animación, mediante el nuevo elemento estándar <canvas>), así como la etiqueta <embed> para contenidos de terceros (como Silverlight o Flash).


<< dnm.plataforma.net

• Conexión con datos. Se incorporan también de forma nativa nuevos elementos HTML como <datagrid> para representar datos de forma dinámica, <progress> para controlar la evolución de un proceso o <time> para representar fechas u horas. • Nuevas API Quizá el nuevo elemento <canvas> es una de las novedades más inquietantes, ya que nace con la idea de incluir fragmentos de aplicación estándar a los documentos HTML. Vendría a ser una imagen dinámica, en la que sus elementos gráficos pueden componerse y animarse enriqueciendo la experiencia de usuario y proporcionando un mecanismo nativo para crear estas interfaces enriquecidas.

<<dotNetManía

HTML 5 en la práctica

40

Es complicado aventurarse a cambiar las cosas ahora, en una fase tan temprana de la especificación, con tantas cosas por decidir y algunas que cambian cada pocos meses. En cualquier caso, ninguno de los estándares actuales desaparece, sino que todos siguen siendo perfectamente válidos y usables: HTML 3.5, HTML 4, HTML 4.01, XHTML 1.0… Nada pasará con ellos, y por lo tanto podemos seguir manteniendo la estructura y los tipos de documento utilizados hasta ahora. En lo que respecta a los nuevos documentos, resulta complicado pensar en crear estructuras HTML usando las las características más recientes de HTML 5 (como por ejemplo, las nuevas definiciones de bloques como <header> o <footer>, que todavía están bajo mucha incertidumbre y no hay consenso), una mala idea por ahora. Pero si queremos experimentar con la especificación en su estado actual, podemos optar por alguna de las siguientes tres alternativas:

Figura 7. Autoría HTML 5 con Microsoft Expression Web 3.0.

• La primera opción es cambiar el tipo de documento de cualquier página Web que tengamos a <!DOCTYPE html>, y el documento será ahora compatible con HTML 5. ¡Así de fácil! • La segunda opción consiste en hacer lo que en la primera (cambiar el tipo de documento) y además utilizar no los nuevos elementos estructurales del lenguaje, sino sus equivalentes en forma de clases (por ejemplo, <div class="footer">). De esta forma, seguimos siendo prudentes en el uso de los todavía jóvenes nuevos elementos. • La tercera forma, la más atrevida, consiste en cambiar el tipo de documento y usar los elementos nuevos en nuestro código HTML. Tanto Firefox como Safari disponen ya de un mecanismo de extensión denominado "elementos arbitrarios" (arbitrary elements) que nos permite crear cualquier elemento nuevo que no exista en la especificación y asignarle propiedades de estilo como si se tratara de los mismos elementos HTML. Sin embargo, esto no funciona en Internet Explorer 8, que no soporta los elementos arbitrarios, aunque es posible emplear una técnica especial (hack) que nos permite disponer de ellos usando JavaScript (document.createElement(‘footer‘)).

Si va a programar en HTML 5, elija la opción que elija, actualmente ya se dispone de un servicio de validación (que es además el que utiliza actualmente el W3C) y que podemos usar para comprobar que nuestros documentos HTML cumplen la versión actual del borrador de dicho lenguaje. Para validar nuestro documento, el único requisito es que esté en un servidor accesible de forma externa (alojamiento o hosting), y pasar la URL de la página al validador, al que se puede acceder en la dirección Web: http://html5.validator.nu (figura 8).

Figura 8.Validación de un documento con el servicio de validación para HTML5.

Referencias [ 1]

Puede ampliar sus conocimientos sobre HTML 5 en el artículo de Lachlan Hunt "A Preview of HTML 5", aparecido en el sitio Web "A List Apart": http://www.alistapart.com/articles/previewofhtml5.

[ 2]

Puede usar las librerías de JavaScript para permitir la ejecución de HTML 5 con Microsoft Internet Explorer disponibles en la URL http://html5shiv.googlecode.com/svn/ trunk/html5.js.

[ 3]

El ejemplo utilizado en este artículo puede accederse en la dirección de Internet http://www.augurarte.com/ html5/html5_03.html.


plataforma.net

Raúl Hernández Seda

Las posibilidades de

SketchFlow La posibilidad de crear prototipos funcionales de los proyectos que se vayan a desarrollar y la capacidad de poder añadir feedback a un prototipo de forma fácil e intuitiva son algunas de las características principales que ofrece SketchFlow, la nueva herramienta de creación de prototipos incluida en Microsoft Expression 3.

Raúl Hernández Seda Interface Designer de Raona. Raúl es experto en Silverlight y SketchFlow .

Cuando trabajamos en proyectos en los que intervienen varias personas, es muy común ver como dicho proyecto evoluciona de forma inesperada y, en algunos casos, de forma indeseada, ya que algunos de los cambios que se producen repercuten negativamente en la rentabilidad del proyecto. Imaginemos un caso frecuente en el entorno multimedia: un cliente contrata a una empresa para diseñar una intranet que ha de cumplir “x” requisitos y tener “y“ funcionalidades. Una vez aceptado el proyecto, el camino que se sigue normalmente se basa en que el equipo de diseño haga propuestas sobre papel de cómo serán los aspectos gráficos de la interfaz de usuario (GUI). Llegados a este punto, disponemos de una o varias propuestas gráficas (mockups) que han de ser implementadas por los programadores, y aquí es donde empiezan los problemas: los diseñadores no han tenido en cuenta las limitaciones del producto en el que se han de implementar sus diseños, los programadores se ven incapaces de simular un cierto efecto gráfico mediante código, etc. Aquí es precisamente cuando SketchFlow puede ayudarnos. La nueva apuesta de Microsoft en esta línea es una aplicación incorporada a la última versión de Expression Blend que ofrece una serie de herramientas que, bien aprovechadas, suponen un valor incalculable en las fases iniciales de un proyecto.

¿Qué nos ofrece SketchFlow? La característica principal que nos ofrece SketchFlow es la posibilidad de poder crear prototipos funcionales de los proyectos que vayamos a desarrollar. Esto quiere decir que nuestros mockups, que hasta ahora eran simples bocetos en papel, pasan a un siguiente nivel y se ven dotados con cierta interacción que refleja perfectamente las funcionalidades que tendrá el proyecto final. Esto, que a primera vista puede parecer simple eye candy, tiene en realidad un potencial que no ha de ser menospreciado, ya que ahora podemos tener en cuenta todas las funciones del proyecto desde el primer boceto. En el ejemplo de antes, esto significa que el programador va a saber de antemano si tendrá problemas a la hora de implementar alguna animación o gráfico, y en caso de ser inviable su implementación, puede comentárselo a los diseñadores para buscar una alternativa. Otra joya de esta nueva herramienta es la capacidad de poder añadir feedback a un prototipo de forma fácil e intuitiva. Si tenemos en cuenta que para utilizar la función de feedback ni siquiera es necesario tener instalado Expression Blend, nos encontramos ante una forma de obtener retroalimentación fácil de usar y tremendamente versátil. Podemos, por ejemplo, enviar una versión del proyecto a las distintas partes que conforman nuestro equipo para que nos digan si es viable implemen-


<< dnm.plataforma.net tar nuestra idea, o enviársela directamente al cliente para que sea él mismo quien exprese sus inquietudes sobre nuestro prototipo. ¿Una pega? Los prototipos de SketchFlow están limitados a ser eso, prototipos. Por ahora no es posible migrar un prototipo a un proyecto WPF o Silverlight, pero ¿quién sabe? Quizás en futuras versiones sea posible. Figura 2

Algunas funcionalidades Es frecuente entre los diseñadores pensar que un mockup ha de ser simple, y que para ello no hay nada mejor que utilizar un bolígrafo y papel. Esto es así ya que demasiadas florituras tienden a distraer la atención del usuario del prototipo y en las primeras fases de un prototipo tan solo se ha de evaluar la funcionalidad y no tanto el diseño en sí. Si bien es cierto que nadie ni nada va a separar a los diseñadores de sus bolígrafos Bic y sus cuadernos de dibujo, SketchFlow nos ofrece la posibilidad de utilizar un diseño simple que simula la escritura a mano para las primeras fases (figura 1). A medida que el prototipo madura, es posible ir actualizando el diseño a la par.

SketchFlow + metodología SCRUM Hasta ahora hemos hablado de las numerosas ventajas que nos proporciona esta primera versión de la nueva herramienta de Expression, pero ¿qué pasa si además trabajamos siguiendo una metodología basada en SCRUM? Los resultados son aún mejores. Debido a que trabajar basándonos en dicha metodología implica reunirnos frecuentemente (tanto de forma interna como con el cliente), tener la opción de poder contar con un prototipo funcional del proyecto en las reuniones es una ventaja considerable, ya que todo el mundo puede aportar observaciones e ir madurando la idea en posteriores reuniones. En otras palabras, sin SketchFlow podrían pasar varias semanas hasta tener un prototipo funcional que mostrar en las reuniones, mientras que, gracias a ella, podremos contar con una primera versión funcional poco después del kick-off del proyecto. Sin duda un gran valor añadido.

Conclusión

Figura 1

Otra funcionalidad que se aprecia es la posibilidad de ver a simple vista dónde estamos y a dónde podemos ir desde allí. Esto es tan fácil como observar el mapa de elementos que incorpora SketchFlow, con el que, además, podemos interactuar creando y modificando nuevos elementos (figura 2).

Microsoft ha puesto sobre la mesa una herramienta que, sobre el papel, debería acabar con todos, o casi todos, los problemas de comunicación en un equipo de desarrollo de software. Obviamente, todos sabemos que esto no es más que una utopía; no obstante, la utilidad de SketchFlow es algo que no se puede discutir. Ahora sólo queda ver qué tal acogen las empresas esta nueva herramienta de Microsoft y qué piensan sobre ella los desarrolladores. Personalmente, creo que se trata de una idea cuanto menos interesante, y que vale la pena echarle un vistazo a SketchFlow para ver sus posibilidades.

Fundada en 2003, raona tiene oficinas en Madrid, Barcelona, Londres y Argentina. La especialización en tecnologías .NET, avalada por sus 11 competencias, y la cercanía al cliente, son los dos ejes fundamentales de su estrategia de mercado, que la han llevado a trabajar para marcas líderes. En la actualidad, raona es una de las pocas compañías españolas que desarrolla aplicaciones para Microsoft Surface.

www.raona.com

<<dotNetManía

Artículo Patrocinado

43


ALManía

José Luis Soria

Servidores de símbolos y de origen en Team Build 2008 y 2010 Disponer de un servidor de símbolos, estando además éstos indexados con la información de acceso al código fuente correspondiente, es algo que puede ser de gran utilidad a la hora de depurar nuestras aplicaciones. Si automatizamos el mantenimiento de este servidor mediante Team Build, conseguiremos además que los símbolos indexados estén disponibles para todas nuestras compilaciones y con un mínimo trabajo extra.

Servidor de símbolos

José Luis Soria trabaja como Project Management Team Lead de Plain Concepts. Es MCTS en Team Foundation Server y Certified Scrum Master. Podéis encontrarle en su blog http://geeks.ms/blogs/ jlsoria

Los símbolos son esos ficheros .pdb que aparecen junto a nuestros ensamblados cada vez que compilamos un proyecto. Su principal cometido es ayudar en la depuración de estos ensamblados, mapeando puntos de ejecución con el código fuente (clase o método) que les corresponde. Sin estos ficheros, a la hora de depurar un posible error tendríamos que enfrentarnos directamente al lenguaje ensamblador o al IL. Cuando estamos utilizando cualquier depurador, por ejemplo el de Visual Studio o WinDbg, éste carga el fichero .pdb correspondiente a cada ensamblado que estemos depurando, de modo que a medida que vamos ejecutando la aplicación podemos ir navegando por su código fuente, ya que el depurador dispone de la información de mapeo necesaria. Un servidor de símbolos (symbol server) no es más que una ruta o carpeta donde tenemos almacenados los símbolos que se van generando por las sucesivas compilaciones de nuestras aplicaciones. De esta forma, estarán disponibles en cualquier momento en que necesitemos depurar, por ejemplo, ante un error grave en producción, sin necesidad de tener que optar por otras opciones (como recompilar el código exacto para obtener el .pdb correspondiente, si es que sabemos cuál es ese código…). Si configuramos nuestro depurador para que apunte a la ruta del servidor de símbolos, al

iniciar la depuración de un ensamblado automáticamente se cargará la información de símbolos del .pdb correspondiente, si es que éste ha sido almacenado en dicho servidor, y podremos empezar a depurar sin más. Para mantener un servidor de símbolos se utilizan las herramientas de depuración de Windows, y en concreto una utilidad incluida en ellas llamada symstore.exe. Esta herramienta copia al servidor de símbolos los ficheros .pdb que le indiquemos, asociando previamente cada ensamblado con su .pdb a través de un hash, del que el depurador hará uso para identificar unívocamente dentro del servidor de símbolos el .pdb del ensamblado que necesite de entre todos los que tengamos almacenados.

Servidor de origen Además del .pdb correspondiente a un ensamblado, necesitamos el código fuente propiamente dicho para que el depurador disponga de toda la información necesaria para establecer una sesión de depuración interactiva. Un .pdb contiene por defecto la información del fichero de código fuente desde el que fue generado, con una ruta relativa a la máquina local donde se hizo la compilación. Pero, ¿qué ocurre si ya no estamos en esa máquina, o si el .pdb ya no está disponible en ella? Ahí es donde entra en juego el servidor de origen (source server).


<< dnm.ALManía

tf.exe view /server:<servidor> /versión:<versión> <ruta del fichero .cs o .vb>

Al igual que con el servidor de símbolos, las herramientas de depuración de Windows disponen de utilidades que permiten incrustar esta información en los .pdb; en concreto, para TFS contamos con el comando tfsindex.cmd, el cual podemos invocar pasándole como parámetros la ruta de los ficheros .pdb a indexar y la carpeta que contiene el código fuente correspondiente. La indexación de un .pdb se realiza indicando la versión exacta del fichero de código correspondiente (en el caso de TFS, a nivel de conjunto de cambios o changeset). Esto permite solucionar el típico problema al que cualquiera nos hemos podido enfrentar de determinar cuál es el código fuente exacto que corresponde a un ensamblado que necesitamos a depurar. Aunque hay otros mecanismos que permiten lograr esto mismo (de los cuales el más recomendable es mantener una política adecuada de etiquetado, o mejor aún, de ramas, en nuestro sistema de control de versiones), la ventaja del servidor de origen es que automatiza la obtención del código durante las sesiones de depuración.

Depurando… y automatizando el mantenimiento Poniendo un ejemplo concreto, el panorama quedaría de la siguiente forma. Si disponemos de un servidor de símbolos en el cual los .pdb además han sido indexados para servidor de origen, podremos hacer lo siguiente:

• Abrir Visual Studio y adjuntar el depurador al proceso en ejecución que queremos depurar, ya sea local o remoto. En este punto, el depurador cargará por sí mismo los .pdb necesarios desde el servidor de símbolos, aunque no los tengamos copiados en nuestra máquina. • Si reproducimos un error que haga que la aplicación lance una excepción no controlada, o introducimos un punto de ruptura por nombre de función, el depurador, al llegar a ese punto, descargará la versión exacta del código fuente desde el sistema de control de versiones, y podremos seguir depurando sin más. ¡Todo esto sin tener acceso a los .pdb ni al código fuente! Esto es extremadamente útil y rápido para depurar, por ejemplo, el típico error crítico que sale en producción un sábado por la noche, o si estamos haciendo sesiones de depuración prolongadas contra distintos entornos y aplicaciones (por ejemplo, buscando optimizaciones de rendimiento, investigando consumos de recursos injustificados, etc.) A partir de un cierto tamaño o complejidad del proyecto, yo diría que se hace imprescindible… por algo comenzaron a usarlo en Microsoft para multitud de proyectos incluyendo el mismísimo desarrollo de Windows, y lo pusieron a disposición de la comunidad para el caso de .NET en el servidor de símbolos público de Microsoft. Como hemos visto hasta ahora, para conseguir mantener un servidor de símbolos y de origen, tendríamos que utilizar las utilidades symstore.exe y tfsindex.cmd (o la correspondiente a nuestro control de versiones, como vssindex.cmd, svnindex.cmd) sobre nuestros ensamblados, ficheros .pdb y de código fuente. ¿No sería mucho mejor si pudiésemos automatizar este proceso, para que todo esto se ejecute por nosotros cada vez que efectuemos una construcción de nuestro software? En los dos siguientes apartados veremos cómo configurar Team Build 2008 y 2010 para que ejecuten los pasos necesarios para mantener un servidor de símbolos y de origen en cada construcción automatizada que lancemos. Lógicamente, como premisa para cualquiera de los casos, los proyectos que vayamos

a construir automáticamente deberán tener habilitada la emisión de información de depuración (.pdb) durante la compilación, en las propiedades de cada uno de ellos (opción que se encuentra habilitada por defecto).

Configurando Team Build 2008 Para Team Build 2008, habilitar el mantenimiento del servidor de símbolos y de origen es una tarea algo compleja, que requiere unos conocimientos mínimos de Team Build en general y del lenguaje utilizado por MSBuild. Por cuestiones de espacio en este artículo, los pasos que se detallan a continuación asumen dichos conocimientos en el lector.

Configuración de la máquina de Team Build Este paso sólo se realiza una vez, para preparar nuestra máquina o máquinas de build. • Instalar las herramientas de depuración para Windows (Debugging Tools for Windows), que nos permitirán disponer de las utilidades symstore.exe y tfsindex.cmd para ser invocadas desde los scripts de build. Éste es el único paso necesario para el servidor de símbolos; los cuatro siguientes corresponden al servidor de origen. • Instalar Perl, que es utilizado internamente por las Debugging Tools for Windows para incrustar la información de servidor de origen en los .pdb. • En el fichero tfsindex.cmd, ubicado en la carpeta de instalación de las Debugging Tools for Windows, sustituir la última línea por la siguiente: @call "%~dp0SSIndex.cmd" -SYSTEM=TFS -SYMBOLS=%1 %*

De este modo, conseguiremos poder pasar como parámetro a tfsindex.cmd en %1 la ubicación de nuestros .pdb durante la indexación de los mismos. Esto es necesario porque durante un proceso de build los ficheros .pdb no van a estar ubicados en la misma carpeta que los de código fuente, que es donde los busca por defecto la utilidad.

<<dotNetManía

Habilitar los .pdb para servidor de origen consiste simplemente en incluir en cada .pdb la información necesaria para que el depurador pueda obtener, durante la depuración, el fichero específico de código fuente correspondiente, desde el sistema de control de versiones que estemos utilizando. Esto se consigue incrustando en el .pdb una llamada al comando necesario para obtener el fichero; por ejemplo, en el caso que nos ocupa, para Team Foundation Server tendríamos que incrustar en cada .pdb algo similar a lo siguiente:

45


<< dnm.ALManía

• Modificar el valor de la variable MYSERVER en el fichero srcsrv.ini, ubicado en el mismo directorio que tfsindex.cmd, para que apunte a la dirección exacta de nuestro TFS. Por ejemplo: MYSERVER=http://tfs:8080/

• Añadir la ruta de tf.exe a la variable de entorno PATH de la máquina, y reiniciar el servicio de builds (o reiniciar la máquina). De este modo, Team Build podrá invocar a tf.exe para construir el comando a incrustar en los ficheros .pdb durante la indexación de los mismos. La ruta por defecto de tf.exe es C:\Program Files\Microsoft 9.0\Common7\IDE.

Visual

Studio

Configuración del servidor de símbolos En la máquina que aloje el servidor de símbolos, que puede ser la misma que la de build, simplemente habrá que compartir la carpeta que aloje el servidor de símbolos (por ejemplo, \\computerName\SymbolServer) y dar permisos de escritura en ella al usuario que ejecute el servicio de build (por ejemplo, TFSService).

<<dotNetManía

Configurando el servidor de símbolos en el script de una construcción automatizada

46

Para cada construcción automatizada que queramos que mantenga el servidor de símbolos, incluiremos en el fichero TFSBuild.proj una tarea que invoque a symstore.exe, para que éste prepare los .pdb con el hash correspondiente y los copie al servidor de símbolos. El código del listado 1 puede ser un punto de partida, sustituyendo los valores de las PropertyGroup por los necesarios en nuestro entorno. La invocación a symstore.exe con la opción /p hace que en lugar de una copia de los ficheros .pdb al servidor de símbolos consigamos que se cree un fichero especial que es un puntero al .pdb correspondiente (ubicado en la carpeta en la que se dejan los resultados de las builds). La ventaja de esto es el aho-

<Target Name="SymbolServerMaintenance"> <PropertyGroup> <ProjectName>Nombre del proyecto</ProjectName> <SymStoreToolPath> $(ProgramFiles)\Debugging Tools for Windows (x86)\symstore.exe </SymStoreToolPath> <SymServerPath>\\computerName\SymbolServer\$(ProjectName)</SymServerPath> </PropertyGroup> <Exec Command="&quot;$(SymStoreToolPath)&quot; add /p /r /f &quot;$(DropLocation)\$(ProjectName)\%(ConfigurationToBuild.FlavorToBuild)\*.pdb&quot; /s &quot;$(SymServerPath)\$(ProjectName)&quot; /t &quot;$(BuildDefinitionName)&quot; /v &quot;$(BuildNumber)&quot;" /> </Target>

Listado 1. Servidor de símbolos en TFSBuild.proj <Target Name="SourceServerMaintenance"> <PropertyGroup> <TfsIndexToolPath> $(ProgramFiles)\Debugging Tools for Windows (x86)\srcsrv\tfsindex.cmd </TfsIndexToolPath> <TfsIndexToolWorkingDir>$(SolutionRoot)</TfsIndexToolWorkingDir> </PropertyGroup> <Exec Command="&quot;$(TfsIndexToolPath)&quot; &quot;$(DropLocation)\$(BuildNumber)\%(ConfigurationToBuild.FlavorToBuild)&quot;" WorkingDirectory="$(TfsIndexToolWorkingDir)" /> </Target>

Listado 2. Servidor de origen en TFSBuild.proj <Target Name="AfterDropBuild" DependsOnTargets="SourceServerMaintenance; SymbolServerMaintenance"> </Target>

Listado 3. Habilitando targets en TFSBuild.proj

rro de espacio en disco consiguiente; pero si eliminamos una build tendremos que eliminar a mano los punteros en el servidor de símbolos para no dejar inconsistencias (o hacerlo de forma automatizada; por ejemplo, mediante la API de extensibilidad de TFS).

Configurando el servidor de origen en el script de una construcción automatizada Para cada construcción automatizada que queramos que mantenga el servidor de origen, incluiremos en el fichero TFSBuild.proj una tarea que invoque a tfsindex.cmd, para que éste indexe los .pdb con el comando necesario para obtener el código fuente desde el sistema de control de versiones. El código del listado 2 puede ser un punto de partida, sustituyendo los valores de las PropertyGroup por los necesarios en nuestro entorno.

Habilitando el servidor de origen y de símbolos en el script de una construcción automatizada Para que los targets anteriores sean invocados en el momento preciso, incluiremos un código similar al que se muestra en el listado 3 en nuestro TFSBuild.proj. Con estos cinco pasos, si todo ha ido bien, conseguiremos que nuestra build indexe los .pdb y los copie al servidor de símbolos, en la ubicación correspondiente al hash calculado por symstore.exe. Una forma rápida de validar el proceso es comprobar lo siguiente una vez que hayamos lanzado la build y ésta haya finalizado: • En la ruta del servidor de símbolos se habrá creado una estructura de carpetas con los nombres de los ensamblados y los hashes, la cual contiene los .pdb resultantes del proceso de construcción (o punteros a los mismos).


<< dnm.ALManía

• Si abrimos dichos .pdb (por ejemplo, con el Bloc de notas), podremos ver que contienen incrustadas en ellos llamadas a tf.exe.

Figura 1. Definición de la build en Team Build 2010

Configurando Team Build 2010 Afortunadamente, en Team Build 2010 el proceso de habilitar el mantenimiento del servidor de símbolos y de origen es significativamente más sencillo que en 2008. A continuación se muestran los pasos a seguir para Team Build 2010 Beta 2. Es de destacar que no es necesario configurar la máquina de build de ninguna forma especial, ya que ésta ya dispone por defecto de las herramientas necesarias para indexar los .pdb y subirlos al servidor de símbolos. Tampoco será necesario tocar una sola línea de código en los ficheros que definen la build. Una vez que tengamos configurado nuestro servidor de símbolos (ver paso 2 de lo explicado para la versión 2008), simplemente tendremos que editar la definición de la build correspondiente, establecer el parámetro Index Sources a true, y especificar la ruta de nuestro servidor de símbolos en Path to Publish Symbols (ver figura 1). ¡Y eso es todo! Además, disponemos de un mantenimiento completo del servidor de símbolos, ya que si eliminamos una build que tenga habilitadas las opciones de servidor de símbolos y de origen, se nos preguntará si queremos eliminar también los .pdb correspondientes almacenados en el servidor de símbolos, de forma que no queden .pdb que no correspondan a ninguna construcción automatizada (figura 2).

Figura 2: Eliminando una build en Team Build 2010

Configurando y utilizando Visual Studio con el servidor de símbolos/origen Por último, vamos a ver cómo configurar una herramienta de depuración (en este caso Visual Studio) para hacer uso de las ventajas que nos aporta el servidor de símbolos y de origen. El proceso está explicado para Visual Studio 2010 Beta 2; para Visual Studio 2008 el proceso es análogo.

Una vez hecho esto, una sesión típica de depuración podría ser la siguiente, sin necesidad de disponer de los .pdb ni de abrir la solución o los ficheros de código fuente: 1. Arrancar la aplicación a depurar. Si estamos en una máquina remota (distinta a donde tenemos Visual Studio), podemos utilizar Remote Debugger para depurarla en remoto. 2. Desde Visual Studio, adjuntarse al proceso a depurar mediante "Tools" | "Attach to process". En este punto serán cargados los símbolos (ver ventana Modules en "Debug" | "Windows" | "Modules"). 3. Podemos poner un punto de ruptura nuevo en base a un nombre de función ("Debug" | "New Breakpoint" | "Break at function"). O ejecutar la aplicación hasta que salte una excepción no controlada que estemos trazando. En cualquier caso, Visual Studio obtendrá el código fuente desde TFS y podremos seguir la depuración de forma interactiva.

Referencias Figura 3. Habilitando servidor de símbolos en Visual Studio 2010

[ 1]

Debugging Tools for Windows: http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx.

[ 2]

Perl: http://www.activestate.com/activeperl

<<dotNetManía

Si trabajamos con la versión en castellano de Team Explorer, tenemos un problema adicional debido al hecho de que el script de Perl utilizado en el proceso de indexación (tfs.pm) sólo es capaz de analizar la salida del comando tf.exe si ésta está en inglés. La solución más sencilla sería instalar la versión en inglés de Team Explorer en la máquina de build. Otra opción, si nos manejamos un poco con Perl, sería modificar el script tfs.pm para adaptarlo al castellano.

• En el menú "Tools" | "Options" | "Debugging" | "Symbols", introducir la ruta de nuestro servidor de símbolos (figura 3). Con esto conseguiremos que Visual Studio cargue automáticamente los .pdb de la ubicación especificada cuando empecemos a depurar. • En el menú "Tools" | "Options" | "Debugging" | "General", marcar la opción "Enable source server support". Esto hará que Visual Studio cargue automáticamente la versión adecuada del código fuente que se está depurando desde el sistema de control de versiones.

47


dnm.ux#06

dnm.ux

Miguel Jiménez

Miguel Jiménez es un profesional con amplia experiencia en Silverlight, WPF, Surface, User Experience y ponente en conferencias como TechEd Europe, Shift o Developer Days. Puedes seguirle en twitter.com/migs212 o en su blog www.miguel jimenez.net.

La Humanización del Producto << Como seres humanos, contamos con la inigualable capacidad de crear, y en el modelo económico y social de la actualidad esta capacidad se refleja en la producción de productos de consumo. Dada la amplitud de nuestra creación y del estado actual del comercio, el término consumo, en esta línea de pensamiento, lo utilizo en el más amplio sentido de la palabra: cualquier producto digital, físico, tangible, servicio o perecedero digno de ser comercializado bajo una marca, y creado/ideado por el ser humano, entra en la definición.

Desde el principio de los tiempos hemos creado productos, herramientas o servicios que nos facilitaban y simplificaban la vida a través de la especialización y la reutilización. Pero no fue hasta el siglo XIX, con la Revolución Industrial, que se comenzó a producir para las masas, dejando de lado la producción artesanal y recurriendo a la mecanización industrial. En estos procesos industriales la especialización y reutilización del conocimiento del artesano llegó a extremos tales que la pro-

ducción en masa era capaz de abaratar los costes a mínimos históricos. A finales del siglo XX, la sociedad volvió a sufrir un importante cambio en el modelo de producción y gran parte de los países, mayoritariamente en lo que denominamos Primer Mundo (el viejo Continente y Norteamérica), comienzan a basar su economía en un trabajo más intelectual y se da nacimiento a la Sociedad de la Información. Este nuevo modelo de negocio basado en el conocimiento genera un nuevo abanico de posibilidades, negocios y servicios a su alrededor. Inicialmente se realiza de manera un tanto precaria, dada la novedad de los sistemas utilizados, pero con el tiempo se va consiguiendo un nivel de excelencia digno de las últimas fases de la evolución del modelo de conocimiento. El problema que presenta este tipo de economías, en cuanto a la creación de productos y servicios se refiere, es que al contar con un acceso libre a la información, varias marcas, empresas o profesionales pueden llegar al nivel de excelencia en una franja de tiempo similar, generalmente marcada por el propio mercado. Y este simple acto de libertad representa, a la vez, un problema y una ventaja. Es un problema en el sentido de que al existir más oferta, y generalmente la misma demanda, el precio tiende a bajar y por tanto se hace más difícil mantener a flote los negocios. Por el otro lado, este problema representa el único punto en el que la diferenciación e innovación proporcionan un salto cualitativo hacia el siguiente paso de la evolución el modelo de negocio. Actualmente, o más bien en los últimos años, hemos vivido uno de estos saltos; un nuevo proceso de diferenciación que ha comenzado y que incluimos en nuestros productos bajo el nombre de Experiencia de Usuario.


<< dnm.ux

1. Selecciona la tecnología adecuada para resolver cada situación. Es importante no basarse en modas o últimas versiones a menos que representen la mejor solución a nuestro problema. La mayoría de desarrolladores que conozco incumplen este simple principio y con ello crean experiencias muy poco optimizadas para los usuarios de las mismas. 2. Piensa en cómo tu usuario realiza sus tareas, y crea la funcionalidad de forma coherente con el usuario. El mejor código, patrones,

entidades, caché y otras tantas artimañas del desarrollo no sirven absolutamente para nada si nadie utiliza tu producto. 3. La creación de software, especialmente, no es un ejercicio de propulsión del ego de los desarrolladores, sino un ejercicio de simplificación de la vida de los usuarios; un ejercicio que resuelve un problema existente. Por tanto, si esta solución o simplificación no es percibida por el usuario, os aseguro que la satisfacción y/o ego de los desarrolladores de poco servirá. Teniendo en cuenta estos elementos, podremos visualizar nuestro producto como un producto mucho más humano; un producto que se preocupa por su usuario, que se centra en solventar los problemas de éste y en hacerlo de una manera innovadora, sencilla y simple. Esta humanización del producto no consiste, evidentemente, en aportar una forma humana al mismo, cual robot, sino en las tareas que el software desempeña, intentando que sean lo más livianas y ligeras posibles para el usuario al que sirve. Los productos que creamos, en primera instancia, sirven al ser humano y le ayudan en sus tareas, y bajo ningún concepto le obligan a aprender sobre su propio funcionamiento, sino que se adaptan al comportamiento del ser al que sirven. Para terminar, me gustaría haceros reflexionar sobre los productos que existen a vuestro alrededor, e independientemente de su índole o tangibilidad, analizar en qué factores han sido humanizados y cómo han sido programados para serviros. Como ejemplo, os puedo apuntar a productos de gran éxito como el iPhone de Apple, el Roomba de iRobot o el servicio Flickr de Yahoo, todos ellos grandes productos que sirven al ser humano desde su perspectiva y punto de vista, adaptado únicamente al servicio que ofrecen como productos. Y tened en cuenta que todos ellos, sin excepción, están basados en software, pero éste, tal y como irá pasando cada vez más en el futuro, pasa inadvertido ante el usuario aunque es el ejecutor final de las tareas que se realizan. Curioso, ¿no?

Si tienes alguna sugerencia o duda, puedes ponerte en contacto con el autor en la dirección hello@migueljimenez.net

<<dotNetManía

Como todo ciclo evolutivo, el paso actual en el que nos encontramos es un tanto precario y nos obliga a determinar cuáles son los factores de diferenciación que hemos de utilizar para avanzar hacia al siguiente ciclo. Estos factores varían mucho en función del sector en el que se mueve nuestro producto, pero se propagan rápidamente a través de la publicidad y los procesos de producción. Por ejemplo, a nivel de automoción está claro que el factor más claro de diferenciación en el mercado actual es la sostenibilidad de los combustibles y el comportamiento ante el medio ambiente de los vehículos; esto puede observarse en todos y cada uno de los canales de comunicación de los productos. En nuestro sector, el de la ingeniería y servicios de software, el factor de diferenciación se encuentra en la mejora sustancial de las experiencias de usuario. El primer paso a realizar en esta dirección se encuentra, por supuesto, en la inclusión de procesos de diseño dentro del mismo proceso de desarrollo y tomar a éste como parte integral e indivisible del mismo, algo que forma parte del todo y no es un mero elemento decorativo que se puede añadir al final. Y justo aquí es donde comienzan los conflictos con los procesos de desarrollo que conocemos, y sobre todo con la gestión de los mismos. Las experiencias de usuario, como he indicado en anteriores ocasiones, son globales, y por tanto deben ser planificadas desde todos los puntos de vista de la producción de nuestro producto o servicio. Esta simple condición implica que tanto desde el punto de vista de desarrollo como desde el punto de vista de diseño, refiriendo específicamente al diseño visual, se planifique la creación de la experiencia. Creo que podríamos agrupar los errores más comunes y algunas directrices que mejorarían nuestros productos en tres simples puntos:

49


q&a

dnm.q&a

dnm.q&a

dnm.q&a

Alberto Población

Alberto Población lleva 29 años desarrollando software. Es MCSE, MCDBA, MCITP, MCSD, MCPD y MCT, además de MVP de C#. Alberto trabaja como consultor independiente, dedicándose principalmente a la formación, asesoramiento y desarrollo de aplicaciones. Es tutor de Campus MVP.

Comunicación entre formularios y sus componentes Tengo un formulario MDI donde se va a desarrollar la vida de mi aplicación. Este formulario contiene un control de usuario que debe modificar un Label del formulario y no sé cómo hacerlo. ¿Me podéis ayudar?

Esta pregunta concreta pertenece a una clase más amplia de preguntas que aparecen repetidamente en los foros de desarrollo, en las que usuarios más o menos noveles preguntan por la forma de comunicar entre un formulario y otro, o entre los componentes de uno o varios formularios. La forma de modificar los controles de un formulario desde otro probablemente resultará trivial y evidente para quienes estén ya habituados al desarrollo de aplicaciones Windows Forms bajo .NET. Sin embargo, no es raro encontrarse con un desarrollador acostumbrado a trabajar con Visual Basic 6 o versiones anteriores, que al no conseguir hacer funcionar su código en la forma a la que estaba acostumbrado, recurre al experto en .NET para resolver sus dudas. En las siguientes líneas pretendemos aclarar dónde está la diferencia y por qué el código de .NET no compila como esperan. En VB6 se podían hacer operaciones como las que se muestran en el listado 1. Este código no compilará correctamente en VB.NET. La confusión radica en que se está intentando utilizar el identificador Form2 como si fuera una instancia, cuando en realidad es el nombre de la clase. En VB6 este problema no se producía, y este tipo de operaciones funcionaban, gracias a que el entorno ya generaba internamente una sentencia del tipo Dim Form2 As New Form2(). En otras palabras, siempre existía de antemano una instancia con el mismo nombre de la clase. Por eso era lícito hacer referencia a Form2.Label1, ya que se estaba apuntando al Label1 existente en la primera instancia creada de Form2.

' Esto no funciona en .NET !!! Public Class Form1 Inherits System.Windows.Forms.Form Private Sub CambiarLabelEnForm2 Form2.Label1.Text = "algo" End Sub End Class Public Class Form2 Inherits System.Windows.Forms.Form ' En este Form se define Label1 End Class

Listado 1

En .NET esta declaración no es automática. Cada vez que se instancia un formulario (cosa que puede ocurrir varias veces, ya que es perfectamente lícito tener abiertas simultáneamente varias copias de un Form de la misma clase) es necesario declarar una nueva variable para contener una referencia a esa instancia, y luego hacer visible el formulario a través del correspondiente método de la misma. Esta variable la declaramos nosotros en nuestro código, y tendrá la visibilidad que nosotros queramos darle; no es automáticamente una variable global como ocurría en VB6, ni tiene el mismo nombre que la clase, como también ocurría en dicho entorno. El listado 2 muestra un ejemplo de apertura de un formulario Form2 desde otro nombrado Form1. Obsérvese que hemos declarado para ello una variable llamada frm, que es la que sustituye a la que los programadores de VB6 habrían llamado Form2 igual que la clase.


<< dnm.q&a Private Sub Button1_Click(...) Handles Button1.Click Dim frm As New Form2() frm.Show() '... frm.Label1.Text = "Prueba" End Sub

' Esto va dentro de Form1: Private Sub Button1_Click(...) Handles Button1.Click ' Me es una referencia al propio Form1 Dim frm As New Form2(Me) frm.Show() End Sub

Listado 2

Public Sub New(ByVal frm As Form1) llamante = frm InitializeComponent() End Sub Private Sub Button1_Click(...) Handles Button1.Click llamante.Label1.Text = "Hola, mundo" End Sub End Class

Listado 3

da fuertemente vinculado al contenedor, ya que el tipo de esa propiedad tendría que ser la clase del formulario contenedor, impidiéndonos reutilizar este control en otros formularios. Afortunadamente, hay una forma más elegante de devolver información desde el control hacia su contenedor, que además es la que ya utilizan los controles que vienen con .NET Framework, tales como Button. Esta consiste en disparar un evento desde dentro del control (por ejemplo, el evento Click en el caso del Button), y que el contenedor del control responda a dicho evento mediante el correspondiente manejador (handler) conectado al mismo (la rutina Button1_Click en el ejemplo de Button). Este mismo mecanismo podemos implementarlo dentro de nuestros propios controles de usuario. El listado 4 muestra un ejemplo del tipo de código que se escribe dentro del control de usuario para exponer y disparar el evento. Dentro de la clase se declara el evento con la palabra clave Event, indicando su tipo con el nombre de un delegado MiEventHandler, que definimos un poco más abajo. En C# los eventos siempre se definen de esta manera; en VB.NET existe una sintaxis alternativa que permite declarar únicamente el evento, definiéndose el delegado de forma automática. En nuestro ejemplo hemos seguido el convenio usual seguido en .NET Framework a la hora de declarar eventos, que utiliza siempre un argumento de tipo Object para transmitir el "remitente" del evento (el objeto que lo dispara), y un segundo argumento que hereda de System.EventArgs y sirve para encapsular los datos que se envían al suscriptor del evento. Con este fin, en el ejemplo hemos definido la clase MisEventArgs, que utilizamos para enviar un dato de tipo String.

<<dotNetManía

En este listado se ve también cómo podemos manipular un control Label1 ubicado dentro del nuevo formulario que hemos abierto. La referencia se hace desde la propia variable frm que acabamos de declarar, y no desde Form2, como esperaría un desarrollador de VB6. En el ejemplo anterior, la variable frm está declarada dentro del método que abre el formulario, y por lo tanto su visibilidad está limitada a ese método. Pero, por supuesto, nada impide declararla como una variable de clase en Form1, lo que permitiría comunicarse con esta instancia de Form2 desde cualquier otro punto de Form1. Evidentemente, el control Label1 tendrá que tener la suficiente visibilidad para que sea accesible desde la clase que lo llama. Visual Studio 2008 lo declara de forma predeterminada como Friend, lo que permite que sea accesible desde todas las clases compiladas en el mismo ensamblado. Si Form2 estuviera compilado en un ensamblado diferente de Form1, tendríamos que cambiar la accesibilidad de Label1 a Public, cosa que se puede hacer desde el diseñador de formularios a través de la propiedad Modifiers. También se plantea con frecuencia la pregunta contraria: cómo comunicar desde Form2 con Form1. De manera similar al caso anterior, se necesita disponer en Form2 de una referencia a la correspondiente instancia de Form1, referencia que habrá que hacerle llegar por el método que resulte más conveniente. Usualmente, el método consiste en pasarle este dato en el constructor. Esta opción se les suele pasar por alto a los programadores de VB6, ya que en dicho entorno no existía la posibilidad de tener un constructor con parámetros. En el listado 3 se muestra un ejemplo. Volviendo a la pregunta inicial que abría este artículo, nos encontramos con un problema de comunicación entre componentes muy similar a la comunicación entre formularios que hemos estado comentando. En este caso, se trata de que un control se comunique con su contenedor, cualquiera que sea éste. Se podría realizar esta comunicación de forma análoga a la que hemos visto para la comunicación entre formularios, haciéndole llegar al control una referencia a su formulario contenedor, por ejemplo a través de una propiedad pública añadida en el control para ese fin. Cada vez que utilizásemos el control en un formulario, habría que recordar la necesidad de inicializar dicha propiedad. Sin embargo, este mecanismo tiene el inconveniente de que el control que-

' Este es Form2: Public Class Form2 Private llamante As Form1

51


dnm.q&a

Finalmente, solo nos queda "disparar" el evento en el punto en el que deseemos devolver un dato al contenedor de nuestro control. En VB.NET esto se consigue con la palabra clave RaiseEvent, como se muestra en el listado 4.

Public Class UserControl1 Public Event MiEvento As MiEventHandler Private Sub PictureBox1_Click(ByVal sender AsObject,_ ByVal e As EventArgs) Handles PictureBox1.Click Dim argumento As New MisEventArgs(TextBox1.Text) RaiseEvent MiEvento(Me, argumento) End Sub End Class Public Delegate Sub MiEventHandler( _ ByVal sender As Object, ByVal e As MisEventArgs) Public Class MisEventArgs Inherits System.EventArgs Private mCadenaDevuelta As String Public ReadOnly Property CadenaDevuelta() As String Get Return mCadenaDevuelta End Get End Property Public Sub New(ByVal cadena As String) mCadenaDevuelta = cadena End Sub

Figura 1

la conexión del evento con su gestor seleccionándolo en la ventana de propiedades del control, como se ve en la figura 1. Al hacer doble clic sobre el nombre de nuestro evento, se genera un método como el que se presenta en el listado 5. Dentro de ese método, recogemos el valor pasado por el control de usuario a través del segundo parámetro (de tipo MisEventArgs), usualmente llamado e.

Private Sub UserControl11_MiEvento( _ ByVal sender As System.Object, _ ByVal e As WindowsApplication1.MisEventArgs) _ Handles UserControl11.MiEvento Label1.Text = e.CadenaDevuelta End Sub

End Class

Listado 5 Listado 4

En cuanto al formulario que contiene el control, para recibir los eventos disparados por éste basta con conectar un manejador de eventos al evento del control. Esto puede hacerse dinámicamente en el código, si se desea, mediante la sentencia AddHandler. Pero si ya tenemos el control ubicado sobre un formulario en el diseñador de Visual Studio, podemos efectuar

Con esto queda completado el circuito, y nuestro control de usuario es capaz de transmitir cambios al formulario que lo contiene. Aunque el código que hemos visto está desarrollado sobre un formulario Windows, el concepto es perfectamente aplicable también a los formularios Web, y podríamos utilizar sin ningún problema este mecanismo de eventos para comunicar (por ejemplo) un control .ascx con la página que lo contiene.

<<dotNetManía

¿Es posible configurar un control PictureBox en el que previamente se ha cargado una fotografía para poder moverla por dicho control arrastrando el ratón?

52

El usuario que formulaba esta pregunta aclaraba que tenía un PictureBox de un tamaño tal como 800x600 y en su interior una fotografía de 1024x768, y quería poder arrastrar la foto para que al moverla se vieran las partes inicialmente ocultas.

Aunque el control PictureBox en sí mismo no se puede configurar para que automáticamente tenga este comportamiento, este efecto puede simularse fácilmente ubicándolo dentro de otro control, como por ejemplo un Panel. Para ello, dimensionaremos el PictureBox al tama-


<< dnm.q&a

Sería una buena idea encapsular esta combinación de controles dentro de un control de usuario con vistas a su reutilización

public partial class VisorDeFotos : UserControl { private bool moviendo = false; private Point posicionDelCursorAlPulsar; private Point posicionActualDeLaImagen; public VisorDeFotos() { InitializeComponent(); posicionActualDeLaImagen = pictureBox1.Location; } public Image Imagen { get { return pictureBox1.Image; } set { pictureBox1.Image = value; } } private void pictureBox1_MouseDown( object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { panel1.Cursor = Cursors.Hand; moviendo = true; posicionDelCursorAlPulsar = e.Location; } }

ño de 1024x768, y su Panel contenedor lo dejaremos en 800x600. Después, mediante los eventos MouseDown, MouseUp y MouseMove del panel podremos detectar los movimientos del ratón, y cuando éste se mueva, cambiar la ubicación del PictureBox para que se vea a través del Panel una parte distinta de la fotografía. Esta combinación de Panel más PictureBox es interesante para reutilizarla en diversas aplicaciones, por lo que podría ser una buena idea encapsularla dentro de un control de usuario, para después ubicar éste sobre los formularios que requieran un "visor de fotos" de este estilo. El listado 6 contiene un ejemplo resumido del codigo de este control. Obviamente, en el diseño del control (que no se ve en el listado) hemos incorporado pictureBox1 dentro del panel panel1, tal como se describe en el texto precedente. El PictureBox se encuentra inicialmente en las coordenadas (0,0) del Panel, y tiene su propiedad SizeMode establecida al valor AutoSize. Como puede verse, durante el evento MouseDown almacenamos la posición del cursor del ratón en ese momento. Después, al recibir eventos MouseMove, restamos la posición actual del cursor de la que habíamos almacenado. Esto nos da una diferencia que indica la distancia que se ha movido el ratón. Sumamos esa diferencia a la posición que antes tenía la imagen (que conservamos en otra variable), y el resultado es la nueva ubicación en la que debe situarse. Antes de asignarla,

private void pictureBox1_MouseUp( object sender, MouseEventArgs e) { panel1.Cursor = Cursors.Default; moviendo = false; } private void pictureBox1_MouseMove( object sender, MouseEventArgs e) { if (moviendo) { Point posicionActual = e.Location; Size diferencia = new Size( posicionActual.X - posicionDelCursorAlPulsar.X, posicionActual.Y - posicionDelCursorAlPulsar.Y); Point nuevaPosicion = posicionActualDeLaImagen + diferencia; if (nuevaPosicion.X > 0) nuevaPosicion.X = 0; if (nuevaPosicion.Y > 0) nuevaPosicion.Y = 0; int dW = panel1.ClientRectangle.Width pictureBox1.Width; if (nuevaPosicion.X < dW) nuevaPosicion.X = dW; int dH = panel1.ClientRectangle.Height pictureBox1.Height; if (nuevaPosicion.Y < dH) nuevaPosicion.Y = dH; pictureBox1.Location = nuevaPosicion; posicionActualDeLaImagen = pictureBox1.Location; } } }

Figura 2

comprobamos que esta nueva ubicación no saque la imagen del área visible, en cuyo caso limitamos el desplazamiento. Como detalle adicional, para presentar una indicación visual que muestre que estamos arrastrando la imagen, hemos cambiado el cursor en el evento MouseDown, devolviéndolo a su valor predeterminado en el MouseUp. La figura 2 muestra el resultado final.

<<dotNetManía

Listado 6

53


<< dnm.laboratorio.net

Laboratorio.net

Suites de componentes para desarrolladores .NET Las suites de componentes ponen a disposición de los desarrolladores piezas que pueden añadir en sus proyectos tanto para cubrir elementos puntuales que llevaría un tiempo considerable implementar, como para mejorar a todos los niveles las prestaciones que ofrece inicialmente .NET.Además, estos controles nos proporcionan código de alta calidad, una experiencia de usuario sofisticada, y en algunos casos representan soluciones especializadas en diversos aspectos, como ocurre con los cuadros de mandos, generación de informes o comunicaciones, entre otros. Cabe destacar que todas estas suites están en constante evolución, soportando casi de inmediato las novedades tecnológicas que constantemente incorporan Microsoft y el sector, lo cual les lleva a crear entre 1 y 4 revisiones anuales, ya incluidas en el coste del producto o del mantenimiento anual. Esto nos permite estar siempre actualizados, sin que sea necesario realizar un gran esfuerzo por nuestra parte. A continuación, presentamos brevemente las suites más populares para Visual Studio .NET.

NetAdvantage for .NET NetAdvantage es una suite que acompaña a los desarrolladores de Visual Studio desde hace muchos años; la última versión, NetAdvantage for .NET 2009 vol 2, es de las que pone a nuestra disposición con mayor calidad y rapidez actualizaciones a las más recientes tecnologías desarrolladas por Microsoft. Su oferta para clientes inteligentes principalmente va dirigida a Windows Forms y Windows Presentation Foundation (WPF). Los componentes para Windows Forms componen un conjunto de elementos de interfaz de usuario diseñados con la experiencia de usuario y el rendimiento en mente, por lo que potencian al desarrollador para crear las experiencias más efectivas, mediante controles como el panel mosaico, el empleo de los nuevas metáforas de navegación o la emulación de la experiencia de usuario de Office 2007 mediante tablas de colores predefinidos y los controles ribbon. Por su parte, los controles para WPF elevan las expectativas del usuario, a la vez que ofrecen un alto rendimiento. Son especialmente útiles si se necesita enlazar datos de millones de registros con un renderizado rápido para mostrar la primera pantalla en milisegundos, o crear espectaculares efectos visuales con presentaciones tipo carrusel. Todo ello facilitado mediante un modelo de objetos lógico y amigable, que puede

aprovecharse tanto a través del UI declarativo (XAML) como mediante código. Para las aplicaciones Web, la suite ofrece controles ASP.NET que incorporan AJAX, controles Rich Internet Application (RIA) para ASP.NET 2.0 y ASP.NET 3.5, y controles Silverlight para el desarrollo de la línea de negocio. Con más de 45 controles visuales y no visuales, los componentes de NetAdvantage para ASP.NET conforman una caja de herramientas completa para crear rápidamente la interfaz de usuario de una aplicación Web, incluyendo rejillas AJAX, gráficos comerciales, barras de herramientas, menús, árboles, pestañas, ricos editores HTML WYSIWYG, revisores de ortografía integrados e independientes, barras de exploración, agen-


<< dnm.laboratorio.net

ComponentOne Studio Enterprise Component One Studio Enterprise 2009 v3 es otra de las suites clásicas para Visual Studio, la cual está compuesta por la gama más completa de componentes visuales para su utilización en aplicaciones Windows, Web, y para dispositivos móviles. Esta suite incluye las siguientes soluciones: • Studio for WinForms, para aplicaciones Smart Client, con más de 60 componentes de rejillas, gráficos de datos, informes, agendas, menús, barras de herramientas, ribbon, entrada y validación de datos e importación/exportación, entre otros, todos ellos trabajando de forma que vemos los resultados en tiempo de diseño para facilitar el desarrollo, e incluyendo asistentes, diseñadores y etiquetas inteligentes. • Studio for ASP.NET, con más de 35 controles para ASP .NET, entre los que se incluyen rejillas, gráficos de datos, informes, agendas, menús, barras de herramientas, editores, separadores, validación y entrada de datos, importación/exportación y mucho más, todos ellos soportando los últimos estándares (CSS 2 y XHTML 1.0), estilos visuales predefinidos y tecnología AJAX. • Studio for WPF, con controles que van desde la conexión de datos avanzada a la visualización de datos rica propia de WPF, permitiendo presentar la información de diferentes

maneras como rejillas, agendas, gráficos de datos e informes. Studio for Silverlight, que proporciona más de 30 controles fáciles de personalizar y estilizar para las aplicaciones RIA. Studio for Mobile proporciona cuatro componentes de rejilla, gráficos comerciales y compresión ZIP para la creación de aplicaciones basadas en .NET Compact Framework. Studio for iPhone es una suite para crear aplicaciones ASP .NET que ofrecen un aspecto nativo para el iPhone de Apple. Studio for ActiveX incluye algunos productos muy conocidos como TrueDBGrid y VSFlexGrid, además de otros controles ActiveX que han sido ampliamente utilizados a lo largo de los últimos años para la creación de informes, gráficos de datos o interfaz de usuario. IntelliSpell, por último, es un addin de corrección ortográfica para Microsoft Visual Studio que permite corregir código, comentarios, cadenas de caracteres, HTML, XML, recursos y texto en general.

tipos de gráficos comerciales, entre los que se incluyen algunos muy innovadores y vistosos. El producto se comercializa en versiones para Windows Forms, ASP .NET AJAX, SharePoint y Reporting Services. • Dundas Gauge ayuda a analizar de forma instantánea los indicadores clave de rendimiento (KPI) y otros datos en tiempo real, para crear cuadros de mando. Este componente ofrece un gran número de indicadores que se pueden configurar mediante asistentes. También está disponible para aplicaciones Windows, Web, SharePoint y Reporting Services. • Dundas Map permite visualizar los datos en un mapa para poder interpretar datos distribuidos geográficamente de una forma más clara y completa. Los datos se pueden enlazar a una extensa librería de mapas que se pueden ordenar en capas, elementos para componer mapas y controles de navegación. Está disponible para Windows, Web y Reporting.

Dundas Components Dundas cuenta principalmente con tres productos individuales, muy destacados por su calidad, los cuales están más planteados como soluciones que como componentes. • Dundas Chart es una solución completa para la creación de gráficos comerciales a partir de datos, con soporte para animaciones. Es muy fácil de utilizar, ya que cuenta con asistentes y plantillas que funcionan en tiempo de diseño. También está pensada para trabajar con cubos de decisión OLAP, proporcionando 37

<<dotNetManía

das y editores de entrada de datos entre otros. Los controles Silverlight 3 proporcionan una rejilla de datos Silverlight, con una virtualización UI muy rápida en escenarios de negocio comunes y con capacidad para hacer un uso intensivo de datos que demanden cientos o miles de filas, con frecuencia de refresco de milisegundos. El modelo de suscripción anual, con actualizaciones continuas de NetAdvantage, permite estar siempre al día, con la ventaja adicional de incluir todo el código fuente en C#.

55


<< dnm.laboratorio.net

Como oferta más reciente, Dundas Dashboard es una nueva solución "llave en mano" basada en la experiencia adquirida en el desarrollo de las herramientas anteriores, que proporciona toda una plataforma para el desarrollo rápido de cuadros de mando de negocio de tipo estratégico, analítico y operacional.

Aspose.Total La suite Aspose.Total Q3 2009 proporciona una amplia variedad de componentes repletos de funcionalidad para diversas plataformas, como .NET, Java, Microsoft SQL Server Reporting Services (SSRS) y JasperReports.

for Silverlight y Web.UI for ASP.NET AJAX, incluyen rejillas, gráficos de datos, controles para navegación y controles de entrada y edición de datos. Si bien los componentes de estas dos partes son completos, y ofrecen un estilo gráfico sofisticado, la principal originalidad de esta suite está en el tercer conjunto de controles llamado SOA.UI for .NET, que es una plataforma para la construcción de servicios Web especializada en servir a la capa de interfaz de usuario. La lógica desarrollada para el lado servidor con SOA.UI puede ser utilizada con AJAX, Silverlight, WPF o front ends de dispositivos móviles.

TMS ASP.NET Component Pack Este paquete ofrece más de 60 componentes escritos en C#, entre los que se incluyen rejillas, barras de herramientas y ribbon de Office 2003/2007, planificadores, agendas, calendarios, controles de edición avanzada, actualización a través de Web, cajas de lista mejoradas, vistas de árbol, combos, componentes para la gestión de ficheros CAB y otros. Como característica a resaltar, esta suite de controles de alta calidad también está disponible para otras herramientas de desarrollo en .NET además de Visual Studio, como Delphi.

PowerTCP Universal Suite

<<dotNetManía

Con la ayuda de los componentes .NET de Aspose, los desarrolladores pueden fácil y eficientemente incorporar funcionalidades avanzadas de procesamiento de ficheros dentro de sus aplicaciones .NET, y abrir, crear, editar y guardar ficheros en muchos de los formatos más populares, como Word, Excel, PowerPoint y PDF. La suite también incorpora una excelente línea de componentes de visualización de datos, incluyendo componentes que permiten generar consultas ad-hoc y visualizar datos en forma de rejilla o gráfico comercial a partir de datos, así como incorporar fácilmente funcionalidad de código de barras. Asimismo, Aspose.Total proporciona algunas de las mejores utilidades del mercado para el trabajo con plantillas recurrentes, protocolos de red (SMTP, POP3, MIME, IMAP, FTP, DNS, ICMP o WHOIS), y un motor de flujos de trabajo. Es de destacar también que los SSRS Rendering Extensions son una herramienta imprescindible para todos aquellos que busquen generar informes en múltiples formatos desde SSRS.

56

Es una suite especializada en componentes de comunicaciones. PowerTCP Universal Suite Subscription ofrece, en formato de suscripción, una licencia de desarrollo para todos los componentes PowerTCP ActiveX y PowerTCP .NET, además de actualizaciones periódicas y soporte. Estos componentes proporcionan todas las funcionalidades asociadas a TCP/IP de forma segura y fiable, además de componentes de compresión.

PowerWEB for ASP.NET PowerWEB for ASP.NET ofrece un útil control para añadir a AJAX capacidades de respuesta al obtener o actualizar datos del servidor, lo cual permite eliminar molestos parpadeos; otro que incluye un editor WYSIWYG para aplicaciones Web; un tercero para mostrar imágenes de alta calidad (con controles de zoom) en aplicaciones ASP.NET, y por último un componente para la transferencia de ficheros desde el navegador al servidor minimizando el uso de memoria.

UIFramework for .NET UIFramework for .NET está compuesto por tres paquetes de componentes. Los dos primeros, Web.UI

Sobre todas ellas puedes obtener más información contactando con Danysoft en el 902 123146, o por email en info@danysoft.com.


biblioteca.net Diseño y programación de bases de datos con SQL Server 2008 Pedro López Belmonte y Aroa Solana Editorial: Luarna Páginas: 286 Publicación: 2009 ISBN: 978-8492684595 Idioma: castellano Sitio de descarga: www.luarna.com En este manual digital se tratan las diferentes tareas necesarias para llevar a cabo el diseño de una base de datos y su implementación en SQL Server 2008, desde las tareas de diseño de los diferentes modelos hasta la implementación física de los mismos, pasando por la creación de objetos de base de datos, procedimientos almacenados, funciones definidas por el usuario, desencadenadores o el tipo de datos XML, sin olvidar algunos aspectos interesantes de cara al desarrollador, tales como LINQ to SQL o el almacenamiento FileStream, dos potentes recursos para la construcción de aplicaciones de gestión. También se exploran las características que aporta la última versión del sistema gestor de base de datos de Microsoft, como son la integración con .NET 3.5 (objetos SQL CLR), o las nuevas aplicaciones de servidor, como Reporting Services, Notification Services o Integration Services, entre otras. Y tampoco faltan los nuevos tipos de datos espaciales, indispensables para el almacenamiento de datos cartográficos.

Tecnologias ASP.NET 4.0 (saltando desde la versión 2.0) José Manuel Alarcón Editorial: Krasis Press Páginas: 161 Publicación: noviembre de 2009 ISBN-13: 978-8493669614 Idioma: castellano Nuestro amigo José Manuel Alarcón ataca de nuevo. Esta vez, con una obra novedosa en cuanto al contenido, que nos anticipa lo que estará presente en la versión final de ASP.NET 4.0. Cabe resaltar el tratamiento de los temas relacionados con AJAX (en todos sus gustos y sabores), el enlace a datos en el lado cliente (tecnología Live Binding, que es la principal novedad de ASP.NET 4.0), la generación automática de interfaces de “mantenimiento” con Dynamic Data y el filtrado automático de datos con Query Extenders. Por lo demás, en este trabajo se presentan las novedades de ASP.NET 4.0 con lenguaje claro y ejemplos comprensibles, asumiendo que el lector conoce la versión 2.0, y que espera ver realmente eso: qué ha cambiado que podamos aprovechar en nuestros desarrollos. Eso promete y eso consigue. Difícil dar más por menos.

novedades

De cara a los lectores, la obra tiene otra bondad adicional: puede leer online el texto completo del libro, y comprarlo si le resulta de interés (http://www.scribd.com/doc/20154009/Tecnologias-ASPNET-40-saltando-desde-la-version-20).

Introducing .NET 4.0 with Visual Studio 2010 Alex Mackey Editorial: APress. Páginas: 400. ISBN: 978-1430224556. Fecha de publicación: 17 de diciembre de 2009. Idioma: inglés.

Visual C# 2010 Recipes:A Problem-Solution Approach Allen Jones, Matthew MacDonald y Rakesh Rajan. Editorial: APress. Páginas: 800 . ISBN: 978-1430225256. Fecha de publicación: 28 de diciembre de 2009. Idioma: inglés.

TEXTO: MARINO POSADAS


desván

Marino Posadas

<<dotNetManía

Disquisiciones sobre el futuro (de nuestras tecnologías)

58

O dicho de otro modo, por dónde parece que van los tiros en esta profesión nuestra, desde el punto de vista de las herramientas (físicas y lógicas) que utilizamos. Podríamos decir también: hardware (y cómo evoluciona y nos condiciona su potencial), software (siempre vinculado al anterior), y el uso que se hace de la implantación de ambos. Respecto al hardware, se dice que estamos en un cuello de botella. Y el problema puede verse desde dos vertientes: lo que existe o es el inmediato futuro y lo que puede venir. Está claro que lo que existe está llegando a un límite en cuanto a la potencia de los procesadores, y de ahí la tendencia a incluir varios en los ordenadores actuales. Eso tiene implicaciones en el desarrollo: la mayor preocupación actual es la programación paralela (Parallel Programming), y .NET 4.0 va a aportar mejoras significativas a este respecto. De poco sirve incluir más "cores" en una placa base si son infrautilizados. Por otra parte, se abren nuevas vías, especialmente en el apartado de la interacción hombre-máquina y las nuevas interfaces de usuario con pantallas táctiles, sistemas de reconocimiento de avatares, interacciones dirigidas mediante reconocimiento gestual, etc. El celebrado vídeo de Patti Maes (de M.I.T. Media Lab), disponible en la dirección http://www.youtube.com/watch?v=YVvJw4FJmU U y que recomiendo sinceramente (es espectacular), nos muestra claramente lo último que se puede adquirir con estas características (y muy barato). En cuanto al futuro, hay muchas propuestas, pero todas pasan por un avance cardinal en las capacidades de procesamiento. Hace poco, hablábamos en esta columna de la computación basada en ADN y los trabajos del profesor Ehud Shapiro, del Instituto Weizmann de Israel; la otra gran opción parece la computación cuántica, donde los españoles contamos con uno de los más avanzados investigadores mundiales: José Ignacio Cirac (en la foto), Director del Dpto. de Óptica Cuántica del Instituto Max Plank. Por ahí se pueden esperar grandes avances, aunque nada inmediato desde el punto de vista comercial. En cuanto al software, pienso que lo más relevante estará, por una parte, en la forma en que

aprovechemos esa computación paralela, y por otra, en las nuevas interfaces de usuario y nuestro diálogo con las máquinas que muestren inteligencia. Para programar estos nuevos paradigmas, tenemos que cambiar el "chip", y acostumbrarnos cada vez más a trabajar con hilos de ejecución, a utilizar sistemas que permitan ese control, y a planificar las aplicaciones de acuerdo con estos principios desde las fases iniciales de su ciclo de vida. No voy a entrar aquí en la lucha de lenguajes, porque es algo que me parece carente de importancia. Lo de menos es el lenguaje que se use. Lo importante es que se use bien. Aún así, hay ciertos paradigmas que no tienen discusión posible hoy en día: la orientación a objetos, la IoC (inversión de control), la inyección de dependencias y las metodologías ágiles son aspectos del desarrollo que casi todos los "gurús" actuales admiten como necesarios y recomendables. Finalmente, todos somos usuarios. Usuarios de interfaces de usuario. Y de Internet. Y de las redes sociales. Pienso que éstas están aún en sus inicios, y ganando adeptos y creando tendencias con más rapidez que ningún otro fenómeno que se recuerde (en buena parte, por la democratización del medio, y la libertad de expresión que supone Internet. Todavía…). De momento, triunfan las redes generalistas que agrupan a grandes colectivos. Pero llegará la especialización. Y la creación asistida (sin necesidad de saber programar). Poca creatividad, pero una gran eficacia. Los mashups y las aplicaciones en la nube (el cloud computing) permitirán una "inmediatez en la creación" como no se ha visto hasta ahora y se agrandará la figura del creador de contextos, que aprovechará elementos existentes en la red, y la facilidad de su organización en un mashup, para (sin casi utilizar herramientas de desarrollo) ofrecer soluciones y espacios de colaboración e intercambio no vistos hasta ahora, con interfaces cada vez más ricas y objetivos más especializados. En fin, esta es mi visión en este momento. Como cualquier visión, es incompleta y está en cambio constante. Pero así es la informática...

firma.firma.firma.firma

documentos en la red Pivot: Microsoft’s expe riment to ‘view the Web as a web’ , es un docu -

mento de la conocida columnista de ZDNet, Mary Jo Foley, donde apunta las posibilidades que ofecerá el nuevo proyecto "Pivot", actualmente en desarrollo por los equipos de MS-Live con el objetivo de ver la Web como una red realmente conectada y no como un conjunto de páginas individuales. Disponible en http://blogs. zdnet.com/microsoft/?p=4612&tag=content.

sitios del mes IEBlog es el sitio de Dean Hachamovitch, General Manager de Internet Explorer y de su equipo, que de alguna forma se ha convertido también en la "voz oficial" del navegador de Microsoft. Una de sus últimas entradas trata acerca de las previsiones que tienen en cartera para la versión 9 del navegador. El enlace es: http://blogs.msdn.com/ie/archive/2009/11/18/anearly-look-at-ie9-for-developers.aspx.

Otro sitio más o menos oficial es el blog de Tim Heuer, mano derecha de Jesse Liberty en esto de la divulgación de las tecnologías relacionadas con Silverlight, en su recomendable "Method ~ of ~ failed": http://timheuer.com/blog.

utilidades del mes ¡100 Juegos de Microsoft gratis!

Es un sitio Web que contiene más de 100 juegos on-line y descargables. Un recurso para momentos de aburrimiento y para entretener a los críos... Visite la página: www.microsoft.com/ games/playyourgame.


dotNetManía #065  
Read more
Read more
Similar to
Popular now
Just for you