dotnetmanía · product manager de c#. empezamos a hablar con él de las ... creación de un nuevo...

60
entrevista Dan Fernandez Developer and Platform Evangelism Team Microsoft Corp. Factorías de software. Justificación y ventajas Aspose.Total for .NET El Marco de trabajo de entidades de ADO.NET v3.5 (VII) • Paneles para el mundo 3D • Frameworks para Javascript • Componentes de uso general • Extender o no extender... Los métodos extensores en Visual Basic 2008 Plantillas ASP.NET e inferencia de tipos en C# Integrándonos continuamente dedicada a los profesionales de la plataforma .NET www.dotnetmania.com entrevista Dan Fernandez Developer and Platform Evangelism Team Microsoft Corp. dotNetManía nº 50 julio-agosto 2008 6,50 Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía Factorías de software. Justificación y ventajas Aspose.Total for .NET Opinión Laboratorio.NET El Marco de trabajo de entidades de ADO.NET v3.5 (VII) • Paneles para el mundo 3D • Frameworks para Javascript • Componentes de uso general • Extender o no extender... Los métodos extensores en Visual Basic 2008 Plantillas ASP.NET e inferencia de tipos en C# TodotNet@QA Integrándonos continuamente

Upload: vuthuy

Post on 04-Oct-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

entrevistaDan Fernandez

Developer and Platform Evangelism TeamMicrosoft Corp.

Factorías de software. Justificación y ventajas

Aspose.Total for .NET

El Marco de trabajo de entidades de ADO.NET v3.5 (VII) • Paneles para el mundo 3D • Frameworks para Javascript •Componentes de uso general • Extender o no extender... Los métodos extensores en Visual Basic 2008

Plantillas ASP.NET e inferencia de tipos en C#

Integrándonos continuamente dedicada a los profesionales de la plataforma .NET

www.

dotne

tman

ia.co

m

entrevistaDan Fernandez

Developer and Platform Evangelism TeamMicrosoft Corp.

dotNetManíanº 50 julio-agosto 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework

dotNetManía

Factorías de software. Justificación y ventajas

Aspose.Total for .NET

Opinión

Laboratorio.NET

El Marco de trabajo de entidades de ADO.NET v3.5 (VII) • Paneles para el mundo 3D • Frameworks para Javascript •Componentes de uso general • Extender o no extender... Los métodos extensores en Visual Basic 2008

Plantillas ASP.NET e inferencia de tipos en C#TodotNet@QA

Integrándonos continuamente

Bienvenido al número 50, de julio/agosto de2008, de dotNetManía.

¡Podemos! Éste ha sido el lema para laselección española, campeona de Europa2008. Es un lema simple, pero que dice másde lo que parece: dice que nos enfrentamosante un reto difícil pero conseguible; quesomos capaces, más capaces de lo que muchoscreen; puede interpretarse como un mensajede auto-convencimiento o auto-motivación;aunque también parece querer infundir tran-quilidad a los nerviosos aficionados. Con esteejemplar, van 50 dotnetmanías, y no es que sig-nifique nada en especial, pero cumplir núme-ros redondos parece que haya que celebrarlode alguna forma, y qué mejor que hacer nues-tro ese lema de la selección de española defútbol y decir ese ¡podemos! para afrontar lospróximos 50.

Para ayudarnos en tarea tan motivantenos hemos aliado con Alhambra-Eidos paraconformar, difundir y participar en planes for-mativos para desarrolladores .NET y tambiénpara profesionales TI, siempre en el entornode las tecnologías de Microsoft. Empezamoscon un laboratorio de dos días de Silverlight2.0, impartido por nuestro redactor jefe Mari-no Posadas, del que puede ver más informa-ción en www.alhambra-eidos.es. Marino estáactualmente trabajando en el primer libro deSilverlight 2.0 en castellano, que publicare-mos como nuestro Cuaderno Técnico nº9y que regalaremos con el patrocinio de Micro-soft Ibérica en el número de octubre.

Siverlight 2.0, que ya está en Beta 2 ycon licencia Go Live, será –a mi entender–

una auténtica revolución para los progra-madores de la plataforma .NET, en tantoque tendremos la posibilidad de progra-mar con interfaces que hasta ahora eranimpensables. Nosotros mismos ya estamosrediseñando nuestra página Web usandoSilverlight 2.0. Espero que puedan ver elresultado entre septiembre y octubre deeste año.

Este mes entrevistamos a Dan Fernan-dez, Lead Product Manager para herramien-tas no profesionales en Microsoft y antiguoProduct Manager de C#. Empezamos ahablar con él de las versiones Express y aca-bamos hablando de XNA, pasando por Sil-verlight y PopFly.

El artículo de portada “Integrándonoscontinuamente” de Luis Fraile, a quien doyla bienvenida en su primera intervención,nos muestra como crear un entorno base deintegración continua con Visual Studio 2008Team System no es nada complicado.

Por último, aunque no tenemos aún enWPF una organización jerárquica en el mun-do 3D similar a la ya existente en 2D y mien-tras esperamos a que el equipo de desarro-llo de WPF complete la jerarquía para futu-ras versiones, publicamos el artículo “Pane-les para el mundo 3D” del Grupo Weboode la Universidad de La Habana, que mues-tra cómo programar paneles tridimensiona-les y dotar a las aplicaciones de un aspectosimilar a los paneles de Windows Vista.

Y nada más. Como siempre, ¡dentro haymucho más! Espero que nuestro trabajo deeste mes sea de su agrado.

dotN

etM

anía

<<

3

¡Podemos!

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 50 • Julio-agosto 2008Precio: 6,50 €

EditorPaco Marín ([email protected])

Redactor jefeMarino Posadas([email protected])

Editor técnicoOctavio Hernández([email protected])

RedacciónDino Esposito, Guillermo 'Guille' Som, LuisMiguel Blanco y Miguel Katrib (Grupo Weboo)

Empresas colaboradoras

Alhambra-Eidos

Krasis

Plain Concepts

Raona

Solid Quality Mentors

Además colaboran en este númeroAntonio Quirós, Daniel Seara, IskanderSierra, Juan Carlos Viñas, Luis Fraile, Mariodel Valle y Unai Zorrilla.

IlustracionesPortada: Javier Roldán

Atención al suscriptorPilar Pérez ([email protected])

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528522 - Rivas Vaciamadrid (Madrid)

www.dotnetmania.com

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

ImprimeGráficas MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

dotNetManíadotNetManía

Paco Marín

sumario 50Factorías de software. Justificación y ventajas 10-11

El momento de evolución tecnológica y económica en que nos encontramos está fomentando lacreación de un nuevo modo de enfrentarse al problema de desarrollar software. Se trata de laorganización de los equipos de desarrollo en factorías que, típicamente, están deslocalizadas respectoa los lugares en los que se generan las necesidades tecnológicas de los clientes..

Entrevista a Dan Fernandez 12-15Otra de las entrevistas que pudimos “arañar” al programa oficial en el pasado Tech-Ed 2007 deBarcelona fue con Dan Fernandez, del Developer and Platform Evangelism Team en Microsoft(Redmond), quien nos atendió amablemente durante más de media hora en una de las salaseventualmente vacías, para charlar de “productos y proyectos” de desarrollo, y también de “planesvs. realidades”.

El Marco de trabajo de entidades de ADO.NET v3.5 (VII) 18-21Continuando con nuestra serie dedicada a presentar las posibilidades que ofrecerá el Marco deentidades de ADO.NET 3.5 para el modelado conceptual, en esta entrega mostraremos otrosmecanismos disponibles para la implementación de vistas, presentando la vía para mapear las vistasdefinidas en el almacén relacional, así como las que tenemos a nuestra disposición para definir yoperar con vistas personalizadas expresadas en Entity SQL.

Paneles para el mundo 3D 22-27Este artículo debe resultar un útil divertimento para la ya creciente familia de seguidores de WPF.Aquí se verá cómo programar paneles tridimensionales para facilitar la distribución de diferentescuerpos en un Viewport3D. A la vez, el lector encontrará detalles de algunos elementos de la API3D de WPF que le deberán resultar de utilidad.

Integrándonos continuamente 28-35Una de las prácticas más recomendadas a la hora de realizar proyectos y empezar a asegurar lacalidad pronto es la de integrar todo el código lo más frecuentemente posible. Esto es especialmenteimportante a la hora del desarrollo iterativo, mediante el cual gestionaremos los cambios derequisitos de una forma más efectiva, entregando nuevas funcionalidades del software en cortosperiodos de tiempo.

Frameworks para Javascript 36-38Las técnicas de desarrollo en Javascript, así como los usos que se le dan a esta tecnología, hancambiado notablemente en los últimos años. Hoy en día, nos es difícil pensar que una aplicación Webmoderna pueda prescindir de esta tecnología para finalidades tan diversas como la comunicaciónasíncrona entre cliente y servidor, la aplicación de efectos visuales a nuestro código HTML omantener nuestro propio sistema de caché en el lado del cliente.

Componentes de uso general 40-44Otro mes, y otro componente. Veamos cómo nuestros otros componentes pueden relacionarse con elsistema operativo, la seguridad, los usuarios… el Directorio activo.

Extender o no extender... Los métodos extensores en Visual Basic 2008 45-49La versión de Visual Basic que se incluye con .NET Framework 3.5 o Visual Studio 2008 permiteque creemos métodos que extiendan la funcionalidad de clases existentes sin necesidad de tener accesoal código fuente de éstas. En este artículo veremos cómo crear este tipo de métodos y quéconsideraciones debemos tener en cuenta para usarlos de la forma más adecuada.

dnm.todotnet.qa 50-52Plantillas ASP.NET e inferencia de tipos en C#

Abordamos este mes un examen en profundidad de las propiedades de las plantillas de ASP.NET, yconcluiremos explicando los pros y contras del uso de la nueva palabra reservada var en C#.

dnm.laboratorio.net 54-56Aspose.Total for .NET

Este mes presentamos Aspose.Total for .NET, una potente suite de componentes reutilizables creados ycomercializados por la empresa australiana Aspose, que pueden ser adquiridos conjuntamente o por separadopara ser incorporados a todo tipo de aplicaciones .NET.

dnm.biblioteca.net 57Programming Microsoft LINQ Professional C# 2008

dnm.desvan 58

Visual Studio 2008 y .NETFramework 3.5 Service Pack1 dan continuidad a la inver-sión de Microsoft en herra-mientas de desarrollo líderesdel mercado. El Service Pack 1 resuel-ve problemas encontrados tantomediante pruebas internas como gra-cias a información recibida de clien-tes y partners. En general, el ServicePack 1 ofrece a sus usuarios tanto nue-vas características como mejoras en laestabilidad y el rendimiento de VisualStudio 2008 y .NET Framework 3.5.

Descripción general

Con el Service Pack 1, Visual Studio2008 introduce una gran cantidad denuevas características para el desarrollode aplicaciones para Windows, Officey la Web. Los desarrolladores que cre-en aplicaciones basadas en .NET dis-frutarán de un rendimiento superior deldiseñador de WPF, nuevos componen-tes para Visual Basic y Visual C++, asícomo un ribbon de Office 2007 para lasMFC. Los desarrolladores de aplica-ciones Web encontrarán múltiplesmejoras en el soporte para la progra-mación de scripts del lado del cliente,incluyendo el IntelliSense para Javas-cript. Adicionalmente, el soporte totalpara SQL Server 2008, la incorpora-ción de ADO.NET Entity Frameworky las mejoras de rendimiento del entor-no hacen que el Service Pack 1 sea unproducto sumamente atractivo.

Por su parte, .NET Framework3.5 Service Pack 1 ofrece más con-troles, una configuración más dirigi-da y mejoras en el rendimiento duran-te el arranque, así como potentescaracterísticas gráficas para el desa-

rrollo de aplicaciones cliente y nue-vas posibilidades de acceso a datos,soporte mejorado para AJAX y otrasmejoras para el desarrollo Web. Adi-cionalmente, introduce ADO.NETEntity Framework y ADO.NET DataServices, que permitirán simplificaraún más el código de acceso a datosen las aplicaciones ofreciendo unmodelo conceptual extensible pararepresentar datos provenientes dediversas fuentes y permitiendo queeste modelo refleje de un modo máscercano los requisitos de negocio.

Visual Studio 2008 Service Pack 1incluye:

• Diseñadores mejorados para eldesarrollo de aplicaciones WPF.

• Soporte completo para SQL Ser-ver 2008.

• La introducción del Diseñador deentidades de ADO.NET.

• Componentes y herramientas paraVisual Basic y Visual C++ (inclu-yendo un ribbon de Office 2007para MFC).

• Mejoras en Team Foundation Ser-ver para responder al feedback delos clientes acerca de la usabilidady rendimiento del control de ver-siones, y ofrecer una mejor inte-gración del e-mail con el segui-miento de ítems de proyectos ysoporte completo para la utiliza-ción de SQL Server 2008.

• Mejoras para el desarrollo Web,incluyendo un soporte más com-

pleto de Javascript, herramien-tas mejoradas para AJAX y elacceso a datos, y mejoras en eldespliegue de sitios Web.

.NET Framework 3.5 Service Pack 1incluye:

• Mejoras de rendimiento de entreun 20 y un 45% en las aplicacio-nes WPF –sin necesidad de hacercambio alguno al código–.

• Mejoras en WCF que ofrecen máscontrol al desarrollador sobre elacceso a datos y servicios.

• Experiencia de instalación mejo-rada para aplicaciones cliente.

• Mejoras en la plataforma de accesoa datos, como ADO.NET EntityFramework, ADO.NET Data Ser-vices y soporte para las nuevas carac-terísticas de SQL Server 2008.

Detalles adicionales

Adicionalmente, el Service Pack 1 de.NET Framework y Visual Studio2008 incluye otras varias nuevas carac-terísticas:

Cambios en WPF y el diseñador visual

• Mejoras en el rendimiento del“arranque en frío” de entre un 20 yun 45%, dependiendo del tamañode la aplicación, sin modificaciónalguna al código.

• Características adicionales de WPFpara un mejor rendimiento del tex-to (especialmente cuando se utilizaen elementos Visual y Drawing-Brush), los gráficos (efectos comoDropShadow y Blur, antes imple-mentados por software, ahora se

dotN

etM

anía

<<

6

noticiasnoticias

noticias

noticias

noticias

Visual Studio 2008 y .NET Framework 3.5Service Pack 1Durante los meses de verano, se pondrá a disposición del público la versión final delService Pack 1 de Visual Studio 2008 y .NET Framework 3.5, de los que se liberaronrecientemente versiones beta.

dotN

etM

anía

<<

7

<<dnm.directo.noticias

realizan mediante aceleración de hard-ware) y los multimedios.

• WriteableBitmap muy mejorado, quehace posible las actualizaciones demapas de bits en tiempo real desdeuna superficie de software.

• Mejoras en la escalabilidad de losdatos, como el reciclado de contene-dores y la virtualización de TreeView,para ofrecer un mejor soporte parala edición de datos.

• Múltiples novedades en el diseñadorde WPF, como el soporte para loseventos en la ventana de propieda-des, soporte del Cuadro de herra-mientas en el modo de código fuen-te, entre otras.

Cambios en WCF y WF

• Nuevo Asistente de alojamiento paralos proyectos de servicio WCF.

• Mejoras en el Cliente de pruebas,tales como el soporte para contratosde mensajes y tipos anulables.

• Expansión del alcance del serializa-dor de contratos de datos, relajandola necesidad de aplicar los atributosDataContract y DataMember en los tiposy soportando un mecanismo intero-perable para tratar las referencias aobjetos.

• Experiencia mejorada de depuraciónen entornos de confianza parcial, consoporte para el Registro de sucesos.

• Soporte para entidades de ADO.NETEntity Framework en contratos WCF.

• Múltiples mejoras para crear servi-cios REST, como el soporte para lapublicación y consumo de Service-Document o un mayor control y usabi-lidad de UriTemplate.

• Mejoras significativas en el trabajocon proyectos grandes basados enWF dentro de Visual Studio.

• Mejora considerable en la escalabili-dad de los servicios WCF alojados enel modo integrado en IIS7.

.NET Framework 3.5 Optimized ClientRuntime

• .NET Framework 3.5 SP1 ofrece unaversión de instalación de .NET Fra-

mework optimizada para el desarrollode aplicaciones cliente. El tamaño finalde este runtime optimizado es menorde 20 Mb.

Nuevos marcos de ADO.NET

.NET Framework 3.5 SP1 incluye dosnuevos marcos de trabajo, ADO.NETEntity Framework y ADO.NET Data Ser-vices, para ofrecer a los desarrolladores unamayor flexibilidad y más opciones para eldesarrollo de aplicaciones que acceden yutilizan datos.

ADO.NET Entity Framework

• El Marco de entidades de ADO.NET(tecnología sobre la que vienen escri-biendo desde hace varios meses nues-tros columnistas Unai Zorrilla y Octa-vio Hernández) permitirá elevar elnivel de abstracción en el manejo dedatos, y haciendo posible que la estruc-tura de la base de datos evolucione sinprovocar un impacto significativo sobreel código de la aplicación.

• En vez de programar contra filas ycolumnas, el Marco de entidades per-mite la definición de un modelo dedatos de entidades sobre el almacénrelacional, y entonces programar entérminos de ese modelo. Los desarro-lladores trabajarán con representacio-nes de los datos que tienen sentido parala aplicación, y que se expresan en unvocabulario más rico que incluye con-ceptos como la herencia, tipos com-plejos y relaciones explícitas.

• Un nuevo “sabor” de LINQ, LINQto Entities, permitirá definir consultasfáciles de mantener que recuperanobjetos o entidades de negocio fuerte-mente tipados.

ADO.NET Data Services

• Los Servicios de datos de ADO.NETofrecen una infraestructura de prime-ra clase para desarrollar la siguiente olade aplicaciones de Internet dinámicas,permitiendo exponer los datos comoservicios REST que utilizan una sinta-xis de URI uniforme y los verbos están-dar de HTTP y que pueden ser con-sumidos por todo tipo de aplicaciones

clientes (por ejemplo ASP.NET, AJAXy Silverlight).

• Los Servicios de datos ofrecen un mar-co de trabajo para crear servicios dedatos sobre almacenes relacionalescomo SQL Server, MySQL, DB2 uOracle, utilizando el soporte del Mar-co de entidades, o para fuentes de datosno relacionales utilizando el modelo deproveedores suministrado.

Mejoras en Team Foundation ServerVarias mejoras y características adi-

cionales han sido añadidas a Visual Stu-dio Team System 2008 Team Founda-tion Server, incluyendo:

Control de versiones

• Mejoras en la experiencia de usuarioa través de nuevos diálogos.

• Mejoras en el Explorador de controlde código fuente.

• Soporte para ficheros no pertene-cientes a una solución.

Seguimiento de Work Items

• Integración con Office 2007 median-te el ribbon estándar.

• Integración del correo electrónico enel ciclo de desarrollo.

Herramienta de migración de Visual SourceSafe

• Numerosas mejoras en el rendimien-to y fiabilidad de la herramienta.

Rendimiento y escalabilidad

• Múltiples mejoras en el rendimien-to de diferentes tareas.

• Un mismo servidor puede soportarmuchos más proyectos; además, mejo-ra sensiblemente la experiencia de usua-rio de un cliente que se conecta a un ser-vidor con gran cantidad de proyectos.

Características adicionales

• Soporte para la utilización de SQLServer 2008.

• Mejoras en Team System WebAccess, que mejoran la experienciade usuario de los clientes que no uti-lizan Team Explorer.

• Soporte para la creación de proyec-tos mediante scripts.

dotN

etM

anía

<<

8

dnm.directo.noticias<<

La compañía Alhambra Eidos y larevista dotNetManía han alcanzadoun acuerdo estratégico por el cual dichomedio, el más prestigioso entre la

comunidad de desarrolladoresde software en .NET en elmundo de habla hispana, se alíacon la empresa de servicios,líder en formación para desa-

rrolladores especializados en productos Microsoft y centro de for-mación autorizado por Microsoft (CPLS).

Como consecuencia de este acuerdo, la revista difundirá la ofer-ta formativa de Alhambra-Eidos y, a su vez, personal de dotNet-Manía asesorará y colaborará con el área de Formación de Alham-bra-Eidos, optimizando y elaborando conjuntamente cursos y semi-narios especializados en tecnologías .NET y otras tecnologías deMicrosoft como Windows Server, SQL Server, SharePoint, Biz-Talk, Exchange Server, etc.

Otro aspecto deeste acuerdo es lacolaboración deNetalia –la editorialde dotNetManía yde los CuadernosTécnicos de dot-NetManía– en laedición y distribución de los libros editados por Alhambra-Eidos.

Además, Alhambra-Eidos ofrecerá a los lectores de dot-NetManía ventajas ex clusivas como descuentos permanentes encursos y libros.

Como comienzo de esta colaboración, Marino Posadas,redactor jefe de dotNetManía, impartirá el laboratorio “Sil-verlight 2.0” de diez horas de duración, durante los días 16y 17 de julio. Los lectores de dotNetManía tendrán un 10%de descuento. Para más información sobre este laboratorio:http://www.alhambra-eidos.es/ES/Formacion.

Alhambra-Eidos llega a un acuerdo con dotNetManía para ladifusión conjunta de su oferta formativa

La Beta 2 aña-de una grancantidad denuevas carac-terísticas, noobstante a locual, es unadescarga desolo 4.6 MB

que tarda menos de 10 segundos en ins-talarse. No requiere la presencia de.NET Framework ni ningún otro soft-ware para funcionar, y todas sus carac-terísticas funcionan a través de diferen-tes navegadores en máquinas Windowsy Mac. Estas características tambiénestarán soportadas en Linux gracias aMoonlight 2.

Silverlight 2 Beta 2 ofrece unalicencia Go Live que permite utilizar

y desplegar Silverlight 2 en aplicacio-nes comerciales, aunque se espera quese produzcan algunos cambios en lasAPI entre la Beta 2 y el producto final,por lo que muy probablemente habráque “retocar” esas aplicaciones cuan-do la versión final esté disponible.

Las nuevas características incorpo-radas a la Beta 2 pueden agruparse enlas siguientes categorías:

• Mejoras en interfaz de usuario ycontroles.

• Mejoras en el soporte multime-dios.

• Mejoras en el soporte de red.• Mejoras en el manejo de datos.

Para más información y descargas,visite http://www.silverlight.net.

Liberada Beta 2 de Silverlight 2

Alhambra-Eidos y dotNetManía ofrecerán conjuntamente cursos y libros especializadosen la plataforma .NET y otras tecnologías Microsoft como Windows Server, SQL Server,SharePoint Server, BizTalk Server, Exchange Server, etc.

En el marco del pasado Tech-Ed USA celebrado en Orlando,Microsoft liberó la Beta 2 de Silverlight 2, así comoactualizaciones de las herramientas de Visual Studio 2008 yExpression Blend 2.5 que le dan soporte.

Windows Server 2008 Hyper-Vdisponible

Después del lanzamiento de WindowsServer 2008 sin la tan esperada carac-terística de virtualización, por finWindows Server 2008 Hyper-V estádisponible para su descarga desdehttp://www.microsoft.com/Hyper-V o víaWindows Update desde el 8 de julio.

Hyper-V es la tecnología de virtua-lización basada en servidor de Microsoft,que viene como una característica total-mente integrada en Windows Server2008, disponible para ciertas edicionesdel sistema operativo.

Hasta la fecha se han distribuido algomenos de 1,5 millones de copias de la betade Hyper-V, lo que demuestra el gran in -terés suscitado por la tecnología de vir-tualización, que competirá con los pro-ductos de VMWare.

Adicionalmente, System Center Vir-tual Machine Manageres la solución parala centralización de la gestión de la infra-estructura de virtualización. Más infor-mación en: http://www.microsoft.com/sys-temcenter/virtualmachinemanager.

nueva situación se encuentran las siguien-tes consideraciones:

• La mayor demanda de soluciones de software se ubica enlos países con un alto desarrollo económico y un tejidoempresarial fuerte. El personal especializado en estos paí-ses es escaso y de alto coste, por lo que frecuentementeno alcanza a satisfacerse la demanda con los recursos inter-nos que se poseen.

• Dentro de los propios países desarrollados existen áreasde muy fuerte desarrollo empresarial y otras que se carac-terizan por un menor nivel del mismo. Sin embargo, enEuropa al menos, la inversión pública lleva hacia todas lasáreas prácticamente por igual el proceso de difusión de laenseñanza técnica especializada, existiendo, por tanto,exceso de capacidad productiva en ciertas áreas demográ-ficas y falta de la misma en otras.

• El desarrollo de software es un proceso altamente indus-trializable y, por tanto, sometido a reglas similares a lasque se están dando en otras partes de la industria y la tec-nología. Nos referimos al fenómeno de la deslocalizaciónde la producción.

Todo esto nos está llevando a una situación en la cual laparte de la producción que se encuentra cercana al cliente (pla-nificación, diseño funcional, implantación y parte del mante-nimiento) se realizan en ubicaciones cercanas a donde seencuentran los usuarios, mientras que la construcción o inclu-so el diseño técnico tienden a realizarse en ubicaciones remo-tas donde es más fácil cubrir la demanda de personal técnicoespecializado.

Extremando esta argumentación, estaríamos en el procesodel off-shoring, es decir, la construcción de software en paísescon economías emergentes (típicamente India, Rusia o Lati-noamérica). Sin embargo, incluso dentro de nuestro país está

Factorías de softwareJustificación y ventajas

<< A la base de esta

Antonio Quirós escolaborador habitual

de ddotNetManía. Co-fundador de las revis-

tas clippeRManía, FOX-Manía y Algoritmo.

Actualmente es direc-tor de operaciones en

Alhambra-Eidos.

El momento deevolución tecnológica yeconómica en que nosencontramos estáfomentando la creaciónde un nuevo modo deenfrentarse al problemade desarrollar software.Se trata de laorganización de losequipos de desarrollo enfactorías que,típicamente, estándeslocalizadas respectoa los lugares en los quese generan lasnecesidades tecnológicasde los clientes.

opinión

Antonio Quirós

creciendo fuertemente la tendencia deque compañías que tienen que atenderuna importante demanda nacional eincluso internacional, y que se encuen-tran ubicadas en Madrid y/o Barcelo-na, están creando factorías de softwa-re en provincias donde no existedemanda empresarial para dar salida alos titulados de las facultades deInformática y donde les resulta muchomás fácil acceder a dicho mercado depersonal técnico. De este modo, losequipos de desarrollo de software tien-den a desdoblarse en dos áreas clara-mente diferenciadas:

a) Aquella que atiende las necesi-dades de relación inmediata conel cliente y que por tanto seencarga de actividades normali-zadas de diseño, tales como tomade requisitos, casos de uso, vali-dación de actas con el cliente,planificación, etc., así como lasde despliegue, implantación, for-mación, etc.

b) La que se encarga de realizar losdiseños técnicos, así como laconstrucción del software y laspruebas sobre el mismo.

En esto se sigue el mismo esquema(o al menos uno similar) al que en laproducción industrial ordinaria se esta-blece entre la ingeniería y la produc-ción o línea de montaje. Lo importan-te de este sistema es que permite des-lindar y formalizar, por tanto, mejor,procesos que no siempre han estadobien separados. Es decir, que de la pro-pia necesidad del mercado en recorrereste camino se sigue la necesidad paralos informáticos de encapsular mejorcada uno de sus procedimientos a finde que puedan ser realizados de formaseparada por equipos diferentes y quepueden estar alejados por el espaciomiles de kilómetros unos de otros y porel tiempo según la diferencia horariaque corresponda.

La industria informática lleva añostrabajando fuertemente en el plantea-miento de modelos que mejoren laencapsulación de sus procedimientosy en metodologías que permitan pro-tocolizar los distintos pasos que se dan

en todo el ciclo de vida de producciónde software. Esto nos lleva a un esce-nario donde podemos decir que elestadio de desarrollo en que nosencontramos respecto a este procesode (valga la redundancia) mejora deprocesos es bastante alto. Prueba deesto son estándares comúnmente acep-tados como UML (Lenguaje Unifica-do de Modelado) o MDA (Arquitec-tura Guiada por Modelos), ambos enel área de diseño, o metodologíascomo CMMI, ITIL, COBIT o lasbasadas en ISO 9001 respecto a la pro-tocolización de la construcción de soft-ware, la prestación de serviciosinformáticos o el gobierno de las acti-vidades TIC de las empresas.

En nuestro país existe un fuertedesequilibrio interregional respecto alvolumen de negocio que el mundo TICmueve en cada una de las comunida-des, de forma que éste se concentramayoritariamente en Madrid y Cata-luña donde existe más demanda de titu-lados de los que las facultades deinformática pueden proveer, estandopor otra lado el resto de las Comuni-dades donde lo normal es que la uni-versidad genere más titulados de losque el mercado puede absorber. Estedesequilibrio fomenta un fenómeno deinmigración tecnológica interna, don-de los titulados de ciertas universida-des han de verse forzados a emigrar aMadrid o Barcelona para poder abas-tecer la demanda de titulados de dichosmercados, así como para garantizar losniveles salariales adecuados al desem-peño de dichos puestos. Este fenóme-

no, desde luego, no contribuye al equi-libro económico y demográfico del paíssino que es una semilla continua queabona el crecimiento de los grandespolos de atracción económica españo-la en el área TIC (Madrid y Barcelo-na), consiguiendo cada vez más que eltalento que otras universidades regio-nales liberan no se quede “en casa”,fijando la población al territorio y equi-librando la demografía y la renta de lasdistintas áreas de población.

Sin embargo, el mundo del softwa-re abre expectativas más que intere-santes para atajar este problema. Des-de hace algunos años en España se estádando la tendencia, entre las empresasmás grandes del sector TIC, a abrirFactorías de Software para deslocalizarsu producción y aprovecharse de lasposibilidades de captar talento directa-mente en sus fuentes (las universidadesde las comunidades donde se instalan).Este fenómeno va a contribuir muypositivamente al equilibrio económicoy demográfico a nivel interregional, ala vez que auspicia que las empresas ten-gan que mejorar sus procesos paragarantizar que esta producción deslo-calizada se realice con los niveles de efi-ciencia y calidad que nuestro mundodemanda. Hay que ser conscientes tam-bién de que el desarrollo de esta mecá-nica nos ayudará como país a mejorarnuestro posicionamiento en cuanto aproductividad y generación de valorañadido, epígrafes en los que nosencontramos no demasiado bien posi-cionados respecto a muchos de nues-tros socios europeos.

dotN

etM

anía

<<

11

dnm.opinión<<

De la propia necesidad del mercado en recorrer estecamino se sigue la necesidad para los informáticos deencapsular mejor cada uno de sus procedimientos a fin de que puedan ser realizados de forma separadapor equipos diferentes

Marino Posadas

Marino Posadases consultor inde-

pendiente y redac-tor jefe de ddotNet-Manía. Puedes leer

su blog enhttp://www.

elavefenix.net.

entrevista

entrevista a Dan FernandezOtra de las entrevistas que pudimos “arañar” al programa oficial enel pasado Tech-Ed 2007 de Barcelona fue con Dan Fernandez, delDeveloper and Platform Evangelism Team en Microsoft (Redmond),quien nos atendió amablemente durante más de media hora en unade las salas eventualmente vacías, para charlar de “productos y pro-yectos” de desarrollo, y también de “planes vs. realidades”.

Ya es tradicional que el entrevista-do para dotNetManía se presentea sí mismo. De esa forma matamosdos pájaros de un tiro, porque másde una vez mi interlocutor ya noocupaba la posición que aparecíaen su sitio Web o en su blog… Asíque, aunque me dijiste ayer quetrabajabas con un antiguo entre-vistado por mi revista (ArturoToledo), prefiero que sigas con latradición…

Por supuesto, mi nombre es DanFernandez, y soy Lead ProductManager para herramientas no pro-fesionales en Microsoft. Eso signifi-ca especialmente las herramientas quegenéricamente conocemos comoherramientas “Express”. En realidad,como sabes, es una suite completa deherramientas de desarrollo, cada unaespecializada en una tecnología (WebDeveloper o SQL Server) o un len-guaje (C#, VB.NET, C++).

Y antes de esto estabas relaciona-do directamente con el equipo dedesarrollo de C#, si no recuerdomal.

Sí, antes de este trabajo fui VisualC# Product Manager, y tuve la opor-tunidad de trabajar con muchos de loscreadores del producto como AndersHejlsberg o Scott Nonnenberg, yotros.

¿Cómo defines el propósito deMicrosoft –lo que se tiene en men-te– a la hora de crear este tipo deherramientas que, por definición,son gratuitas?

Nuestro propósito es crear unconjunto de herramientas que facili-ten la “democratización del desarro-llo de software”. Con Visual StudioExpress queríamos conseguir algosencillo y fácil de utilizar, que estu-viera disponible para principiantes yentusiastas del desarrollo no profe-sional. Y lo que hacemos ahora es lacontinuación lógica de ese esfuerzoinicial. Ahora disponemos de muchosmás recursos como el sitio Web“Beginner Developer Learning Cen-ter” (http://msdn.microsoft.com/en-us/beginner/default.aspx) yotros recursos que suponen inversio-nes importantes en ese sentido, comolos libros de programación para nova-tos, de forma que cualquiera que no

tenga experiencia pueda tambiénacercarse al mundo del desarrollo yencontrar fácilmente un punto departida.

¿Tiene esto que ver con el movi-miento de introducción o presenta-ción del entorno .NET en el mun-do universitario, donde habitual-mente se ignoran las herramientasde desarrollo de Microsoft?

Sí. De hecho, podemos decir quelos principales usuarios de estos pro-ductos son estudiantes, que lo obtie-nen de diversas formas, y al comen-zar a trabajar se ven necesitados delos recursos adicionales que te comen-taba hace un momento. Son elemen-tos importantes para que puedanempezar enseguida a ver algunosresultados.

Cambiando un poco “el tercio”,algunas empresas están empezandoa requerir la figura del diseñador deaplicaciones, además del desarrolla-dor clásico. ¿Apreciáis vosotrosigualmente esa tendencia en vues-tros análisis de mercado?

Sí, eso es notable también enEE.UU. Ciertamente, muchas vecesdepende del volumen de la empresade que se trate: cuanto más grande,más roles especializados te encuen-tras, porque eso permite no “repetirel conocimiento” de forma innecesa-ria y avanzar más en el concepto de“factoría de software”. Ése es el lugarexacto de la suite Expression, el de ser-vir de enlace entre estos roles, ofre-ciéndoles un lugar común de cone-xión de sus trabajos.

¿Cuál piensas que es el períodoadecuado entre dos versiones deVisual Studio (ya sean profesiona-les o Express)? ¿Dos años, comoafirman algunos analistas?

Entiendo muy bien la pregunta ycreo que también el porqué. Perodebo decir que para nosotros lasfechas no son una prioridad. Noso-tros establecemos los contenidos deuna versión basándonos principal-mente en el feedback de nuestrosclientes, de foros de desarrollo, denuestros partners, etc. Y cuando sedecide cuáles van a ser los conteni-dos de la siguiente versión, en lo úni-co que se piensa es en que, cuandosalga al mercado, esté lo suficiente-mente probada, estable y productivacomo para suponer un aliciente deactualización.

dotN

etM

anía

<<

13

dnm.directo.entrevista<<

Nuestro propósito es crear un conjunto de herramientas que faciliten la “democratización

del desarrollo de software”

dotN

etM

anía

<<

14

dnm.directo.entrevista<<

¿Se espera un crecimiento paralelo de las capa-cidades de la suite Expression con respecto aVisual Studio? ¿O van a seguir una progresiónindependiente?

Más que funcionar en paralelo, lo que pensa-mos es que deben tener un mismo objetivo común,y que aquellas cosas necesarias para el diseño deuna aplicación (independientemente de la versiónde Visual Studio de que se trate), siempre esténsoportadas en la suite Expression. Y especialmen-te, que ambos productos siempre funcionen muybien juntos.

El gran “boom” que se espera en el mundo deldesarrollo Web (o al menos así nos lo estánpresentando los principales fabricantes) tieneque ver con las aplicaciones RIA (Rich Inter-net Applications). ¿Cuál es tu opinión acercade la importancia de Silverlight en este con-texto?

Para mí, la palabra para definir Silverlight es“emocionante”. Y lo digo especialmente porque heestado implicado directamente en el desarrollo dePopFly, y he podido ver la demanda y la acepta-ción que esa herramienta de construcción de sitiossin necesidad de código fuente ha tenido desde elcomienzo y sigue teniendo. Y eso ya llevaba algu-nos elementos que no eran sino la promesa de loque empieza a ser Silverlight. Una increíble inter-faz de usuario (por fin), pero desde el punto de vis-ta de desarrollador que soy, hay dos cosas que megustan especialmente: una es la posibilidad de quelas aplicaciones se construyan (al menos en buenaparte) en tiempo de ejecución, como algo dinámi-co, dependiendo de otros factores que tienen quever con el uso que le da a la aplicación el navegan-te Web, y aprovechando las capacidades del len-guaje XAML.

La otra cosa que resulta especialmente intere-sante es la posibilidad de tener VB.NET o C# enel cliente, sin que ello dependa de que se esté uti-lizando un navegador o una plataforma concreta,sino que podamos usarlo para cualquier navega-dor, o en Linux o Mac. Creo que esa riqueza y esacapacidad de cobertura es lo más importante. Esaposibilidad de utilizar C#, por ejemplo, puede pro-ducir ganancias, como la que demostró ScottGuthrie recientemente con un juego de ajedrezescrito en Javascript tradicional y su equivalenteen C# casi ¡1000 veces! más rápido en la versiónescrita en C#.

Además, existen millones de programadores enVB.NET y C# que podrán reutilizar su código paracolocarlo en aplicaciones Silverlight, y eso sí quees totalmente novedoso en el mundo del desarro-llo Web.

Ya que lo mencionas, dinos algo más acerca dePopFly… en los foros hay mucha gente comen-tando sus experiencias…

PopFly es una aproximación distinta al mundodel desarrollo Web. Asumimos que todo el mundotiene que tener el derecho a hacer su sitio Web sinnecesidad de hacer una carrera, y suministramoslas herramientas prefabricadas para que esto seaasí. Se trata, fundamentalmente, de permitir queel creador utilice estos “elementos prefabricados”en una labor similar a la de un puzle, hasta conse-guir en cada caso el efecto deseado. Lo que hemoshecho es analizar los distintos tipos de blogs quemantiene la gente, qué les gusta utilizar, cómo lesgusta compartir su información, etc. Y a partir detodo eso se ha construido PopFly.

Ya que estamos hablando de software que hacefácil la vida al desarrollador, es inevitable citar

Millones de programadores en VB.NET y C# podrán reutilizar su código para colocarlo en aplicaciones Silverlight, y eso sí que es

totalmente novedoso en el mundo del desarrollo Web

dotN

etM

anía

<<

15

dnm.directo.entrevista<<

una herramienta porla que existe muchaexpectación en elmundo de los aficio-nados a los videojue-gos (que es enorme).Me refiero a XNA.¿Cómo ves este pro-ducto y que expecta-tivas de crecimientoy aceptación popularle concedes?

XNA es sin dudauna de mis herra-mientas favoritas. Lameta es permitir quecualquiera se puedaadentrar en el mundodel desarrollo de jue-gos (y también deaplicaciones de multi-media y otros tipos)de una forma muysencilla, y crear aplicaciones para la XBOX o paraWindows y distribuirlas con facilidad. El únicorequisito es tener conocimientos de programaciónen lenguaje C#, si bien, dependiendo del juego,pueden requerirse conocimientos gráficos, aunqueXNA Studio hace que esa labor sea muchísimo másfácil.

De hecho, ahora puede incluirse como “add-in”de Visual C# Express. Incluso te diré más: existenuniversidades norteamericanas (y alguna extranje-ra) que están preparando lo que se denomina“Currículo XNA”, para capacitar en la construc-ción de este tipo de aplicaciones. Es otro concep-to del aprendizaje que allí se denomina “Learningby having fun” (aprendizaje mediante el entreteni-miento). Y está teniendo una repercusión que noso-tros mismos no imaginábamos en principio.

Siempre tratamos de visualizar cuál será elpanorama del desarrollo dentro de unos pocosaños, sobre todo para la toma de decisionesempresariales que nos ayuden a no pasar poralto cosas importantes. ¿Cómo ves tú este pano-rama?

Pues creo que esta democratización del softwa-re va a continuar. La diferencia es que no todo elmundo siente la necesidad de construir un puente,pongamos por caso, pero, cada vez más, mucha gen-

te siente la necesidad de verse expresado en la Web.Este movimiento va a continuar porque la gente lodemandará cada vez más y más. Y se producirá unasegunda “explosión Web” asociada a esta demo-cratización. Explosión que ya está implícita de for-ma clara en lo que llamamos Web 2.0. Y esto no essolo para las típicas aplicaciones como blogs o sitios,sino también para otros tipos de aplicaciones Web,como programas de mensajería instantánea, redesP2P, etc.

El reto es construir software que permita queese escenario sea del tipo “dos líneas de código”sin perder (en la medida de lo posible) las posibi-lidades de personalización que cualquier autornecesita.

A la vista de tu apellido, hay una pregunta quetengo que hacerte para concluir esta entrevis-ta: ¿es la primera vez que vienes a España?

¡Qué va! De hecho, tengo familia aquí. Un tíoy un primo míos viven aquí, en Barcelona, y ya heestado otras veces, especialmente en vacaciones deAño Nuevo. Mis padres son originalmente colom-bianos, aunque mi abuelo era español.

Pues nos alegramos. Muchas gracias en nom-bre de todos los lectores por tu tiempo y tusinteresantes propuestas.

Marino Posadas y Dan Fernandez en un momento de la entrevista

Con enorme éxito de crítica y público, Solid Quality™Iberoamérica (www.solidq.com/ib) organizó y llevó a buenfin en Madrid, España, el cuarto Solid Quality Sum-mit, durante los días 23, 24 , 25, 26 y 27 de junio.

Durante esos cinco días, los asistentes –entre los quese incluyeron representantes de empresas y organiza-ciones de reconocido renombre en España– tuvieron laoportunidad de asistir a más de 60 sesiones, distribuidasen los tres tracks ofrecidos en el evento (Inteligencia deNegocios, Motor Relacional y Tecnologías .NET). Esteaño, como novedad, los asistentes pudieron confeccio-nar de antemano sus propias agendas, lo que les permi-tió planificar mejor su tiempo y aprovecharlo al máxi-mo. Asimismo, se puso a disposición de los participan-tes un portal exclusivo, repleto de contenidos como laspresentaciones realizadas, vídeos y código de las demos-traciones y libros electrónicos, entre otros.

Alejandro Leguizamo, director de marketing,declaró: “Este cuarto año ha sido una experiencia muypositiva para nosotros. Hemos logrado nuestra consoli-

dación como el punto de referencia en el mercadoespañol alrededor de SQL Server y .NET. Hemos sidolos primeros en la industria (aparte de Microsoft) en estarintegrados desde fases muy tempranas en el proceso dedesarrollo de SQL Server (tanto 2005 como 2008) conel grupo de producto en Redmond, y durante este even-to hemos podido entregar ese conocimiento de prime-ra mano a nuestros clientes, garantizando la mejor for-mación”.

SUMMITSolid Quality

eventoseve

ntos

dotN

etM

anía

<<

16

El pasado jueves 26 de juniotuvo lugar, en las oficinas deMicrosoft, el evento con elque MAD.NUG (el Grupo

de usuarios .NET de Madrid) retomó sus actividadesdespués de unos meses de pausa. Como complementoal evento, los asistentes pudimos disfrutar del emocio-nante segundo tiempo del partido de semifinales de laEurocopa '08 entre España y Rusia, para lo que Micro-soft gentilmente suministró la infraestructura y los ape-ritivos necesarios.

El evento, bajo el título “Déjate engatusar porVisual Studio 2008”, tuvo como objetivo mostrar algu-nas de las posibilidades que pone esta nueva versión delentorno de desarrollo a disposición de los desarrolla-dores. Después de la introducción general a cargo deDavid Herráiz (cuya presentación de las novedades enASP.NET 3.5 finalmente quedó para una próxima oca-sión), David Carmona (Microsoft) nos mostró la nue-

va versión de MSDN Vídeo, desarrollada desde cerocon .NET 3.5 y VS 2008, haciendo énfasis en la arqui-tectura del sistema y en los momentos en los que se haceutilización de nuevas tecnologías como LINQ, WPF oWCF. Posteriormente entraron en acción Luis Frailey Bruno Capuano para hablar sobre algunas de las nue-vas posibilidades incluidas en VS Team System para elanálisis y control de calidad del código. Y finamente,Jorge Serrano y Octavio Hernández hicieron un reco-rrido por las novedades de Visual Basic 9.0, incluyendolas relativas a LINQ.

El próximo evento de MAD.NUG ya tiene fecha:será el jueves 24 de julio, y en él Roberto González,MVP de Biztalk, tendrá a su cargo la charla “Integra-ción de WCF y WF en .NET 3.5”.

Más información en http://info.madriddotnet.com.

Octavio Hernández

MAD.NUG reinicia sus actividades

Como ya es habitual, basaremos los ejemplos deeste artículo en la base de datos FUTBOL2006 del libro“C# 3.0 y LINQ” [2]. El código de ejemplo aso-ciado a este artículo (que puede ser descargadodesde www.dotnetmania.com) ha sido creado utili-zando el Service Pack 1 de Visual Studio 2008, queincluye una versión cercana a la definitiva del Mar-co de Entidades.

Mapeo de vistas de servidorDel mismo modo que el Marco de entidades ofre-ce una vía para mapear de manera declarativa losprocedimientos almacenados y funciones defini-das por el usuario que devuelven conjuntos dedatos, como hemos descrito en el artículo ante-rior de la serie, ofrece asimismo una vía directapara “sacar a la superficie” de un modelo de enti-dades las vistas definidas directamente en elalmacén de datos mediante el lenguaje del almacén(Transact-SQL, en el caso de SQL Server, PL-SQL en el caso de Oracle, etc.). Por ejemplo, supo-niendo que se ha definido sobre la base de datosFUTBOL2006 la vista RealMadrid que se presenta enel listado 1, ésta quedaría reflejada en el modelodel almacén generado por el asistente integradoen Visual Studio mediante el fragmento de docu-

mento SSDL que se muestra en el listado 2. Obser-ve cómo los atributos store:Type, store:Schema ystore:Name y el elemento <DefiningQuery> reflejanen el modelo las propiedades básicas de la vista. Asu vez, a nivel conceptual se modelaría la defini-ción anterior mediante la creación de la entidadque se muestra en el fragmento de documentoCSDL del listado 3. Y por último, la correspon-dencia entre las entidades lógica y física quedaríaexpresada mediante el mapeo que muestra el frag-mento MSL del listado 4. El resultado final seráque podremos acceder al conjunto de resultadosque la vista produce utilizando la consulta LINQque se muestra en el listado 5.

El Marco de trabajo de entidades de ADO.NET v3.5 (VII)

plataforma.net

Continuando con nuestra serie dedicada a presentar las posibilidadesque ofrecerá el Marco de entidades de ADO.NET 3.5 para el modela-do conceptual [1], en esta entrega mostraremos otros mecanismos dis-ponibles para la implementación de vistas, presentando la vía para mape-ar las vistas definidas en el almacén relacional, así como las que tene-mos a nuestra disposición para definir y operar con vistas personaliza-das expresadas en Entity SQL.

CREATE VIEW [dbo].[RealMadrid]ASSELECT TOP (100) PERCENT dbo.Futbolista.Id,dbo.Futbolista.Nombre,dbo.Futbolista.Posicion,dbo.Pais.Nombre AS NombrePais

FROM dbo.Futbolista INNER JOIN dbo.PaisON dbo.Futbolista.CodigoPaisNacimiento =

dbo.Pais.CodigoWHERE dbo.Futbolista.CodigoClub = ‘RMA’ORDER BY dbo.Futbolista.Posicion,

dbo.Futbolista.Nombre

Listado 1. Vista de servidor definida en Transact-SQL.

Unai Zorrilla esDevelopment Team

Leader de Plain Conceptsy tutor de campusMVP.

MVP desde 2004,colabora activamente con

Microsoft en eventos dearquitectura y

desarrollo, así como engiras de productos. Autor

del libro "Modelandoprocesos de negocio con

Workflow Foundation".

Octavio Hernández esMentoring Team Leader

de Plain Concepts, editortécnico de dotNetManía y

tutor de campusMVP. Es MVP de C# desde2004, MCSD y MCT.

Autor del libro "C# 3.0 yLINQ".

Unai ZorrillaOctavio Hernández

dotN

etM

anía

<<

19

dnm.plataforma.net<<

Vistas de consulta

Además de permitir “sacar a la super-ficie” las vistas definidas directamen-te en la base de datos, el Marco de enti-dades ofrece una potente infraestruc-tura basada en vistas de cliente, una decuyas ventajas principales es la de hacerposible encapsular la complejidad aso-ciada a la obtención de los datos, deforma que ésta no permee el código delas aplicaciones. Estas vistas funcionantotalmente en el lado del cliente, demodo que los desarrolladores puedencrear vistas adecuadas a las necesida-des concretas de cada aplicación sinafectar a la base de datos u otras apli-caciones. El lenguaje en el que seexpresan estas vistas es Entity SQL,un lenguaje muy similar en estructuraal SQL tradicional, pero preparadopara manejar los nuevos conceptos queintroduce el Marco de entidades comola herencia, las relaciones, los tiposcomplejos, etc. Del análisis de las sen-tencias Entity SQL y su traducción aldialecto de SQL del almacén subya-cente se encarga el Proveedor deEntidades (Entity Provider), un nue-vo proveedor de ADO.NET que inte-ractúa con el proveedor “nativo”correspondiente para ejecutar la sen-tencia traducida y recuperar los resul-tados (figura 1).

<edmx:StorageModels><Schema Namespace=”FUTBOL2006Model.Store” Alias=”Self”

Provider=”System.Data.SqlClient” ProviderManifestToken=”2005”xmlns=”http://schemas.microsoft.com/ado/2006/04/edm/ssdl”>

<EntityContainer Name=”dbo”><!— ... —><EntitySet Name=”RealMadrid” EntityType=”FUTBOL2006Model.Store.RealMadrid”

store:Type=”Views” store:Schema=”dbo” store:Name=”RealMadrid”><DefiningQuery>SELECT

[RealMadrid].[Id] AS [Id], [RealMadrid].[Nombre] AS [Nombre], [RealMadrid].[Posicion] AS [Posicion], [RealMadrid].[NombrePais] AS [NombrePais]FROM [dbo].[RealMadrid] AS [RealMadrid]</DefiningQuery>

</EntitySet><!— ... —>

</EntityContainer><!— ... —><EntityType Name=”RealMadrid”><Key><PropertyRef Name=”Id” /><PropertyRef Name=”Nombre” /><PropertyRef Name=”Posicion” /><PropertyRef Name=”NombrePais” />

</Key><Property Name=”Id” Type=”int” Nullable=”false” /><Property Name=”Nombre” Type=”varchar” Nullable=”false” MaxLength=”75” /><Property Name=”Posicion” Type=”char” Nullable=”false” MaxLength=”1” /><Property Name=”NombrePais” Type=”varchar” Nullable=”false” MaxLength=”50” />

</EntityType><!— ... —>

</Schema></edmx:StorageModels>

Listado 3. Fragmento de documento CSDL.

Listado 2. Fragmento de documento SSDL.

<edmx:ConceptualModels><Schema Namespace=”FUTBOL2006” Alias=”Self”

xmlns=”http://schemas.microsoft.com/ado/2006/04/edm”><EntityContainer Name=”FUTBOL2006Context”><!— ... —><EntitySet Name=”RealMadrid” EntityType=”FUTBOL2006.RealMadrid” /><!— ... —>

</EntityContainer><!— ... —><EntityType Name=”RealMadrid”><Key><PropertyRef Name=”Id” /><PropertyRef Name=”Nombre” /><PropertyRef Name=”Posicion” /><PropertyRef Name=”NombrePais” />

</Key><Property Name=”Id” Type=”Int32” Nullable=”false” /><Property Name=”Nombre” Type=”String” Nullable=”false” MaxLength=”75”

Unicode=”false” FixedLength=”false” /><Property Name=”Posicion” Type=”String” Nullable=”false” MaxLength=”1”

Unicode=”false” FixedLength=”true” /><Property Name=”NombrePais” Type=”String” Nullable=”false” MaxLength=”50”

Unicode=”false” FixedLength=”false” /></EntityType><!— ... —>

</Schema></edmx:ConceptualModels>

El Marco de entidades ofrece una vía directa

para “sacar a la superficie” de un modelo de

entidades las vistas definidas directamente en el almacén de datos

dotN

etM

anía

<<

20

dnm.plataforma.net<<

La definición estática de vistas dellado cliente (conocidas como vistas deconsulta) se realiza mediante el ele-mento <QueryView> del fichero demapeo (MSL), que encapsula una sen-tencia Entity SQL definida sobre elmodelo del almacén. Estas vistas lue-go se mapean igualmente en el CSDLcomo entidades de pleno derecho. Ellistado 6 muestra un fragmento deldocumento combinado EDMX en elque se define una vista de consulta quepermite recuperar los porteros del RealMadrid. Por su parte, el listado 7 mues-tra cómo obtener esos datos utilizandouna consulta LINQ, la vía más natural,que podríamos utilizar, por ejemplo,como fuente de enlace a datos.

<?xml version=”1.0” encoding=”utf-8”?><edmx:Edmx Version=”1.0”

xmlns:edmx=”http://schemas.microsoft.com/ado/2007/06/edmx”><edmx:Runtime><!— SSDL content —><edmx:StorageModels><!— ... —>

</edmx:StorageModels><!— CSDL content —><edmx:ConceptualModels><Schema Namespace=”FUTBOL2006” Alias=”Self”

xmlns=”http://schemas.microsoft.com/ado/2006/04/edm”><EntityContainer Name=”FUTBOL2006Context”><!— ... —>

<EntitySet Name=”PorteroRealMadrid”EntityType=”FUTBOL2006.PorteroRealMadrid” />

<!— ... —></EntityContainer><!— ... —><EntityType Name=”PorteroRealMadrid”><Key><PropertyRef Name=”Id” /><PropertyRef Name=”Nombre” />

</Key><Property Name=”Id” Type=”Int32” Nullable=”false” /><Property Name=”Nombre” Type=”String” Nullable=”false”

MaxLength=”75” Unicode=”false” FixedLength=”false” /></EntityType>

</Schema></edmx:ConceptualModels><!— C-S mapping content —><edmx:Mappings><Mapping Space=”C-S”

xmlns=”urn:schemas-microsoft-com:windows:storage:mapping:CS”><EntityContainerMapping StorageEntityContainer=”dbo”

CdmEntityContainer=”FUTBOL2006Context”><!— ... —><EntitySetMapping Name=”PorteroRealMadrid”><QueryView>SELECT VALUE FUTBOL2006.PorteroRealMadrid(F.Id, F.Nombre)FROM dbo.Futbolista AS FWHERE F.Posicion = ‘P’ AND F.CodigoClub = ‘RMA’

</QueryView></EntitySetMapping>

</EntityContainerMapping></Mapping>

</edmx:Mappings></edmx:Runtime><edmx:Designer

xmlns=”http://schemas.microsoft.com/ado/2007/06/edmx”><!— ... —>

</edmx:Designer></edmx:Edmx>

private void button2_Click(object sender, EventArgs e){

using (var ctx = new FUTBOL2006Context()){

var q = from f in ctx.PorteroRealMadridselect f;

foreach (var r in q)MessageBox.Show(r.Nombre);

dataGridView1.DataSource = q.ToList();}

}

Listado 6. Fragmentos relevantes en la definición de una vista de consulta.

Listado 7. Consulta integrada contra la vista de consulta.

private void button1_Click(object sender, EventArgs e){

using (var ctx = new FUTBOL2006Context()){

var q = from f in ctx.RealMadridwhere f.Posicion == “P”orderby f.Idselect f.Nombre;

foreach (var r in q)MessageBox.Show(r);

}}

Listado 5. Consulta LINQ que utiliza la vista de servidor mapeada.

<edmx:Mappings><Mapping Space=”C-S”

xmlns=”urn:schemas-microsoft-com:windows:storage:mapping:CS”><EntityContainerMapping

StorageEntityContainer=”dbo”CdmEntityContainer=”FUTBOL2006Context”>

<!— ... —><EntitySetMapping Name=”RealMadrid”><EntityTypeMapping TypeName=”IsTypeOf(FUTBOL2006.RealMadrid)”><MappingFragment StoreEntitySet=”RealMadrid”><ScalarProperty Name=”Id” ColumnName=”Id” /><ScalarProperty Name=”Nombre” ColumnName=”Nombre” /><ScalarProperty Name=”Posicion” ColumnName=”Posicion” /><ScalarProperty Name=”NombrePais” ColumnName=”NombrePais”/>

</MappingFragment></EntityTypeMapping>

</EntitySetMapping><!— ... —>

</EntityContainerMapping></Mapping></edmx:Mappings>

Listado 4. Fragmento de documento MSL.

Aunque no lo mostraremos aquípara no repetirnos, es de destacar quea estas “entidades virtuales” (tanto lasvistas de servidor mapeadas como lasvistas de consulta) en principio tambiénse les puede asociar en el modelo pro-cedimientos almacenados para la inser-ción, modificación y borrado, de unmodo similar a como lo hicimos ennuestro artículo anterior para las fun-ciones.

Consultas ad-hoc

La existencia de Entity SQL simpli-fica en gran medida la especificaciónno solo de las típicas vistas estáticasque acabamos de ver, sino también deconsultas dinámicas (construidas entiempo de ejecución) y parametriza-das. El listado 8 muestra un ejemplode ejecución de una consulta para-metrizada que produce un resultadosimilar al de los ejemplos anteriores.Observe cómo en este caso la sen-tencia Entity SQL se construye nosobre el modelo del almacén, sinosobre el modelo conceptual.

ConclusionesEn este artículo hemos mostrado losmecanismos que ofrecerá el Marco deentidades de ADO.NET para acce-der a vistas del lado del servidor ydefinir vistas del lado del cliente, inci-diendo en la importancia conceptualde éstas últimas. Después del verano(y ya con la versión definitiva delMarco de entidades a nuestra dispo-sición), volveremos con más detallesrelacionados con el lenguaje EntitySQL. ¡Que lo paséis bien!

dotN

etM

anía

<<

21

dnm.plataforma.net<<

private void button3_Click(object sender, EventArgs e){using (var con = new EntityConnection(ConfigurationManager.

ConnectionStrings[“FUTBOL2006Context”].ConnectionString)){

con.Open();using (EntityCommand cmd = con.CreateCommand()){

cmd.CommandText =@”SELECT F.Id AS Id, F.Nombre AS Nombre, F.Posicion AS Posicion,

F.Pais.Nombre AS NombrePaisFROM Futbol2006Context.Futbolista AS F WHERE F.Club.Codigo = @Club AND F.Posicion = @PosORDER BY F.Posicion, F.Nombre”;

cmd.Parameters.AddWithValue(“Club”, “RMA”);cmd.Parameters.AddWithValue(“Pos”, “P”);

using (DbDataReader rdr =cmd.ExecuteReader(CommandBehavior.SequentialAccess))

{while (rdr.Read()){

MessageBox.Show((string)rdr[“Nombre”]);}

}}

}

Figura 1. El Entity Provider traduce las sentencias Entity SQL al dialecto del almacén.

Listado 8. Ejecución de una consulta parametrizada usando Entity Provider.

BibliografíaZorrilla, U. y Hernández, O. “El Marco de trabajo de entidades de ADO.NET 3.5” (partes I a VI), en dotNetManía nº44-49, enero-junio de 2007.

Hernández, O. “C# 3.0 y LINQ”, Segunda edición, Krasis Press, mayo de 2008.

"The ADO.NET Entity Framework Overview", en http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx.

Blog del equipo de ADO.NET Entity Framework, en http://blogs.msdn.com/adonet/.

[1]

[2]

[3]

[4]

Mario del Valle,Miguel Katrib, Iskander Sierra

Jerarquía de tipos del mundo bidimensional

El familiar espacio bidimensional, tal y como loconocemos en WPF, está organizado fundamen-talmente a partir de los tipos base que se mues-tran en la figura 1. Visual es la clase base de todoslos elementos WPF que se pueden visualizar,mientras que su heredera UIElement es la base detodos los elementos que permiten interacción conel usuario, o sea, que tienen eventos de teclado yratón. FrameworkElement, por su parte, es la únicaimplementación existente de UIElement y es a suvez la clase base de casi todos los elementos deinteracción. Los herederosde Shape representan a lasfiguras geométricas más uti-lizadas en la ornamentaciónde las ventanas y en la defi-nición de las plantillas decontroles. Los decoradores(herederos de Decorator) seutilizan con el propósito dedecorar elementos, aprove-chando la característica delos decoradores de podercontener otro elemento ensu interior. Los controles(herederos de Control) sonlos protagonistas de la inte-racción, que se expresan

visualmente a través de plantillas definidas a par-tir de todos los tipos de elementos de WPF. Final-mente, tenemos los paneles (herederos de Panel),que no tienen expresión visual propia sino que tie-nen la tarea de distribuir y mantener organizadosa los elementos en el espacio bidimensional.

¿Está el mundo tridimensional igual deorganizado?La respuesta es: ¡aún no! Lamentablemente, en elmundo 3D todavía no se cuenta con tipos equiva-lentes a los de la figura 1. Por ejemplo, al igual que

Paneles para el mundo 3D

plataforma.net

Miguel Katrib es doctor yprofesor jefe de programa-ción del departamento de

Ciencia de la Computa-ción de la Universidad de

La Habana. Miguel es líderdel grupo WEBOO, dedi-

cado a la orientación aobjetos y la programación

en la Web. Es entusiasta de.NET y redactor de ddot-

NetManía.Mario del Valle e IskanderSierra son instructores de

programación en C# de lacátedra de Programación eIngeniería de Software deldepartamento de Cienciade la Computación de la

Universidad de La Habana.Son desarrolladores del

grupo WEBOO dedicadosa la tecnología .NET.

Este artículo debe resultar un útil divertimento para la ya crecientefamilia de seguidores de WPF. Aquí se verá cómo programar panelestridimensionales para facilitar la distribución de diferentes cuerpos enun Viewport3D. A la vez, el lector encontrará detalles de algunos ele-mentos de la API 3D de WPF que le deberán resultar de utilidad.

Figura 1. Síntesis de la jerarquía de los principales elementos 2D de WPF.

dotN

etM

anía

<<

23

dnm.plataforma.net<<

existen figuras geométricas básicas queforman parte de la jerarquía de Shape, seríadeseable poder contar con algo similarpara las tres dimensiones, es decir, dis-poner de tipos para esferas, cubos, conos,planos, etc. Tampoco hay aún algunasuerte de Control3D (imagine un botónen forma de esfera), ni tampoco unPanel3D. La buena noticia es que el entu-siasta equipo de desarrollo de MS WPFya ha dado señales de sus intenciones decompletar la jerarquía para futuras ver-siones1. Pero mientras esperamos por ello,con este artículo queremos presentarleun acercamiento a lo que podría ser unPanel3D que permita darle a su aplicaciónuna visualización tan familiar como la queofrece Vista (figura 2)2.

Situando la clase Panel3DLa figura 3 muestra la jerarquía de cla-ses 3D que se tiene actualmente con.NET Framework 3.5. El tipo Visual3Drepresenta a todos los elementos que se

muestren en un espacio tridimensional(Viewport3D). ModelVisual3D es un con-tenedor que permite agrupar elemen-tos de todos los tipos en el espacio 3D.UIElement3D es la base de todos los ele-mentos tridimensionales que permiteninteracción con el usuario, mientras queViewport2DVisual3D permite envolverun cuerpo 3D con un elemento 2D, de

modo que la interacción se haga con elelemento bidimensional. Como here-deros de UIElement3D se tiene a Contai-nerUIElement3D, que permite agrupar avarios elementos de tipo UIElement3D, ya ModelUIElement3D, que facilita la incor-poración de las cualidades interactivasen los elementos primitivos (elementosde tipo Model3D).

La propuesta y definición de unPanel3D podría basarse en aquellostipos que permiten agregar más de unelemento en su interior, a saber Con-tainerUIElement3D y ModelVisual3D. Paraser consecuentes con el modelo segui-do en el mundo 2D (figura 1), el másindicado sería ContainerUIElement3D;sin embargo, la mala noticia es queesta clase por ahora está sellada (sea-led en C#), así que, por decantación,es ModelVisual3D el ganador del sorteo.

¿Qué es un Panel?

En [1] y [2] se describen las caracterís-ticas que definen a un Panel bidimen-sional en WPF. Hagamos una abstrac-ción de este concepto para ayudarnos adeterminar cuáles son los problemasprincipales que se pretende que unPanel3D resuelva.

Figura 3. Jerarquía de elementos tridimensionales de WPF.

Figura 2. Planos mostrados en forma de stack en Windows Vista.

1 En la versión 3.5 de .NET Framework introdujeron un tipo UIElement3D, cuyo parecido con UIElement no es pura coincidencia, y se amenazacon más para la versión 4.0.

2 En un artículo anterior en dotNetManía [1], describimos un panel circular que nos permitía ubicar los elementos circularmente con perspectiva,pero se desplegaban de forma plana.

dotN

etM

anía

<<

24

dnm.plataforma.net<<

Posicionamiento

Imagine que en el mundo bidimen-sional solo se pudiera contar con un Can-vas. En ese caso, ubicar varios controlesuno debajo del otro se traduciría en hacery rehacer una secuencia de cálculosmatemáticos basados en el tamaño delos controles involucrados para lograr elefecto. Cuando hubiera tenido que repe-tir un código similar, seguro que inten-taría encapsularlo en algún tipo al quese le podría llamar StackPanel; luegoharía lo mismo para la ubicación o posi-cionamiento de los controles en formade tabla y entonces le llamaría Grid, y asísucesivamente. Todos estos tipos tienen,después de todo, un factor común, y esque se ocupan de determinar en quéposición deben aparecer los elementosque ellos contienen. Esta es precisamenteuna de las funciones principales de lospaneles en WPF.

Dimensionamiento

Al igual que el posicionamiento, lospaneles también pueden ayudar paradeterminar qué tamaño es el más apro-piado para cada control según la distri-bución que el panel esté aplicando.

Arrange y Measure

La clase Panel que encapsula el siste-ma de distribución (posicionamiento ydimensionamiento) de WPF resuelveambos problemas a partir del empleo delos métodos Arrange y Measure que con-tiene UIElement. Measure se ocupa de indi-car cuál es el tamaño recomendable paraun elemento (a partir, claro está, de infor-mación que el propio elemento debe ofre-cer) y Arrange se ocupa de ubicarlo y redi-mensionarlo si fuera necesario, tomandoen consideración el tamaño recomenda-do por Measure. Pero UIElement3D no tie-ne tales métodos y aparentemente no hayintenciones de que los tenga (figura 4).

Aunque lamentablemente no se pue-de contar entonces con tan esencialesmétodos para 3D, se puede utilizar un

recurso de WPF que aliviará el proble-ma. Si bien no se podrá redimensionar,al menos sí se podrán posicionar los ele-mentos de una manera más asequible quecalculando las posiciones a base de puramatemática.

Transformaciones tridimensionalesAl igual que en el mundo bidimensio-nal, para 3D existen varios tipos detransformaciones lineales que se pue-

den aplicar a todos los elementos detipo Visual3D, Model3D y Camera. Todosestos elementos pueden ser rotados,escalados y trasladados a través de supropiedad Transform, a la que se le pue-de dar como valor cualquier transfor-mación heredera de Transform3D. Lasmás relevantes a los efectos del Stack-Panel3D que queremos desarrollar sonTransformGroup, que permite agruparvarias transformaciones de modo queuna se aplica sobre los efectos de laanterior, y TranslateTransform, que per-mite trasladar en un desplazamiento porlos ejes X, Y y Z. Además, usted puedeutilizar RotateTransform3D y ScaleTrans-form3D para rotar y escalar objetos tri-dimensionales.

Figura 4. Recorte tomado de la documentación MSDN de UIElement3D.

public abstract class Panel3D : ModelVisual3D, INotifyPropertyChanged {protected Rect3D bounds;protected virtual void Move(Visual3D visual, Vector3D offset) {Transform3D transform = visual.Transform;if (object.Equals(transform, MatrixTransform3D.Identity))

visual.Transform = new TranslateTransform3D(offset);else {

Transform3DGroup group = new Transform3DGroup();group.Children.Add(new TranslateTransform3D(offset));group.Children.Add(transform);visual.Transform = group;

}}

protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved) {

base.OnVisualChildrenChanged(visualAdded, visualRemoved);Arrange((Visual3D) visualAdded, bounds);

}

protected abstract void Arrange(Visual3D visual, Rect3D rect);}

Listado 1. Definición de Panel3D.

public partial class StackPanel3D : Panel3D {protected override void Arrange(Visual3D visual, Rect3D rect) {int index = this.Children.IndexOf(visual);if (index >= 0) {Vector3D offset = new Vector3D(0, 0, index * Gap);Move(visual, offset);

}}

public double Gap {get { return (double)GetValue(GapProperty); }set { SetValue(GapProperty, value); }

}

public static readonly DependencyProperty GapProperty =DependencyProperty.Register(“Gap”, typeof(double), typeof(StackPanel3D),

new UIPropertyMetadata(0.1));}

Listado 2. Definición de StackPanel3D.

dotN

etM

anía

<<

25

dnm.plataforma.net<<

Definición de un Panel3D

El listado 1 muestra una variante de loque sería la clase base Panel3D.

El valor por defecto de la propiedadTransform de un Visual3D es Matrix-Transform3D.Identity, por ello en elmétodo Move del listado 1 se pregunta sila propiedad Transform del Visual3D querecibe como parámetro es igual a estevalor por defecto para determinar si aúnno se la ha asignado ningún valor.

Por lo demás, la definición dePanel3D sólo se ocupa de invocar almétodo Arrange en los herederos cuan-do se agregue un nuevo elemento alpanel (código de OnVisualChildrenChan-ged), y de definir un método Move quepuede resultar muy útil en la mayoríade los controles; su función es precisa-mente desplazar (mover) el cuerposegún el desplazamiento indicado porel parámetro offset.

Definición de un StackPanel3DUn StackPanel3D lo definimos comoheredero de Panel3D y redefiniendo elmétodo Arrange, como se muestra en ellistado 2.

Obsérvese que en el listado 2 se haagregado además la definición de lapropiedad de dependencia Gap, queestablece la separación entre un cuer-po y otro en el panel.

Organizando el espacio 3D enun stackEl listado 3 muestra una definiciónXAML de un espacio 3D en el que seutiliza el StackPanel3D para distribuirseis planos y una esfera como se mues-tra en la figura 5. El tipo SphereBuilderque se usa en este listado el lector lopuede encontrar en [3], y por economíade espacio no lo hemos repetido aquí.El tipo PlaneBuilder, al igual que Sphe-reBuilder, se utiliza para construir unamalla (MeshGeometry3D) que representeun plano.

<Window x:Class=”Panel3DApp.Window1”xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”xmlns:this=”clr-namespace:Panel3DApp” Title=”Window1”>

<Window.Resources><MaterialGroup x:Key=”material1”><DiffuseMaterial><DiffuseMaterial.Brush><ImageBrush ImageSource=”Images/No41.png”><ImageBrush.RelativeTransform><ScaleTransform ScaleY=”-1” CenterY=”0.5”/>

</ImageBrush.RelativeTransform></ImageBrush>

</DiffuseMaterial.Brush></DiffuseMaterial><SpecularMaterial Brush=”ForestGreen” SpecularPower=”85”/>

</MaterialGroup>

<MaterialGroup x:Key=”material2”><DiffuseMaterial><DiffuseMaterial.Brush><ImageBrush ImageSource=”Images/No42.png”><ImageBrush.RelativeTransform><ScaleTransform ScaleY=”-1” CenterY=”0.5”/>

</ImageBrush.RelativeTransform></ImageBrush>

</DiffuseMaterial.Brush></DiffuseMaterial><SpecularMaterial Brush=”RoyalBlue” SpecularPower=”85”/>

</MaterialGroup>

<MaterialGroup x:Key=”material”><DiffuseMaterial><DiffuseMaterial.Brush><ImageBrush ImageSource=”Images/vsnet_green1.jpg”><ImageBrush.RelativeTransform><ScaleTransform ScaleY=”-1” ScaleX=”-1” CenterX=”0.5” CenterY=”0.5”/>

</ImageBrush.RelativeTransform></ImageBrush>

</DiffuseMaterial.Brush></DiffuseMaterial><SpecularMaterial Brush=”RoyalBlue” SpecularPower=”85”/>

</MaterialGroup>

<MaterialGroup x:Key=”material3”><DiffuseMaterial><DiffuseMaterial.Brush><ImageBrush ImageSource=”Images/No43.png”>

Figura 5. Visualización de un StackPanel3D.

dotN

etM

anía

<<

26

dnm.plataforma.net<<

<ImageBrush.RelativeTransform><ScaleTransform ScaleY=”-1” CenterY=”0.5”/>

</ImageBrush.RelativeTransform></ImageBrush>

</DiffuseMaterial.Brush></DiffuseMaterial><SpecularMaterial Brush=”#bFA8” SpecularPower=”85”/>

</MaterialGroup>

<MaterialGroup x:Key=”material4”><DiffuseMaterial><DiffuseMaterial.Brush><ImageBrush ImageSource=”Images/No44.png”><ImageBrush.RelativeTransform><ScaleTransform ScaleY=”-1” CenterY=”0.5”/>

</ImageBrush.RelativeTransform></ImageBrush>

</DiffuseMaterial.Brush></DiffuseMaterial><SpecularMaterial Brush=”#bFA8” SpecularPower=”85”/>

</MaterialGroup>

<MaterialGroup x:Key=”material5”><DiffuseMaterial><DiffuseMaterial.Brush><ImageBrush ImageSource=”Images/No45.png”><ImageBrush.RelativeTransform><ScaleTransform ScaleY=”-1” CenterY=”0.5”/>

</ImageBrush.RelativeTransform></ImageBrush>

</DiffuseMaterial.Brush></DiffuseMaterial><SpecularMaterial Brush=”#bFA8” SpecularPower=”85”/>

</MaterialGroup>

<MaterialGroup x:Key=”material6”><DiffuseMaterial><DiffuseMaterial.Brush><ImageBrush ImageSource=”Images/No46.png”><ImageBrush.RelativeTransform><ScaleTransform ScaleY=”-1” CenterY=”0.5”/>

</ImageBrush.RelativeTransform></ImageBrush>

</DiffuseMaterial.Brush></DiffuseMaterial><SpecularMaterial Brush=”#bFA8” SpecularPower=”85”/>

</MaterialGroup><this:SphereBuilder x:Key=”sphere1” Radius=”0.6” WidthSegments=”40” HeightSegments=”40”/>

<this:PlaneBuilder x:Key=”plane” WidthSegments=”20” HeightSegments=”20” Width=”3” Height=”3”/></Window.Resources>

<Grid><Viewport3D><Viewport3D.Camera><PerspectiveCamera Position=”-8,4,8” LookDirection=”8,-4,-8”

UpDirection=”0,1,0” FieldOfView=”45”/></Viewport3D.Camera><ModelVisual3D><ModelVisual3D.Content><Model3DGroup><AmbientLight Color=”#8FFF”/><DirectionalLight Color=”White” Direction=”1,0,-1”/>

</Model3DGroup></ModelVisual3D.Content><ModelVisual3D.Children><this:StackPanel3D x:Name=”cube” Gap=”1.5”><this:Panel3D.Children>

<ModelVisual3D><ModelVisual3D.Content><GeometryModel3D Geometry=”{Binding Geometry, Source={StaticResource plane}}”

Material=”{StaticResource material1}”/></ModelVisual3D.Content>

</ModelVisual3D>

<this:StackPanel3D x:Name=”cube” Gap=”1.5”>

dotN

etM

anía

<<

27

dnm.plataforma.net<<

Conclusiones

El equipo de WPF trabaja para ampliar las capaci-dades y primitivas 3D a incluir en WPF. Mientrastanto, los lectores pueden descargar este código e

ir dando sus primeros pasos en este terreno, apoyán-dose en el concepto de panel que hemos desarro-llado aquí.

Un tema interesante a desarrollar en el futuro escómo sería un Grid3D.

Listado 3. Empleo de un StackPanel3D en un espacio tridimensional.

<ModelVisual3D><ModelVisual3D.Content><GeometryModel3D Geometry=”{Binding Geometry, Source={StaticResource plane}}”

Material=”{StaticResource material2}”/></ModelVisual3D.Content>

</ModelVisual3D>

<ModelVisual3D><ModelVisual3D.Content><GeometryModel3D Geometry=”{Binding Geometry, Source={StaticResource plane}}”

Material=”{StaticResource material3}”/></ModelVisual3D.Content>

</ModelVisual3D>

<ModelVisual3D><ModelVisual3D.Content><GeometryModel3D Geometry=”{Binding Geometry, Source={StaticResource plane}}”

Material=”{StaticResource material4}”/></ModelVisual3D.Content>

</ModelVisual3D>

<ModelVisual3D><ModelVisual3D.Content><GeometryModel3D Geometry=”{Binding Geometry, Source={StaticResource plane}}”

Material=”{StaticResource material5}”/></ModelVisual3D.Content>

</ModelVisual3D>

<ModelVisual3D><ModelVisual3D.Content><GeometryModel3D Geometry=”{Binding Geometry, Source={StaticResource plane}}”

Material=”{StaticResource material6}”/></ModelVisual3D.Content>

</ModelVisual3D>

<ModelVisual3D><ModelVisual3D.Content><GeometryModel3D Geometry=”{Binding Geometry, Source={StaticResource sphere1}}”

Material=”{StaticResource material}”/></ModelVisual3D.Content>

</ModelVisual3D>

</this:Panel3D.Children></this:StackPanel3D>

</ModelVisual3D.Children></ModelVisual3D>

</Viewport3D></Grid>

</Window>

BibliografíaDel Valle Mario, Sierra Iskander, Hernández Yamil, Katrib Miguel. “Cómo definir nuestros pro-pios paneles personalizados en WPF”, dotNetManía No. 35, marzo de 2007.Katrib Miguel, Del Valle Mario, Sierra Iskander, Hernández Yamil, Windows Presentation Foun-dation. dotNetManía Cuaderno Técnico No. 7, Netalia 2007.Del Valle Mario, Sierra Iskander, Hernández Yamil, Katrib Miguel. “Entrando en la tercera dimen-sión”, dotNetManía No. 37, mayo de 2007.

[1]

[2]

[3]

</this:StackPanel3D>

Seguro que muchos de nosotros nos hemosencontrado con la siguiente situación: el equi-po de desarrollo lleva generando código untiempo “razonable”; en el mejor de los casos, siestamos siendo “iterativos”, puede que ese tiem-po no exceda de las 2 ó 3 semanas. Tenemosnuestro repositorio de código fuente, donde losdesarrolladores actualizan y obtienen la últimaversión, y en el entorno ideal, los desarrollado-res obtienen con frecuencia la última versión,antes de subir código, para compilarla y pro-barla. ¡Incluso tenemos pruebas unitarias queprueban el código! Sin embargo, el final de laiteración (o proyecto) se acerca, los tiempos seaprietan por otras muchas razones, el entornoideal empieza a desmontarse, y los desarrolla-dores, más concentrados en sacar la funcionali-dad, olvidan buenas prácticas como obtener laúltima versión para comprobar al menos quecompila.

¿Qué ocurre entonces? Que puede llegar, ycasi seguro llegará, un momento en el que alguienobtendrá la compilación (cuanto más cerca del díade entrega más posibilidades hay, según el algo-ritmo del Dr. Stono Compilani Decoña), y secomprobará que todo el conjunto de código nisiquiera compila: han cambiado interfaces, se hacambiado código al que se hacen referencias, ycomo resultado el código de nuestro repositoriono compila.

¿Qué hemos hecho mal en este caso? Sim-plemente, olvidarnos de una de las buenas prác-ticas de los equipos de desarrollo: la integra-ción continua.

Pero, ¿qué es la integración? La integracióndel código consta en varios pasos:

1. Obtener la última versión de todo el código.2. Compilar esta última versión.3. Ejecutar el set de pruebas unitarias junto

con la cobertura de código.4. Dejar al alcance de todo el equipo esta últi-

ma versión integrada de los ejecutables, asícomo los informes de la compilación y eje-cución de las pruebas.

Siguiendo esta práctica, podremos comprobaren cualquier momento el estado de nuestro códi-go. No hay que olvidar que uno de los principa-les problemas que se nos presenta en los últimosmomentos de la entrega es precisamente esta inte-gración, cuando surgen problemas de código quepuesto todo junto no compila correctamente porcambios en interfaces durante el desarrollo, o fallosen la ejecución del software.

Esta integración nos va a dar el “latido” delproceso, ya que se convertirá el indicador del pro-greso de nuestro equipo, permitiéndonos com-probar, durante la iteración, que las tareas se estánrealizando, promocionando entre el equipo de

Integrándonos continuamente

metodologías

Luis Frailees MVP de Team Sys-

tem y colabora activa-mente en MAD.NUG(grupo de usuarios de

.NET de Madrid).Actualmente es direc-tor técnico en Multi-

domo Networks,donde desarrollan unproducto de softwarepara la gestión de dis-positivos domóticos ycámaras de vigilanciaa través de Internetmediante interfaces

web, teléfonos móvi-les, Media Center, etc.

Puede consultar sublog en

http://ww.lfraile.net.

Una de las prácticas más recomendadas a la hora de realizar proyectos yempezar a asegurar la calidad pronto es la de integrar todo el código lo másfrecuentemente posible. Esto es especialmente importante a la hora del desa-rrollo iterativo, mediante el cual gestionaremos los cambios de requisitos deuna forma más efectiva, entregando nuevas funcionalidades del software encortos periodos de tiempo.

Luis Fraile

dnm.plataforma.net<<

desarrollo la cultura de subir código fuente que com-pile y funcione con frecuencia, favoreciendo así eldesarrollo iterativo.

Sin embargo, para que esta práctica sea realmen-te efectiva y no genere una sobrecarga de trabajo,necesitamos herramientas que nos ayuden a la horade integrar.

Repositorio de código fuenteLo primero que necesitamos es un repositorio de códi-go fuente, donde los desarrolladores ponen en comúnsu código, exponiéndolo al resto del equipo, y de don-de pueden obtener asimismo el código fuente creadopor los otros desarrolladores del equipo.

En los entornos Microsoft, tradicionalmente se havenido usando Visual Source Safe como repositorio.Sin embargo, desde la aparición de Visual Studio TeamSystem, cada vez más equipos usan la nueva herramientade control de código fuente integrada en Team Foun-dation Server y que se llama Team Foundation Ser-ver Version Control; ésta es en la que nos vamos abasar para este artículo, sin entrar no obstante a expli-car en detalle todas sus funcionalidades y herramien-tas, ya que ello no es objeto de este artículo.

Herramienta de compilación automatizadaLa siguiente herramienta que necesitaremos es laencargada de realizar la integración. Esta herramien-ta será la encargada, de modo automático, de obtenerla última versión de las soluciones de Visual Studioque deseemos compilar, realizar la compilación de lassoluciones, ejecutar el conjunto de pruebas unitariasque configuremos, y dejar los resultados del procesoen un recurso compartido accesible por el equipo dedesarrollo. La herramienta que vamos a utilizar paraesta tarea es la que viene integrada en Team System,y que se integra con Team Foundation Server; estaherramienta es Team Build.

Tipos de integraciónTambién hay que definir los dos tipos de integraciónque podremos llevar a cabo, y entre los que, en fun-ción de nuestra experiencia, equipo y tipo de proyec-to, podemos escoger una para nuestro proyecto.

Integración continua

La integración continua es el tipo de integraciónque se ejecuta automáticamente cada vez que un desa-rrollador actualiza el código fuente de nuestro repo-sitorio (lo que solemos llamar “hacer un check-in”).En este tipo de integración, cada vez que un desa-rrollador realiza esta acción, se lanza la integraciónconfigurada en la herramienta, con todos sus pasos.

Como se puede ver, este tipo de integración es laideal, ya que en todo momento y en cada actualiza-ción de código, que se tiene que realizar con bastan-te frecuencia (varias veces al día) obtenemos una ver-sión de los ejecutables completamente integrada. Aúnsiendo la ideal, tenemos que tener cuidado a la horade ponerla en práctica, ya que en soluciones muy gran-des puede generarnos bastante sobrecarga en la máqui-na dedicada a la ejecución del proceso. Por esta razón,la solución o soluciones para esta integración, así comola ejecución de pruebas, deben ser configuradas cui-dadosamente para que no se produzcan problemas ala hora de la integración.

Integración frecuente

Por otra parte, la integración frecuente, a dife-rencia de la integración continua, solo se ejecuta conuna frecuencia determinada por nosotros en la herra-mienta; por ejemplo, a mitad del día y al final de la tar-de. Este tipo de integración nos proporciona menosresultados y menos “latidos”, pero también nos gene-ra menos sobrecarga en las máquinas de compilación.Por tanto, la integración frecuente es ideal cuando

dotN

etM

anía

<<

29

Desde la aparición de Visual StudioTeam System, cada vez más equipos

usan la nueva herramienta de control de código fuente integrada en Team Foundation Server y que

se llama Team Foundation Server Version Control

dnm.metodologías<<

dotN

etM

anía

<<

30

tenemos procesos muy pesados de com-pilación o pruebas unitarias; pero, aúnasí, deberemos procurar compilar unmínimo de una o dos veces diarias, paraque podamos tener la certeza de que elcódigo se está integrando correctamentey no tener problemas a la hora de fina-lizar la iteración; normalmente, debe-remos fijar una periodicidad de, almenos, una compilación diaria.

El decidir qué tipo de integraciónqueremos usar también nos hace pen-sar en algo que es muy importante ala hora de trabajar con Visual Studio,que es el decidir cuántas solucionesvamos a utilizar en nuestro proyectoy qué proyectos de Visual Studio que-remos tener en cada una de esas solu-ciones. Pudiendo disponer así de unaúnica solución, si nuestro proyecto noes muy grande, o varias soluciones conun conjunto pequeño de proyectoscada una, que nos ayuden a manejarde un modo más cómodo nuestrocódigo.

Es muy importante recordar ademásque siempre debemos llevar a cabo unaplanificación de entregas iterativa, yaque junto con la integración continua,éste es un modo de generar nueva fun-cionalidad que minimiza la posibilidadde fallos a la hora de entregar funcio-nalidad a nuestros clientes.

Estas compilaciones se tienen queconvertir en el “latido” del corazón denuestro proyecto; algo que nos indicaque diariamente estamos incrementan-do nuestras funcionalidades, con la adi-ción de nuevo código con sus pruebasunitarias funcionando correctamente,y ayudándonos a detectar los fallos tanpronto como éstos surjan.

Por último, hay que recordar tam-bién que cuanto más complicado sea elproyecto, más complicada y costosaserá su compilación y ejecución depruebas, de modo que la automatiza-ción de la integración nos salvará demuchos disgustos y nos ahorrarámucho tiempo, especialmente en lasfases más delicadas del proyecto: el finalde las iteraciones.

Configuración de la integración en TFSAhora que ya conocemos los beneficiosque nos ofrece la integración y los dostipos de integración posibles, aprende-remos a configurar la herramienta parala realización de compilaciones auto-matizadas. Solo recordar que, parahacer esto, necesitaremos un TeamFoundation Server (TFS) como repo-sitorio de código fuente para la reali-zación de compilaciones con TeamBuild. TFS es la herramienta de servi-dor que pertenece al conjunto de herra-mientas para la gestión del ciclo de vidadel software de Microsoft, y que nossirve como repositorio de código fuen-te, tareas (Work Items), documentación(en SharePoint) y que nos proporcionamétricas a nivel de proyectos.

Instalación del agente de compilaciones

Para la realización de compilacionescon TFS, lo primero que necesitamos esun agente de compilaciones. Este agen-te lo podemos instalar en cualquier orde-nador con conexión a nuestro TFS. Pue-de ser incluso un ordenador del equipode desarrollo, si bien se recomienda quese instale en un orde-nador independiente,en equipos pequeños,con pocos proyectos ypor tanto pocas com-pilaciones automatiza-das. Podemos instalarel agente en el mismoservidor TFS, peropara equipos grandes ocon muchos proyectosse recomienda un ser-vidor aparte para lascompilaciones.

En ese equipo,necesitaremos ademásuna versión de VisualStudio Team Systempara la compilación yejecución de las prue-

bas. Ésta debería ser al menos Visual Stu-dio Team System Tester Edition, parapermitirnos ejecutar pruebas de todotipo, o mejor aún Visual Studio TeamSystem Team Suite. Hay que señalar quepara el agente de compilaciones no nece-sitamos una licencia extra de Visual Stu-dio, sino que podemos utilizar una mis-ma licencia ya usada en otra de nuestrasmáquinas de desarrollo.

La instalación del agente de com-pilaciones se realiza desde el CD/DVDde TFS. Una vez insertemos elCD/DVD de TFS en la máquina ele-gida, se nos mostrará la pantalla inicialde instalación, y deberemos seleccionarla opción “Team Foundation Build”.Aquí se nos mostrará un asistente(wizard) de instalación, en el que podre-mos seleccionar el directorio de insta-lación, y lo más importante, la cuentade ejecución del servicio del agente, queserá la cuenta con la que éste se conec-tará al TFS. Esta cuenta deberá tenerpermisos de acceso al TFS, y en casode existir un dominio, debe pertenecera éste. Puede ser la misma cuenta queutilizamos para la instalación de los ser-vicios de TFS: TFSService (asegurarantes que habéis configurado esta cuen-ta en la instalación), si bien esta cuen-ta hay que tenerla controlada, ya que

Figura 1

dnm.metodologías<<

dotN

etM

anía

<<

32

tiene acceso completo a TFS, algo que puede no seradecuado en muchos entornos (ver figura 1).

Con esto, ya podemos completar la instalaciónde nuestro agente de compilaciones. Tampocovamos a detenernos más en este punto; si necesitáismás información al respecto, en el CD/DVD deTFS disponéis de las guías completas de adminis-tración y configuración, accesibles desde la prime-ra pantalla.

Configuración de la compilación

Una vez tengamos el agente instalado, ya esta-mos listos para configurar nuestra primera compila-ción automatizada. El primer paso es abrir nuestroVisual Studio 2008 y, en la ventana de Team Explo-rer, seleccionar la rama “Builds” y obtener su menúcontextual.

Configurando el agente

El primer paso es agregar el agente de compilacio-nes que hemos instalado anteriormente, para esto, selec-cionamos la opción “Manage Build Agents” del menú.En la ventana de gestión “Build Agents” tenemos el lis-tado de agentes configurados; para añadir uno nuevo,pulsamos “New…”. Simplemente le pondremos unnombre significativo para referirnos a él, una descrip-ción (opcional), e indicaremos el nombre de máquinadónde hemos instalado previamente el componente deTeam Foundation Build y el puerto (dejaremos el pordefecto). Adicionalmente, podemos seleccionar si que-remos que se use comunicación HTTPS, y el estadoinicial (dejaremos el por defecto también).

Un punto importante a configurar en esta pan-talla es el directorio de trabajo: “Working directory”.Por defecto, .NET no admite rutas de disco mayo-res de 256 caracteres, por lo que os recomiendo cre-ar un directorio con nombre corto, por ejemplo C:\B,y utilizar ese directorio en sustitución del directo-rio temporal, quedando así: C:\B\$(BuildDefini-tionPath).

Configuración de la definición de la compilación

El siguiente paso es crear la definición de nuestracompilación automatizada. Para ello, seleccionamos laopción “New Build Definition” en el menú contextualde “Builds”. En la pantalla inicial de configuración deuna compilación, debemos prestar especial atención alos puntos marcados con el icono de advertencia, queson los principales. Vamos a ver punto por punto.

• GeneralEn este punto debemos de introducir el nombre

con el que vamos a referirnos a esta compilación, asícomo, opcionalmente, una descripción. También dis-ponemos de una casilla para desactivar la definiciónde esta compilación.

• WorkspaceEl workspace es el espacio de trabajo que usará el

agente de compilaciones. Aquí podemos definir quéramas del repositorio de control de fuentes obtendráel agente a la hora de realizar una compilación; al seréste un ejemplo básico, lo dejaremos con los valorespor defecto.

Esto se usaría también para separar en distintascompilaciones de integración continua las distintaspartes de nuestro proyecto, para evitar así compilarsiempre todo al completo en caso de proyectos muygrandes. Para ello, definiríamos aquí qué espacios detrabajo queremos que lancen la compilación a la horade un check-in.

• Project FileEn este punto vamos a generar el fichero que se

encargará de definir qué soluciones y qué pruebasqueremos ejecutar. Lo primero es indicar en qué ramadel repositorio de fuentes vamos a crear el fichero dedefinición. Este fichero se llamará TFSBuild.proj, y esun documento XML que podremos editar para per-sonalizar los pasos de nuestras compilaciones. Paracrear uno nuevo, pulsamos el botón “Create…”.

El primer paso es seleccionar qué solución o solu-ciones vamos a compilar. Por defecto, no podemosseleccionar proyectos por separado; solo lo podemoshacer a nivel de solución. Una vez seleccionadas lassoluciones que queremos compilar, podremos pasaral siguiente paso (figura 2), en el que deberemos espe-cificar qué configuraciones queremos compilar.

Una misma solución la podemos compilar condiferentes configuraciones (Debug, Release o confi-guraciones personalizadas), así como para diferentesplataformas (x86, x64, Any CPU). Pero estas confi-guraciones tienen que ser configuraciones existentesen nuestras soluciones, ya que si no la compilaciónno funcionará correctamente; estas configuracioneslas podemos comprobar abriendo la solución en VisualStudio y comprobando el gestor de configuraciones(Configuration Manager).

El siguiente paso es decidir qué pruebas vamos aejecutar, lo que se hace en la ventana de opciones.Para decidir qué pruebas ejecutar, seleccionaremos laopción “Run tests”, y del listado de ficheros de listas

dnm.metodologías<<

dotN

etM

anía

<<

33

de pruebas unitarias (ficheros conextensión .vsmdi) seleccionamos el quetiene la lista de pruebas que queremosejecutar; entonces en la ventana de lis-tas de pruebas podremos seleccionar lasque queremos ejecutar.

Si no estamos trabajando con listasde pruebas, podemos seleccionar eje-cutar automáticamente todas las prue-bas que estén en una DLL que cumplacon un determinado patrón; ésta es lasegunda opción que se nos muestra, ycomo patrón se nos propone que laDLL de pruebas comience con la pala-bra “Test”. Es importante tener encuenta que el sistema detectará y eje-cutará todas las pruebas de esa DLL;por tanto, es importante mantener ais-ladas en ella únicamente las pruebas quedeseemos ejecutar, siendo preferibleque sean únicamente pruebas unitariaso de ejecución muy simple.

En esta última pantalla tambiénpodemos especificar si queremos quese ejecute el analizador de código está-tico para cada proyecto según la confi-guración detallada en cada proyecto.Este analizador comprobará que nues-

tro código cumple los conjuntos dereglas de diseño y codificación, comosi de un revisor de código se tratase. Sino estáis familiarizados con esto, os

recomiendo hacerlo antes, fuera de lascompilaciones automatizadas.

Una vez que pulsemos “Finish”,se nos creará el fichero TFSBuild.projcon las configuraciones elegidas, vol-viendo a la pantalla de configuraciónde la compilación. De estas configu-raciones no disponemos a posterioride un editor gráfico integrado, aun-que sí existen herramientas de terce-ros, como los sidekicks de Attrice(http://www.attrice.info).

• Políticas de retenciónVolviendo a la pantalla principal de

configuración de la compilación, tene-mos el apartado de políticas de retención.

Como podemos suponer, el com-pilar diariamente una o varias veces ydejar compartidos los binarios, resul-tados de pruebas unitarias, etc. generamuchos ficheros que pueden llegar acrear un problema de almacenamien-to en la máquina de compilación. Paraevitar que esto suceda, podemos espe-cificar qué resultados queremos guar-dar mediante políticas de retención(figura 3).

Figura 2

Figura 3

dnm.metodologías<<

dotN

etM

anía

<<

34

Los posibles resultados de la com-pilación son:

• Failed: la solución no se ha com-pilado correctamente.

• Stopped: hemos detenido la com-pilación durante su ejecución.

• Partially succeeded: cuando unacompilación da este resultado,alguna o todas las pruebas unita-rias han fallado.

• Succeeded: la compilación y suspruebas unitarias han funciona-do correctamente.

Y lo que podemos especificar en lafigura 3 es qué número de resultados decompilación queremos conservar. Es reco-mendable especificar cuántas queremosguardar para cada uno de los resultados,ya que si bien podremos eliminar los resul-tados manualmente, lo más cómodo esque TFS lo haga por nosotros.

• Build defaultsEn la figura 4 podemos ver la pan-

talla de selección del agente de compi-lación, y el recurso compartido (en estecaso \\tfsdemos\deploy) en el que sealmacenarán los resultados de estageneración. En el listado de agentes decompilación, seleccionaremos el quehemos configurado previamente.

Es importante tener en cuenta queen ese recurso compartido de red, elusuario que configuramos durante lainstalación del agente de compilación(TFSService) debe tener acceso de lec-tura y escritura para dejar los binarios.En ese recurso compartido se crearáuna carpeta con el nombre de la com-pilación y un número de identificación(basado en la fecha y orden de compi-lación) que contendrá los resultados decada compilación, manteniendo así unhistórico de compilaciones. Estos direc-torios se borrarán dependiendo de laspolíticas de retención.

• Triggers (disparadores)Por último, podemos configurar la

periodicidad de nuestra compilación.

Las opciones que tenemos a nues-tra disposición son:

• Check-ins do not trigger a newbuild: si seleccionamos esta con-figuración, la compilación solo selanzará cuando la lancemosmanualmente desde el menú“Builds” de Team Explorer, selec-cionando la compilación y en sumenú contextual, la opción“Queue Build”.

• Build each check-in: con estaopción, cada vez que un usuariohaga check-in de código fuentese lanzará esta compilación. Éstaes la opción que nos proporcio-na una compilación de integra-ción continua.

• Accumulate check-ins…: conesta opción, también tendremosun entorno parecido al de inte-gración continua, pero para evi-tar un número excesivo de com-pilaciones, especialmente enequipos grandes, podemos acu-mular check-ins, hasta que lacompilación previa acabe, y

además especificar que no se lan-ce la compilación más de una vezcada X minutos, para, por ejem-plo, no compilar más de una vezcada hora.

• Build every week on…: con estaconfiguración, especificaremosuna periodicidad para nuestrascompilaciones. Podemos especi-ficar qué días de la semana que-remos compilar, a qué hora, yespecificar si queremos compilarindependientemente de que hayacambios o no en el repositorio decódigo. Esto nos daría un entor-no de integración frecuente.

Una vez configuradas todas lasopciones, pulsando el botón “Ok”, secreará nuestro nuevo tipo de compila-ción, que aparecerá en el listado“Builds” de nuestro Team Explorer.Con esto ya tendremos nuestro entor-no listo, y la compilación se ejecutarásegún la periodicidad elegida, o bienmanualmente mediante la opción“Queue build” del menú contextual decada tipo de compilación.

Figura 4

dnm.metodologías<<

dotN

etM

anía

<<

35

Resultados de compilación

Para comprobar los resultados de una compila-ción, haremos doble clic en el listado de tipos de com-pilación de Team Explorer. La ventana que obten-dremos nos mostrará si hay alguna compilación rea-lizándose actualmente, en cuyo caso podremos hacerdoble clic en ella y ver los pasos que se están ejecu-tando, como obtención de fuentes, compilación, eje-cución de pruebas…

En esta ventana también podemos seleccionar,mediante los filtros de la parte superior, otros agen-tes de compilación u otros tipos de compilación paraver el estado de compilaciones encoladas.

Para ver los resultados de compilaciones pasadas, enesta misma pantalla, en la parte inferior, tenemos la pes-taña “Completed”, que nos mostrará la ventana de lafigura 5, en la que vemos el listado de las compilacionesfinalizadas. Por defecto, los filtros muestran solo las com-pilaciones finalizadas en un día; si queremos ver másresultados, podemos cambiar el filtro de fecha. En eselistado se nos muestra además el resultado de cada com-pilación mediante el icono de la izquierda, siendo éste

una “pelotita” verde paraindicar que todo ha sidocorrecto, o roja, para indi-car que no se ha podido rea-lizar la compilación. Sitenemos una pelotita roja yuna verde, es que el resul-tado ha sido parcialmente

correcto (fallo en pruebas uni-tarias).

También podremos verlos detalles de cualquier com-

pilación haciendo doble clic sobre ella. En la ventanaemergente obtendremos los resultados detallados deesa compilación, así como un enlace directo al recur-so compartido donde están los binarios resultantes ylos logs de la compilación, para que todo el equipo delproyecto tenga disponible la última versión.

Otra de las funcionalidades que obtenemos direc-tamente de Team System es la alerta de compilacio-nes completadas, que nos permite disponer de datosal momento de la finalización de la compilación. Paraello, en el menú contextual del proyecto en el TeamExplorer debemos seleccionar la opción “ProjectAlerts”. Podemos configurar distintos tipos de aler-tas, introduciendo nuestra dirección de correo electró-nico; la que nos interesa para estar al tanto de las com-pilaciones es la opción “A build completes”.

Conclusiones Como veis, crear un entorno base de integración con-tinua con Visual Studio 2008 Team System no es nadacomplicado, y lo podemos lograr mediante unos sen-cillos pasos basados en asistentes. Si bien hemos mos-trado solo los fundamentos, y dependiendo de nues-tro proyecto, podemos extenderlo para conseguir unamayor funcionalidad de nuestro entorno de integra-ción continua.

Muchas de estas funcionalidades se comentan endiferentes blogs, e iré presentando algunas de ellas enel futuro, tanto a través de artículos en esta revista (sime dejan ☺ )1 como a través de mi blog enhttp://www.lfraile.net. El lector también puedeencontrar más información en otros blogs (en inglés)relacionados con Team System: http://msdn2.micro-soft.com/en-us/teamsystem/aa718761.aspx.

Y esto es todo por ahora. Os animo a todos losque ya estéis usando TFS a sacar un poco más de par-tido a vuestro servidor, utilizando los entornos de inte-gración continua/integración frecuente.

Figura 5

Crear un entorno base de integración continua con Visual Studio 2008 Team System no es

nada complicado

1 Nota del Editor: ¡Por supuesto que sí!

Cuando implementamos una aplicación Web, amenudo necesitamos escribir partes de código quehan de ser ejecutadas en el navegador. Este códi-go debe ser escrito en Javascript, y es aquí cuan-do nos puede ser útil la ayuda de una librería decódigo en este lenguaje. Es por esto que en losúltimos años han comenzado a aparecer libreríasque han cambiado la forma de incorporar códigoJavascript a una aplicación Web: ya no necesita-mos escribir todo el código nosotros mismos, por-que existen multitud de recursos que nos ayudarána programar más rápida y fácilmente de lo quenunca antes había sido posible. Estas librerías sonrecursos que podremos conectar a nuestros fra-meworks de desarrollo y que ofrecen soluciones alos problemas más comunes con los que se encuen-tra un programador Web a la hora de escribir códi-go Javascript.

Eligiendo la librería que más nos con-vieneLa mayoría de las librerías Javascript más popula-res comparten muchas de sus funcionalidades. Espor eso que elegir qué librería es la que mejor seadapta a nuestras necesidades no siempre es fácil.Estos son algunos de los criterios que no pode-mos dejar de tener en cuenta a la hora de elegirnuestra librería:

• ¿Dispone de todas las funcionalidades que nece-sitamos?

Es importante que la librería que elijamos ten-ga todas las funcionalidades que queramos uti-lizar. Muchas de las librerías de Javascript com-parten el mismo espacio de nombres (como $()),lo que hace que no sea fácil combinar sus fun-cionalidades. Además, al combinar librerías nosarriesgamos a tener código redundante en nues-tra aplicación.

• ¿Dispone de más funcionalidades de las que real-mente necesitamos?

Cuantas más funcionalidades tenga una librería,es de esperar que ésta contenga más líneas decódigo y por tanto sea más costosa de descar-gar. Muchas de las librerías actuales disponende versiones “ligeras” e incluso algunas estándivididas en módulos, lo que nos permite incluiren nuestra aplicación solo aquellas funcionali-dades en las que estemos realmente interesa-dos.

• ¿Es compatible con todos los navegadores?

Las librerías Javascript suelen funcionar inde-pendientemente del navegador en que se eje-cuten. Esto es una gran ventaja, ya que permi-

Frameworks para Javascript

plataforma.net

Juan Carlos ViñasCustom Development

Manager de Raona. JuanCarlos es MCSD .NET

Las técnicas de desarrollo en Javascript, así como los usos que se le dana esta tecnología, han cambiado notablemente en los últimos años. Hoyen día, nos es difícil pensar que una aplicación Web moderna pueda pres-cindir de esta tecnología para finalidades tan diversas como la comuni-cación asíncrona entre cliente y servidor, la aplicación de efectos visua-les a nuestro código HTML o mantener nuestro propio sistema de cachéen el lado del cliente.

Juan Carlos Viñas

dotN

etM

anía

<<

37

dnm.plataforma.net<<

te al programador olvidarse de lasdiferencias entre navegadores yescribir el código con la certeza deque funcionará correctamente entodos los navegadores que la libreríasoporte.

• ¿Dispone de un buen soporte por par-te de la comunidad?

Una comunidad de usuarios y desa-rrolladores activa se traduce enmenos errores y un código de mayorcalidad, además de constituir unvalioso recurso al que recurrir encaso de necesitar ayuda.

• ¿Dispone de documentación?

Una buena documentación y unlugar donde encontrar ejemplos deuso resulta fundamental para enten-der, y por tanto utilizar correcta-mente, cualquier librería.

• ¿Tiene la licencia que nos interesa?

Que dispongamos del código fuen-te de una librería no significa quepodamos hacer con él lo que noso-tros queramos. La mayoría de estaslibrerías son libres, pero otras exi-gen que cualquier código que seescriba usando alguna de sus fun-cionalidades se libere bajo la mismalicencia que ellas.

¿Qué tipo de funcionalidadesme pueden aportar?

Existen muchas librerías, y cada una deellas tiene sus propias particularidades.Existen librerías con funcionalidadesmuy específicas, y otras que pretendenproporcionar herramientas para facili-tar las tareas más cotidianas de un pro-gramador Web. A las librerías de esteúltimo tipo se les llama librerías multi-propósito, y en el siguiente apartadovamos a ver cuáles son las funcionali-dades más comunes que éstas suelenincorporar.

Selección de elementos de unapágina

Una de las características más úti-les de las librerías multipropósito sonlos selectores de elementos. Estos selec-tores son una potente herramienta quenos permite seleccionar elementos deuna página de forma simple y eficien-te. Realizar selecciones complejas uti-lizando las funciones nativas que Javas-cript nos ofrece puede ser una tarearealmente tediosa. Por ejemplo, si qui-siéramos obtener todos los controlesRadioButton seleccionados en una pági-na, primero tendríamos que obtenertodos los elementos de tipo <input> uti-lizando la función getElementByTagName,y luego iterar sobre estos elementos,seleccionando los que sean de tipo radioy que tengan el atributo checked.

En cambio, utilizando una libreríacomo jQuery (http://www.jquery.com), elcódigo necesario se simplificaría a:

Otro ejemplo: supongamos quequeremos seleccionar todos elementosde tipo párrafo que tengan en su atri-buto class el valor class1 y que ademáscontengan un elemento de tipo hipe-renlace. En Javascript tradicional,tendríamos que seleccionar todos loselementos de tipo <p> mediante la fun-ción getElementByTagName, iterar sobreéstos para seleccionar los que tengan elvalor class1 en su atributo class, y porúltimo recorrer todos los nodos hijosde estos últimos para comprobar quetengan un hijo de tipo <a>. UtilizandojQuery, nos bastaría con escribir lasiguiente línea:

Estos dos ejemplos son una pequeñamuestra de lo que los selectores de laslibrerías multipropósito pueden sim-plificar nuestro código, pero éstastodavía pueden ofrecernos mucho más.

La combinación del lenguaje XPath ylos selectores CSS nos permiten reali-zar selecciones mediante prácticamen-te cualquier criterio que se nos ocurra,y esto es algo que también nos ofrecenlibrerías como jQuery.

Comunicación asíncronaentre cliente-servidor (AJAX)

Resulta casi imposible hablar sobretecnología Web sin hablar sobre AJAX.AJAX es una combinación de tecno-logías ya existentes, y éstas, como no,tienen los mismos problemas de incom-patibilidad entre navegadores que siem-pre tuvieron. Las librerías Javascript nosayudan a solucionar estos problemas,además de simplificar nuestras llama-das desde cliente hacia el servidor.

Probablemente el objeto AJAX máspopular de entre todas las libreríasJavascript es el que nos ofrece Prototy-pe (http://www.prototypejs.org). Pro-totype.Ajax funciona en todos los nave-gadores modernos y nos ofrece méto-dos que nos permiten trabajar conAJAX de una forma simple:

• El método Ajax.Request realiza unapetición simple al servidor:

• Con el método Ajax.Updater podemosincrustar directamente el contenidodevuelto por la petición AJAX a unnodo de nuestra página. La siguien-te llamada insertaría el resultado dela petición en el nodo “node”:

$(“input[@type=radio][@checked]”)

new Ajax.Request(‘/some_url’, { method:’get’, onSuccess: function(){

alert(“It works!”); }

});

new Ajax.Updater(‘node’, ‘/some_url’,{ method: ‘get’, insertion: Insertion.Top });

$(“p.class1[a]”);

dotN

etM

anía

<<

38

dnm.plataforma.net<<

• Ajax.PeriodicalUpdater realiza peticiones periódi-cas al servidor, e inserta el contenido que obtieneen el nodo de nuestra página que indiquemos:

El parámetro frecuency hace referencia al inter-valo de tiempo entre llamadas, mientras que el pará-metro decay es el factor por el cual se multiplica lafrecuencia cada vez que el contenido de la respues-ta sea el mismo. De esta forma evitamos sobrecar-gar al servidor con un número excesivo de peticio-nes.

Gestión de eventosLa gestión de eventos es otra de las tareas que puederesultar complicada debido a las incompatibilidadesentre navegadores: mientras que Internet Explorerutiliza su propio método attachEvent para asociareventos a elementos de una página, el resto de nave-gadores utiliza el método addEventListener. Laslibrerías Javascript nos ahorran este tipo de proble-mas y nos permiten tratar eventos de forma más intui-tiva. Como ejemplo, podemos ver cómo añadir even-tos a un elemento <textarea> utilizando la libreríamootools (http://www.mootools.net).

En el ejemplo anterior vemos cómo asociar múl-tiples eventos a un elemento mediante el método addE-vents, cómo crear eventos propios, y cómo lanzareventos mediante fireEvent. Si escribimos la palabra“hello” en el cuadro de texto se lanzará nuestro even-to propio, al que hemos llamado “burn”, mientras quesi escribimos la palabra “delayed” obtendremos el mis-mo resultado, con la diferencia que el evento se lan-zará al cabo de 1000 ms.

Y mucho más…La selección de elementos, AJAX y la gestión de

eventos en cliente son solo una parte de lo que laslibrerías Javascript nos pueden ofrecer. Tareas tancomplejas como añadir efectos visuales a nuestra pági-na o implementar un sistema de arrastrar y soltar sesimplifican enormemente utilizando librerías comojQuery, Prototype o mootools. Es por esto que resul-ta altamente recomendable conocer las posibilidadesde estas librerías antes de embarcarse en cualquierproyecto Web.

new Ajax.PeriodicalUpdater(node, ‘/some_url’,

{

method: ‘get’,

insertion: Insertion.Top,

frequency: 1,

decay: 2

});

$(‘myTextarea’).addEvents({

‘focus’: function() {

if ($(‘myTextarea’).value.contains(‘Type here’))

$(‘myTextarea’).value = ‘’;

},

‘keyup’: function() {

if ($(‘myTextarea’).value.contains(‘hello’))

$(‘myTextarea’).fireEvent(‘burn’, ‘hello world!’);

else if ($(‘myTextarea’).value.contains(‘delayed’))

$(‘myTextarea’).fireEvent(‘burn’, “I’m a bit late!”, 1000);

},

‘burn’: function(text) {

$(‘myTextarea’).value = ‘burn! ‘ + text;

}

});

La selección de elementos, AJAX y la gestión de eventos en cliente sonsolo una parte de lo que las librerías

Javascript nos pueden ofrecer

De la identificación de usuarios y su relación con la redEn muchas ocasiones, identificar al usuario querealiza una acción es requerido en las aplicaciones.Y más que eso, reflejar en la interfaz del usuariodicha información, e inclusive las opciones y com-portamiento de la misma pueden depender de estainformación. Es por ello que nos resultará útil con-tar con un componente que encapsule métodos quenos faciliten la relación con el Directorio activo.

¿Qué necesitamos?Para una funcionalidad básica, es suficiente con uti-lizar los tipos que se encuentran en System.Direc-toryServices. Dentro de ese espacio de nombres,la clase DirectorySearcher nos permite encontrarinformación en el Directorio activo.

Pero antes de esto, necesitamos saber en quéentorno nos encontramos.

Agreguemos a este ensamblado una clase quenos defina el entorno: Environment. En ella, podre-mos agregar un método que nos retorne cuál es elnombre del dominio actual, como se ve en el lis-

tado 1. Además, podríamos agregar otro métodopara obtener la identificación del usuario actual,como muestra el listado 2.

Internamente, esa clase siempre podría nece-sitar acceder al dominio para obtener otros obje-tos y referencias. Entonces sería conveniente dis-poner de la función privada cuyo código encon-tramos en el listado 3.

Componentes de uso general

plataforma.net

Otro mes, y otro componente. Veamos cómo nuestros otros compo-nentes pueden relacionarse con el sistema operativo, la seguridad, losusuarios… el Directorio activo.

Daniel Seara

Imports AD = System.DirectoryServices

Public Class Environment

Private Shared mDomainName As String

Public Shared Function DomainName() As String

If mDomainName = “” Then

mDomainName = _

AD.ActiveDirectory.Domain.GetCurrentDomain.Name

End If

Return mDomainName

End Function

Listado 1 Dominio actual.

Private Shared mActualUser As StringPublic Shared Function ActualUserName() As String

If mActualUser = “” ThenmActualUser = _

System.Threading.Thread.CurrentPrincipal.Identity.NameEnd IfReturn mActualUser

End Function

Listado 2. Usuario actual.

Daniel Seara es mentorde Solid Quality Mentors

y director del área dedesarrollo .NET. Es MVP

desde 2003 y ponentehabitual de

y Microsoft.

Nueva idea, nuevo ensamblado: en micaso Solid.Servers.ActiveDirectory[ ]

NOTA

dotN

etM

anía

<<

41

dnm.plataforma.net<<

Enmascarando los objetos de directorioEn muchas ocasiones, solo necesitare-mos información específica de cualquierade los elementos del directorio. Y esosignifica que resulta inútil, además dealgo más inseguro, requerir referenciasal espacio de nombres de servicios dedirectorio. Siempre que sea posible, espreferible enmascarar los objetos y usarlos propios para tener un control ade-cuado de la información brindada.

Por otra parte, los servicios de direc-torio de Windows tienen un inconve-niente, y es que a ellos se accede a travésde ADSI (Active Directory ServiceInterfaces), un conjunto de interfacesCOM modeladas a partir del protoco-lo LDAP (Lightweight DirectoryAccess Protocol), diseñado en la erapre-nética ☺. Por lo tanto, no son pre-cisamente la perfección respecto aldiseño orientado a objetos. Cada obje-to expone propiedades diferentes, haypropiedades que retornan más de unvalor, no están adecuadamente identi-ficados los tipos de datos. Conceptual-mente, además, se trata de implemen-taciones genéricas que se expresan usan-do identificadores de clase (que no sonclases específicas).

Podemos, sin embargo, convertir-las en algo más “nético”, aprovechan-do cosas como la generación de códigoy los mecanismos de reflexión.

Consideremos, para comenzar, queposiblemente nos interese administrarpermisos de nuestras aplicaciones enbase a grupos de seguridad. Para ellonecesitaríamos la lista de los grupos,

cosa que los servicios de directorio soncapaces de brindarnos si hacemos unabúsqueda con DirectorySearcher, comovemos en el listado 4.

Ahora bien, una vez se obtiene unSearchResult (uno de los miembros dela variable r), éste contiene un Direc-toryEntry y a través de él podemos obte-ner qué propiedades expone. Pero, porotra parte, hay algunos grupos que expo-

nen distintas propiedades (o distintacantidad de valores para una propiedad).Por ello, recorreremos todas ellas yobtendremos una lista de las propieda-des existentes. Una vez las tengamos,podremos generar el código corres-pondiente a cada una.

En el listado 5 se ve cómo se vancoleccionando las propiedades en undiccionario donde guardamos una cla-se MyPropertyInfo (listado 6), que nospermite almacenar:

Private Shared mDomainEntry As AD.DirectoryEntryPrivate Shared ReadOnly Property DomainEntry() As AD.DirectoryEntryGet

If mDomainEntry Is Nothing ThenmDomainEntry = _

AD.ActiveDirectory.Domain.GetCurrentDomain.GetDirectoryEntryEnd IfReturn mDomainEntry

End GetEnd Property

Listado 3. Información del dominio.

Dim ms As DirectoryServices.DirectorySearcher = Searcher()With ms

.Filter = “(objectClass=group)”

.SearchScope = DirectoryServices.SearchScope.SubtreeDim r As DirectoryServices.SearchResultCollection = .FindAll

End With

Listado 4. Búsqueda de grupos.

Listado 5. Diccionario de propiedades.

La sintaxis de filtrado en LDAP puede ser compleja. Por ejemplo, losargumentos encerrados entre paréntesis, los nombres y valores de los fil-trados, etc. suelen no ser simples. El primer punto de referencia está enhttp://msdn.microsoft.com/es-es/library/system.directoryservices.aspx [ ]

NOTA

Dim colElements As New Dictionary(Of String, MyPropertyInfo)Sub GetPropertyInfo(ByVal en As DirectoryServices.DirectoryEntry)

For Each v As PropertyValueCollection In en.PropertiesIf v.Value.GetType.ToString <> “System.__ComObject” Then

With colElementsIf .ContainsKey(v.PropertyName) Then

If .Item(v.PropertyName).Count < v.Count Then.Item(v.PropertyName).Count = v.Count

End IfElse

Dim p As New MyPropertyInfo With _{.Count = v.Count, _.DataTypeName = v.Value.GetType.ToString, _.Name = v.PropertyName}.Add(v.PropertyName, p)

End IfEnd With

End IfNext

End Sub

dotN

etM

anía

<<

42

dnm.plataforma.net<<

• El nombre de la propiedad.• La cantidad de valores que con-

tiene.• El tipo de dato que almacena.

En la búsqueda de propiedades, seexcluyen aquellas que son de tipo ComOb-ject, que son las que internamenteADSI utiliza para la manipulación deinformación.

Una vez que se obtiene la coleccióncompleta de propiedades (y asumiendoque la muestra es lo suficientementesignificativa), podemos generar códigopara exponer dichas propiedades un laclase Group que pretendemos definir.

Utilizamos una plantilla para gene-rar el código correspondiente a cada pro-piedad. Considerando que habrá pro-piedades con más de un valor, tendremosen realidad dos plantillas: una para pro-piedades simples (listado 7) y otra parapropiedades indexadas (listado 8).

Como se ve, en ambos casos se uti-liza una sintaxis acorde a los marcado-res posicionales de formatos. Amboscódigos se agregan como recursos en el

Listado 6. Clase MyPropertyInfo.

Listado 7. Plantilla para propiedad simple.

Listado 8. Plantilla para propiedad Indexada.

Friend Class MyPropertyInfo

Private mName As String

Public Property Name() As String

Get

Return mName

End Get

Set(ByVal value As String)

mName = value

End Set

End Property

Private mCount As Integer

Public Property Count() As Integer

Get

Return mCount

End Get

Set(ByVal value As Integer)

mCount = value

End Set

End Property

Private mDataTypeName As String

Public Property DataTypeName() _

As String

Get

Return mDataTypeName

End Get

Set(ByVal value As String)

mDataTypeName = value

End Set

End Property

End Class

Private m{0} As New Dictionary(OfString, {1})Public Property {0}(ByVal key AsString) As {1}

GetReturn m{0}(key)

End GetSet(ByVal value As {1})

If m{0}.ContainsKey(key) Thenm{0}(key) = value

Elsem{0}.Add(key, value)

End Ifm{0}(key) = value

End SetEnd Property

Listado 9. Generador de propiedades.

Listado 10. Constructor de la clase Group.

Sub GenProperties()

Dim st As New StringBuilder

For Each p As MyPropertyInfo _

In colElements.Values

Dim sFormat As String = “”

If p.Count = 1 Then

sFormat = My.Resources.PropertyDef

Else

sFormat = My.Resources.IndexedPropDef

End If

Dim sDT As String=p.DataTypeName.Replace(_

“[“, “(“).Replace(“]”, “)”)

If p.Count > 1 Then

sDT = sDT.Replace(“(“, “”).Replace(“)”,“”)

End If

st.AppendFormat(sFormat, p.Name, sDT)

Next

Using fi As New IO.StreamWriter(“c:\Props.vb”)

fi.Write(st.ToString)

fi.Close()

End Using

End Sub

Friend Sub New(ByVal de As DirectoryServices.DirectoryEntry)For Each v As PropertyValueCollection In de.Properties

If v.Value.GetType.ToString <> “System.__ComObject” ThenDim sFormat As String = “”If Me.GetType.GetProperty(v.PropertyName).GetIndexParameters.Count = 0 Then

CallByName(Me, v.PropertyName, CallType.Let, v.Value)Else

For i As Integer = 0 To v.Count - 1Dim arr As New ArrayListIf v.Value.GetType.IsArray Then

arr.AddRange( _CType(v.Value, Collections.ICollection))

Elsearr.Add(v.Value)

End IfCallByName(Me, v.PropertyName, _

CallType.Let, i, arr(i))Next

End IfEnd If

NextEnd Sub

Private m{0} As {1}Public Property {0}() As {1}

GetReturn m{0}

End GetSet(ByVal value As {1})

m{0} = valueEnd Set

End Property

dotN

etM

anía

<<

43

dnm.plataforma.net<<

proyecto de generación (una aplicaciónauxiliar que solo sirve para generar estecódigo).

Entonces, el procedimiento del lis-tado 9 crea una cadena de caracteresque contiene las definiciones de todaslas propiedades y genera con ellas unarchivo en disco.

Los métodos Replace en el listado 9permiten quitar la declaración de valorde tipo array en las propiedades múlti-ples, ya que eso lo re-implementamosusando nuestra propia metodologíapara la manipulación de dichas propie-dades multi-valor.

Usando el código generado en elarchivo props.vb, podemos definir aho-ra la clase Group, que exponga y seacapaz de cargar las propiedades a par-tir de una entrada de directorio. Paraello, implementamos un constructor(listado 10) que recibe una variable detipo DirectoryEntry para obtener losvalores y utiliza reflexión para cargarlos valores de las propiedades.

Siguiendo procedimientos simila-res, pero utilizando otros filtros LDAP,podemos definir clases de usuario, uni-dad organizativa, servidor, etc.

Mejorando los resultadosobtenidos

El Directorio activo define muchoselementos que normalmente no seencuentran disponibles para los usuariosy que, sin embargo, aparecen cuando con-sultamos por código utilizando LDAP.Por ello, siempre es bueno tener claro (yutilizar adecuadamente) la información

que nos permita discriminar dichos ele-mentos accesibles por los usuarios.

Comencemos por mostrar en unListView de una aplicación WindowsForms todas y cada una de las propie-dades de los objetos de tipo Group queobtenemos de nuestro directorio. Defi-namos en nuestra clase de entorno unmétodo que nos devuelva una lista delos grupos presentes en el directorio(listado 11).

Podemos obtener el conjunto degrupos del Directorio activo y pre-sentar en columnas cada una de suspropiedades como se muestra en ellistado 12.

Ejecutando esta operación, se car-gará una lista con todos los grupos, comomuestra la figura 1. En ella podemos ver

Public Shared Function Groups() As List(Of Group)Dim ms As DirectoryServices.DirectorySearcher = Searcher()Dim g As New List(Of Group)With ms

.Filter = “(objectClass=group)”

.SearchScope = DirectoryServices.SearchScope.SubtreeDim r As DirectoryServices.SearchResultCollection = .FindAllFor Each rr As DirectoryServices.SearchResult In r

g.Add(New Group(rr.GetDirectoryEntry))Next

End WithReturn g

End Function

For Each el In Solid.Servers.ActiveDirectory.Environment.Groups‘agrega un ítem en la listaWith ListView1.Items.Add(el.name)

‘recorre las propiedades de la clase GroupFor Each p As System.Reflection.PropertyInfo In _el.GetType.GetProperties

‘si aún no está definida la columna, la agregaIf Not ListView1.Columns.ContainsKey(p.Name) Then

ListView1.Columns.Add(p.Name, p.Name)End If‘pos es el índice de la columnaDim pos As Integer = ListView1.Columns(p.Name).Index‘si el ítem agregado tiene menos subítems,‘agrega hasta alcanzar la posiciónWhile pos > .SubItems.Count - 1

.SubItems.Add(“”)End While‘intenta agregar el valorTry

.SubItems(pos).Text = _CallByName(el, p.Name, CallType.Get).ToString

Catch ex As Exception‘(puede haber errores, que se ignoran)

End TryNext

End WithNext

Listado 11. Lista de grupos.

Listado 12. Cargando una lista con todos los grupos.

Figura 1. Lista parcial de grupos.

que la propiedad groupType nos permite agruparlos,para así entender cuáles son los más útiles a nuestrosfines.

Si creamos grupos (aprovechando las caracterís-ticas propias del control ListView), veremos clara-mente a qué me refiero. El listado 13 modifica el ante-rior, agregando grupos.

Podemos ver entonces en la figura 2 cómogroupType nos muestra los grupos de administración,los que permiten reunir y dar permisos a usuarios, losque contienen servidores, etc.

Conclusión

Este es otro caso donde establecer algo de código nospermite personalizar funcionalidades y acceder a infor-mación de bajo nivel o de alta seguridad, en un mar-co controlado. A partir de aquí, se podrá agregar

métodos que permitan saber si un usuario perteneceo no a un grupo, quiénes son miembros de un gru-po, de una unidad organizativa, etc.

Un comentario final: es necesario ser muy deta-llista en esto de las pertenencias. Una unidad orga-nizativa puede contener usuarios y grupos… gru-pos que a su vez pueden incluir usuarios de ésa ode otra unidad organizativa. Y un grupo puede con-tener subgrupos, que a su vez pueden contener sub-grupos…

Saludos cordiales.

dotN

etM

anía

<<

44

dnm.plataforma.net<<

Figura 2. Tipos de grupos.

For Each el In _Solid.Servers.ActiveDirectory.Environment.Groups

‘agrega un ítem en la listaDim it As String = “G” & el.groupTypeWith ListView1.Items.Add(el.name)

Dim g As ListViewGroup = ListView1.Groups(it)If g Is Nothing Then

g = ListView1.Groups.Add(it, it)End If

.Group = g‘recorre las propiedades de la clase Group‘...

Listado 13. Agrupando por groupType.

Los servicios de directorio de Windows tienen un inconveniente, y es que aellos se accede a través de ADSI (Active Directory Service Interfaces), un

conjunto de interfaces COM modeladas a partir del protocolo LDAP (Lightweight Directory Access Protocol), diseñado en la era pre-nética

dotN

etM

anía

<<

45

Los métodos extensores

La mayoría de las novedades incluidas en los len-guajes de .NET Framework 3.5, y particularmen-te todo lo relacionado con las expresiones de con-sulta (LINQ), es posible gracias a los métodosextensores (o métodos de extensión, que es comose traduce esta característica en la documentaciónde Visual Studio 2008), ya que mucha de esa nue-va funcionalidad se implementa mediante méto-dos agregados a las clases e interfaces del propio.NET Framework, particularmente en extensio-nes agregadas a la interfaz IEnumerable(Of T). Pero,lo primero es lo primero, y es explicar qué es unmétodo extensor.

¿Qué es un método extensor?

Los métodos extensores son métodos que pode-mos definir en nuestro proyecto para extender la fun-cionalidad de cualquier clase, ya sea de las que tene-mos definidas en el propio proyecto o bien clasesdefinidas en el propio .NET o por cualquier otrodesarrollador. La ventaja es que esa definición demétodos no requiere que tengamos acceso al códi-go fuente de la clase original, y es especialmente útilpara aquellas clases que están “selladas”, es decir, delas que no podemos crear nuevas clases derivadas.

¿Cómo definir un método extensor en VisualBasic?

Para crear métodos de extensión en Visual Basic,tenemos que definir esos métodos en un módulo, yaque los métodos extensores deben estar siempre dis-ponibles y no depender de ninguna instancia en par-ticular. Además, tenemos que indicarle al compila-dor que el método en cuestión está extendiendo lafuncionalidad de una clase; para ello tendremos queindicar qué clase queremos extender, y esa clase laindicaremos como el primer parámetro del método.Pero además también tenemos que indicarle al com-pilador que estamos ampliando la funcionalidad dedicha clase, y para ello tenemos que aplicar el atri-

Isla VB

Guillermo “Guille”Som

Es Microsoft MVP deVisual Basic desde

1997. Es redactor dedotNetManía, mentorde Solid Quality Men-

tors, orador de INETALatam, y autor de los

libros “Manual Impres-cindible de Visual Basic

.NET” y “Visual Basic2005” y “Novedadesde Visual Basic 9.0” y

próximamente “Apren-da C# 3.0 desde 0.0 –

Parte 3: Lo nuevo” .http://www.elguille.info.

La versión de Visual Basic que se incluye con .NET Framework 3.5 o VisualStudio 2008 permite que creemos métodos que extiendan la funcionalidadde clases existentes sin necesidad de tener acceso al código fuente de éstas.En este artículo veremos cómo crear este tipo de métodos y qué conside-raciones debemos tener en cuenta para usarlos de la forma más adecuada.

Guillermo «Guille» Som

Extender o no extender...Los métodos extensores en Visual Basic 2008

Guillermo Som ingresará los derechos de autor deeste artículo en la cuenta de Ayuda a Juanma a vivir.Desde aquí, invita a los lectores de esta isla solida-ria para que hagan sus aportaciones o participen enlas subastas que se realizan desde la Web de Juan-ma para recaudar fondos con el fin de ayudar en lainvestigación de una cura para la enfermedad deAlexander. http://www.ayudajuanma.es.

Isla solidaria

dotN

etM

anía

<<

46

dnm.isla.vb<<

buto Extension a la definición del método extensor.El atributo Extension está definido en el espacio denombres System.Runtime.CompilerServices. Para com-prender mejor cómo definir un método extensor, veá-moslo con un ejemplo. En el listado 1 tenemos unmétodo llamado TrimMid que extiende la funcionali-dad de la clase String añadiendo un nuevo método,que en este caso concreto elimina todos los caracte-res “blancos” que tenga una cadena (incluso los queno están al principio o al final).

En el código del listado 1 estamos usando expre-siones de consulta para hacer el trabajo de recuperarsolo los caracteres que no son considerados comocaracteres blancos, para lo que he usado la funciónIsWhiteSpace de la clase Char, y debido a que el resul-tado de esta expresión de consulta es una colección deltipo IEnumerable(Of Char), he tenido que usar el méto-do extensor ToArray (definido por el propio .NET Fra-mework) para convertir esa colección en un array detipo Char, que como sabemos, el propio Visual Basicconvierte en una cadena de caracteres, que es lo quefinalmente se devuelve en esta función.

Utilizar los métodos extensores

Para usar los métodos extensores no tenemos quehacer nada en especial, salvo indicar el método quequeremos usar, pero esto es algo que siempre ten-dremos que hacer para usar un método cualquiera,sea propio de la clase o porque se haya definido comométodo extensor.

Si estamos usando Visual Studio 2008 para escri-bir nuestro código, al mostrar los métodos extenso-res por medio de Intellisense, éstos se mostrarán conuna flechita azul; de esta forma nos resultará fácil iden-tificar cuáles son los métodos propios y cuáles losmétodos de extensión. En la figura 1 vemos cómo semuestra el método extensor que tenemos definido enel listado 1.

Como vemos en la figura 1, para usar el métodoextensor que hemos definido en el listado 1 solo tene-mos que indicarlo en una variable (o constante) deltipo que estamos extendiendo, y la forma de usarlo esla habitual, es decir, que no tenemos que hacerlo deninguna forma extraña. Otra cosa es que queramosusar ese método extensor como un método compar-tido normal y corriente. Si es esa la forma en que que-remos usarlo, lo haremos indicando el nombre de laclase (módulo en nuestro caso) en el que está defini-do, pero como lo estamos usando como un método“normal”, y no de extensión, tal como vemos en el lis-tado 2, tendremos que pasarle como argumento lacadena a la que queremos quitarle todos los espaciosque tenga.

Pero debido a que ese método está definido enun módulo, Visual Basic también nos permitiría usar-lo sin necesidad de indicar el nombre del módulo enel que está definido, ya que Visual Basic siempre haceuna importación del módulo (tipo); por tanto, todoslos métodos y demás elementos que contenga estaránsiempre accesibles. Pero esto es un tema diferente,y si el lector quiere saber más sobre los módulos ycómo se comportan, puede leer el artículo publica-do en esta misma sección del número 46 de dot-NetManía.

¿Qué podemos extender?

Ya hemos visto cómo crear y usar un métodoextensor, y también sabemos que podemos agregarnueva funcionalidad a cualquier tipo de datos, inclu-so los tipos por valor. Por ejemplo, podemos agregar

Module Extensiones<Extension()> _Public Function TrimMid(ByVal str As String) _

As StringDim q = From c In str _

Where Not Char.IsWhiteSpace(c) _Select c

Return q.ToArrayEnd Function

End Module

Listado 1. Un método que extiende la funcionalidad de laclase String

Figura 1. Intellisense muestra los métodosextensores con una flecha

res = Extensiones.TrimMid(s)

Listado 2. Los métodos extensores se pueden usar comométodos de clase

dotN

etM

anía

<<

47

dnm.isla.vb<<

nueva funcionalidad a los tipos enteros, etc. Pero paraun buen uso de todos los métodos extensores que deci-damos crear, debemos saber qué podemos extendery qué problemas (o inconvenientes) nos podemosencontrar al crear esas extensiones.

Lo primero que debemos saber es que solo pode-mos crear extensiones en métodos, es decir, elemen-tos Function o Sub. Lo habitual es que los métodosextensores siempre devuelvan algo, pero tal como VisualBasic funciona, es muy fácil crear un método extensorde tipo Sub (no devuelve un valor); pero en ese caso,tendremos que definir el parámetro del tipo a exten-der por referencia. Por ejemplo, si tenemos el códigodel listado 3, estamos agregando un método a la claseString que permite modificar la cadena a la que se apli-ca ese método de extensión, y por tanto, lo podremosusar tal como vemos en el listado 4. Pero esto no es lohabitual, además de que es mejor no modificar direc-tamente el objeto al que se aplica el método por la sen-cilla razón de que si usamos una constante no hará nada,y por tanto, no tendrá ninguna utilidad.

En cualquier caso, si es ésta la funcionalidad quequeremos en nuestro método extensor, lo recomen-dable es definirlo como una función, que además demodificarla, devuelva el contenido de esa variable. Deesa forma, el método servirá tanto para variables comopara constantes. En el listado 5 vemos una modifica-ción del método TrimAll para que haga lo que acabode comentar.

Sobrecargas en los métodos extensores

Ya sabemos que solo podemos extender métodos,la siguiente pregunta es: ¿podemos crear sobrecargasde métodos existentes? La respuesta es: sí. Inclusopodemos definir métodos que tengan la misma firmaque uno existente en la clase que queremos extender,aunque en este caso, simplemente se ignorará esa defi-nición, ya que las sobrecargas definidas en las clases

tienen preferencia sobre las extensiones que defina-mos. Y si eso ocurre, el compilador no nos avisará deninguna forma de que esa extensión no se usará. Estono hay que tomarlo con un error, ya que es conve-niente saber que siempre tienen preferencia las defi-niciones “nativas” del tipo de datos, y que los méto-dos extensores solo se usarán si no existe una sobre-carga en el tipo que estamos extendiendo. Dicho esto,queda claro que podemos crear sobrecargas de méto-dos existentes en el tipo que queremos extender eincluso entre diferentes métodos extensores.

Las definiciones “nativas” del tipo de datos siempre tienen preferencia, y los métodos extensores solo seusarán si no existe una sobrecargaadecuada en el tipo que estamos

extendiendo

s.TrimAll()

Listado 4. Los métodos extensores de tipo Sub debenaplicarse a la variable

<Extension()> _Public Function TrimAll(ByRef str As String) _

As Stringstr = str.TrimMidReturn str

End Function

Listado 5. Los métodos extensores admiten parámetros porreferencia

Comentar que solo Visual Basic permite crear métodosextensores que reciban el primer parámetro por referen-cia (el tipo a extender), ya que en C# no podemos defi-nir ese primer parámetro usando los modificadores outo ref. Y aunque ese método lo podamos usar desde C#(agregando una referencia al proyecto de VB), esa exten-sión no aparecerá en la lista de métodos disponibles.

[ ]NOTA

<Extension()> _Public Sub TrimAll(ByRef str As String)

str = str.TrimMidEnd Sub

Listado 3. Un método extensor que no devuelve un valor

dotN

etM

anía

<<

48

dnm.isla.vb<<

Métodos extensores en tipos genéricos

Los tipos de datos que indiquemos para un méto-do extensor también pueden ser genéricos. Por ejem-plo, si quisiéramos crear un método extensor para lostipos por valor (estructuras), podemos hacer algocomo vemos en el listado 6.

Aunque no es necesario que hagamos ninguna res-tricción, en este ejemplo la he hecho para que quedeclaro que podemos restringir los tipos a los que que-ramos aplicar ese método.

Distribuir un proyecto con métodos extensores

Los métodos extensores los podemos usar en pro-yectos en los que hayamos definido el módulo con losmétodos; pero si queremos que otros programadorestambién puedan usarlos, debemos compilarlo en unensamblado y distribuirlo. De esta forma pondremosa disposición de otros programadores los métodos deextensión que hemos definido, pero si queremos haceresto, tenemos que tener en cuenta que los módulostienen un ámbito predeterminado del tipo Friend, ypor tanto solo estarán disponibles dentro del mismoproyecto en el que estén definidos. Sabiendo esto,debemos tener la precaución de definir el módulo conel modificador Public. Y para evitar conflictos de nom-bres, ese módulo debería estar en un espacio de nom-bres, aunque esto último no es necesario hacerlo expre-samente, ya que al crear un proyecto de Visual Basicsiempre se crea un espacio de nombres para dicho pro-yecto, pero es conveniente tenerlo en cuenta.

Si nuestro ensamblado con los métodos extenso-res se usará desde C#, debemos tener en cuenta queese lenguaje no permite usar métodos en los que hayaparámetros opcionales. Por tanto, la forma de usarun método extensor que defina parámetros opciona-les será diferente en Visual Basic que en C#. Por ejem-plo, si tenemos el método definido en el listado 7,desde Visual Basic lo podemos usar de las dos formasmostradas en el listado 8. Sin embargo, en C# siem-pre tendremos que indicar el valor de ese parámetroopcional, y por tanto tendremos que usarlo tal comovemos en el listado 9.

¿Cuándo usar los métodos extensores?

Ésta seguramente es una pregunta que algunos seharán para decidir si tienen que usar los métodos

<Extension()> _Public Function ToHex(Of T As Structure)( _

ByVal num As T) As StringReturn Microsoft.VisualBasic.Hex(num)

End Function

Listado 6. Los métodos extensores los podemos aplicartambién a tipos genéricos

<Extension()> _Public Function TrimOpcional( _

ByVal str As String, _Optional ByVal quitarCifras As _

Boolean = False) As String

Dim sb As New StringBuilder

For Each c In strIf Char.IsWhiteSpace(c) _

Then Continue ForIf quitarCifras AndAlso Char.IsNumber(c) _

Then Continue Forsb.Append(c)

Next

Return sb.ToStringEnd Function

Listado 7. Definición de un método extensor conparámetros opcionales

s = “ Prueba con cifras 123 y letras”

res = s.TrimOpcionalConsole.WriteLine(res)

Console.WriteLine()

res = s.TrimOpcional(True)Console.WriteLine(res)

Listado 8. En Visual Basic podemos usar los métodosextensores con parámetros opcionales de la forma habitual

s = “ Prueba con cifras 123 y letras”;

// En C# hay que indicar siempre los parámetrosopcionalesres = s.TrimOpcional(false);Console.WriteLine(res);

Console.WriteLine();

res = s.TrimOpcional(true);Console.WriteLine(res);

Listado 9. En C# siempre tenemos que indicar el parámetroopcional

extensores o buscar otra forma de conseguir lo mis-mo. La respuesta, como siempre, dependerá de lo quenosotros decidamos.

Si somos los autores del tipo de datos que queremosextender, nos tendremos que plantear si ese método esnecesario en la mayoría de ocasiones que se utilice el tipode datos. Si la respuesta es no, ya que es posible que sólolo necesitemos en contadas ocasiones, es obvio que lamejor opción es crear un métodoextensor.

Otra razón para que nos decan-temos por el método extensor enlugar de modificar la definición deltipo de datos es para mantener lamisma versión de ese tipo, ya que simodificamos los métodos expuestos,lo lógico es pensar que estamos cre-ando una nueva versión, y si ese tipode datos lo tenemos compilado enun ensamblado, deberíamos incre-mentar la versión de dicho ensam-blado, y esto es posible que no nosinterese hacerlo.

También debemos tener en cuen-ta que los métodos definidos en elpropio tipo siempre tienen prefe-rencia sobre los definidos comométodos extensores. Por tanto, siqueremos ofrecer esa funcionalidady no dejar que sea el usuario que uti-liza nuestro tipo el que defina unmétodo con ese nombre, la opciónmás efectiva es definirlo en el propiotipo.

Por otro lado, si no tenemosacceso al código de ese tipo que que-remos extender, solo nos queda laopción de definirlo como un méto-do extensor.

Pero como he comentado antes,la decisión final la tenemos quetomar nosotros, y esa decisión la ten-dremos que tomar evaluando cualserá la opción que mejor se adapta anuestras necesidades.

ConclusionesEn este artículo hemos visto cómoutilizar los métodos extensores, deforma que podamos agregar nuevafuncionalidad a las clases existentessin necesidad de tener acceso al códi-

go fuente de esos tipos que queremos extender. En laWeb de la revista puede descargar el código de ejem-plo, en el que también se incluye un proyecto de C#para que pueda probar todo lo comentado. Y comoen esta isla también llega el verano, nos tomamos unpequeño descanso, pero en septiembre volveremoscon más cosas interesantes sobre Visual Basic.

¡Feliz verano!

dnm.isla.vb<<

EL PRIMER E-BOOK EN CASTELLANO EDITADO PORSOLID QUALITYTM PRESS SOBRE VISUAL BASIC 9.0

COMO EL MISMO TÍTULO SUGIERE: "NOVEDADESDE VISUAL BASIC 9.0", ESTE LIBRO CONTIENE TODALA INFORMACIÓN SOBRE LA NUEVA VERSIÓN DELCOMPILADOR DE VISUAL BASIC QUE SE INCLUYEEN VISUAL STUDIO 2008.

http://www.solidq.com/ib/eBookDetail.aspx?Id=1

TODAS LAS NOVEDADES DE

VISUAL BASIC 9.0AL DETALLE

INCLUSO LO QUEOTROS NO TE

HAN CONTADONUNCA

Y TODO DE UNAFORMA “CASI”

FÁCIL DE ENTENDER

Me da la impresión de que te has propuesto cons-truir la perfecta interfaz Web que resulte total-mente configurable. Si es así, resulta un reto másque interesante. Tu pregunta puede desdoblarseen dos. Una es cómo añadir en la práctica algúncontenido a la propiedad ItemTemplate de un con-trol ListView. La otra es cómo transformar untexto leído de una base de datos en una colecciónde controles ASP.NET que puedan ser añadidosa la plantilla de un control enlazado a datos. Vamosa responder primero a estos dos aspectos, y des-pués añadiré alguna recomendación sobre cómoconstruir la aplicación ASP.NET “perfecta”, o sea,totalmente contenida en una base de datos.

La propiedad ItemTemplate, al igual que cual-quier otra propiedad de las plantillas de los con-troles ASP.NET, se define mediante la interfazITemplate. ITemplate se define de la siguienteforma:

public interface ITemplate

{

void InstantiateIn(Control container);

}

Casi siempre, las propiedades de las plantillasse establecen de forma declarativa mediantecódigo de marcas ASP.NET, ya sea de formamanual, o mediante código autogenerado poralgún diseñador de Visual Studio. Y estableceruna propiedad de plantilla de forma manual esinteresante muchas veces y más sencillo de loque se piensa. Basta con disponer de un obje-to que exponga la interfaz ITemplate. Tambiénse puede crear un tipo personalizado y hacerque implemente dicha interfaz. Supongamosque ese tipo se llamase MyTemplateFromDb. Elsiguiente código muestra cómo usarlo en códi-go real:

Plantillas ASP.NETe inferencia de tipos en C#

Dino Esposito

Arquitecto en IDesign,Dino Esposito es una de

las autoridades mundialesreconocidas en tecnologías

Web y arquitectura desoftware. Sus libros másrecientes son "Program-ming ASP.NET 3.5-Core

Reference" e "IntroducingMicrosoft ASP.NET AJAX"

(Microsoft Press). Esponente regular en even-

tos de la industria deámbito mundial, como

TechEd o DevConnec-tions, y europeos, como

DevWeek y Basta.

Soy suscriptor de dotNetManía a través de la empresa, y he leído en el número 44, pág. 52, un artícu-lo tuyo sobre cómo cargar en tiempo de ejecución el ContentTemplate de un control UpdatePanel.Es muy interesante, y quiero hacer algo similar con los ItemTemplate de un ListView, pero meencuentro con una duda. En tiempo de ejecución, voy creando los literales y los controles que nece-sito para hacer container.Controls.Add, y funciona bien, pero mi intención es poder tener plantillasguardadas en la base de datos para que el usuario en tiempo de ejecución seleccione la que quiera.Entonces no sé cómo puedo "traducir" un trozo de código que contenga etiquetas HTML del tipo<TR>, pero que también incluya etiquetas ASP.NET del tipo <asp:label> para poderlo cargar de unaforma directa en una plantilla. ¿Tienes algún ejemplo al respecto?

todonet@qa

Abordamos este mes un examen en profundidad de las propiedades de las plantillasde ASP.NET, y concluiremos explicando los pros y contras del uso de la nueva palabrareservada var en C#.

tod

otN

et.q

a@

dot

net

mania

.com

MyTemplateFromDb template = new

MyTemplateFromDb(...);

ListView1.ItemTemplate = template;

Internamente, cuando el control ListView nece-sita el contenido de la plantilla, llama al método Ins-tantiateIn del objeto ITemplate que le hemos sumi-nistrado. Y este comportamiento no es específico delcontrol ListView; es típico de cualquier controlASP.NET que soporte plantillas con propiedades. Deforma que lo que sucede cuando el control ListViewutiliza la plantilla depende esencialmente de la imple-mentación del método InstantiateIn.

¿Cómo podría ser una implementación de estetipo en una clase MyTemplateFromDb? Si deseamos car-gar código de marcas a partir de una base de datos,ejecutamos una consulta sobre la tabla apropiada yasociamos la información leída a una variable de tipostring, como en el código siguiente:

public class MyTemplateFromDb : ITemplate{

public void InstantiateIn(Control container){

string markup = ReadFromDb(...);// ...

} // ...

}

El siguiente problema es encontrar una forma detransformar el código de marcas en una colección decontroles. Sin más rodeos, necesitas un parser deASPX. ¿Construimos uno o nos compramos algunode la oferta existente?

Afortunadamente, ASP.NET viene con un méto-do no muy conocido que invoca al parser propio deASPX. En particular, se puede sustituir el parser están-dar por uno personalizado modificando una zona delfichero Web.config. El método al que me refiero ave-rigua cuál es el parser adecuado para la página activay le utiliza para llevar a cabo la operación. El méto-do es ParseControl y se define en la clase Template-Control, que a su vez hereda de Control y es el ante-cesor jerárquico de la clase Page. Este método se defi-ne de la siguiente forma:

public Control ParseControl(string content);

Este método acepta una cadena de marcadoASP.NET y la analiza para producir un objeto Con-trol. Este objeto puede entonces añadirse a cualquierformulario Web, control de usuario o propiedad Tem-plate. Si el código de marcado contiene más de uncontrol, se devuelve un grafo cuya raíz es el objetopadre y podemos averiguar cuántos controles indivi-duales posee mediante el siguiente código:

Control root = this.ParseControl(markup);

int numOfControls = root.Controls.Count;

En este punto, en el cuerpo del método Ins-tantiateIn añadimos simplemente este grafo decontroles al contenedor suministrado, tal y comose muestra aquí:

public class MyTemplateFromDb : ITemplate

{

public void InstantiateIn(Control container)

{

string markup = ReadFromDb(...);

Control root = this.ParseControl(markup);

container.Controls.Add(root);

// ...

}

// ...

}

En ASP.NET, existen dos sobrecargas del méto-do ParseControl. La segunda sobrecarga tiene lasiguiente definición:

public Control ParseControl(string content,

bool ignoreParserFilter);

El segundo parámetro booleano indica si el par-ser debe tener en cuenta cualquier filtro indicado paraestablecer qué etiquetas se ignoran (este es otro aspec-to de ASP.NET sutilmente configurable).

Tal y como hemos dicho, el método ParseControlemplea el parser activo de ASP.NET. Así que, cuan-do el mecanismo se activa, el proceso es exactamen-te igual al proceso predeterminado directamente porASP.NET. Esto significa, por ejemplo, que bloquesconsecutivos de literales HTML son asociados al mis-mo control.

dotN

etM

anía

<<

51

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

dnm.todonet@qa<<

Lo que sucede cuando el control ListView utiliza la plantilla depende

esencialmente de la implementacióndel método InstantiateIn

La palabra reservada var en C# 3.0 tiene que ver con lainferencia de tipos, pero no con LINQ como mecanis-mo de consultas. Simplemente, o el desarrollador esdemasiado perezoso para declarar el tipo exacto de obje-to que está definiendo, o no lo conoce en absoluto, demodo que le indica al compilador que utilice el tipodeterminado por la expresión de inicialización de la sen-tencia. Puede que el desarrollador realmente no conoz-ca el tipo que devuelve esa expresión. ¿Cómo puede ser que no conozcamos el tipo de varia-ble que queremos usar? Solo hay una posibilidad razo-nable: que se estén manejando tipos anónimos. Un tipoanónimo es un tipo sin nombre que se define en C# alutilizar inicializadores, como por ejemplo en:

var person = new { FirstName="Nancy", LastName="Davolio", Age=28

};

Para el CLR, los tipos anónimos y no anónimos sonexactamente lo mismo. Los tipos anónimos se puedenutilizar en escenarios muy variados, pero se introduje-

ron principalmente para el soporte de las consultasintegradas de LINQ. De forma que aquí está el “quid”de la cuestión. La palabra reservada var se usa princi-palmente para recoger los resultados de consultasLINQ.

var data = from c in db.Customersselect new {c.CompanyName, c.ContactName};

En C# 3.0, var no indica una referencia tardía (latebinding), ya que se resuelve estáticamente. Debido aesto, se requiere siempre una expresión de asignaciónen la sentencia para evitar un error del compilador. Deforma que, al usarla, siempre se obtiene un elementofuertemente tipado. El compilador realiza todo el traba-jo, así que no hay sobrecarga extra alguna en tiempo deejecución. En general, la utilización de la palabra reser-vada var con tipos no anónimos es posible, pero no reco-mendable. Sin dudas, permite teclear menos código.Pero, ¿cuánto se gana en productividad al evitar escri-bir un nombre de tipo? A mí me parece una cuestión depereza más que de rapidez.

dotN

etM

anía

<<

52

dnm.todonet@qa<<T

odot

Net.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

Traducido al castellano por Marino Posadas

En mi empresa estamos discutiendo acerca de la utilización de la nueva palabra reservada var, introducidacon LINQ, y nos gustaría saber si se debería usar también en otras situaciones. Esto es, ¿si se utiliza encontextos diferentes de las consultas LINQ, afectaría a la legibilidad, el rendimiento u otros aspectos delsistema?

Otro enfoque, quizás más senci-llo, supone el uso del método Load-Template del control TemplateControl.Este método toma una URL de uncontrol de usuario como entrada ydevuelve un objeto creado dinámi-camente que contiene el control deusuario más la implementación deITemplate. El tipo real de ese objetodevuelto es SimpleTemplate. Parausarlo, sin embargo, se necesita tenerun UserControl, o sea que la cuestiónaquí es cómo obtener un control des-de una base de datos.

Hay dos formas. Una supone quese cree un control de usuario con todala interfaz de usuario necesaria y sealmacene la URL del control en labase de datos. La otra supone leer elcódigo de marcado de la base dedatos y crear un fichero temporal conla extensión ASCX para cargarlo enla plantilla del control ListView. Sin

embargo, crear ficheros temporalespuede ser problemático en ASP.NET,más que por problemas de codifica-ción por aspectos relacionados conla seguridad.

Y para concluir con la respues-ta a esta pregunta, permíteme echarun breve vistazo a una tecnologíaASP.NET que puede utilizarse paraalmacenar un sitio Web entero enuna base de datos. Se basa en unoscomponentes especiales conocidoscomo proveedores virtuales derutas (virtual path providers), y setrata de una clase que suministra unconjunto de métodos para habilitarla posibilidad de que una aplicaciónWeb recupere sus recursos de unsistema virtual de ficheros. Con estesistema se puede almacenar esosdatos donde se desee, incluyendopor supuesto una tabla de base dedatos.

DbPathProvider provider = new

DbPathProvider();

HostingEnvironment.

RegisterVirtualPathProvider(provider);

El código precedente muestracómo registrar un proveedor perso-nalizado en una aplicación ASP.NET.Este código debería ejecutarse cuan-do se lanza la aplicación. ASP.NETinterroga al proveedor virtual regis-trado y lee el contenido indicado poréste. Se puede crear un proveedorpersonalizado que recupere el con-tenido de cada página lógica ASPX apartir de cualquiera de los almacenesde datos soportados, incluyendo latabla de la base de datos que nos ocu-pa. Para más información sobre losproveedores virtuales de rutas, visitala página: http://msdn.microsoft.com/en-us/library/system.web.hosting.

virtualpathprovider.aspx.

www.Abox.com

…We make sure your application rocks!Advantage Database Server es un sistema de base de datos cliente/servidor de alto rendimiento y total-mente equipada, especialmente diseñado para darrespuesta a las necesidades de los desarrolladores deaplicaciones• Proporciona tanto acceso a tablas de datos ISAM como SQL • Acceso nativo a archivos dbf a través de Cliente/Servidor,

sin necesidad de importar datos.• Multi Plataforma (Windows, Linux, Netware) • Bajo Coste Total de Propiedad: fácil instalación, administración

cero, Requisitos mínimos de hardware.

Mejoras y nuevas Funcionalidades en la version 9: • Mejoras en el soporte de FoxPro: Advantage 9 soporta la versión

de Visual FoxPro 9. • SQL Debugger ha sido añadido a la versión 9 de ADS Architect. • Notificaciones de Eventos. • 64-bit en servidores Windows y Linux: Advantage ha sido

adaptado para funcionar como aplicación nativa de 64-bit en las versiones de x64 de Windows y Linux.

A que espera!Consiga ya 2 usuarios gratuitos (solo para desarrollo) enviando unEmail a [email protected]

C/ Manso, 26-28, 2ª planta 08015 Barcelona Teléfono: 93 426 22 57E-mail: [email protected]

Como podrá confirmar el lector al consultar latabla 1, Aspose.Total for .NET va más allá delo que ofrecen otras suites de similares propósitosdisponibles en el mercado, incluyendo no solo losclásicos controles destinados a potenciar la inter-faz de usuarios de nuestras aplicaciones (rejilla,gráficos comerciales, etc.), sino además toda unaserie de componentes utilitarios para llevar a cabode una manera cómoda y eficiente diferentes tare-as que se presentan con bastante frecuencia duran-te el desarrollo de aplicaciones. Es de destacar quela empresa ofrece también una versión paralela enJava de la suite, Aspose.Total for Java, hecho quepuede ser muy interesante para las empresas quedesarrollen tanto para .NET como para la plata-forma Java.

Componentes para formatos de ficheros

Uno de los principales grupos de componentes queincorpora Aspose.Total es el de los componentes quepermiten el tratamiento de diferentes formatos de fiche-ros muy comunes en la informática de hoy, como sontodo tipo de documentos de la suite Office (Word, Excel,PowerPoint) u otros como Adobe PDF o Adobe Flash.Se trata de clases que han sido desarrolladas en C# al100% y no dependen de manera alguna de la disponi-bilidad en el equipo de destino de ningún prerrequisi-to, lo que se traduce en una máxima economía y faci-lidad de despliegue, además de un excelente rendi-miento. La amplitud y naturalidad de los modelos deobjetos de documento (DOM) que los diferentes com-ponentes ofrecen los hacen ideales para todo tipo detareas de automatización. En lo relativo a los formatosde Office, cabe destacar el soporte completo para OpenXML, ya un estándar internacional.

Componentes visualesPor supuesto, no podía faltar en una suite como ésta unconjunto de controles destinados a potenciar las inter-faces de usuario de las aplicaciones Windows yASP.NET. Además de las tradicionales rejillas y viso-res de gráficos comerciales, cabe destacar en esta cate-goría un potente editor de textos (tanto para Windowscomo para la Web) que pone a disposición de sus usua-rios muchas de las posibilidades de Word, y un com-pleto control de código de barras (figura 1).

Componentes utilitariosPor último, la otra categoría en la que se puede agru-par a varios de los componentes que integran Aspo-

Aspose.Total for .NET

Laboratorio.net

Este mes presentamos Aspose.Total for .NET, una potente suite de componen-tes reutilizables creados y comercializados por la empresa australiana Aspose,que pueden ser adquiridos conjuntamente o por separado para ser incorpora-dos a todo tipo de aplicaciones .NET.

Nombre: Aspose.Total for .NETVersión: 1.4Fabricante: AsposeSitio Web: http://www.aspose.comCategoría: Componentes reutilizablesPrecio:

• Suscripción a suite completa: 1.999 USD• Paquetes individuales: desde 249 USD• Descuentos por compra de múltiples pro-

ductos y licencias.• Todas las compras incluyen actualiza-

ciones y parches, más soporte técnicogratuito durante un año.

Ficha técnica

Octavio Hernández esMentoring TeamLeader de Plain

Concepts, editortécnico de

dotNetManía y tutorde campusMVP.

Es MVP de C# desde2004, MCSD y MCT.

Octavio Hernández

dotN

etM

anía

<<

55

dnm.laboratorio.net<<

se.Total es la de utilitarios. Se trata de componentes novisuales que facilitan la implementación de diversas tare-as, que van desde la programación de aplicaciones conec-tadas a la comprobación ortográfica. Puede ver un resu-men de lo que hacen esos componentes en la tabla 1.

Un pequeño ejemplo

Difícilmente pueda ofrecer algo novedoso para el lectorversado en el desarrollo .NET un ejemplo básico en elque se muestre cómo utilizar una librería de clases. Por

Librerías que componen Aspose.Total for .NET

Componentes para formatos de ficheros

Aspose.Words Permite leer, crear y modificar documentos de Word sin utilizar Microsoft Word. Ofrece soportecompleto para todas las funcionalidades que ofrece Word, y para el tratamiento de documentos enlos formatos DOC, DOCX, RTF, HTML y TXT.

Aspose.Cells Permite leer, crear y modificar documentos de Excel sin utilizar Microsoft Excel. Ofrece soportecompleto para todas las funcionalidades que ofrece Excel, y para el tratamiento de documentos enlos formatos XLS y XLSX, además de la importación y exportación a otros diversos formatos.

Aspose.Slides Permite leer, crear y modificar documentos de PowerPoint sin utilizar Microsoft PowerPoint. Ofre-ce soporte completo para todas las funcionalidades que ofrece PowerPoint, y para el tratamiento dedocumentos en los formatos PPT y PPTX.

Aspose.Pdf Permite a las aplicaciones .NET generar documentos PDF (tanto mediante código como a partirde plantillas XML y ficheros XSL-FO) sin utilizar Adobe Acrobat. Incluye soporte para numerosascaracterísticas avanzadas, como compresión, utilización de tablas, gráficos, imágenes, hiperenlaceso fuentes personalizadas.

Aspose.Pdf.Kit Permite a las aplicaciones .NET gestionar y actualizar documentos PDF sin utilizar Adobe Acro-bat. Orientado a tareas de tratamiento de información, como la combinación de datos en documentosexistentes y la gestión de formularios embebidos en ficheros PDF.

Aspose.Tasks Permite a las aplicaciones .NET generar y manipular documentos de Project (MPX, MPP, MPD yXML) sin utilizar Microsoft Project, ofreciendo un amplio conjunto de funcionalidades relaciona-das con la gestión de especificaciones de proyectos.

Aspose.Flash Permite generar y manipular dinámicamente documentos de Flash desde las aplicaciones .NET, unaposibilidad muy interesante de cara al desarrollo de sitios Web impactantes.

Aspose.Form Ofrece un conjunto de controles Web que permiten trabajar con plantillas de InfoPath a través deun navegador.

Componentes visuales

Aspose.Grid Conjunto de dos potentes componentes de rejilla, uno para aplicaciones Windows y otro para apli-caciones Web, que ofrecen potentes API para dar un control total sobre la apariencia y comporta-miento de las rejillas.

Aspose.Chart Componente que hace posible la incorporación de gráficos comerciales y científicos a las aplicaciones.NET. Soporta 21 tipos de gráficos diferentes, así como innumerables variaciones de los mismos, y diver-sos efectos avanzados como la renderización 3D, transparencias, gradientes o dibujo personalizado.

Aspose.Editor Control que posibilita la edición de documentos DOC, RTF y HTML dentro de las aplicacionesWindows Forms y ASP.NET. Nos permite visualizar, editar e imprimir documentos de manera muysimilar a Microsoft Word, pero desde nuestra aplicación y de manera autónoma.

Aspose.BarCode Componentes robustos y fiables que permiten de una manera sencilla la incorporación de funcio-nalidad relacionada con códigos de barras en las aplicaciones .NET. Soporta las principales especi-ficaciones y estándares del mercado, y permite la exportación a múltiples formatos de imagen.

Aspose.AdHoc Generador de consultas SQL para aplicaciones ASP.NET, potente y fácil de usar, que puede ser uti-lizado para la generación directa de informes o la implementación de pantallas de búsqueda.

dotN

etM

anía

<<

56

dnm.laboratorio.net<<

lo tanto, nos limitaremos aquí a presen-tar la apariencia del Cuadro de herra-mientas de Visual Studio 2008 despuésde instalar uno de los paquetes integran-tes de la suite, en este caso el de códigosde barras (figura 1), y a mostrar un frag-mento de código que utiliza el compo-nente Aspose.Words (listado 1), para queel lector pueda hacerse una idea del mode-lo de programación que la librería ofre-ce. El sitio Web del fabricante ofrecemucha más información general, ejem-plos de código y de documentación,además de la posibilidad de descargar ver-siones de evaluación de 30 días.

Conclusiones

Aspose.Total for .NET ofrece un ampliosurtido de excelentes componentes, quepermiten potenciar de múltiples formas

el desarrollo de nuestras aplicaciones. Suadquisición, conjuntamente o de mane-ra independiente, constituye indudable-mente una buena inversión, que se amor-tizará casi inmediatamente.

Librerías que componen Aspose.Total for .NET

Componentes utilitarios

Aspose.Network Paquete de componentes .NET flexibles y fáciles de usar para la programación de todo tipo de apli-caciones de comunicaciones. Incluye no solo implementaciones de la gran mayoría de los protoco-los de red actualmente en uso, sino también numerosas clases auxiliares que simplifican el desarro-llo. Excelente complemento para las clases del espacio System.Net de .NET.

Aspose.Workflow Componente que ofrece un potente motor de flujos de trabajo, conjuntamente con un conjunto deobjetos de flujo construidos alrededor del estándar WFMC.

Aspose.iCalendar Librería .NET que ofrece numerosas clases y algoritmos para la generación de patrones tempora-les de recurrencia y la planificación de tareas, cuya implementación es coherente con la especifica-ción iCalendar (RFC 2445).

Aspose.Spell Componente para la verificación ortográfica en más de 20 idiomas. Soporta diccionarios personali-zados y puede ser utilizado tanto en aplicaciones para Windows como para la Web.

Aspose.ASPXpand Componente para aplicaciones ASP.NET que ofrece implementaciones de más de 60 funcionescomunes en las aplicaciones Windows pero difíciles de programar en aplicaciones Web: asignaciónde foco, edición con máscaras, completamiento automático, gestión de la tecla Intro, entre otras.

Tabla 1

Figura 1. Componentes de Aspose.BarCode

using System;using System.Windows.Forms;using Aspose.Words; // espacio de nombres de la librería

namespace WinApp4{

public partial class Form1 : Form{

public Form1(){

InitializeComponent();}private void button1_Click(object sender, EventArgs e){

// abrir documentoDocument doc = new Document(@”D:\DNM\49\Lab49_Aspose.docx”);// clase que encapsula los métodos // de manipulación de documentos WordDocumentBuilder builder = new DocumentBuilder(doc);// establecer formatobuilder.Font.Color = System.Drawing.Color.Blue;builder.Font.Underline = Underline.Single;// localizar un marcadorbuilder.MoveToBookmark(“FIRMA”);// insertar hiperenlacebuilder.InsertHyperlink(“Octavio Hernandez”,

“http://geeks.ms/blogs/ohernandez/”, false);// guardar documento modificadodoc.Save(@”D:\DNM\49\Lab49_Aspose_Firmado.docx”);

}}

}

Listado 1. Programa que procesa el documento de Word que contiene este artículo medianteAspose.Words

Programming Microsoft LINQPaolo Pialorsi y Marco RussoEditorial: Microsoft PressPáginas: 660Publicado: mayo de 2008ISBN: 978-0735624009Idioma: inglés

Aunque no muy conocidos previamente como autores, Pialorsi y Russo (consulto-res, formadores y fundadores de www.DevLeap.com) han obtenido con esta obra el reco-nocimiento internacional y una excelente aceptación por parte de los lectores, si bien yase habían estrenado con alguna obra anterior centrada en XML y los servicios Web.

La atención al material incluido, el esmero en el detalle, la selección cuidadosa de loscontenidos y su interés para los lectores, los ejemplos (que funcionan, y realmente sir-ven de explicación a los contenidos del texto), hacen del texto un material más que reco-mendable. A eso hay que unir los nuevos diseños editoriales de Microsoft Press: más con-cisos y organizados, con mejor tipografía y organización del material expuesto y una edi-ción más moderna. Todo ello se enmarca en la fase de renovación que se ha impuesto laeditorial y que, probablemente, el lector asiduo de MSDN Magazine ya ha podido com-probar en el último número de esa revista.

Professional C# 2008Christian Nagel, Bill Evjen, Jay Glynn, Morgan Skinner y Karli WatsonEditorial: Wrox PressPáginas: 1.782Publicado: marzo de 2008ISBN: 978-0470191378Idioma: inglés

Nagel y compañía atacan de nuevo. Y muy bien. Se trata de una obra de consulta yreferencia. Todos los autores, excepto Evjen, ya son viejos conocidos, y varios de ellos lohan sido de las primeras ediciones de esta obra para versiones previas del lenguaje, asícomo habituales de la editorial. Y esa experiencia en el lenguaje y en el oficio de escribirse aprecia en esta obra que cubre “todo lo que uno pueda necesitar hacer con el lengua-je C#”, según uno de sus lectores. No afirmaré yo tanto, pero lo cierto es que una lar-guísima parte de lo que es posible se encuentra aquí, debidamente organizado por con-textos de trabajo y utilización.

Es una obra un tanto monumental, sin duda exhaustiva (la más extensa publicada has-ta ahora sobre el tema; baste indicar que el número de capítulos es de 48, y todos conbastante contenido), y que consigue lo que pretende: que el lector la vea inmediatamen-te como la referencia a consultar cuando se plantea la pregunta típica: ¿y cómo se haríaen C# 3.0…? Se trata, probablemente, de lo más completo publicado hasta la fecha sobreeste lenguaje (y nada cara, considerando lo anterior).

biblioteca.net

nove

dad

es Silverlight 2.0 Bible

Brad Dayley. Editorial: Wiley. Páginas: 552. ISBN: 978-0470375006. Fecha de publicación:

octubre de 2008. Idioma: inglés.

Pro Silverlight 2 in C# 2008 Matthew MacDonald. Editorial: APress. Páginas: 400. ISBN: 978-1590599495. Fecha de

publicación: octubre de 2008. Idioma: inglés.

TEXTO: MARINO POSADAS

dotN

etM

anía

<<

58

desvánMarino Posadas

Warning: This Secret CSS Technique Will Surprise You!Se trata de un artículo de Alex Walkerque explica cómo conseguir mediantetécnicas puras de Hojas de Estilo en

Cascada efectos de animación a partir de imágenes estáticassecuenciales. Se trata nuevamente de una aportación intere-sante de este sitio (SitePoint), disponible en http://www.site-point.com/article/css-animation-technique.

“Regular Expressions: Now You Have TwoProblems” es una interesante reflexión paraprogramadores sobre las ventajas –y tambiénalguna desventaja– de la utilización de expre-

siones regulares. Jeff Atwood (Coding Horror) es el autorde este artículo disponible en su sitio: http://www.codingho-rror.com/blog/archives/001016.html, donde el lector encontraráseguramente otros materiales de interés.

Pixel Girl es un sitio dedicado a ofrecerarchivos (iconos, fondos de pantalla,etc.), artículos y tutoriales sobre cómo

mejorar la experiencia visual del usuario de una plataforma oprograma mediante el uso de efectos atractivos e iconografíaadecuada. Todo ello original de la autora, cuya Web ha sidoincluida como una de las 50 mejores del año 2008, que premiaanualmente la revista Time. (http://www.pixelgirlpresents.com).

Installed Codecs V 1.02 es unapequeña utilidad gratuita quepermite comprobar cuáles son (y

de qué versión) los códec de audio y vídeo instaladosen nuestro sistema, así como los filtros Direct Showactivos. Se encuentra disponible en http://nirsoft.net/utils/installed_codec.html.

documentos en la red

utilidades del mes

sitios del mes

Tiempo de cambios en Microsoft

El verano invita a la reflexión.Para la compañía de Redmond,además, el inicio del verano estambién el inicio de un nuevoperíodo económico, que esteaño está marcado inexorable-mente por la retirada del CEO

y alma mater de la compañía, William Henry Gates III (el pri-mero de la fila inferior de la foto, en 1978, el año de su funda-ción). Gates, atenderá un día a la semana asuntos relacionados conla empresa, dedicando la mayor parte de su tiempo a la Funda-ción Bill y Melinda Gates, cuyas principales actividades son lamejora de las condiciones de salud en zonas desfavorecidas (comoMozambique, donde trabaja el doctor español Pedro Alonso, encampañas de lucha contra la malaria y otras enfermedades), y laexpansión de las oportunidades educativas y el acceso a las tec-nologías de la información.

Si, como dice el sabio, “se conoce el corazón del hombre porlo que hace, y su sabiduría, por lo que dice”, Gates ha hecho mucho,quizá más que nadie, por cambiar el panorama de lo que hoy díaes la informática y el acceso del gran público a este valioso recur-so. Y ha sabido crear un imperio alrededor de esa idea. Tambiénha dicho y anticipado mucho sobre lo que tendría que ser lainformática del futuro, comenzando por su obra “The Road Ahe-ad”, donde ya se refería como PC monedero a lo que hoy cono-cemos como PDA, subrayando la importancia de la informáticamóvil, y donde se hablaba de interconectividad, librerías de soft-ware y muchas cosas que forman parte de la computación de hoy.

Sin embargo, los comienzos fueron complicados. La apari-ción del primer ordenador personal quepodría recibir tal nombre (el Altair8800) dio la oportunidad a Gates y PaulAllen de introducirse en el mercado.Gates les llamó para decirles que teníanuna versión del lenguaje BASIC parasu nueva máquina (falso, ni siquiera

tenían la máquina). Allen consiguió crear un simulador del Altairque funcionaba en el PDP-10 de Digital disponible en su escue-la, mientras Gates se centraba en el código del intérprete de BASIC.Ocho semanas más tarde, Allen introducía el código por prime-ra vez en un Altair real. Si cualquier parte del código (del pro-grama o del simulador) hubiera fallado, todo se habría ido al tras-te. Pero no fue así. El programa funcionó perfectamente la pri-mera vez y se llamaba 4k BASIC en referencia a la memoria nece-saria para su ejecución. A esto le siguió un contrato con los crea-dores de Altair (MITS). Un año más tarde, Gates se salía de laUniversidad de Harvard y fundaba Microsoft.

El reto que deja a sus sucesores es grande. Como decía JuanLuis Cebrián (exdirector del diario “El País” y académico) en suobra “La red”: “será necesario invertir de forma continuada, y has-ta terca, en la formación de los ciudadanos acerca no solo de lautilización de las nuevas tecnologías, sino en las consecuencias desu implantación”.

noticias.noticias.noticias

Varun Kashyap, de www.makeuseof.com, propone unconjunto de herramientas

gratuitas alternativas a la suite de creación de conteni-dos de Adobe. Desde programas de creación de docu-mentos PDF o contenidos gráficos, hasta editores desonido. Para descargas y explicación de cada una, visi-tar http://www.makeuseof.com/tag/say-goodbye-to-adobe-creative-suite.

COLOURlovers. Otro sitio recomendado que parece más utilque nunca con las necesidades de diseño de aplicaciones quese dan hoy en día es COLOURlovers, donde podemos encon-trar todo lo que necesitemos a la hora de escoger un tema decolor para un sitio Web, una aplicación impactante o un jue-go. De especial utilidad para webmasters innovadores(http://www.colourlovers.com).