dotnetmanía · 2011-04-22 · disposición para hacer uso de los procedimientos almacenados...

60
dedicada a los profesionales de la plataforma .NET www.dotnetmania.com entrevista Ted Pattison Presidente de Ted Pattison Group dotNetManía Uso de GPS desde Windows Mobile nº 49 junio 2008 6,50 Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows Server System dotNetManía LINQ para consultas y actualizaciones Entrevista a los ganadores de la final española de Imagine Cup 2008 TodotNet@QA comunidad.NET Uso de GPS desde Windows Mobile El Marco de trabajo de entidades de ADO.NET v3.5 (VI) • Exprime al máximo .NET Compact Framework • Rendir o no rendir… Viejas costumbres, nuevas formas, versión 2.0 • Estresando aplicaciones BizTalk con LoadGenerator

Upload: tranliem

Post on 01-Oct-2018

244 views

Category:

Documents


0 download

TRANSCRIPT

dedicada a los profesionales de la plataforma .NET

www.

dotne

tman

ia.co

m

entrevistaTed PattisonPresidente de Ted Pattison Group

dotNetManíaUso de GPS

desde Windows Mobile

nº 49 junio 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows Server System

dotNetManíaLINQ para consultas y actualizaciones

Entrevista a los ganadores de la finalespañola de Imagine Cup 2008

TodotNet@QA

comunidad.NET Uso de GPSdesde Windows Mobile

El Marco de trabajo de entidades de ADO.NET v3.5 (VI) • Exprime al máximo .NET Compact Framework • Rendir o norendir… Viejas costumbres, nuevas formas, versión 2.0 • Estresando aplicaciones BizTalk con LoadGenerator

Bienvenido al número 49, de junio de2008, de dotNetManía.

Este mes entrevistamos a Ted Pat-tison, uno de los autores míticos desdela época de COM+ y ahora centrado enla asesoría y formación en SharePoint.

Nuestra mayor atención este mes seha centrado en los dispositivos móviles.Creo que éste es un tema al que debemosdedicar atención, dada la cada vez mayorproliferación de dispositivos móviles en elmercado y las grandes posibilidades quetenemos los desarrolladores de la plata-forma .NET para crear nuevas solucionespara tales dispositivos.

El artículo de portada, “Uso de GPSdesde Windows Mobile”, de JoséMiguel Torres, nos muestra las posibi-lidades de utilización con WindowsMobile de las características tecnológi-cas del GPS y nos ayuda en lo más difí-cil, el desarrollo de la lógica de la apli-cación en base a la información obteni-da. Por su parte, “Exprime al máximo.NET Compact Framework”, de IbónLanda y Unai Zorrilla, es un artículoque cubre de modo más genérico eldesarrollo de aplicaciones para disposi-tivos móviles, centrándose en el uso efi-ciente de los recursos y el rendimientode las aplicaciones, porque, como losautores dicen, “cuando hablamos de.NET Compact Framework, el tamañoimporta, ¡y mucho!”.

El equipo ganador de la edición espa-ñola de Imagine Cup (cuyo lema para este

año es “Imagina un mundo donde la tec-nología facilite un medioambiente soste-nible”), y nuestro representante en la finalde París, ha desarrollado Windows Dri-ve, una plataforma que se apoya en Win-dows Live, en conjunción con mapas Vir-tual Earth, y que pretende ahorrar emi-siones de CO2 permitiendo que, a travésde una red social, contactos que haganuna misma ruta puedan compartir coche.Este mes, ellos mismos nos cuentan todosobre su proyecto, primero en el artícu-lo “Desarrollo con Windows Live. Apro-vechando el poder de las redes sociales”y luego en una entrevista con todos losmiembros del equipo. Esperamos vues-tras informaciones desde París. ¡Suerte,amigos!

Por último, mencionar la iniciativasolidaria de este mes, nuevamente aus-piciada por El Guille, que tiene un cora-zón que no le cabe en el pecho. Estádedicada una vez más a su particularlucha contra la maldita enfermedad deAlexander, y en particular a ayudar aJuanma. Además, El Guille este mes nosanima a apoyar, simplemente con nues-tra firma, una solicitud al gobierno espa-ñol de ayuda para la investigación de unacura para esta terrible enfermedad. Si loestima conveniente, ayude firmando enhttp://www.elguille.info/solidario/ayuda-Juanma/Firmas_Juanma.aspx.

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

dotN

etM

anía

<<

3

Dispositivos móviles

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 49 • Junio 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úmeroDavid Baraldés, Ibón Landa, José MiguelTorres, Miguel Llopis y Unai Zorrilla.

IlustracionesMascota (Clico): Yamil HernándezPortada: Javier Roldán

FotografíaMartín Quirós

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 49Entrevista a Ted Pattison 8-10

Recientemente, tuvimos ocasión de hablar con un viejo conocido desde los tiempos en que publicabalibros sobre COM+ (“Distributed Applications with COM+ and Visual Basic 6.0”, que más tardeactualizó a .NET con “Building Applications and Components with Visual Basic.NET”, publicadoen 2003), que desde hace algún tiempo se ha especializado en el desarrollo para SharePoint, temasobre el que publicó el año pasado una de las obras de mejor acogida sobre el tema en Amazon,“Inside Microsoft Windows SharePoint Services 3.0 (Pro Developer)”.

El Marco de trabajo de entidades de ADO.NET v3.5 (VI) 12-16Como continuación de nuestra serie dedicada a presentar las posibilidades que ofrecerá el Marco deentidades de ADO.NET 3.5 para el desarrollo de modelos conceptuales de entidades mapeados amodelos de bases de datos [1], en esta ocasión presentaremos los mecanismos que tendremos a nuestradisposición para hacer uso de los procedimientos almacenados creados en la base de datos relacional dedestino.

Exprime al máximo .NET Compact Framework 18-24Aunque el desarrollo de aplicaciones para dispositivos móviles se asemeje enormemente al desarrollode aplicaciones de escritorio, no podemos olvidar que este tipo de dispositivos cuenta con restriccionesque hacen que los desarrolladores tengan que prestar especial importancia al uso eficiente de losrecursos y al rendimiento de la aplicación. Cuando hablamos de NETCF, el tamaño importa, ¡ymucho!

Uso de GPS desde Windows Mobile 26-34La proliferación de teléfonos y dispositivos móviles en estos últimos años ha hecho posible todo tipo deusos que hace una década era impensable tener a nuestro alcance. Los receptores GPS son unejemplo.

Estresando aplicaciones BizTalk con LoadGenerator 36-39Este artículo pretende mostrar una manera sencilla y flexible de construir un entorno de simulaciónpara cualquier proceso de negocio BizTalk que implique la comunicación con cualquier sistemaimaginable y sin tener que realizar ningún tipo de modificación en el código fuente de lasorquestaciones.

Rendir o no rendir… Viejas costumbres, nuevas formas, versión 2.0 40-45Si me rinde el código y no lo entiendo, ¿realmente me rinde? Este debería haber sido el título de esteartículo, pero era demasiado largo, aunque en el contenido sí que veremos algunas cuestiones quedebemos tener en cuenta a la hora de decidir qué es mejor, si entender lo que escribimos o que rindamejor. Por supuesto, lo bueno es que seremos nosotros los que decidamos qué hacer, sobre todo sisabemos cómo hacerlo.

dnm.todotnet.qa 46-48LINQ para consultas y actualizaciones

LINQ (Language Integrated Query) significa Consultas integradas en el lenguaje, pero también puedeutilizarse en ciertas ocasiones para modificar información. Todo esto se relaciona con la maquinarialingüística que incorporan las últimas versiones de C# y VB.NET. En su conjunto, las preguntasseleccionadas este mes suministran una visión más amplia del propósito y la arquitectura de LINQ.

dnm.comunidad.net 50-56Desarrollo con Windows Live. Aprovechando el poder de las redes socialesEntrevista a los ganadores de la final española de Imagine Cup 2008

dnm.biblioteca.net 57The Practical Guide to Defect Prevention (Best Practices) I. M. Wright’s “Hard Code”

dnm.desvan 58

Además de ofrecer correcciones a diver-sos problemas reportados por los usua-rios en relación con estos productos des-de la aparición de sus versiones origi-nales, estos Service Packs incorporannuevos marcos de trabajo que podránempezar a aprovechar inmediatamen-te los desarrolladores, entre las que cabedestacar las siguientes:• La versión 1 de ADO.NET Entity

Framework, sobre el que hemosvenido escribiendo en dotNet-Manía desde enero de 2008.

• ADO.NET Data Services, que faci-litan la creación y el consumo deservicios de datos que se integrannaturalmente con la Web.

• ASP.NET MVC Framework, unnuevo marco de trabajo paraASP.NET que ofrece un modelo

estructurado de desarrollo para laWeb.

• ASP.NET Dynamic Data, que agi-liza y simplifica la creación de sitiosWeb dirigidos por datos basados enformularios ASP.NET y el nuevomodelo MVC.

Otras novedades importantes queintegrará el SP1 son:• .NET Framework Client Profile,

una instalación "ligera" de .NETFramework 3.5 que incorpora úni-camente el CLR, ClickOnce, Win-dows Forms, WPF y WCF, los ele-mentos típicamente necesarios parala ejecución de aplicaciones cliente.

• Soporte completo en ADO.NET yLINQ to SQL para SQL Server2008, de próxima aparición.

• Mejoras en el diseñador de WPF.• Nuevas plantillas de WCF para pro-

yectos Silverlight.• Mejoras en controles como el Data-

Repeater para Windows Forms.• Incorporación del Feature Pack y

el soporte para el ribbon de Office2007 en C++.

• Soporte para la depuración a nivelde código fuente de las librerías de.NET Framework.

• Mejoras generales en la estabilidad,rendimiento y seguridad de muchascaracterísticas.

Para más información y descarga,visite la página http://www.micro-soft.com/downloads/details.aspx?Famil-yId=CF99C752-1391-4BC3-BABC-86BC0B9E8E5A.

dotN

etM

anía

<<

6

noticiasnoticias

noticias

noticias

noticias

Disponibles .NET Framework 3.5 SP1 Betay Visual Studio 2008 SP1 BetaMicrosoft ha liberado las versiones beta del SP1 para .NET Framework 3.5 y el SP1para Visual Studio 2008. Las versiones definitivas de estos Service Packs estarándisponibles algo más adelante, durante el verano.

Source Analysis —que veníausándose internamente en Micro-soft (donde se conocía como Style-Cop) desde hacía varios años— essimilar a FxCop, pero hay algunasdiferencias importantes. FxCop hacesu análisis sobre ensamblados com-pilados, mientras que SourceAnalysis analiza directamente elcódigo fuente, centrándose más enla disposición de elementos, legibi-lidad y documentación, algo que nopuede hacer FxCop.

Source Analysis incorpora deserie unas 200 prácticas recomen-dadas, que cubren aspectos como:

• Disposición de elementos, ins-trucciones y expresiones (inclu-yendo expresiones de consulta).

• Situación de llaves, paréntesis,corchetes, etc.

• Espaciado alrededor de palabrasclave y operadores.

• Espaciado entre líneas.• Ubicación de parámetros en

declaraciones y llamadas demétodos.

• Ordenación de elementos den-tro de una clase.

• Formato de la documentaciónen cabeceras de elementos yarchivos.

• Nombrado de campos y varia-bles.

• Uso de tipos predefinidos.• Uso de modificadores de acceso.• Contenidos permitidos en

archivos.• Textos de depuración.

Source Analysis se integra enVisual Studio 2005 y 2008, y tam-bién puede ejecutarse desde la líneade comandos y en scripts deMSBuild.

Para más información y descar-ga, visite http://code.msdn.micro-soft.com/sourceanalysis.

Disponible Microsoft Source Analysis for C#Microsoft ha puesto recientemente a disposición de los desarrolladores Source Analysisfor C#, herramienta que ayuda a los equipos de desarrollo a aplicar un conjunto de buenasprácticas para la disposición e indentación de elementos, legibilidad, mantenibilidad ydocumentación del código fuente en lenguaje C#.

dotN

etM

anía

<<

7

Después de la oleada denuevos productos y tecno-logías, incluyendo Win-dows Server 2008, .NETFramework 3.5, Visual

Studio 2008 y SQL Server 2008, Microsoft lanzará una versiónde BizTalk que será compatible con ellos y que se llamará Biz-Talk Server 2006 R3. Ésta estará disponible a principios del añoque viene, pero podremos ver una CTP al final de 2008.

Según informa Steven Martin, Director of Product Mana-gement for Microsoft's Connected Systems Division, en su bloghttp://blogs.msdn.com/stevemar/archive/2008/04/23/biztalk-server-

platform-updates.aspx, en Microsoft aprovecharán la salida de estanueva release para entregar capacidades adicionales requeridaspor los clientes para su infraestructura SOA. Esta release incluirá:• Nuevas capacidades de registro de servicios Web con soporte

para UDDI versión 3.0.• Servicio mejorado de implantación de aplicaciones.• Servicio mejorado de implantación de dispositivos “edge” a

través de BizTalk RFID Mobile.• Interoperabilidad mejorada y soporte de conectividad para

protocolos B2B (como SWIFT, EDI, etc.).• Patrones SOA y guía de mejores prácticas para ayudar a las

implantaciones de los clientes.

Primeras informaciones sobre BizTalk Server 2006 R3

<<dnm.directo.noticias

ILOG anun-cia el lanza-miento de sunueva suite deherramientas

gráficas para la plataforma .NET, diseñadaspara ayudar a los desarrolladores de Microsofta crear aplicaciones ricas de internet (RIA),más concretamente diagramas visualmentericos e interactivos, y gráficos de Gantt. ILOGDiagrammer for .NET® 1.5 e ILOG Ganttfor .NET 3.5, las suites de herramientas gráfi-cas de ILOG para la creación de diagramas ygráficos Gantt para la plataforma .NET, aho-ra ofrecen soporte para Windows Presenta-tion Foundation (WPF) y ASP.NET AJAXpara el desarrollo RIA y bajo Visual Studio2008®. Los desarrolladores pueden acceder alos diseñadores, cajas de herramientas y asis-tentes dedicados, así como a la documentaciónonline presente en el nuevo producto, desdeel entorno de Visual Studio, sin tener queaprender a utilizar una nueva herramienta olenguaje.

ILOG Diagrammer for .NET ayuda alos desarrolladores a configurar e integrarrápida y fácilmente sofisticados diagramas ypantallas de cuadros de mando dentro de susaplicaciones de formularios Windows yWeb. Esta nueva versión incluye elementos

WPF avanzados que facilitan la creación derepresentaciones gráficas, como los diagra-mas de relaciones entre entidades, o las topo-logías de red o de los procesos de negocio.Con el soporte para WPF, ahora es posiblecrear atractivos gráficos utilizando tanto lasfunciones de plantilla de WPF como labiblioteca de Capa Gráfica del producto.ILOG Diagrammer for .NET 1.5 permitiráa los desarrolladores aprovechar las venta-jas de WPF utilizando Microsoft Visual Stu-dio, Expression Design, Expression Blend,XAML, vídeos, animaciones y otras herra-mientas de WPF.

ILOG Gantt for .NET 3.5, con soportepara la tecnología ASP.NET AJAX, permite alos desarrolladores simplificar aún más la cre-ación de aplicaciones RIA para planificación ycontrol a través de sus controles integradosASP.NET AJAX, lo que redunda en una mayorcolaboración entre los diversos actores queintervienen en la construcción, gestión ycorrección de los proyectos complejos. La edi-ción y visualización del proyecto basada enWeb representa un elemento central de lassoluciones de gestión colaborativa y de ges-tión de la cartera de proyectos.

Ambos productos están disponibles enwww.ilog.com/products/diagrammernet ywww.ilog.com/products/ganttnet.

Nuevas versiones de los productos gráficos de ILOG dirigidas al desa-rrollo de aplicaciones ricas de Internet sobre la plataforma .NET

ILOG Diagrammer for .NET da soporte a Windows Presentation Foundation,e ILOG Gantt for .NET a ASP.NET AJAX

ILOG comparte su experienciay sus productos con la comuni-dad de código abierto EclipseILOG suministra la primera metodología decódigo abierto para reglas de negocio, dona elconversor de código fuente de Java a C# yencabeza el proyecto de integración Albireo

ILOG está contribuyendo al impulso del códi-go abierto dentro de la comunidad Eclipse através de diversas iniciativas. Entre ellas: la meto-dología de Desarrollo Ágil de Reglas de Nego-cio (ABRD) de ILOG, una metodología inde-pendiente de marcas y fabricantes que se sumi-nistra como una Estructura de Procesos Eclip-se (EPF), bien documentada y estructurada,que proporciona un proceso paso a paso parael desarrollo de aplicaciones de reglas de nego-cio. La Estructura de Procesos Eclipse de Desa-rrollo Ágil de Reglas de Negocio puede des-cargarse desde http://www.eclipse.org/epf/downloads/openup/openup_downloads.php; la apor-tación de un conversor de código fuente de Javaa C# para la comunidad de código abierto, bajoLicencia Pública Eclipse (el traductor convier-te un proyecto Eclipse Java en Microsoft VisualStudio C#). La compañía ha creado un foro deayuda para responder a las preguntas sobre esteconversor, en http://sourceforge.net/forum/forum.php?forum_id=787971a; ILOG se ha con-vertido, además, en uno de los principales pro-motores del proyecto Albireo para el desarro-llo de aplicaciones de Plataforma Rich Client(RCP). Con estas iniciativas, ILOG pretendeayudar a los desarrolladores a construir aplica-ciones robustas sobre la EPF.

Marino Posadas

Marino Posadases director de tec-nologías de desa-

rrollo para Españay Portugal de Solid

Quality Learning.Puedes leer su blog

en http://www.elavefenix.net.

entrevista

entrevista a Ted PattisonRecientemente, tuvimos ocasión de hablar con unviejo conocido desde los tiempos en que publicabalibros sobre COM+ (“Distributed Applications withCOM+ and Visual Basic 6.0”, que más tarde actualizó a.NET con “Building Applications and Components withVisual Basic.NET”, publicado en 2003), que desde hacealgún tiempo se ha especializado en el desarrollo paraSharePoint, tema sobre el que publicó el año pasadouna de las obras de mejor acogida sobre el tema enAmazon, “Inside Microsoft Windows SharePointServices 3.0 (Pro Developer)”.

Gracias por hacer este hueco parahablar con nosotros. Sabemos quetienes una agenda apretada. Comosiempre, preferimos que seas túquien haga la introducción para loslectores de la revista.

Gracias a vosotros por la invita-ción. Espero que mis comentariossean de interés para los lectores. Minombre es Ted Pattison, y soy pre-sidente del grupo que lleva mi nom-bre, Ted Pattisson Group, empresadedicada a la asesoría y formación enSharePoint (para los lectores inte-resados, su página oficial corpora-

tiva es http://www.tedpatti-son.net).

Algunos de nosotros te conoce-mos por los viejos libros sobre VisualBasic. Esa línea parece abandonadasegún tus actividades actuales, ¿noes así?

Sí, tuve una vida previa como foro-fo de VB y COM/COM+, y estuve tra-bajando un buen tiempo con COM,que, por aquellos tiempos, era la formacorrecta de hacer las cosas; luchandocon las interfaces COM, los CoCrea-teInstance, etc. Después vino COM+

y MTS (Microsoft Transaction Server),que comenzó a despertar la necesidadde utilizar el concepto de capa inter-media, con lo que se modificaron nota-blemente las arquitecturas de las apli-caciones. Eso era lo que había y lo pasá-bamos bien con esa tecnología.

En aquella primera obra, recuer-do que llamabas la atención sobre laimportancia de las interfaces, a pesarde que VB 6.0 no disponía de unaOOP pura. ¿Recuerdas esta reco-mendación en tu obra?

Yo veía las interfaces como algoextraordinariamente importante, por-que te permitían, en COM (y no diga-mos ahora, con .NET), conectar ele-mentos de forma coherente. Sin embar-go, en el momento actual (cuando utili-zo indistintamente los dos lenguajes, C#

y VB.NET), ya no es tan señalada la dife-rencia. Uno puede estructurar las clasesde distintas formas, concebir estructu-ras que van mejor como clases abstrac-tas, y la dicotomía entre clases abstrac-tas e interfaces no es tan señalada comoantes. Supongo que aquella recomen-dación era una consecuencia de lo quehabía y también de lo que podía hacer-se en ese momento con esa tecnología.Pero eso no me impedía tratar de pro-fundizar en cómo funcionaban las cosas.Eso es algo que me ha gustado siempreen cualquier cosa que haga.

Sin embargo, tu evolución pare-ce haber ido convergiendo hacia lalínea de las herramientas de pro-ducción Web, y en concreto haciaSharePoint, sobre el que tambiénhas publicado otra obra este mismoaño, con bastante buena acogida,¿no?

Sí. He movido mis intereses haciaSharePoint, pero muy especialmen-te hacia la programación de Share-Point utilizando .NET, y como dijeantes, en cualquiera de los dos len-guajes fundamentales. Esto es algoque observé claramente en 2003,viendo el interés del público por apli-car la programación en los lenguajes.NET al desarrollo Web. Además delas posibilidades que ofrecíaASP.NET dentro de un marco como

SharePoint 2003 (en aquel entonces),que crecía enormemente en muypoco tiempo.

Sin embargo, el número de cam-bios que ha tenido lugar entre la ver-sión 2003 y la versión 2007 es tre-mendo, tanto en lo relativo a la arqui-tectura como a la capacidad de pro-gramación. Creo que es un cambiotan grande como el cambio entreCOM y .NET. Y se aprecia en todoslos aspectos del desarrollo de una apli-cación. Los controles, la integracióncon Visual Studio, el soporte de nue-

vas características, la personaliza-ción… incluso aspectos como el con-trol de código fuente; en fin, todo.Creo que se puede decir que, actual-mente, se puede hacer desarrollo realcon SharePoint. Esto incluye todoslos aspectos del ciclo de vida de laaplicación. En EE.UU. es cada vezmás popular, y hay muchos desarro-lladores que están alternando sus acti-vidades de desarrollo tradicionalescon las propias de esta plataforma,que sigue creciendo…

Esta era una de las cosas que pre-cisamente quería que recalcases,porque todavía hay personas quepiensan que no hay un gran “ver-tiente programable” en SharePoint,y yo coincido contigo en que esto noes así…

dotN

etM

anía

<<

9

dnm.directo.entrevista<<

Ted Pattison junto a Marino Posadas durante la entrevista

dotN

etM

anía

<<

10

dnm.directo.entrevista<<

Totalmente. La vertiente progra-mable de SharePoint es muy amplia yva a más. Lo que sucede es que Share-Point pone a disposición del desarro-llador una gran cantidad de funciona-lidad predeterminada, que nos ahorraun montón de tiempo y nos facilita laconstrucción de sitios Web con unaganancia de un factor de 3 ó 4 veces eltiempo que tardábamos utilizando losmecanismos tradicionales (por ejemplo,ASP.NET) para hacer lo mismo. Estoes especialmente apreciable en el casode grandes sitios Web.

Pero luego intervienen todos losprocesos de personalización, y ahí esdonde intervienes tú como desarrolla-dor, y es mucho lo que se puede haceren ese sentido. Cuando necesitas, porejemplo, establecer la automatizaciónde un proceso de negocio, o manejareficientemente componentes de capaintermedia, o manejar granjas de servi-dores, es fundamental tu conocimien-to como desarrollador de la plataforma.NET si quieres llevar el proceso a buentérmino.

¿Pueden confiar los desarrolla-dores en que, según lo que dices, elprogramador de SharePoint va acontar con lo mejor del mundo delas herramientas de automatizaciónsin renunciar a ninguna de las ven-tajas del desarrollo?

Bueno, todo requiere una puntua-lización. Obviamente, ASP.NET tieneuna madurez y una cantidad de posibi-lidades, como fruto del número de ver-siones con las que cuenta, que es difí-cil que algunas cosas que llegan a hacer-se con ASP.NET se implementen talcual en SharePoint. Además, el desa-rrollador de ASP.NET está acostum-brado a hacer cambios, copiar a undirectorio y probar directamente el fun-cionamiento, etc. En ese sentido, el pro-ceso con SharePoint es para algunos unpaso atrás. Pero hay que poner en labalanza las dos ofertas y seleccionar loque necesitamos. Como casi siempre,cada herramienta es buena para una cir-cunstancia, pero también interviene

quien la usa. Es posible que, depen-diendo de tus conocimientos de desa-rrollo, elijas la opción de usar ASP.NETporque te encuentras más cómodo conesa tecnología, o piensas que tienes unmayor control. O, si tu opción es con-seguir en poco tiempo algo lo más adap-table posible a las necesidades empre-sariales, veas que SharePoint te va aregalar ese tiempo, por su propia arqui-tectura.

También puedes utilizar las doscosas. Puedes crear componentesdesde Visual Studio, y luego inte-grarlos dentro de tu aplicación deSharePoint…

Efectivamente, así es. Empiezaspor crear una característica (feature),y también dispones de un lenguajedeclarativo basado en XML, llamadoCAML (Collaborative ApplicationMarkup Language), que requiereaprender un nuevo vocabulario XML,pero que permite establecer cómoquieres que sean los comportamien-tos. Además, puedes programar con-tra el Modelo de objetos de Share-Point (SharePoint Object Model),que te permite realizar una cantidadingente de tareas relacionadas con laconstrucción de sitios. Pero siemprepuedes volver atrás y trabajar tambiéncon las API de ASP.NET e integrar-las posteriormente en la aplicación,como decía antes. En mi opinión,cuando operas de esta forma no pier-des la sensación de que estás progra-mando para el mundo .NET.

Sé que hay muchos desarrolladoresque se han desilusionado al principio,debido a esos seis meses iniciales de…bueno, ya sabes… no tener mucha ideade por dónde van los tiros, pelearse conlas características de la plataforma, pen-sar alguna vez si lo que están haciendova a funcionar realmente como ellosquieren, etc. Pero estamos llegando aesa masa crítica de desarrolladores quehace que las cosas se muevan, y con eltiempo, SharePoint será consideradoen sí mismo como una plataforma dedesarrollo.

Bueno, parece que nos estás anti-cipando el futuro de lo que puedeser la siguiente versión de la herra-mienta. ¿Qué crees que va a llevaresa próxima versión y cuáles seránlos puntos fuertes para hacer quemás desarrolladores se inclinen porutilizarla?

Estoy convencido de que va a incluirmuchas cosas para mejorar la platafor-ma. Por ejemplo, una de las cosas queechamos de menos hoy es la capacidadde versionado cuando se crea una deesas features que te comentaba antes.Frecuentemente se necesita poder hacercomparaciones entre cómo funciona-ba, digamos, la versión 1 de una de estascaracterísticas, y cargar simultánea-mente en otra página una segunda ver-sión, para compararlas. Me estoy refi-riendo a poder trabajar de forma simi-lar a como operan otros componentes:side-by-side. Hoy día, si incluyes un valorde versión en una de estas features, Sha-rePoint lo ignora. Su uso nos permi-tiría tener algún tipo de lógica condi-cional para, por ejemplo, dependiendode la versión que desee el usuario poderllamar a cierto código que se adaptasea las necesidades de esa versión.

La plataforma está mejorando cadadía, así que confiamos en que cosascomo ésta estarán resueltas para lapróxima versión, y realmente haymucha gente implicada en el desarro-llo de SharePoint como plataforma dedesarrollo. Microsoft ha recogido unmontón de feedback por parte de sususuarios y partners, y tenemos el con-vencimiento (en Ted Pattison Group)de que esa línea va a seguir de formaclaramente ascendente y van a poder-se realizar aplicaciones fantásticas conla próxima versión… de hecho, ya sehacen ahora mismo… (risas).

Pues muchas gracias por estosminutos que nos has dedicado. Siquieres añadir algo para el públicode habla española y los lectores dela revista…

Claro. “Saludos, amigos, y gracias porsu tiempo” (lo dice en castellano).

La creación y uso de procedimientos almacenadoses un hecho muy común durante la definición delmodelo físico de una base de datos relacional. Sinentrar a analizar las ventajas y desventajas asocia-das a la utilización de los mismos, tema sobre elque existe una amplia literatura, en esta entregapresentaremos los recursos que tendrán a su dis-posición los programadores que utilicen el Marcode entidades para mapear los procedimientos dis-ponibles en la base de datos a) como recursos queimplementan las operaciones CUD asociadas a lainserción, modificación y borrado de la fila de labase de datos asociada a un objeto en memoria bajoel control de un contexto de objetos (ObjectCon-text) del Marco de entidades, o b) como recursosque permiten la selección de conjuntos de resulta-dos que en caso necesario deberán ser “materiali-zados” como objetos y traídos bajo el control delcontexto de objetos.

Como base de datos de ejemplo utilizaremosnuevamente una versión ampliada de la base dedatos de SQL Server 2005 FUTBOL2006 del libro “C#3.0 y LINQ” [2]. Una copia de seguridad de estabase de datos, conjuntamente con todo el códigode ejemplo utilizado aquí, puede ser descargada delsitio Web de dotNetManía (http://www.dotnetma-nia.com). De antemano, la base de datos incluyevarios procedimientos almacenados que utilizare-mos a lo largo del artículo.

Para comenzar, crearemos una nueva aplica-ción y le agregaremos un nuevo Modelo de datosde entidades de ADO.NET. Una vez que haya-mos especificado al asistente que debe generar elmodelo a partir de la base de datos FUTBOL2006, leindicaremos que utilice todas las tablas y procedi-mientos disponibles (figura 1).

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

plataforma.net

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".

Como continuación de nuestra serie dedicada a presentar las posibilida-des que ofrecerá el Marco de entidades de ADO.NET 3.5 para el desa-rrollo de modelos conceptuales de entidades mapeados a modelos debases de datos [1], en esta ocasión presentaremos los mecanismos quetendremos a nuestra disposición para hacer uso de los procedimientosalmacenados creados en la base de datos relacional de destino.

Figura 1. Elección de los objetos de base de datosa incluir en el modelo.

Unai ZorrillaOctavio Hernández

dotN

etM

anía

<<

13

dnm.plataforma.net<<

Aunque en el Visor de modelos sehabla de procedimientos almacenados(figura 2), a nivel de modelo de almacén(SSDL) el Marco de entidades utilizael término función (y el elemento XML<Function>, como puede verse en elfragmento del documento EDMX quese muestra en el listado 1) para referir-se a los procedimientos almacenados.

Si examina detalladamente el docu-mento EDMX, observará que esos ele-mentos del modelo de almacén, de for-ma predeterminada, no se reflejan demanera alguna en el modelo conceptual(CSDL) generado. Es tarea nuestrahacer que esos elementos salgan, de unade las formas que mostraremos a con-tinuación, a la “superficie” del modelo.

Mapeo de funciones a operaciones de actualización

La primera manera de hacer uso de pro-cedimientos almacenados como partedel modelo conceptual consiste en uti-lizar esos elementos como mecanismospara la inserción, modificación o borra-do en la base de datos de las filas corres-pondientes a instancias de entidades enlugar de las sentencias SQL generadaspor el asistente. Como ejemplo, a con-tinuación mapearemos los procedi-mientos usp_FutbolistaInsert, usp_Fut-bolistaUpdate y usp_FutbolistaDeletecomo operaciones de actualización parala entidad Futbolista del modelo con-ceptual. Para ello, basta con seleccio-nar la tabla en el modelo y, en la ven-tana de Detalles de mapeo, pulsar elbotón “Mapear entidad a funciones” eindicar los procedimientos a utilizarpara cada una de las tres operaciones(figura 3). Observe cómo es posibleestablecer las asociaciones entre las pro-piedades de la entidad y los parámetrosy resultados del procedimiento.

Figura 2. El Visor de modelos mostrando las funciones del almacén.

<!— SSDL content —><edmx:StorageModels><Schema Namespace=”FUTBOL2006Model.Store” Alias=”Self”

ProviderManifestToken=”09.00.3042”xmlns=”http://schemas.microsoft.com/ado/2006/04/edm/ssdl”>

<!— ... —><Function Name=”usp_FutbolistaInsert” Aggregate=”false” BuiltIn=”false”

NiladicFunction=”false” IsComposable=”false”ParameterTypeSemantics=”AllowImplicitConversion” Schema=”dbo”>

<Parameter Name=”CodigoClub” Type=”char” Mode=”In” /><Parameter Name=”CodigoPaisNacimiento” Type=”char” Mode=”In” /><Parameter Name=”FechaNacimiento” Type=”datetime” Mode=”In” /><Parameter Name=”Nombre” Type=”varchar” Mode=”In” /><Parameter Name=”Posicion” Type=”char” Mode=”In” />

</Function><Function Name=”usp_FutbolistaUpdate” Aggregate=”false” BuiltIn=”false”

NiladicFunction=”false” IsComposable=”false”ParameterTypeSemantics=”AllowImplicitConversion” Schema=”dbo”>

<Parameter Name=”Id” Type=”int” Mode=”In” /><Parameter Name=”CodigoClub” Type=”char” Mode=”In” /><Parameter Name=”CodigoPaisNacimiento” Type=”char” Mode=”In” /><Parameter Name=”FechaNacimiento” Type=”datetime” Mode=”In” /><Parameter Name=”Nombre” Type=”varchar” Mode=”In” /><Parameter Name=”Posicion” Type=”char” Mode=”In” />

</Function><Function Name=”usp_FutbolistaDelete” Aggregate=”false” BuiltIn=”false”

NiladicFunction=”false” IsComposable=”false”ParameterTypeSemantics=”AllowImplicitConversion” Schema=”dbo”>

<Parameter Name=”Id” Type=”int” Mode=”In” /></Function><Function Name=”usp_FutbolistaSelect” Aggregate=”false” BuiltIn=”false”

NiladicFunction=”false” IsComposable=”false”ParameterTypeSemantics=”AllowImplicitConversion” Schema=”dbo”>

<Parameter Name=”Id” Type=”int” Mode=”In” /></Function><Function Name=”usp_FutbolistasDePais” Aggregate=”false” BuiltIn=”false”

NiladicFunction=”false” IsComposable=”false”ParameterTypeSemantics=”AllowImplicitConversion” Schema=”dbo”>

<Parameter Name=”CodigoPais” Type=”char” Mode=”In” /></Function><Function Name=”usp_MediaEdadFutbolistasDePais” Aggregate=”false” BuiltIn=”false”

NiladicFunction=”false” IsComposable=”false”ParameterTypeSemantics=”AllowImplicitConversion” Schema=”dbo”>

<Parameter Name=”CodigoPais” Type=”char” Mode=”In” /><Parameter Name=”Cantidad” Type=”int” Mode=”InOut” />

</Function></Schema>

</edmx:StorageModels>

Listado 1. Fragmento del modelo de almacén en el que se definen las funciones.

dotN

etM

anía

<<

14

dnm.plataforma.net<<

Una vez establecidas estas corres-pondencias, las operaciones de crea-ción, actualización y eliminación deentidades de la clase Futbolista se tra-ducirán, al aplicarse los cambios en elalmacén, en llamadas a los procedi-mientos almacenados correspondien-tes. El listado 2 muestra un fragmentode código en el que se realizan opera-ciones de esos tipos.

Observe en la figura 3 cómo para laoperación de actualización es posible indi-car si se debe pasar a cada parámetro elvalor actual de la propiedad correspon-diente o su valor original, que fue leídode la base de datos y es mantenido por elservicio de gestión del estado de los obje-tos del Marco de entidades. Esto puedeutilizarse para implementar mecanismosde control de concurrencia optimista.

Mapeo de funciones para defi-nir consultasLa segunda vía que ofrece el Marco deentidades para aprovechar las funcio-nes del modelo del almacén consiste enmapear esos elementos mediante lo quese conoce como importaciones defunciones (function imports). Esta vía esaplicable a procedimientos almacena-dos de selección y funciones definidaspor el usuario que devuelvan tablas, asícomo a vistas de servidor, y su objetivocentral es el de permitir la ejecución deconsultas que se implementan directa-mente mediante código del almacén.

Para definir una importación defunción, se debe pulsar con el botónderecho del ratón sobre la función delSSDL deseada y seleccionar la opción“Crear importación de función”. Porejemplo, en el caso del procedimien-to usp_FutbolistasDePais, un proce-dimiento almacenado de selección quedevuelve los futbolistas del país espe-cificado como parámetro de entrada,aparecerá el cuadro de diálogo de lafigura 3. En él, será necesario indicarel nombre con el que se desea mapearla función importada y el tipo de datosal que el Marco de entidades debe tra-ducir cada una de las filas devueltas porel procedimiento (en este caso, Futbo-lista). En el fragmento de CSDL quese presenta en el listado 3 se puedeobservar cómo se interpreta que la fun-ción retorna un conjunto de entidadesde ese tipo mediante la sintaxis Collec-tion(T). Y el listado 4 presenta el frag-mento del esquema de mapeo en el quese establece la correspondencia entrelas funciones y sus correspondientesimportaciones.

private void button1_Click(object sender, EventArgs e){

using (FUTBOL2006Entities ctx = new FUTBOL2006Entities()){

Futbolista f = new Futbolista();f.Nombre = “PABLO PELAEZ”;f.FechaNacimiento = new DateTime(1973, 12, 08);f.Posicion = “P”;f.Club =

(from c in ctx.Club where c.Codigo == “RMA” select c).First();f.Pais =

(from p in ctx.Pais where p.Codigo == “ES” select p).First();

// *** inserciónctx.AddToFutbolista(f);ctx.SaveChanges();// *** actualizaciónf.Posicion = “M”;ctx.SaveChanges();// *** borradoctx.DeleteObject(f);ctx.SaveChanges();

}}

Listado 2. Operaciones de actualización que generan llamadas a procedimientos almacenados.

Figura 3. Mapeo de funciones de actualización.

Figura 4. Creación de importación defunción.

dotN

etM

anía

<<

15

dnm.plataforma.net<<

El generador de código del Marcode entidades, EDMGen.exe, crea unmétodo dentro del contexto de obje-

tos tipado para cada una de estasimportaciones de funciones. De estamanera, una vez que hayamos “saca-do a la superficie” del modelo por estavía un procedimiento almacenado,podremos utilizarlo directamente

como fuente de consultas integradas,quedando los objetos generados bajoel control del contexto de objetos en

caso necesario. El listado 5 muestra unejemplo de llamada al método gene-rado para la función FutbolistasDe-Pais (mapeado a fin de cuentas al pro-cedimiento almacenado usp_Futbo-listasDePais).

¿Y los demás procedimientos,qué?Del análisis de los listados anteriores, yase habrá dado cuenta de que el procedi-miento usp_FutbolistaSelect, quedevuelve los datos de un único futbolis-ta a partir de su clave primaria (código),se importa de la misma manera queusp_FutbolistasDePais. El Marco deentidades desconoce la semántica con-creta del procedimiento almacenado yno sabe que éste retornará a lo sumo unregistro.

<!— CSDL content —><edmx:ConceptualModels><Schema Namespace=”FUTBOL2006Model” Alias=”Self”

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

<FunctionImport Name=”FutbolistasDePais” EntitySet=”Futbolista”ReturnType=”Collection(Self.Futbolista)”>

<Parameter Name=”CodigoPais” Mode=”In” Type=”String” /></FunctionImport><FunctionImport Name=”ObtenerFutbolista” EntitySet=”Futbolista”

ReturnType=”Collection(Self.Futbolista)”><Parameter Name=”Id” Mode=”In” Type=”Int32” />

</FunctionImport></EntityContainer><!— ... —>

</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=”FUTBOL2006Entities”><!— ... —><FunctionImportMapping FunctionImportName=”FutbolistasDePais”

FunctionName=”FUTBOL2006Model.Store.usp_FutbolistasDePais” /><FunctionImportMapping FunctionImportName=”ObtenerFutbolista”

FunctionName=”FUTBOL2006Model.Store.usp_FutbolistaSelect” /></EntityContainerMapping>

</Mapping></edmx:Mappings>

private void button2_Click(object sender, EventArgs e){

using (FUTBOL2006Entities ctx = new FUTBOL2006Entities()){

int sum = 0, n = 0;foreach (Futbolista f in ctx.FutbolistasDePais(“ES”)){

n++;sum += (DateTime.Now - f.FechaNacimiento.Value).Days / 365;

}MessageBox.Show(“Media de edad = “ + (sum / n).ToString());

}}

Listado 3. Fragmento del modelo conceptual con las importaciones de funciones.

Listado 4. Fragmento del esquema de mapeo con las importaciones de funciones.

Listado 5. Llamada a una función importada al modelo conceptual.

Figura 5. El Visor de modelos mostrandolas importaciones de funciones.

Las importaciones de funciones hacen posible la

ejecución de consultas que se implementan

directamente mediantecódigo del almacén

Listado 7. Código para llamar al procedimiento almacenado usp_MediaEdadFutbolistasDePais.

Ahora bien, si importa la funcióncorrespondiente a usp_MediaEdadFutbo-listasDePais, un procedimiento más “tra-dicional”, que devuelve la media de edadde los futbolistas de un país a través de unparámetro de salida (listado 6) y compilael proyecto, verá que EDMGen.EXEno gene-ra el método correspondiente en el con-texto de objetos. Aunque cabría cuestio-narse la razón de tal omisión, hay quedecir que no es nada difícil programar lallamada a un procedimiento almacenadoutilizando las facilidades generales queofrece EntityClient, que en el fondo noes otra cosa que un proveedor más deADO.NET. El listado 7 muestra cómohacerlo (¡muy importante: de maneraindependiente del motor de base de datossubyacente!) en el caso de nuestro ejem-plo. Cabe destacar que actualmente seestán desarrollando, dentro del marco deCodeGallery [4], extensiones del Marcode entidades que simplificarán aún máslas llamadas a procedimientos almacena-dos arbitrarios.

ConclusionesEn este artículo hemos mostrado lasposibilidades que ofrecerá el Marcode entidades de ADO.NET paraaprovechar los procedimientos alma-cenados como parte directa de losmodelos conceptuales. Asimismo,hemos presentado un patrón de códi-go general que puede ser utilizadopara llamar directamente a cualquierprocedimiento almacenado disponi-ble en la base de datos.

[1]

[2]

[3]

dotN

etM

anía

<<

16

dnm.plataforma.net<<

ALTER PROCEDURE [dbo].[usp_MediaEdadFutbolistasDePais](

@CodigoPais CHAR(2),@Cantidad INT OUTPUT)

ASBEGINDECLARE @res INTSELECT @res = AVG(DATEDIFF(day,

FechaNacimiento,GETDATE())/365)

FROM Futbolista WHERE CodigoPaisNacimiento = @CodigoPaisSET @Cantidad = @res

END

Listado 6. El procedimiento almacenadousp_MediaEdadFutbolistasDePais.

private void button3_Click(object sender, EventArgs e)

{

using (FUTBOL2006Entities ctx = new FUTBOL2006Entities())

{

EntityConnection eCon = (EntityConnection) ctx.Connection;

DbConnection sCon = eCon.StoreConnection;

using (DbCommand cmd = sCon.CreateCommand())

{

cmd.CommandText = “usp_MediaEdadFutbolistasDePais”;

cmd.CommandType = CommandType.StoredProcedure;

// parámetros

DbParameter p1 = cmd.CreateParameter();

p1.ParameterName = “CodigoPais”;

p1.Direction = ParameterDirection.Input;

p1.DbType = DbType.AnsiStringFixedLength;

p1.Size = 2;

p1.Value = “ES”;

DbParameter p2 = cmd.CreateParameter();

p2.ParameterName = “Cantidad”;

p2.Direction = ParameterDirection.InputOutput;

p2.DbType = DbType.Int32;

p2.Value = 0;

// ejecutar

bool opening = cmd.Connection.State == ConnectionState.Closed;

if (opening) { cmd.Connection.Open(); }

try

{

cmd.Parameters.Add(p1);

cmd.Parameters.Add(p2);

cmd.ExecuteNonQuery();

MessageBox.Show(“Media de edad = “ + ((int)p2.Value).ToString());

}

finally

{

if (opening && cmd.Connection.State == ConnectionState.Open)

{

cmd.Connection.Close();

}

}

}

}

}

[4]

BibliografíaZorrilla, U. y Hernández, O. “El Marco de trabajo de entidades de ADO.NET3.5” (partes I a V), en dotNetManía nº 44-48, enero-mayo de 2008.

Hernández, O. “C# 3.0 y LINQ”, Krasis Press, octubre de 2007.

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

Sitio de ADO.NET Entity Framework Extensions, en http://code.msdn.micro-soft.com/EFExtensions/Release/ProjectReleases.aspx?ReleaseId=711.

Ibon LandaUnai Zorrilla

Como muchos ya sabréis, Microsoft .NET Com-pact Framework (NETCF) es una plataforma parael desarrollo de aplicaciones para dispositivos Win-dows Mobile y Windows Embedded CE que per-mite generar y ejecutar aplicaciones administra-das. Incluye una versión optimizada del CLR, unsubconjunto de las clases de .NET Framework eincluso características que han sido diseñadasexclusivamente para esta plataforma.

Con Visual Studio se incluye todo lo necesa-rio para que los desarrolladores puedan crear apli-caciones de este tipo de una manera muy sencilla,prácticamente igual que si estuvieran creando unaaplicación de escritorio.

Aunque el desarrollo de aplicaciones paradispositivos móviles se asemeje enormementeal desarrollo de aplicaciones de escritorio, nopodemos olvidar que este tipo de dispositivosadolece de restricciones (memoria, procesador,disco duro…) que hacen que los desarrollado-res tengan que prestar especial importancia aluso eficiente de los recursos, especialmente lamemoria, y al rendimiento de la aplicación.Cuando hablamos de NETCF, el tamaño impor-ta, ¡y mucho!

El uso eficiente de la memoria es uno de losprincipales aspectos a tener en cuenta en el desa-rrollo para dispositivos móviles. Como ocurre

con .NET Framework, en NETCF la memoriaes manejada y de una manera muy fácil el desa-rrollador podría abusar de ella y hacer que elrendimiento de la aplicación se viera afectadonegativamente.

Pero ¡tranquilos! Aunque las restricciones queexisten son importantes, no imposibilitan quepodamos llegar a construir aplicaciones eficien-tes, aprovechando todas las ventajas que nos ofre-cen NETCF y Visual Studio.

En la primera parte de este artículo, veremosuna serie de recomendaciones para poder cons-truir aplicaciones que gocen de buena salud y queno tengan problemas de rendimiento. A conti-nuación, analizaremos algunas de las herramien-tas que se incluyen con .NET Compact Frame-work 3.5 y Visual Studio 2008 y que nos van a ayu-dar enormemente a evaluar el rendimiento y obte-ner datos para ayudarnos a encontrar los cuellosde botella de nuestras aplicaciones.

RecomendacionesA lo largo de este apartado, iremos comentandoalgunas de las recomendaciones que creemos con-veniente tener en cuenta a la hora de desarrollaraplicaciones para dispositivos móviles. Como es

Exprime al máximo .NET Compact Framework

plataforma.net

Ibón Landa es SoftwareArchitect y Project Team

Leader de AvanGroup.Colabora activamente en

el grupo de usuariosArtalde.NET y escribe en

http://geeks.ms/blogs/ilanda

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".

Aunque el desarrollo de aplicaciones para dispositivos móviles se ase-meje enormemente al desarrollo de aplicaciones de escritorio, no pode-mos olvidar que este tipo de dispositivos cuenta con restricciones quehacen que los desarrolladores tengan que prestar especial importancia aluso eficiente de los recursos y al rendimiento de la aplicación. Cuandohablamos de NETCF, el tamaño importa, ¡y mucho!

dotN

etM

anía

<<

19

dnm.plataforma.net<<

lógico, estas recomendaciones son de carácter gene-ral, y seguro que para muchas de ellas existe algúncaso en el que la regla no se cumple: ¡la excepción queconfirma la regla!

Siempre que hablemos de rendimiento, es con-veniente tener es mente las siguientes recomenda-ciones:

• Lo primero es comprender que desarrollar paraNETCF no es lo mismo que crear una aplica-ción de escritorio, aunque pueda parecerlo.

• Analizar las diferentes posibilidades de diseñoque existan para la aplicación a desarrollar, exa-minando cuál es la más conveniente de acuer-do al rendimiento que necesitas.

• Menos es más. Minimizar el número de llama-das y el tamaño de los métodos.

• Maximizar la reutilización de objetos.• Evitar llamar directamente al recolector de

basura.• El rendimiento que se percibe es justamente el

rendimiento de la aplicación. La percepción delusuario es un factor clave para el éxito de cual-quier aplicación, y si se percibe lenta, es que laaplicación es lenta.

Uno de los primeros aspectos a tener en cuen-ta, sobre todo cuando estamos diseñando nuestraaplicación, es cómo van a ser nuestras clases ométodos y cómo vamos a instanciarlas e invocar-las. Las llamadas a métodos virtuales son un 40%más lentas que las llamadas a otros métodos. Estoes así porque NETCF interpreta las llamadas vir-tuales en lugar de usar v-tables que permitan acce-der directamente a la implementación del méto-do. Cuando interpreta un método virtual, NETCFrecorre las clases de forma jerárquica buscando elmétodo que se ha invocado; lógicamente, esta ope-ración es mucho más lenta que acceder directa-mente al método.

Eso sí, después de una primera invocaciónNETCF mantiene una caché con los métodos que hansido invocados para evitar tener que hacer todo el pro-ceso en una segunda llamada. En consecuencia, laregla general es evitar los métodos virtuales; en casode no poder evitarlo, la recomendación sería reduciral mínimo su uso.

Otros dos sistemas de invocación que debemosevitar, puesto que ofrecen un rendimiento aún menorque el de las llamadas a métodos estáticos o no vir-tuales son las llamadas en las que se usa P/Invoke ylas que se hacen a través COM. Éstas son unas 5 ó 6veces más lentas que una llamada a un método mane-jado, debido principalmente a las operaciones de mars-halling que se generan.

Colecciones

Un elemento importante a tener en cuenta paraque el rendimiento de nuestra aplicación sea el ade-cuado es conocer cuál es la mejor forma de manejarlas colecciones.

El primer aspecto a tener en cuenta es que siem-pre que sea posible se debe establecer el tamaño de lacolección antes de insertar ningún elemento, para evi-tar que ésta se tenga que redimensionar cada vez quese inserte un elemento. Esta acción de redimensio-namiento tiene un impacto en el rendimiento.

En segundo lugar, el uso de las colecciones gené-ricas resulta más óptimo que utilizar contenedores notipados como ArrayList. Almacenar objetos de formano tipada implica que se tenga que realizar un mayornúmero de operaciones de boxing y unboxing, lo queinfluye negativamente en el rendimiento.

También es recomendable hacer uso de la sen-tencia for en lugar de foreach, ya que ésta última impli-ca llamadas a métodos virtuales (GetEnumerator(),get_Current() y MoveNext()) a través de la interfaz IEnu-merator.

Servicios Web

Las llamadas a servicios Web son algo habitual enla mayoría de las aplicaciones que se programan hoyen día y más el caso de aplicaciones para dispositivosmóviles, donde habitualmente se sincroniza la infor-mación del dispositivo con la de un servidor centralque expone servicios Web.

Cada vez que se utiliza un proxy para llamar a un ser-vicio, NETCF hace uso de la reflexión para examinar elproxy, no cacheando esta búsqueda para la siguientes invo-caciones. Por este motivo, es recomendable no crear másde una instancia del proxy, sino mantener una única ins-tancia global del mismo para toda la aplicación.

Lo primero es comprender que desarrollar para NETCF no es lo mismoque crear una aplicación de escritorio,

aunque pueda parecerlo

dotN

etM

anía

<<

20

dnm.plataforma.net<<

Como regla general, se debe evita el uso de Data-Set para intercambiar información entre el servidory la aplicación, ya que su serialización de éste a XMLes un proceso costoso y poco eficiente.

XML

Usar el formato XML suele ser una de las opcio-nes habitualmente empleadas para intercambiar infor-mación entre dos sistemas. NETCF nos ofrece diver-sas maneras de manejar este tipo de ficheros, y esnecesario conocer realmente qué hace cada una deellas y cuál es más conveniente utilizar.

La clase XmlDocument nos ofrece una forma sencillade manejar ficheros XML, pero el principal “problema”de esta clase es que su uso implica cargar todo el docu-mento en memoria, y como ya todos sabemos, la memo-ria es una restricción crítica para las aplicaciones móvi-les. Adicionalmente, el uso de XmlDocument genera másoperaciones de boxing y unboxing, ya que esta clase estáconstruida de una forma genérica, no tipada.

Por los motivos anteriores, aunque el fichero seapequeño, siempre que sea posible es mejor optar porlas clases que nos ofrece NETCF para la lectura yescritura secuencial: XmlReader y XmlWriter. Incluso nose debe descartar la opción de utilizar un fichero detexto, por ejemplo en casos de ficheros de configura-ción con unos pocos parámetros; aunque puede resul-tar menos cool, sí que será una opción más eficienteque un fichero XML.

Diseñar correctamente los esquemas XML tam-bién puede tener un impacto en el rendimiento, yaque de este diseño depende el tamaño del fichero ola forma en que vamos a poder leer el documento.Consejos generales en este aspecto son:

• Usar atributos en vez de elementos anidados.• Usar nombres cortos para elementos y atributos.• Evitar los espacios en blanco innecesarios.• Agrupar los elementos para poder hacer un

recorrido más óptimo cuando se desee saltardeterminados elementos.

No es conveniente hacer validación de docu-mentos XML a partir de esquemas que hayamos defi-nido. Esta operación es costosa e implica un alto con-sumo de memoria. No obstante, si no hay otra alter-nativa que usar DataSet, tener definido el esquemapodría ayudarnos a mejorar la carga de un ficheroXML en un DataSet.

Bases de datos

Si la aplicación tiene que almacenar datos de for-ma local, la recomendación es usar una base de datos;

es una mejor opción que usar ficheros XML paraalmacenar la información. Como ya hemos comen-tado anteriormente, siempre que sea posible es mejorevitar los DataSet. Este tipo de objetos pueden con-vertirse en un enemigo importante, que puede tenerun impacto negativo en la aplicación.

En lugar de usar DataSet, se puede optar por otrasclases de NETCF: SqlCeDataReader o SqlCeResultSet.La primera ofrece un mejor rendimiento que DataSet,pero solo es posible utilizarla para recorridos secuen-ciales (forward-only) y no es actualizable. Si la aplica-ción utiliza SQL Server 2005 Mobile Edition, se podrábeneficiar de la funcionalidad que ofrece SqlCeRe-sultSet. Esta clase ofrece una mezcla de los dos obje-tos antes mencionados, y ofrece un rendimiento simi-lar a SqlCeDataReader, pero con la posibilidad de actua-lización y de desplazarse por sus filas como si de unDataSet se tratase.

El método ExecuteResultSet de la clase SqlCeCom-mand produce un objeto SqlCeResultSet, además de per-mitir especificar opciones sobre su comportamientomediante el parámetro ResultSetOptions que se pasa almétodo. Adicionalmente, SqlCeResultSet nos permiteenlazar una vista del conjunto de resultados a los con-troles de nuestras aplicaciones con poco esfuerzo, gra-cias a la clase ResultSetView, que proporciona una inter-faz entre el objeto SqlCeResultSet y los controles. Veael listado 1.

Es importante liberar los recursos que consu-man los objetos que se creen en la aplicación tanpronto como éstos dejen de utilizarse. Las clasesque se utilizan para el acceso a datos implementanla interfaz IDisposable, por lo que es posible (y muyrecomendable) utilizar la cláusula using para estepropósito.

private SqlCeResultSet resultSet;

private void LoadData(){

// ...this.resultSet = cmd.ExecuteResultSet(

ResultSetOptions.Scrollable | ResultSetOptions.Updatable);

// ...}private void menuItemBindData_Click(

object sender, EventArgs e){

ResultSetView rview = this.resultSet.ResultSetView;

rview.Ordinals = new int[] { 0, 1 };this.dataGrid1.DataSource = rview;

}

Listado 1. Uso de las clases SqlCeResultSet y ResultSetView.

dotN

etM

anía

<<

22

dnm.plataforma.net<<

Si la aplicación hace uso de SQL Server CompactEdition, en general se deben seguir las mismas reco-mendaciones y técnicas que se siguen al desarrollarcontra SQL Server. En particular, una forma de mejo-rar el rendimiento de una aplicación es optimizandolas consultas que utiliza. En este sentido, la creaciónde índices útiles es uno de los aspectos más impor-tantes para lograr un mejor rendimiento en tus con-sultas, ya que eligiendo los índices adecuados se redu-cirán las operaciones de E/S de disco y se hará unmenor uso de los recursos del sistema.

Recuerde también que realizar de forma periódicauna operación de compactación de la base de datos esuna buena práctica que ayuda al rendimiento.

Interfaz de usuario

Aunque hayamos dejado para el final el tema dela interfaz de usuario, no por ello ésta es menosimportante. A través de la interfaz de usuario el clien-te interactúa con la aplicación, y la percepción quese lleve de ésta es clave para determinar si el rendi-miento de nuestra aplicación es el adecuado.

Algunas recomendaciones relacionadas con lainterfaz de usuario son:

• Incluir el menor código posible en los even-tos. Por ejemplo, si la aplicación tiene que car-gar información en el formulario, en lugar deincluir el código de carga en el evento Load oShow se puede optar por la carga de la infor-mación de manera asíncrona.

• En aplicaciones donde no se puede evitar que exis-tan varios formularios al mismo instante, pero solose visualiza uno de ellos, es conveniente hacer usode los eventos Activate/Deactivate. El métodoActivate puede utilizarse para cargar los recursosque se necesitan en el formulario, mientras que elmétodo Deactivate puede usarse para liberarlosantes de cambiar a otro formulario.

• Utilizar BeginUpdate/EndUpdate cuando sea posi-ble. Por ejemplo, los controles ListView y Tre-eView utilizan estos dos métodos, que evitanque cada vez que actualizamos el contenidodel control éste se redibuje por cada elemen-to que añadamos o modifiquemos.

• Utilizar los métodos SuspendLayout y ResumeLa-yout si es necesario posicionar dinámicamentelos controles de usuario.

• Si es posible, diseñar operaciones asíncronaspara la carga de información. En el caso de uti-lizar hilos para la carga de información, haceruso de la clase ThreadPool suele ser la opciónrecomendable para evitar que los hilos se cre-en y se destruyan constantemente.

• El control TabControl permite crear una interfazrica, con diferentes pestañas dentro del mismo for-mulario. El problema de este componente es quese cargan todas las pestañas a la vez. Es decir, si elformulario tiene siete pestañas con datos en cadauna de ellas, todas ellas se cargarán en memoria ala vez con sus respectivos recursos. En este caso,debemos incluir la lógica necesaria en los eventosde activación y desactivación para conseguir quesolo la pestaña que esté visualizándose consumarecursos.

Herramientas de evaluación y diagnósticoLlegados a este punto, y después de haber mencio-nado los principales aspectos a tener en cuenta de caraal rendimiento, es el momento de analizar las herra-mientas que pueden ayudar a comprobar que el ren-dimiento es el adecuado y que la aplicación cumplecon las expectativas.

Con la llegada de .NET Compact Framework 3.5,han mejorado enormemente las herramientas que nospermiten obtener datos de rendimiento que posibili-tan evaluar y diagnosticar la salud de las aplicacionespara dispositivos móviles que desarrollamos.

Remote Performance Monitor and GC Heap Viewer.

RPM (figura 1) permite obtener contadores derendimiento en tiempo real, mientras que el Visordel heap (figura 2) nos permite capturar en cual-quier momento la parte de heap que usa nuestra apli-cación, y por tanto conocer las referencias que están acti-vas. Esto nos ofrece la posibilidad de comparar múlti-ples “instantáneas” de la ejecución de la aplicación paraencontrar problemas de memoria.

Figura 1. Remote Performance Monitor.

dotN

etM

anía

<<

24

dnm.plataforma.net<<

NETCF CLR Profiler

CLR Profiler (figura 3) es un profiler para aplica-ciones NETCF, que permite obtener datos para diag-nosticar posibles problemas de memoria. Es la pri-mera versión de un profiler para aplicaciones NETCF,ya que hasta esta versión una herramienta así soloestaba disponible para .NET Framework.

Remote Logging Configuration Tool y NETCFLog Viewer

RLCT permite gestionar de forma remota losregistros de actividad (logs) de NETCF: log de car-ga, log de errores, uso de interop, utilización de la redy ejecución de los finalizadores de .NET. Estos logsson muy útiles para la detección de problemas. Porotra parte, usando la herramienta NETCF NetworkLog Viewer podremos visualizar los logs de uso quese hayan obtenido.

ConclusiónLa disponibilidad de .NET Compact Framework sim-plifica en gran medida el desarrollo de aplicacionespara dispositivos Windows Mobile y WindowsEmbedded CE, permitiéndonos aprovechar toda lapotencia que ofrece el CLR. Conociendo las restric-ciones de este tipo de dispositivos y teniendo en cuen-ta las recomendaciones que hemos comentando a lolargo del artículo, tanto en el diseño inicial comodurante el desarrollo de la aplicación, lograremosdesarrollar aplicaciones que se comporten de mane-ra adecuada, de forma que un rendimiento deficien-te no se convierta en un factor de insatisfacción paranuestro cliente.

Figura 2. GC Heap Viewer.

BibliografíaSitio de Microsoft .NET Compact Frameworkhttp://msdn2.microsoft.com/es-es/netframework/aa497273.aspx

Blog de .NET Compact Framework Team http://blogs.msdn.com/netcfteam

Blog de Steven Pratschnerhttp://blogs.msdn.com/stevenpr/archive/2007/12/10/powertoys-for-the-net-compact-framework-version-3-5-now-released.aspx

Conceptos de SQL Server Compact Editionhttp://msdn.microsoft.com/es-es/library/ms173037.aspx

[1]

[2]

[3]

[4]

Figura 3. NETCF Profiler

Figura 4. NETCF Log Viewer.

No hace falta que enumere la cantidad de soft-ware de navegación mediante GPS que existeactualmente en el mercado. Este tipo de soft-ware se comunica con el dispositivo GPS, inter-preta la señal del mismo y procesa dicha infor-mación. En realidad, obtener la señal del GPSes lo menos complejo; lo realmente complicadoes el desarrollo de la lógica de la aplicación enbase a esa información. La versatilidad de esalógica implica que existan otros tipos de softwa-re aplicados en ámbitos más específicos o menoscotidianos.

GPS (su nombre completo es NAVSTARGPS) es un sistema de 301 satélites situados a pocomás de 20.000 km de altura que cubren, de formasincronizada, la totalidad de la esfera terrestre.Debido a su carácter de origen militar, la infor-mación obtenida de los satélites GPS permite nosolo obtener las coordenadas (longitud/latitud) deun objeto, sino también la altitud, así como la velo-cidad, rumbo, información de los satélites, lle-gando incluso a las inclinaciones de un objeto enel espacio con receptores más sofisticados. Sinembargo, muchas características (en forma de sen-tencias NMEA) dependen de que el receptor GPSlas interprete. El receptor que podemos adquirirhoy en día se centra principalmente en la recep-ción de la información necesaria para el posicio-namiento y trayectoria.

Durante el desarrollo de este artículo he tratadode indagar algo más sobre las características tec-nológicas del GPS, en aspectos concretos, con lo queademás de mostrar las posibilidades de utilizacióncon Windows Mobile, se enumeran, a grandes ras-gos (ergo matemáticas aparte), los tecnicismos y pará-metros a tener en cuenta en distintos escenarios.

Podrá encontrar la aplicación y recursos deejemplo utilizados en este artículo en www.dotnet-mania.com o desde mi Web en www.desarrolloMobi-le.NET (Sección GPS).

Qué ofrece Windows MobileComo decía, la demanda es tal, que muchos dis-positivos PDA vienen con GPS incorporado y sino, evidentemente, con posibilidad de conexiónmediante Bluetooth. Esto ha permitido quemuchas aplicaciones empresariales e industrialessaquen provecho de esta capacidad. Pero, si deseá-ramos hacer lo mismo desde nuestra aplicaciónWindows Mobile, ¿por dónde empezaríamos?

Con versiones anteriores a Windows CE 5.0,la obtención de la señal GPS se hacía, ya fueramediante Bluetooth o interno, por un puertoCOM de entrada (directamente por hardware).Un receptor GPS emite señales (en forma de sen-tencias ASCII) hacia el dispositivo a través delpuerto COM con una frecuencia de entre 1 y 5

Uso de GPS desde Windows Mobile

plataforma.net

José Miguel TorresTrabaja como arqui-

tecto de software enel departamento de

Tecnologías de laInformación de la

multinacional españo-la de transporte

urgente MRW. EsMVP en Device Appli-cation Development yMicrosoft Technology

Specialist en SQL Server 2005.

Mantiene el espacioWeb orientado al

desarrollo de disposi-tivos móviles enwww.desarrollo

Mobile.NET.

La proliferación de teléfonos y dispositivos móviles en estos últimos años hahecho posible todo tipo de usos que hace una década era impensable tenera nuestro alcance. Los receptores GPS son un ejemplo.

José Miguel Torres

1 Según las fuentes consultadas, se barajan entre 24 y 30 satélites, contando los de respaldo.

dnm.plataforma.net<<

segundos. En cada recepción se reciben varias sen-tencias NMEA (conoceremos algunas más adelante).En la figura 1 podéis ver un ejemplo de captura realde aproximadamente 3 segundos de un GPS.

Imagínese tener que procesar todo esto. Por un lado,debemos tener un hilo dedicado en exclusiva a escucharlas sentencias de entrada. Seguidamente, en función deltipo de sentencia (recuerden, son varias) interpretamosel contenido (no necesariamente existe una lógica en el

orden de las secuencias) y hacemos uso de delegados yeventos para alertas de cambios de posicionamiento enla interfaz de usuario. Ardua tarea, sin duda.

A partir de Windows CE 5.0 se perfecciona el meca-nismo de obtención de datos de un GPS. Windows CE5.0 ofrece una capa intermedia (GPS Intermediate Dri-ver, GPSID en adelante) que controla el dispositivoGPS para facilitar la obtención de datos del mismo através de básicamente 4 funciones y de estructuras nati-

dotN

etM

anía

<<

27

Figura 1. Ejemplo de sentencias reales obtenidas de un receptor GPS.

Figura 2. Parte del diagrama de clases utilizado en un proyecto para Windows Mobile 2003 SE para gestión de GPS.

$GPGSV,3,3,10,26,36,152,,30,17,236,31,,,,,,,,*7F$GPRMC,055443.072,A,4134.7380,N,00138.2946,E,21.99,142.37,041207,,,A*55$GPVTG,142.37,T,,,21.99,N,40.72,K,A*71$GPGGA,055444.072,4134.7333,N,00138.3000,E,1,04,02.4,302.7,M,50.1,M,,*62$GPRMC,055444.072,A,4134.7333,N,00138.3000,E,22.00,138.57,041207,,,A*58$GPVTG,138.57,T,,,22.00,N,40.75,K,A*7E$GPGGA,055445.072,4134.7287,N,00138.3058,E,1,04,02.4,303.4,M,50.1,M,,*62

dnm.plataforma.net<<

dotN

etM

anía

<<

28

vas. Esta capa intermedia controla todala “fontanería” de eventos de actualiza-ción de datos y además ofrece las sen-tencias NMEA en estructuras de datos,con lo que no es necesaria ya la mani-pulación desde código de las mismas.Otra característica que ofrece es la posi-bilidad de que varias aplicaciones con-suman los datos de un solo GPS a travésde GPSID.

Pese a todas estas ventajas, el desa-rrollo de una aplicación .NET CompactFramework que utilice estas librerías yestructuras no es nada sencilla. Mi opi-nión es que son muchas estructuras, fun-ciones y punteros a eventos, y sin unabase sólida de programación en C++ ycontrol y conocimiento en los cálculosde referencia, la tarea puede hacerse muytediosa. En este artículo no vamos a desa-rrollar una librería que encapsule la fun-ciones del GPS Intermediate Driver bajocódigo administrado; en el SDK de Win-dows Mobile 5.0 y 6.0 hay un ejemplode cómo se utiliza éste, y sinceramenteno se me ocurre una mejor forma deconocer su funcionamiento que explicarlas características de la clase administra-da que engloba las funciones nativas; alfin y al cabo, lo que nos interesa es utili-zar la librería, no desarrollarla desde cero.Sin embargo, lo que sí haremos es tratarde entender el código de ejemplo queMicrosoft ofrece en el SDK a través deldesarrollo de un pequeño ejemplo paraPocket PC, con el fin de poner en prác-tica el uso de la clase Gps, conocer los tér-minos más utilizados en posicionamien-to y utilizar las herramientas de depura-ción para este tipo de proyectos.

Nociones básicas de NMEAEl protocolo estándar NMEA (NationalMarine Electronics Association) es com-patible con RS-232. Utiliza entre 4.800y 9.600 bps, con 8 bits de datos, sin pari-dad y con un bit de parada. Todas las sen-tencias NMEA 0183 están codificadas enASCII, empiezan con el símbolo $ y estánprecedidas por las letras “GP” y el nom-

bre de la sentencia, terminando con unretorno de carro <CR><LF>. Los camposde la sentencias están delimitados porcomas, el último delimitado por un aste-risco y precedido por el valor hexadeci-mal de la suma de chequeo. Existen algomás de 50 sentencias NMEA, capaces dedar todo tipo de información a aerona-ves, embarcaciones y vehículos terrestres.

Los receptores utilizados para nave-gación hacen uso de unas pocas senten-cias, suficientes para obtener la localiza-ción, velocidad, rumbo y estado de lossatélites. Cada una de las sentencias apor-ta información específica. Fijémonos enlas secuencias $GPRMCde la figura 1. RMCson las siglas de Recommended MinimumSpecific GPS/TRANSIT Data. Estasecuencia ofrece información de posicio-namiento en los campos precedentes (verfigura 3). De esta forma, cada sentenciaconlleva un tipo específico de informa-ción, que junto a las demás sentencias con-forman el posicionamiento y estado de lossatélites, entre otros.

Ejemplo prácticoVamos a ver un ejemplo de cómo rea-lizar un velocímetro en una PDA. Elobjetivo es conocer las herramientasde emulación de secuencias que emi-te un GPS; conocer en profundidadqué funciones y estructuras nativas seutilizan, así como el uso de los even-

tos del driver del GPS, todo lo cualpodemos ver en el ejemplo Micro-soft.WindowsMobile.Simples.Location,que viene con el SDK, y por último,familiarizarnos con todos los términosque ofrece el GPS.

Microsoft FakeGPS para entorno dedesarrollo

La depuración de este tipo de apli-caciones es bastante incómoda. En unproyecto bajo Windows Mobile 2003SE,tuve que desarrollar un pequeño pro-grama que se comunicara por el puertoCOM, donde tenía emparejado el GPSBluetooth, y guardara toda la informa-ción que recibía en forma de sentenciasNMEA a un archivo durante los trayec-tos de casa a la oficina. Luego aparecióWindows Mobile 6 y con él su SDK. Enel SDK se ofrece una herramienta quesimula un GPS, cuyo nombre esFakeGPS. FakeGPS emite unas sen-tencias NMEA extraídas de un ficheroy las emite como si de un GPS real setratara a través del GPSID del emula-dor. Podrá encontrar esta herramientadentro del directorio de instalación delSDK de Windows Mobile versión 6, enel subdirectorio Tools\GPS. Observe quehay un archivo Fake.Cab y otro Set-tings.exe. Éste último lo utilizará paradispositivos Smartphone. Copie e insta-le Fake.Cab en el emulador donde depu-rará el proyecto.

Figura 3. Patrón de la sentencia RMC

dnm.plataforma.net<<

dotN

etM

anía

<<

2929

Una vez instalado el archivoFake.Cab en el emulador, nos dirigi-mos a “Programas” y ejecutamosFakeGPS (figura 4). Lo habilitamos eindicamos uno de los dos archivos quevienen preestablecidos inicialmente, yque son prácticamente iguales: elarchivo dixies.txt empieza a emitirsentencias NMEA de forma inmedia-ta, mientras que fakegpsdata.txt hacelo mismo, pero tarda un cierto tiem-po en emitir sentencias válidas. Pue-de añadir los suyos propios, sencilla-mente copiándolos dentro del subdi-rectorio GPSFiles donde se ha instala-do FakeGPS. Debido a que estos dosarchivos de ejemplo son sencillos y nomuestran con claridad la velocidad, nonos serán útiles. Por esa razón, le reco-miendo que descargue el archivooutgps2.txt, que contiene sentenciasNMEA reales tomadas en un rutina-rio día de trabajo desde mi casa enIgualada a la oficina en L’Hospitalet,y que capturé para el desarrollo de esteartículo, desde la www.dotnetmania.como desde mi Web en www.desarrolloMo-bile.NET (sección GPS).

Profundizando en Microsoft.Win-dowsMobile.Samples.Location.dll

Centrándonos en el ejemplo delSDK, la clase Gps llama a 4 funcionesnativas que residen en la librería Gpsa-

pi.dll. Además, existen otras estructu-ras y punteros a funciones para el con-trol de eventos a través de delegados(vea tabla 1). Este conjunto de funcio-nes y estructuras y las correspondien-tes constantes conforman el GPS Inter-mediate Driver (para más información,consulte Gpsapi.h).

Una de las peculiaridades de este dri-ver es que ofrece dos formas de presen-

tar las secuenciasNMEA. La máscomún, conocidacomo Parsed, emi-te la informaciónen forma de estruc-tura GPS_POSITION,en la que el propiodriver interpretalas secuenciasNMEA y crea laestructura condatos de posiciona-miento estructura-dos. Otra forma,

conocida como Raw,ofrece la transmisión

directa de las secuencias NMEA desdeel GPS en forma de stream; posterior-mente éstas son capturadas mediante lasfunciones CreateFile y ReadFile, sin unaprevia manipulación. En esta última,nosotros mismos debemos interpretartodas las sentencias NMEA que nos lle-

guen; además, podemos enviar senten-cias de configuración desde nuestra apli-cación al GPS mediante WriteFile. Eneste ejemplo, obtendremos los datos delposicionamiento a través de la estructu-ra GPS_POSITION y a su vez por la claseGpsPosition (tal y como se hace en elejemplo del SDK), con lo que haremosuso del modo Parsed.

Si observa el código, notará la con-tinua llamada a las funciones, tambiénnativas, LocalAlloc y AllocFree, con lascuales se crean y se destruyen en memo-ria administrada matrices de bytes quealbergan información de las estructurasnativas. Fíjese especialmente en lasestructura GPS_DEVICE. No existe comoclase o estructura administrada, ya quese crea como una matriz desde códigoy posteriormente es consumida por laclase GpsDeviceState.

La recepción de los datos se reali-za a través del método GPSGetPositionde la clase Gps, cuyo hilo comienza alabrirse la comunicación con el GPS.Este hilo permanecerá en continuaescucha y obtendrá tanto las modifica-ciones del estado del GPS, nuevos posi-cionamientos o peticiones de parada enla comunicación. Por otro lado, las apli-caciones que hagan uso de esta libreríarecibirán en modo de eventos todos loscambios mencionados anteriormentecon los nuevos datos, siempre desde cla-

Figura 4. Configuración de FakeGPS

Funciones

GPSOpenDevice Inicializa y crea la conexión con GPSID.GPSCloseDevice Cierra la conexión con GPSID.GPSGetPosition Obtiene la estructura (GPS_POSITION) de datos de posicio-

namiento del GPS.GPSGetDeviceState Obtiene la estructura de estado (GPS_DEVICE) del hardware

del GPS.

Estructuras

GPS_POSITION Estructura que contiene toda la información de posiciona-miento y estado de los satélites en modo Parsed.

GPS_DEVICE Estructura que contiene toda la información de estado tan-to del GPSID como del hardware.

Tabla 1

ses administradas. Fíjese en la funciónnativa GPSOpen. Los dos primeros argu-mentos son punteros a funciones mane-jadas como delegados y propagadascomo eventos desde .NET CompactFramework.

Otra de las características a nues-tra disposición es la posibilidad de obte-ner el estado de la triangulación de lossatélites, como el número y señal de losmismos. Además, existen multitud deconstantes en Gpsapi.dll, algunasexpuestas como enumeradores comoFixQuality en la clase GpsPosition. Loseventos que tengan lugar por la modi-ficación del estado del GPS son de vitalimportancia para determinar la validez,por ejemplo, de las sentencias NMEAobtenidas.

Interfaz de usuario

Para el ejemplo, vamos generar unproyecto Windows Forms para Win-

dows Mobile 5/6. Lo único que nece-sitaremos se muestra en la figura 6. Evi-dentemente, usted puede rediseñarlo asu propio gusto; lo único que se nece-sita son controles para poder represen-tar, por ejemplo:

• La velocidad en km/h.• Información de satélites.• El posicionamiento (latitud/lon-

gitud).• Altitud (por encima del nivel del

mar).• Rumbo.

Si desea mostrar más datos, tiene asu disposición las propiedades de la cla-se GpsPosition con todos los datos nece-sarios.

Primer paso, y más importante,establecer el sistema de eventos. Vamosa utilizar un objeto de la clase Gps pri-vado para la clase del formulario. Abri-remos y cerraremos la comunicacióncon el GPS a través de los menús y lasllamadas a los métodos Open() y Clo-se(). Cuando abramos la comunicacióncon el GPS, capturamos el evento Loca-tionChanged (el evento DeviceState-Changed no se muestra en este ejemplo)que expone la clase Gps. En ambos casos,los delegados propagan argumentos tan-to con el estado del dispositivo, a través

de la clase Gps-D e v i c e S t a t e

(argumento deltipo DeviceSta-teChangedEven-

tArgs), comodel posiciona-miento a travésde la clase Gps-Position (argu-mento del tipoLocationChange-

dEventArgs). Esmuy importanteque los eventosse de claren através del dele-gado EventHand-ler puesto que

la clase Gps, internamente, crea un hiloque propaga la llamada a través del res-pectivo delegado. De esta forma, al resi-dir en un proceso distinto la única alter-nativa es la llamada a través de Con-trol.Invoke (vea listado 1).

dnm.plataforma.net<<

dotN

etM

anía

<<

30

Figura 5. Diagrama de Microsoft.WindowsMobile.Samples.Location del SDK.

Figura 6. Interfaz propuesta y en ejecución utilizando FakeGPSdesde el emulador.

dnm.plataforma.net<<

dotN

etM

anía

<<

32

En cuanto a la actualización dedatos por pantalla, es tan sencillo comose puede ver en el listado 2.

Ejecución y depuración

Prácticamente no tenemos quehacer nada extraordinario para la depu-ración de proyecto si hemos configu-rado correctamente FakeGPS y ésteestá habilitado. Sencillamente ejecuta-mos, y empezarán a mostrarse los datospor pantalla. Recuerde configurarFakeGPS con el archivo outgps2.txtanteriormente mencionado.

Configuración del GPSID en tú PDA

Antes que nada, vamos a ver enprofundidad la configuración del dri-ver desde el GPS. Como dije, pode-mos encontrarlo en “Configuración”| “Sistema”. Por un lado, tenemos

que emparejar el dispositivo GPS (enel caso que sea Bluetooth) y observarqué puerto utiliza el servicio SerialPort (SPP) dentro de la configuraciónde Bluetooth. Tenga en cuenta que elemparejamiento de un GPS Blueto-oth mediante SPP conlleva la utiliza-ción de 2 puertos, el de entrada delGPS y el de salida. Por otro lado, la

configuración del GPSID requiereotros dos puertos COM: el primeroel de programa, que será el que utili-zarán las aplicaciones cliente paraobtener información del GPSID y elsegundo, el de hardware, que ha deser el mismo que el de salida del ser-vicio SPP del emparejamiento delGPS (ver figura 7).

private Gps _gps;private EventHandler hndActualizador;

private void frmMain_Load(object sender, EventArgs e)

{// inicializamos EventHandlerhndActualizador = new

EventHandler(ActualizarDatos);// nueva instancia de la clase Gps_gps = new Gps();// capturamos cambios de // localización_gps.LocationChanged +=

new LocationChangedEventHandler(_gps_LocationChanged);

// abrimos conexión_gps.Open();

}

void _gps_LocationChanged(object sender, LocationChangedEventArgs args)

{// invocamos al método Actualizar // para mostrar nueva información // en el formulario.Invoke(hndActualizador,args.Position);

}

Listado 1. Inicialización básica.

void ActualizarDatos(object sender, System.EventArgs args){

GpsPosition _posicion = sender as GpsPosition;

if (_posicion != null){

if (_posicion.LatitudeValid && _posicion.LongitudeValid)this.lblPosicion.Text = (_posicion.Latitude>0?”N “ :”S “)

+ _posicion.Latitude.ToString(“0.000000”) + “ “+ (_posicion.Longitude>0?”E “:”W “) + _posicion.Longitude.ToString(“0.000000”);

if (_posicion.SatellitesInSolutionValid &&_posicion.SatellitesInViewValid &&_posicion.SatelliteCountValid)

{this.lblAltitud.Text = “Satelites: [“

+ _posicion.GetSatellitesInSolution().Length + “/” +_posicion.GetSatellitesInView().Length + “] # en uso: “ +_posicion.SatelliteCount + “ “ +string.Format(“{0:F}-{0:F}-{0:F}”, _posicion.HorizontalDilutionOfPrecision +_posicion.PositionDilutionOfPrecision+_posicion.VerticalDilutionOfPrecision);

}

if (_posicion.TimeValid)this.Text = “UTC “ + _posicion.Time.ToLongTimeString();

if (_posicion.SpeedValid) // conversión de millas náuticas a Km/hthis.lblVelocidad.Text = (_posicion.Speed * 1.852).ToString(“000”);

if (_posicion.SeaLevelAltitudeValid)this.lblPosicion.Text += “ “

+ _posicion.SeaLevelAltitude.ToString(“00.0”) + “/” + _posicion.EllipsoidAltitude.ToString(“000”) + “ metros.”;

if (_posicion.HeadingValid)this.lblHeading.Text = _posicion.Heading.ToString(“000”);

}}

Listado 2. Representación de datos por pantalla.

dnm.plataforma.net<<

dotN

etM

anía

<<

33

Algunos términos importantes del GPSEl receptor GPS recibe la señal de lossatélites que tiene a su alcance, evalúala calidad de la señal-ruido, determinasi ésta es válida y calcula la distancia alos mismos en base a la velocidad de laluz en el vacío (aplicando una correc-ción de error). Cuando el receptorobtiene información fiable de dos saté-lites, se obtiene una posición inexactaubicada en la zona de intersección delas dos circunferencias de los satélites.Añadiendo un tercer satélite, obtene-mos el posicionamiento 2D (x, y, z) ycon él la triangulación; sin embargo,este posicionamiento no es preciso amenos que exista un cuarto satélite conuna señal-ruido aceptable. La explica-ción reside en que cada uno de los saté-lites incorpora dos relojes atómicos dealtísima precisión. Estos relojes, cuyocoste es elevadísimo, están sincroniza-dos entre todos ellos pero no lo estáncon el reloj del receptor (ya que éste nolos incorpora por cuestiones de abara-tamiento del terminal), y como el cál-culo de distancias entre satélite-recep-tor se realiza en base a la hora exacta enla que fue emitida una señal, la únicaforma de establecer un posicionamien-to fiable es con un cuarto satélite y conello se obtiene una triangulación en 3D(x, y, z, tiempo) exacta.

Así pues, cuanto mejor sean las con-diciones meteorológicas y mayor sea elnúmero de satélites utilizados por elreceptor, mayor será la precisión, cuyorango oscila entre los 15 metros (exis-ten varias fuentes de error) y 1 metro.Dentro de los datos de posiciona-miento que ofrece el GPS se incorpo-ra el estado de los satélites que el recep-tor “visualiza”, así como los que seestán utilizando y la dilución de cadauno de ellos.

La dilución de precisión (DOP) seemplea en cartografía y describe la pre-cisión del GPS en base a la geometríade los satélites. Cuando la señal DOPes alta, los satélites están muy cercaentre sí, con lo que la precisión dismi-nuye y el valor DOP aumenta. Si porel contrario los satélites son distantes,la precisión aumenta y con ello el valorDOP disminuye. Los obstáculos urba-nos y naturales puede aumentar el DOPde la señal del GPS. Existen dilucionesde precisión para el posicionamientohorizontal (HDOP), vertical (VDOP),el de posicionamiento (PDOP) y el detiempo (TDOP). Puede encontrar estosvalores en la clase GpsPosition (propie-dades PositionDilutionOfPosition, Hori-zontalDilutionOfPosition y VerticalDi-lutionOfPosition).

Otro factor que no hemos explica-do es el que hace referencia a la pro-piedad EllipsoidAltitude de la claseGpsPosition. El concepto de elipsoidees utilizado matemáticamente para des-cribir la superficie terrestre en base ados radios (polar y ecuatorial), es decir,algo así como un sistema de coordena-das mundiales relativas a la norma apli-cada, en las que se basa el sistema GPS

Figura 7. Emparejamiento y configuración de un GPS Bluetooth

dotN

etM

anía

<<

34

y que se estableció bajo la norma o“datum” conocida con las siglasWGS84. Esto es necesario puesto quela tierra no tiene una forma geométri-ca regular, y por lo tanto, la altitud (anivel del mar) se obtiene en base a laaltura del receptor respecto del elip-soide y el valor del elipsoide, segúnWGS84, establece un valor entre 44 y55 metros por encima del nivel del maren España. Ambos valores, el del elip-soide y el de la altitud, se complemen-tan, así que si su aplicación requirierade una precisión en cuanto a la altituddel receptor, téngalo presente y con-sulte los manuales del receptor. Para elresto de los mortales, nos conformamoscon saber, aproximadamente, qué es ypara qué sirve el “datum” WGS84.

Uso de varias aplicacionesSi ha utilizado el archivo de sentenciasque le he indicado, uno propio o sen-cillamente los que FakeGPS ofrece pordefecto, trate de hacer lo siguiente.Configure FakeGPS con outgps2.txt einstale Google Maps para Pocket PCen el emulador. Debido a que GoogleMaps requiere conexión a Internet,empareje el emulador a través del Devi-ce Emulator Manager con ActiveSync

o Windows Device Center medianteDMA. Luego instálelo, y tras ejecutarGoogle Maps haga uso del GPSmediante el menú “Use GPS”. Ahoraejecute la aplicación del velocímetro, ycomprobará como ambas aplicacionesconsumen todas las secuencias NMEAtomadas “off line” e indicadas porFakeGPS.

Finalizando

Siempre que quiera profundizar enalgún término, ya sea específico o gene-

ral, acerca del funcionamiento del GPS,llegará a toparse con alguna ecuaciónmatemática que le demostrará el porqué. Si no quiere más que saber acer-ca de cómo utilizarlo desde su aplica-ción, quédese con la utilidad que pue-de sacar del GPSID, de los datos queéste puede ofrecer y del significadoexacto de los mismos. No olvide enentornos de desarrollo el uso deFakeGPS, el cual es sencillamentegenial, y descargar el archivo de sen-tencias que utilicé para el desarrollo deeste ejemplo. La representación de laaplicación en el emulador se aproxi-mará al 95% de la realidad. El únicoinconveniente es la latencia en la recep-ción del datos desde su PDA, la cualserá distinta (más lenta seguramente)que en el emulador, según el receptory la propia PDA. En dicho ejemplo,podrá apreciar también los agotadoresatascos que se producen en la entradaa Barcelona a primera hora, y quizásalgún exceso de velocidad (justificados,lo prometo ☺). Hablando de impru-dencias, si utiliza su aplicación desdeel coche, hágalo estando como copilo-

to; podrá apreciar con mayor percep-ción los datos que se muestran, y depaso se evitará algún que otro disgus-to, se lo digo por experiencia.

Figura 8. Datos de Altitud elipsoidal, DOP y MSL.

Figura 9. Google Maps for Pocket PC utilizando Fake GPS.

dnm.plataforma.net<<

Es bien sabido que BizTalk es utilizado mayorita-riamente como solución de integración en procesosde negocio que involucran grandes sistemas, y quepor tanto requieren el intercambio de informaciónentre entornos tan dispares como HOST, SAP,CRM… Este tipo de aplicaciones de integraciónconstruidas bajo arquitecturas BizTalk suponen unescenario altamente complejo de testear y de estre-sar, en el que a menudo intervienen grandes dosisde imaginación para conseguir realizar ciclos de prue-ba completos en entornos en los que no se tiene acce-so a los sistemas finales.

Situémonos en contexto: los departamentos deIT de las grandes organizaciones suelen tener unainfraestructura en la que disponen de un entorno deproducción y otro de pruebas o test. En el mejor delos casos ambos entornos poseen idénticos sistemascon la salvedad del tipo de datos que albergan y delas peculiaridades arquitectónicas que caracterizancada entorno: alta disponibilidad, hardware de ele-vadas prestaciones… La problemática surge cuandoqueremos realizar una prueba de estrés completa deuna aplicación, ya que seguramente sea necesariorealizar conexiones con los diferentes sistemas ypodríamos llegar a colapsarlos en picos máximos decarga: evidentemente no es un escenario deseable,pues es posible que en el departamento de informá-tica haya decenas de personas que estén trabajandocontra el entorno de desarrollo y estemos inte-rrumpiendo su trabajo con nuestras pruebas.

Para superar las anteriores limitaciones, necesi-taríamos poder aislar nuestros procesos BizTalk susti-tuyendo las comunicaciones contra los diferentes sis-temas por otras que simulen las originales, que utili-cen idénticas estructuras de datos y tipos pero que estén100% en nuestro ámbito y que no interfieran en otrosequipos de trabajo; de esta forma podríamos generartoda la carga que necesitemos buscando el “estrés” delentorno sin afectar al resto de sistemas, para despuéselaborar, por ejemplo, informes de rendimiento en basea volúmenes de carga de los que extrapolar la arqui-tectura final del entorno Biztalk.

En la solución que proponemos a continuación noes necesario modificar el código fuente de los proce-sos BizTalk, sino que mediante las opciones de confi-guración de la aplicación y la creación de los artefac-tos adecuados conseguiremos el aislamiento deseado.El código fuente de este artículo puede encontrarlo enla Web de la revista en www.dotnetmania.com.

Pongámonos manos a la obra y veamos un ejem-plo concreto: un proceso BizTalk expuesto como Web-Service que recibe un pedido y se comunica con SAPpara registrarlo, el resultado del proceso SAP es encap-sulado y devuelto como respuesta al WebService.

La figura 1 muestra lo que podría ser la repre-sentación de una orquestación que encapsula dichoproceso.

Aquí podemos ver dos comunicaciones: la queorigina el lanzamiento del proceso y la que realizael envío de la información a SAP. En cada orquesta-

Estresando aplicaciones BizTalk conLoadGenerator

BizTalk

David Baraldés, Business Process

Competence Mana-ger de Raona. David

es MCTS BizTalk Server 2006.

Este artículo pretende mostrar una manera sencilla y flexible de construirun entorno de simulación para cualquier proceso de negocio BizTalk queimplique la comunicación con cualquier sistema imaginable y sin tener querealizar ningún tipo de modificación en el código fuente de las orquesta-ciones.

David Baraldés

ción que forme parte de la aplicaciónsolo habrá una comunicación de iniciode proceso, sin embargo, para el envíode información puede haber tantascomo sean necesarias. Para poder pro-bar el proceso aislado debemos cen-trarnos en estas dos partes: la genera-ción de la petición de inicio y la simu-lación de la llamada o envío.

Generación de la petición deinicio

Para la generación de peticiones uti-lizaremos una herramienta llamadaLoad Generator, proporcionada porMicrosoft para la realización de prue-bas de estrés de sistemas BizTalk. Setrata de una aplicación que tiene unaarquitectura basada en 3 capas: Pre-sentation, Framework y Component.

La primera se presenta como unaaplicación de consola (LoadGenConso-le.exe), que recibirá como parámetrode entrada un archivo XML e invocaráal Framework pasándole el contenidode este archivo de configuración.

La capa de Framework contiene unassembly (LoadGen.dll) que es el “engi-ne” de la herramienta, y es el responsa-ble de interpretar el XML de configura-ción para crear los componentes necesa-rios para la creación de los mensajes (Mes-sage Creators), el envío y generación delos mismos (Load Generators), y la moni-torización del flujo (Throttle Contro-llers). Estos son los componentes queconstituyen la tercera capa.

LoadGen utiliza los Message Crea-tors para crear dinámicamente los datosde los mensajes. Estos mensajes sonenviados al Load Generator que seencarga de transmitirlos utilizando eltipo de transporte definido en el XMLde configuración. Si es necesario, exis-te la posibilidad de monitorizar el flu-jo de entrega de los mensajes median-te los Throttle Controllers.

La herramienta proporciona pordefecto los siguientes Load Generators:- File Transport: envía los mensajes

a una ruta de disco específicada.- HTTP Transport: envío de mensa-

jes a URLs. Soporta Request-Res-

ponse y envío asíncronos.- SOAP Transport: envío de mensa-

jes a WebServices. Soporta Request-Response y envíos asíncronos.

- MSMQ Transport: envío de men-sajes a colas MSMQ de Microsoft.

- MQ-Series Transport: envío de men-sajes a colas MQ-Series de IBM.

- WSE Transport: envío de mensajesa WebServices que implementanWSE. Soporta Request-Responsey envíos asíncronos.

- WSS Transport: Windows Share-Point Services.

Y los siguientes Throttle Contro-llers:- File Monitor: Monitoriza el núme-

ro de mensajes creados en una rutade disco.

- Rate Monitor: Monitoriza la fre-cuencia en que los datos son creados.

- SQL Monitor: Monitoriza el núme-ro de filas creadas en una base dedatos SQL Server.

- MQ Series Monitor: Monitoriza elnúmero de mensajes enviados a unacola MQ Series de IBM.

- MSMQ Monitor: Monitoriza elnúmero de mensajes enviados a unacola MSMQ de Microsoft.

- Performance Counter Monitor:Monitoriza contadores de rendi-miento.

- Performance Counter Diff Moni-tor: Monitoriza la diferencia entredos contadores de rendimiento.

En el archivo de configuraciónpodremos definir aspectos como: - Creación dinámica de los mensajes

a enviar. Fijando parámetros comoel tamaño del mensaje, o como loscampos del mismo que queremosque tengan valores aleatorios.

- Límite de peticiones a enviar en eltest. Esto puede venir marcado porel número total de mensajes aenviar, o por la duración en tiempode ejecución del test.

- Transporte utilizado para la trans-misión de mensajes. Existe la posi-bilidad de crear varias secciones parapoder utilizar diferentes tipos detransporte a la vez.

dotN

etM

anía

<<

37

dnm.servidores<<

Figura 1

dotN

etM

anía

<<

38

dnm.servidores<<

- Los componentes de monitorización a utilizar.También podemos definir varios, dependiendo delas necesidades de monitorización que tengamos.

En la última versión de esta herramienta (2007)encontraremos la incorporación del soporte a WCFpara poder realizar pruebas de estrés en sistemas conBizTalk 2006 R2 y con este tipo de adaptador.

Simulación de la llamadaPara conseguir una flexibilidad total, la idea es

conseguir simular el envío de información a los dife-rentes sistemas sin necesidad de modificar el códigoexistente. BizTalk realiza estos envíos mediante los“SendPorts”, que pueden ser de tipo “One way” (úni-ca dirección) o “Solicit-Response” (envío-respuesta).Para todos los envíos del primer tipo la solución esfácil: es tan sencillo como cambiar la configuracióndel puerto y fijar como tipo de transporte “File” ycomo pipeline de envío “PassThruTransmit”, e indi-car como destino una carpeta de disco. Sin embargo,para los envíos del segundo tipo es necesaria una res-puesta que esté relacionada con el envío. Por tanto,deberemos construir un sistema (en nuestro caso unWebService), que reciba el envío del mensaje y nosgenere una respuesta adecuada. El último paso de lallamada consistirá en configurar correctamente elpuerto de envío para que apunte a nuestro nuevoWebService.

WebService

Desarrollaremos un servicio (WSBinding) queserá el encargado de recibir todos los envíos de estetipo “envío-respuesta”, y en base a los parámetrosrecibidos en la llamada buscará una instancia de res-puesta correcta para el envío. El almacén de los men-sajes XML de respuesta puede ser tanto una sencillabase de datos SQL Server como un sistema de fiche-ros en disco. En nuestro caso hemos optado por elsistema en base de datos por ser una solución más“elegante” y con mejores rendimientos.

Nuestro ejemplo solo tiene una llamada a un sis-tema externo, pero lo normal es que en un proyectocon cierta entidad tengamos varias orquestaciones quecontengan llamadas con diferentes tipos de transpor-te y diferentes nombres de operación. Para identifi-car cada operación, hemos definido estas propieda-des: SendingOrchestrationType, Transport, MessageTy-peIn. Con estos parámetros podremos buscar en nues-tro repositorio de instancias de mensajes (BD SQLServer) un mensaje de respuesta que se adecúe al tipooperación; además indicaremos en la propiedad Mes-sageTypeOut qué tipo de mensaje devuelve.

Proyecto BizTalk

Una vez tenemos el sistema que nos genera lasrespuestas, necesitamos “adaptar” el envío y recep-ción de estas comunicaciones: crearemos un proyec-to BizTalk (BTSSample) que contendrá dos pipelines, unade envío (SndBinding) y otra de recepción (RcvBinding).Cada una de estas pipelines contendrá su correspon-diente pipeline component que será el que realice latransformación del mensaje, así como la modificaciónde las propiedades de contexto para ser enrutadocorrectamente.

Pipeline de envío

Contendrá en la fase de codificación un CustomPipeline que básicamente se encargará de obtenerlas propiedades del mensaje que identifiquen la ope-ración (SendingOrchestrationType, Transport y Mes-sageTypeIn), para posteriormente, crear la peticiónal WS con estos parámetros. Finalmente, asigna ypromociona el MessageType correspondiente alRequest del WS.

Pipeline de recepción

En la fase de codificación, contiene un CustomPipeline que realiza la transformación de la res-puesta del WS. En esta respuesta nos encontramosdos propiedades: MessageResponse y MessageType-Out. De la primera obtendremos el XML de res-puesta de la operación. De la segunda, el tipo demensaje esperado en la respuesta a la llamada; portanto, la utilizaremos para promocionar el Messa-geType del mensaje y de esta forma cumplir las con-diciones de suscripción del puerto.

Para conseguir una flexibilidad total, la idea es conseguir simular el envío

de información a los diferentes sistemas sin necesidad de modificar

el código existente

Esquemas del WS

En el proyecto BizTalk que hemos creado es nece-sario añadir una referencia Web al servicio anterior,para de esta forma poder consumir los esquemas utili-zados por el mismo. La compilación de los esquemasnos generará las clases proxy necesarias para la seriali-zación de los mensajes y ejecución de sus operaciones.Este paso es necesario para la configuración de los Send-Ports que veremos en el siguiente apartado.

Configuración de puertos

En este punto, ya tenemos construidos todos losdesarrollos; ahora solo nos queda la parte de con-figuración, que realizaremos cambiando los bindingsde los puertos con la consola de administración deBizTalk.

Primero, crearemos una nueva aplicación (BTS-Sample) en la que desplegaremos nuestro proyecto Biz-Talk. En la aplicación BizTalk que queremos testearañadiremos una referencia hacia nuestra nueva apli-cación para poder usar sus componentes. Posterior-mente, nos dirigimos al SendPort encargado de lacomunicación que queremos simular y cambiaremossus propiedades.

Cambiamos el tipo de transporte, antes SAP, porSOAP (pues es un WS) y le asignamos las correspon-dientes pipelines desarrolladas. Ahora hay que modifi-car las propiedades del transporte, para eso nos diri-gimos a “Configure”.

Indicamos la dirección de nuestro WS, y confi-guraríamos la autenticación si fuera necesario. Ahoraviene quizás lo más interesante, nos dirigimos a la pes-taña de “Web Service”.

Por defecto está seleccionada la opción de “Orches-tration Web port”, de forma que se utiliza como cla-se proxy el especificado en la orquestación. Como noqueremos modificar el código de la orquestación ini-cial, utilizamos la otra opción y seleccionamos elensamblado generado en la compilación de BTSSample,e indicamos el tipo de la clase y el método a ejecutar.De esta forma, se utilizará para la serialización y dese-rialización del mensaje nuestra clase proxy correspon-diente al WS. Si no hiciéramos esto, en el momentode enviar el mensaje se nos mostraría una advertenciaen el visor de eventos del sistema, que indicaría quela serialización del mensaje no se corresponde con laesperada por el WS.

Y ahora ya estamos en disposición de testear ygenerar toda la carga necesaria contra nuestra aplica-ción sin necesidad de disponer del sistema de destino,en este caso SAP, evitando de esta forma un posiblecolapso del mismo.

dotN

etM

anía

<<

39

dnm.servidores<<

Figura 2

Figura 3

Figura 4

Si yo fuera escritorNo, no quiero que esta isla sea una columna de opi-nión, y el lector tiene la suerte de que yo no soy escri-tor profesional, es decir, de aquellos que saben de lite-ratura y demuestran continuamente su cultura en todolo que escriben, normalmente adornando todo lo quedicen con cosas que finalmente solo sirven para rizarel rizo, que de por sí ya está rizado.

Tampoco sé formar correctamente las frases, miamigo Octavio Hernández algunas veces me regañaporque a mis textos les falta claramente un sujeto yun predicado; vamos, que algunas veces se me va unpoco la pinza y me olvido de los sujetos, de los pre-

dicados y hasta de qué estaba escribiendo (si alguiensabe quién hace pruebas de implantes de memoriaRAM, yo me ofrezco voluntario, porque según pare-ce, la que tengo no llega ni a los 16 KB de la amplia-ción que tenía el ZX-81).

Sobre mi formación lingüística, en mi defensa diréque “ese día seguro que falté a clase” (y al siguientee incluso el anterior), y así pasa lo que pasa, que nosé dónde poner una coma o un punto. Eso sí, sé aciencia cierta que iba (de ir) se escribe con BE (deburro, que es lo que yo era en esos años, bueno, yahora también, pero algo menos, digamos con beminúscula). La maestra me lo hizo escribir cien veces,pero de las de verdad, es decir, “Toma esta libreta yescribe cien veces ‘Iba se escribe con be’”. En aque-llos años no había ordenadores, si no seguramentehubiera hecho como el del chiste (pero en Visual Basic,como es de suponer), e incluso le hubiera puesto elnúmero delante, por supuesto correctamente alinea-do, para que la maestra (que no profesora) no tuvie-ra dudas de que había cumplido mi tarea. Sí, algoparecido al listado 1.

Pero en aquella época esto no hubiera servido, asíque tuve que escribirlo 100 veces, y además en la calle,porque así eran los maestros de los años 60. Sin olvi-

Isla VB

Guillermo “Guille”Som

Es Microsoft MVP deVisual Basic desde 1997.Es redactor de ddotNet-Manía, mentor de Solid

Quality Mentors, oradorde Ineta Latam, y autor

de los libros “ManualImprescindible de Visual

Basic .NET” y “VisualBasic 2005” y “Noveda-

des de Visual Basic 9.0” ypróximamente “Apren-da C# 3.0 desde 0.0 –

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

Si me rinde el código y no lo entiendo, ¿realmente me rinde? Este deberíahaber sido el título de este artículo, pero era demasiado largo, aunque en elcontenido sí que veremos algunas cuestiones que debemos tener en cuentaa la hora de decidir qué es mejor, si entender lo que escribimos o que rindamejor. Por supuesto, lo bueno es que seremos nosotros los que decidamosqué hacer, sobre todo si sabemos cómo hacerlo.

Guillermo «Guille» Som

Rendir o no rendir…Viejas costumbres, nuevas formas, versión 2.0

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.

Firmas para solicitar ayuda del gobierno españolpara la investigación de una cura para la enfermedadde Alexander: http://www.elguille.info/solidario/ayu-daJuanma/Firmas_Juanma.aspx

Isla solidaria

For i = 1 To 100Console.WriteLine(“{0,3} Iba se escribe con be”, i)

Next

Listado 1. Un castigo de los de antes, al estilo de Visual Basic 9.0.

dotN

etM

anía

<<

41

dnm.isla.vb<<

dar que al director, Don José Molinillo (antes a losmaestros/profesores siempre se les trataba de usted yde don/doña, que para eso habían aprobado cuarto yreválida) lo veía constantemente, y lo malo era queconocía a mi padre (mi padre era fotógrafo y le hizo elreportaje de bodas), así que... ahora sé porqué tengolas orejas que tengo; no porque me dieran tirones, yaque mi padre nunca me puso la mano encima (aunqueel “dire” sí que me daba algunos tirones de las patillas),sino por lo de las orejas de burro que se le ponen a losmalos estudiantes en los comics (o tebeos que decía-mos en aquellos tiempos).

Viejas costumbres, nuevas formas, versión 2.0Aprovechando el código del listado 1, y para empezara cambiar de tema, aunque siguiendo con el del mespasado (que no es el pasado, sino el antepasado, ya queel mes pasado se publicó el artículo del especial sobreLINQ): este tipo de código le cuesta digerirlo a los quehan estado usando los Visual Basic clásicos (ya sabemos:no solo VB6, sino también todos los VBA), no porqueen las versiones clásicas no usáramos Console.WriteLi-ne para mostrar el resultado (de hecho, lo más quepodríamos hacer es usar Print para imprimir en el pro-pio formulario, el problema es que al cambiar el tamaño,el resto, que inicialmente no estaba visible, simplementeno mostrará nada). Tal vez el código del listado 2 seríamás fácil de entender, ya que lo que se hace es conca-tenar el número y el texto a mostrar, aunque tambiénes verdad que al usarse los métodos ToString y PadLeftpodría resultar algo extraño. En realidad, si yo escri-biera ese código en Visual Basic 6.0, y como soy de la“vieja escuela”, seguramente lo haría como muestro enel listado 3, más complicado, pero es lo que mi chip mediría que escribiera, que de muchas de las funciones deformato y manipulación de cadenas que se introduje-ron en la versión 6.0 de Visual Basic son pocas las queusaba, porque, como ya comenté en el artículo de abril,tenía mucho código encapsulado para realizar muchasde estas acciones habituales en mi código, y es que todolo de darle formato a los textos era algo que usaba y abu-saba en mi código, que si cadenas con una cantidad decaracteres, que si cadenas de relleno al inicio o al final,que si quitar los caracteres en blanco del interior de lacadena, que si buscar múltiples posiciones de varioscaracteres en una cadena, y otras “manipulaciones”varias.

En realidad el listado 3 no es la corresponden-cia exacta del listado 2, ya que usamos un controlTextBox para contener el texto a mostrar, y debidoa que la propiedad Text es la predeterminada de loscontroles TextBox de Visual Basic 6.0, no es nece-

sario indicarla. Otra cosa interesante o a destacardel listado 3 es la declaración de la variable delbucle. Seguramente muchos ni la declararían, o alo sumo la definirían sin tipo o del tipo Integer.¿Por qué la defino como Long? Porque Long es eltipo de datos interno que usará el compilador deVisual Basic 6.0, ya que en Visual Basic 6.0 un tipoLong es un entero de 32 bits y como seguramentesabrá el lector, las versiones 5.0 y 6.0 de Visual Basicclásico solo compilan para entornos de 32 bits, portanto, el tipo entero que tiene mejor rendimientoes el de 32 bits. Ahora en Visual Basic .NET lo lógi-co es usar el tipo Integer, que equivale al tipo Int32de .NET. Estas conversiones las hace correctamenteel asistente de conversión de código, pero muchosusuarios de VB6 lo olvidan a la hora de escribir elnuevo código.

Aunque en ese código del listado 3 no se mues-tra, el control que tenemos en el formulario paramostrar el resultado de nuestro castigo por no sabercómo se escribe “iba” es un TextBox multilínea, elcual, para que se “ancle” al formulario, es decir,para que adapte automáticamente su tamaño al delformulario, hay que hacerlo manualmente, y estoes otra de esas cosas que se agradecen de VisualBasic para .NET (o cualquier otro lenguaje que uti-lice los controles y/o tipos de .NET Framework):que con una asignación adecuada a la propiedadAnchor del control nos evitamos código como el dellistado 4, que es lo que normalmente haríamos enVisual Basic 6.0 para ajustar el alto y el ancho deese control al tamaño completo del formulario(suponiendo que ya está posicionado en la esquinasuperior izquierda).

For i = 1 To 100Console.WriteLine(i.ToString.PadLeft(3) & _

“ Iba se escribe con be”)Next

Listado 2. El código del listado 1, reformado.

Dim i As Long

For i = 1 To 100Me.Text1 = Me.Text1 & _

Right$(“ “ & CStr(i), 3) & _“ Iba se escribe con be” & _vbCrLf

Next

Listado 3. Equivalencia para VB6 del listado 2.

dotN

etM

anía

<<

42

Cuestión de rendimiento

Si miramos el código del listado 1 y lo comparamoscon el del listado 2, ¿cuál cree que es más compacto,legible, entendible, mantenible y otros –ibles? Aclaroque siempre que se sepa lo que hace el listado 1, queya lo expliqué un poco más arriba; porque si no seentiende, seguro que elegiremos el segundo listado.

Pero si lo que nos interesa es el rendimiento, elsegundo rinde mejor que el primero. Lo que ahorahay que decidir es si en realidad vale la pena buscarcódigos que rindan mejor o que sean más fáciles deentender, y sobre todo de mantener.

Una vez que se sabe qué hace el marcador de for-mato {0, 3} es evidente que ese código es más legi-ble, pero otra cosa es el rendimiento, ya que al com-pilador (o mejor dicho, al runtime de .NET) le resul-

tará más fácil manejar una concatenación que el usode la función String.Format que usa por debajo elmétodo WriteLine.

Y es que ese método llama internamente al méto-do WriteLine de la propiedad Out de la clase Console,que a su vez llama al método Format de la clase String,y en el caso de Visual Basic, ese código sería más omenos como el mostrado en el listado 5.

Por tanto, dicho esto, y suponiendo que la formaen que lo he comentado es porque se hacen demasia-das cosas para poder mostrar una “simple” cadena conformato, podría pensar que el código del listado 2 serámás simple, y así es, al menos si obviamos lo que se hagaantes de conseguir esa cadena final que se le pasa comoargumento al método WriteLine de la clase Console, yaque tanto una como otra llamada acaban pasando solouna cadena que es la que finalmente se usará para mos-trarla en la ventana de la consola (o en la salida de laventana de depuración, si es que ese código lo usamosdesde una aplicación que no es del tipo consola).

¿Qué debemos sacar en claro de todo esto? Quealgunas veces debemos evaluar si nos conviene másun código rápido que uno fácil de escribir. Lo mejores que si estamos empezando con .NET nos decan-temos por el código fácil de entender, pero sin per-der nunca de vista el código que mejore el rendi-miento; es decir, debemos conocer lo mejor posiblelo que nos ofrece el sistema de tipos de .NET y des-pués decidir. También es cierto que algunas de estasmejoras solo las conseguiremos si alguien nos lo cuen-ta, y de eso se trata, de que haya quién lo cuente ysepamos elegir, o al menos tengamos la base suficientepara poder elegir. Así que a seguir leyendo esta colum-na y todo lo que contamos en esta revista, que paraeso es presuntamente la mejor revista de programa-ción de .NET del mercado de habla hispana e inclu-so en otros idiomas (es que siempre hay que intentarestar a buenas con el boss, je, je).

Rendimiento en la manipulación de cadenasY ya que estamos con cuestiones de rendimiento,otro de los problemas que más quebraderos de cabe-za suelen causar es la manipulación de cadenas en.NET. Los programadores de Visual Basic 6.0 están

dnm.isla.vb<<

Algunas veces debemos evaluar si nos conviene más un código rápido

que uno fácil de escribir

Private Sub Form_Resize()If Me.WindowState = vbMinimized Then

Exit SubEnd If

With Text1.Width = ScaleWidth.Height = ScaleHeight

End WithEnd Sub

Listado 4. Ajustar el control Text1 al tamaño delformulario (en VB6).

Console.Out.WriteLine( _String.Format(Console.Out.FormatProvider, _

format, _New Object() {arg0}))

Listado 5. El método WriteLine del listado 1 es en realidadeste código.

acostumbrados a utilizar código comoel del listado 6.

El código del listado 6, por simpli-ficar, solo está haciendo dos operacio-nes de concatenación (unión de dos omás cadenas en una sola) y en todos loscasos se utiliza la misma variable pararecibir el resultado.

Esto es totalmente lícito en VisualBasic .NET, pero en .NET las cade-nas son un tema que si no se le pres-ta suficiente atención puede causar-nos algún que otro problema, sí, derendimiento. Y es que en .NET lascadenas son tipos inmutables, es decir,una vez que tienen un valor, ya no sepueden cambiar. Cuando realizamoslas dos asignaciones del código ante-rior, en realidad estamos creando nue-vos objetos en la memoria. Todos esosobjetos se van asignando a la variableque recibe el valor (s), pero en cadauna de esas asignaciones se está dese-chando el objeto anterior y creandouno nuevo. Si el número de concate-naciones es grande, y además el con-tenido de esa cadena también lo es, elderroche de memoria puede llegar aser excesivo.

Supongamos que leemos el con-tenido de un fichero de texto relati-vamente grande, y que ese contenidolo modificamos para cambiar algunaparte del mismo, y esos cambios lohacemos como hemos visto antes, obien porque realizamos alguna tareade sustitución, usando métodos comoReplace de la clase String. Todos losmétodos de la clase String que ope-ran con las cadenas necesitan que elresultado se asigne a una variable, ysi estamos cambiando el contenido deuna variable, es lógico que la variablede destino sea la misma. Como yacomenté, en Visual Basic 6.0 esto noera un problema, ya que siempre se

usaba la misma variable, en el senti-do que se ajustaba la memoria queocupaba para que tuviera espacio sufi-ciente para almacenar el nuevo con-tenido, pero a diferencia de las ver-siones clásicas de Visual Basic, en.NET cada operación de este tipo loque hace es desechar el objeto ante-rior y crear uno nuevo, y hacer queesa variable apunte (o referencie) elnuevo objeto que se ha creado en lamemoria.

Por suerte, en .NET tenemos la cla-se StringBuilder, definida en el espaciode nombres System.Text. Ese espacio denombres, a diferencia de lo que ocurreen C#, no está importado automática-

mente en Visual Basic .NET; por tan-to, si no conocemos de su existencia,será difícil que un programador seencuentre accidentalmente con ese tipo.Y digo accidentalmente porque muchasveces, al escribir los nombres de lostipos de datos que queremos darle a unavariable, nos encontramos por casuali-dad con tipos que muchas veces nisabíamos que existían. Como vemos enlas figuras 1 y 2, cuando vamos a defi-

nir una variable de tipo String, en VisualBasic no nos enteramos que existe eltipo StringBuilder (figura 1), sin embar-go en C# sí está a la vista (figura 2), y siel programador que ocasionalmente sefije en los tipos mostrados por Intelli-Sense se dará cuenta de que existe esaclase, que literalmente podríamos tra-ducir como “constructor de cadenas”,y es posible que por curiosidad mire ladocumentación para ver qué tipo deconstrucciones se pueden realizar. Y siel programador ya conoce esa clase, alverla, podrá pensar: sí, mejor utilizo unStringBuilder, que leí en dotNetManíaque ofrece mejor rendimiento que laclase String.

La clase StringBuilder está pensadapara contener cadenas, pero a diferen-cia de la clase String, cualquier mani-pulación que hagamos en el contenidode esa clase no creará un nuevo objetoen la memoria. Si la variable s del lis-tado 6 fuese del tipo StringBuilder, esecódigo lo podríamos escribir tal comovemos en el listado 7, en el que usamosel método Append de esa clase para aña-dir nuevos textos.

dotN

etM

anía

<<

43

dnm.isla.vb<<

s = s & “ el resultado es: “‘ calcular el resultado...s = s & CStr(resultado)

Listado 6. Concatenación de varias cadenas.

Figura 1. Los tipos mostrados en Visual Basic al escribir str.

Figura 2. Los tipos mostrados en Visual C# al escribir str

dotN

etM

anía

<<

44

dnm.isla.vb<<

Si es por razones de rendimiento(aunque en este ejemplo en particular nonotaremos mucho beneficio), si vamos ahacer varias concatenaciones siempre esrecomendable usar un objeto del tipoStringBuilder y añadir las nuevas cade-nas por medio del método Append antesque asignar esos nuevos textos a unavariable de tipo String ya existente. Perono confundamos la concatenación y asig-nación a una variable con una “simple”concatenación, ya que si solo se realizauna asignación no tendremos problemasde rendimiento (al menos por causa decrear varios objetos en la memoria).

Y ya que estamos intentando mejo-rar el rendimiento, la última línea dellistado 7 (e incluso la del listado 6, siestuviera hecho con VB.NET),deberíamos escribirla como:

s.Append(resultado.ToString)

Ya que la utilización de la funciónde conversión CStr tiene más costo queuna simple llamada al método ToString,en este caso en particular, porque esainstrucción de conversión llamará tam-bién a este método.

Recomendación para los progra-madores de Visual Basic: agregar unaimportación a System.Text para tenersiempre a nuestra disposición la claseStringBuilder.

Pero dejemos otras optimizacionespara otros artículos de esta isla, y vea-mos algunos marrones que otros auto-res me dejan, así como quién no quie-re la cosa.

¡Que lo explique el Guille!En el número de abril, mi amigoDaniel Seara, en su artículo “De con-

tadores y trazas” de la serie sobre“Componentes de uso general” mostróen su último listado un código que tie-ne algunos aspectos interesantes. Conel permiso de Daniel voy a repetirlo,pero lo voy a complicar un poco más,ese código lo vemos en el listado 8.

En el listado 8 tenemos dos mun-dos de Visual Basic en perfectaarmonía. Por un lado tenemos dos delas nuevas características de VisualBasic 9.0: la inferencia de tipos y eluso de literales XML directamente enel código, aderezado con el uso deexpresiones incrustadas; por el otro,el uso de funciones propias de VisualBasic: CallByName.

La complicación a la que hacíareferencia antes es precisamente pararesaltar la inferencia de tipos, ya queen el código original, Daniel indica-ba tanto el tipo de la variable x como

el de la variable p del bucle. Eviden-temente, el código en el que se indi-ca qué tipos de datos estamos usandoes más comprensible para cualquiera,ya que si vemos el código del listado8, debemos saber que al asignar unliteral XML a una variable lo queestamos indicando es que se cree unavariable del tipo XElement. Lo mismoocurre con la variable del bucle ForEach: el tipo de datos inferido por lavariable p es del tipo PropertyInfo,pero como esta isla es de Visual Basic,es cuestión de que nos vayamos acos-tumbrando a deducir los tipos de lasvariables que el compilador infiere.Bueno, en realidad no es necesarioque hagamos ese esfuerzo, ya que siestamos usando el editor de VisualBasic, simplemente posicionando elratón en la variable se nos informaráel tipo de variable que se está usan-do, tal como podemos comprobar enla figura 3.

Por supuesto, esto solo será válidosi estamos usando el IDE de Visual Stu-dio (o la versión Express), así que enalgunos casos será cuestión de usar elsentido común para que nuestros códi-gos sean fácilmente entendibles.

En Visual Basic 9.0 podemos usarlos literales XML directamente en elcódigo, y como vemos en el listado 8,al asignar el literal <Entry></Entry>

el compilador sabe que ese código esXML y que representa un elemento.Dentro del bucle volvemos a utilizarliterales XML, pero en esta ocasiónutilizando otra de las novedades de

Dim s As New System.Text.StringBuilder

‘ otras asignaciones a la clase...

s.Append(“ el resultado es: “)

‘ calcular el resultado...

s.Append(CStr(resultado))

Listado 7. Concatenación de varias cadenasusando StringBuilder.

Dim x = <Entry></Entry>

For Each p In Me.GetType.GetProperties

x.Add(<<%= p.Name %>>

<%= CallByName(Me, _

p.Name, _

CallType.Get) %>

</>)

Next

‘ se guarda el valor

x.Save(Me.Name & “.xml”)

Listado 8. Crear un elemento XMLy guardarlo.

Figura 3. Al posicionar el cursor en una variable, vemos de qué tipo son.

dotN

etM

anía

<<

45

dnm.isla.vb<<

LINQ to XML que es exclusiva deVisual Basic, y es la posibilidad deasignar lo que se conoce como expre-siones incrustadas, que consiste enusar código al estilo de la asignaciónde valores de ASP.NET para indicarlos valores que tendrá ese códigoXML. En la primera parte del códigodel método Add, creamos un elemen-to XML con el nombre devuelto porla propiedad Name del objeto Propert-yInfo analizado en cada iteración delbucle:

<<%= p.Name %>>

Que unido al cierre del elemento:</> formará adecuadamente dicho cie-rre del elemento. Si el elemento no tie-ne contenido, simplemente se añadiráel típico />, pero si la siguiente expre-sión del método Add añade algún valor,tendrá el formato de cierre con nom-bre: </NombreElemento>.

Y es precisamente en esa segundaexpresión donde se unen los dos mun-dos de Visual Basic, ya que el conte-nido de ese elemento, el cual asigna-mos por medio de una expresiónincrustada, lo produce una llamada auna de las funciones del runtime deVisual Basic que hemos “heredado” deVisual Basic 6.0: CallByName. Esta fun-ción se utiliza para hacer una llamadaa un método o a una propiedad; eneste último caso, devolverá el valor deesa propiedad, y si el método es unafunción, también devolverá el valorproducido por esa función. Ese valorlo asignamos como contenido delsubelemento que estamos añadiendoal elemento XML que hemos creadoen la variable x. Si el código del lista-

do 8 lo usamos desde un formulario,obtendríamos algo parecido al códigoXML del listado 9.

Como vemos al final del listado 8,se guarda el contenido del elementogenerado por el código, pero aquí hayque comentar que en realidad no seguarda como un solo elemento, sinocomo un documento XML completo,es decir, se le añade la cabecera o el indi-cativo de que es un documento XML:

<?xml version=”1.0” encoding=”utf-8”?>

Esta nueva característica de VisualBasic 9.0 también debemos usarla conmoderación, es decir, solo cuando real-mente sea necesario, como en el ejem-plo del listado 8, ya que hay situacionesen las que puede que queramos usarestos literales XML para hacer otrasoperaciones que no son realmente paralas que están pensadas.

Y si alguien piensa que si en lugarde escribir ese código al estilo de VisualBasic, lo escribiéramos como tendríanque hacerlo los programadores de C#,es decir, usando explícitamente objetosdel tipo XElement (tal como se muestraen el listado 10), el rendimiento esmejor, decir que no, que tanto uno comootro código generan el mismo códigointerno, ya que el compilador de VisualBasic en este caso concreto de los lite-rales XML saca matrícula de honor yhace su trabajo de la forma correcta (noes que en otras ocasiones no lo haga,solo que en este caso no añade sobre-cargas innecesarias, salvo por la formade acceder al valor devuelto por CallBy-Name).

En la versión del código del lista-do 10, aunque tengamos que crear un

nuevo objeto de forma explícita, en rea-lidad el compilador de Visual Basictambién necesita crear ese objeto parapoder realizar la tarea que le hemosencomendado en el listado 8. Por tan-to, el código generado por el compila-dor es prácticamente el mismo enambos casos (incluso aunque en la asig-nación a la propiedad Value hayamostenido que convertir en una cadena elvalor devuelto por CallByName, que esun detalle casi sin importancia). Y aho-ra queda a nuestra decisión si debemosusar un código u otro, pero en estecaso, la decisión solo debe afectar a siqueremos que sea perfectamenteentendible por todos los programado-res de nuestro equipo y/o que sea fácil-mente convertible a otros lenguajes queno soportan los literales XML.

ConclusionesEn este artículo hemos visto algunas cues-tiones que podríamos clasificar de bue-nas prácticas o de rendimiento, ademásde comprobar que hay ciertas funcionesdel “viejo” Visual Basic 6.0 que nos pue-den resultar de utilidad en estos mundosmodernos en los que los literales de XMLya forman parte de nuestro día a día y quegracias al soporte que tienen en VisualBasic 9.0 nos resultan muy fáciles deimplementar en nuestro código.

Como de costumbre, en la Web dela revista puede descargar el código deejemplo usado en el artículo, que en estaocasión incluye tanto código de VisualBasic 6.0, como de Visual Basic 9.0 yhasta de nuestro compañero C#.

Nos vemos el mes de julio en nues-tra isla.

<Entry>

<AcceptButton />

<ActiveMdiChild />

<AllowTransparency>false</AllowTransparency>

<AutoScale>false</AutoScale>

</Entry>

Listado 9. Extracto de un posible resultado de ejecutarel código del listado 8.

Dim x As New XElement(“Entry”)

For Each p In Me.GetType.GetPropertiesDim y As New XElement(p.Name)y.Value = CallByName(Me, p.Name, CallType.Get).ToStringx.Add(y)

Next

‘ se guarda el valorx.Save(Me.Name & “2.xml”)

Listado 10. Equivalencia al código del listado 8 sin usar literales XML.

Cuando se encuentran en memoria, los datos pue-den adoptar diferentes formatos y especificacio-nes. Puede tratarse de un array de objetos, o quizás,de una colección más rica de información. Pue-den tener estructura de tabla o de grafo XML; ensuma, cualquier tipo de modelo de objetos. Sinembargo, hay un factor común: la necesidad delanzar consultas para seleccionar información apartir de un criterio dado. La noción de consultanos recuerda las bases de datos y el lenguaje SQL:seleccionamos (SELECT) elementos de datos, a par-tir (FROM) de un origen de la información, añadi-mos criterios de filtrado (WHERE) y de ordenación(ORDER BY). Estaremos de acuerdo, sin embargo,en que ésta no es obligatoriamente una sintaxisexclusiva de las bases de datos: podría aplicarse aotras fuentes de información. De forma que par-timos de una sintaxis única y bien establecida, perofalta un modelo unificador común para expresartodos los datos que catalogamos como “consulta-bles”. Esto es lo que suministra LINQ.

LINQ eleva las consultas a la categoría de

construcciones de primera clase en los lenguajes.NET, al mismo nivel que las clases o los méto-dos. La magia de LINQ está en su marco de con-sultas personalizado accesible en .NET Frame-work 3.5. Se implementa como un conjunto declases dentro del espacio de nombres System.Linq,y el motor de consultas está relacionado con algu-nas palabras reservadas que reconocen los com-piladores de C# y VB.NET. La figura 1 explicaesto con más detalle.

El código de una aplicación puede operar conLINQ de dos formas: a través de las palabras reser-vadas de los lenguajes C# y VB.NET, o utilizan-do las clases del espacio de nombres System.Linq,que residen en el nuevo ensamblado System.Core.En cualquier caso, las palabras reservadas deLINQ son resueltas como llamadas a métodos deesas clases en tiempo de compilación. Y estas cla-ses, en el marco de consultas, operan sobre datosenumerables almacenados en memoria.

En su forma más simple, LINQ se presentacomo LINQ to Objects, o sea, como un meca-

LINQ para consultas y actualizaciones

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.

¿Dónde está la magia de LINQ? ¿Cómo es posible que unas pocas palabras reservadas nuevasde un lenguaje puedan permitir las consultas sobre tipos de datos radicalmente distintos, comoDataSet o documentos XML? ¿Se trata, quizás, de la interfaz IEnumerable? Y hablando de sinta-xis, ¿cómo es que la palabra FROM se escribe antes que SELECT?

todonet@qa

LINQ (Language Integrated Query) significa Consultas integradas en el lenguaje, perotambién puede utilizarse en ciertas ocasiones para modificar información. Todo estose relaciona con la maquinaria lingüística que incorporan las últimas versiones de C#y VB.NET. En su conjunto, las preguntas seleccionadas este mes suministran una visiónmás amplia del propósito y la arquitectura de LINQ.

tod

otN

et.q

a@

dot

net

mania

.com

La respuesta a esta pregunta tiene claramente relacióncon la respuesta a la pregunta anterior. Los registros deuna base de datos (concretamente, en una base de datosde SQL Server, si hablamos de LINQ to SQL) no sondatos en memoria de tipo enumerable. Por esta razón,se suministra un proveedor de consultas que se ocupa deextraer los datos de su origen a través de un modelo de

objetos adecuado. El modelo de objetos puede crearsemediante el diseñador correspondiente de Visual Studio2008 y se puede persistir en un fichero DBML (Data-Base Markup Language).

El modelo de objetos de LINQ to SQL no es sola-mente para consultas, sino que suministra también capa-cidades para almacenar los datos modificados de vuelta

nismo para consultar el contenido de arrays, colec-ciones o cualquier otro tipo de dato que implementede forma nativa la interfaz IEnumerable<T>:

var data = from dataItem in dataSource

where dataItem.Country == "USA"

select dataItem;

En su forma más simplificada, la pseudo-variabledataSource en el código anterior es un de tipo IEnu-merable<T> cualquiera. ¿Y qué sucede con la variabledata? ¿Está fuertemente tipada? Ciertamente; su tipoes determinado en tiempo de compilación y no entiempo de ejecución.

Cuando se consultan tipos IEnumerable<T> nativos,no se necesita recurrir a clases adicionales para cons-truir un objeto específico y suministrar los mecanis-mos para las actualizaciones. LINQ to Objects, es,esencialmente, una infraestructura tipo SQL para rea-lizar consultas inteligentes sobre arrays y colecciones,algo más poderoso que una consulta global.

El punto clave en LINQ, no obstante, es que sepuede utilizar para consultar datos de diversos oríge-nes y fuentes soportadas. ¿Qué quiere decir “sopor-tadas”? Que se trata de un marco extensible que incor-pora componentes acoplables para conectarse a dis-tintas fuentes externas de información. Microsoftsoporta varios de esos componentes: LINQ to XML,LINQ to DataSet y LINQ to SQL (Server).

En la figura 1 se aprecia un bloque que agrupadatos consultables y un proveedor de consultas. Cual-quier modelo de objetos que contenga un tipo de datosque implemente la interfaz IQueryable<T> (herederade IEnumerable<T>) es, de hecho, un componente detipo "LINQ to XXX". Un proveedor de consultas esun componente que se encarga de la recuperación dedatos consultables a partir de cualquier origen de datosexterno, ya sea persistente o volátil. El papel de losproveedores de consultas consiste en exponer cual-quier conjunto de datos como una secuencia enume-rable que se pueda procesar, agrupar, relacionar o fil-trar.

Finalmente, una nota sobre la aparentementeextraña sintaxis que caracteriza a C# y VB.NET. Enparticular, ¿por qué se sitúa la palabra FROM antes queSELECT? El argumento es complejo, y prefiero referiral lector a la siguiente dirección de Internet para unaexplicación completa de esta historia:

http://forums.microsoft.com/msdn/ShowPost.aspx?

siteid=1&PostID=91256

Resumiendo, se trató de una decisión difícil adop-tada por los equipos implicados en Microsoft. La elec-ción final se justificó por la necesidad de no vincularal usuario a una tecnología específica como el len-guaje SQL (cuya evolución está fuera del control delcreador de LINQ), así como por el deseo de no muti-lar el mecanismo de ayuda Intellisense durante la codi-ficación de las consultas integradas.

dotN

etM

anía

<<

47

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

dnm.todonet@qa<<

LINQ to SQL permite grabar datos modificados en la base de datos. ¿Es seguro usar LINQ to SQLen un escenario donde múltiples tablas tienen que ser actualizadas en algún momento? ¿Cómo semanejan situaciones en las que tienes una Factura y sus Detalles almacenados (como debería ser) entablas distintas, pero relacionadas?

Figura 1. LINQ desde 1000 metros de altura…

en la base de datos. Todas las capacidades de entrada/sali-da se encuentran codificadas en una clase derivada de Data-Context que el diseñador genera para nosotros y que esespecífica para cada base de datos.

En lo que se refiere a actualizaciones (y ya sé que pare-ce preocupante), todo lo que se ve son clases. Cada claserepresenta una tabla de la base de datos y el modelo resul-tante refleja las relaciones exactas existentes entre las tablasde la base de datos. La clase DataContext conoce si existeuna relación de clave ajena entre, digamos, instancias deFactura y DetallesDeFactura. Todo lo que hay que hacer esestablecer las conexiones correspondientes entre objetos ydejar que el DataContext haga su trabajo. Esto significa, porejemplo, que después de crear una nueva Factura se debencrear los objetos DetallesDeFactura necesarios y añadirlosa la colección de detalles de factura de la entidad Facturaasociada. Cuando hayas terminado el trabajo en memoria,solicitas al DataContext que envíe los cambios de vuelta a labase de datos. El listado 1 presenta un ejemplo basado enla base de datos Northwind, que opera sobre las tablas Pro-ducts, Orders y Order Details.

Primero, se crea un objeto Order (pedido) y se rellenacon los datos correspondientes. Al pedido se asocian dosnuevos objetos OrderDetail (detalles de pedido) que, a suvez, hacen referencia a instancias de Product (producto). Lalógica de la aplicación dicta que los pedidos sean solicita-dos por clientes, así que añadimos el pedido a la colecciónOrders (pedido) del objeto Customer (cliente) que represen-ta al cliente que hace el pedido.

Finalmente, simplemente se hace una llamada a Sub-mitChanges(). Como el objeto DataContext, por diseño, haceun seguimiento de todos los cambios en el modelo, su lógi-ca interna es perfectamente capaz de comprender y mane-

jar las relaciones entre tablas. A fin de cuentas, los coman-dos SQL se envían a la base de datos en el orden adecuadopara preservar la integridad y la consistencia.

Aunque esto sea suficiente para las necesidades de laaplicación, nada nos impide escribir un procedimientoalmacenado y exponerlo desde el objeto DataContext. Oquizás, podríamos preferir sobrescribir la forma de actua-lización de datos en la clase Customer y controlar perso-nalmente la manera en que los cambios son enviados ala base de datos.

Esa situación es claramente especial. Sin embargo, si lasbases de datos están alojadas en la misma instancia deSQL Server, cualquier pérdida de rendimiento seríamínima y no afectaría de forma visible a la aplicación.Permíteme recordar que LINQ to SQL no está dispo-nible para otros motores de bases de datos. Sin embar-go, Entity Framework sí lo estará. También debe tener-se en cuenta que LINQ to SQL permite gestionar múl-tiples objetos DataContext: uno por cadena de conexión,esencialmente. De esta forma, puedes agrupar o rela-cionar datos extraídos de distintas tablas como colec-ciones en memoria. Dicho esto, no veo realmente las

ventajas de mover los datos hasta el cliente y efectuarlos encuentros (JOIN) sobre colecciones en memoria,cuando las bases de datos son excelentes para realizaresa labor. Podrías definir en una de las bases de datosvistas que encapsularan los encuentros, y recuperar losdatos a través de LINQ to SQL, manteniendo así unainterfaz con una única base de datos. Si esto se intentamediante Entity Framework (que será lanzado oficial-mente junto al Service Pack 1 de .NET Framework 3.5),entonces se simplifica todo, ya que mediante esta tec-nología se permite relacionar fragmentos de entidadesresidentes en múltiples bases de datos.

dotN

etM

anía

<<

48

dnm.todonet@qa<<T

odot

Net.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

NorthwindDataContext db = new NorthwindDataContext();Product p1 = db.Products.Single(p => p.ProductName == "X");Product p2 = db.Products.Single(p => p.ProductName == "Y");

Order order1 = new Order();order1.OrderDate = DateTime.Now;order1.RequiredDate = order1.OrderDate.AddDays(7);

OrderDetail item1 = new OrderDetails();item1.ProductID = p1.ProductID;item1.Quantity = 4;order1.OrderDetails.Add(item1);

OrderDetail item2 = new OrderDetails();item2.ProductID = p2.ProductID;item2.Quantity = 1;order1.OrderDetails.Add(item2);

Customer cust = db.Customers.Single(c => c.CustomerID == "ALFKI");

cust.Orders.Add(order1);

db.SubmitChanges();

Listado 1. Ejemplo de actualización con LINQ to SQL.

Traducido al castellano por Marino Posadas

¿Ve algunos pros o contras respecto a la agrupación lógica de tablas en bases de datos diferentes en elmismo servidor? En particular, pensamos migrar algún día a LINQ to SQL y me pregunto cómo manejaríaesto ese proveedor. Probablemente tendríamos que hacer encuentros entre tablas de bases de datos dis-tintas. ¿Habría problemas de rendimiento?

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]

El gran fenómeno de las redes sociales a través de laWeb 2.0 nos ha abierto un amplio abanico de posibi-lidades, no solo como usuarios de dichas redes –¿quiénde nosotros no tiene un perfil en Facebook, ha creadosu red de contactos profesionales en LinkedIn o se pasael día enganchado a los SMS para twittear sobre loque está haciendo en cada momento?– sino tambiéndesde el punto de vista de la creación de nuevas opor-tunidades de negocio y, en consecuencia, del desa-rrollo de nuevos proyectos que se beneficien de lassinergias que este tipo deredes han provocado. Poruna parte, la integración denuestros proyectos en dichasredes nos proporciona sen-cillez de uso (a nivel deautenticación de usuarios,por ejemplo) y, por otra,aporta una considerable visi-bilidad a nuestros proyectosy unas posibilidades deexpansión enormes.

Fruto de ello, son muchaslas soluciones basadas endiversas tecnologías de pro-gramación que podemosencontrar últimamente endistintas redes sociales.Podríamos hablar acerca delas API de desarrollo sobreSecond Life, mediante el uso

de PHP, o de otras tecnologías como Google Socialo, ya dentro de un contexto basado en tecnologíasMicrosoft, la posibilidad de despliegue de nuestrosmódulos de Popfly (basado en Silverlight) sobre Face-book o Windows Live Spaces.

En este artículo haremos un repaso a las herra-mientas de desarrollo que Microsoft pone en nues-tras manos de manera gratuita para el desarrollo sobresu red Windows Live, mediante el análisis de unasolución ya implementada como es Windows Drive,

Desarrollo con Windows Live Aprovechando el poder de las redes sociales

comunidad.net

En este artículo se presentan las posibilidades que Microsoft pone al alcan-ce de los desarrolladores para el desarrollo sobre Windows Live, a travésdel análisis de Windows Drive, proyecto ganador de Imagine Cup España ’08,que hace uso de ellas.

Figura 1. Posibilidades de interacción con las librerías de Windows Live.

Miguel Llopis

Miguel LlopisEs Microsoft Stu-

dent Partner, miem-bro del equipo de

Microsoft Channel 8y colaborador delgrupo de usuariosGusenet. Ganador

de Imagine CupEspaña ’08 con suequipo Windows

Drive. Ha sido Inge-niero de Softwarede Pruebas en el

equipo de Connec-ted Tools en Red-

mond, desarrollan-do Microsoft Oslo,trabajo que reto-mará en octubre.

Puede consultar sublog en Geeks:

www.geeks.ms/blogs/mllopis.

proyecto ganador de Imagine Cup España ’08,cuyo objetivo es beneficiarse del componen-te social de Windows Live y añadir valor a losservicios ya existentes (Messenger, mapas, etc.)para lograr un objetivo concreto: fomentar eluso del vehículo compartido entre usuarios deLive.

La figura 1 refleja las diversas librerías exis-tentes mediante las que podemos interactuarcon los servicios que la plataforma WindowsLive pone a nuestra disposición.

Como vemos, prácticamente todos los ser-vicios de Live pueden ser accedidos por nues-tras aplicaciones para hacer uso de sus venta-jas: motores de búsqueda integrados en nues-tras Webs, visualización de mapas con puntoso rutas marcadas, uso de funciones de mensa-jería o de listas de contactos, autenticación ensitios Web integrada con las credenciales delas cuentas de Live, almacenamiento de datosde usuario “in the cloud”, entre otras.

Pasemos a analizar un escenario de uso concreto:Windows Drive, plataforma que nos permitirá visua-lizar una serie de información sobre nuestros contac-tos de Messenger (datos personales, datos del vehí-culo, historial de rutas compartidas previamente…),así como sus próximas rutas de una forma rica e inte-ractiva haciendo uso de mapas de Virtual Earth, y tam-bién recibir avisos, hablar con nuestros contactos ogestionar calendarios, entre otras posibilidades.

Arquitectura de Windows DriveEn la figura 2 podemos ver la arquitectura del pro-yecto. El núcleo del sistema está dividido en variascapas; por un lado la exposición de servicios, por otrolado la lógica del sistema con diferentes tipos de algo-ritmos, el acceso a datos y finalmente nuestra base dedatos, donde además del almacenamiento de datos sesaca partido a las funciones del nuevo motor espacialde SQL Server 2008 para el cálculo y búsqueda derutas.

La arquitectura del sistema está orientada a ser-vicios, y para ello se ha implementado una fachadacon dos tipos de exposición. Por un lado WCF, queserá consumido desde los diferentes clientes existen-tes (ASP.Net AJAX, Mobile, WPF…) y un por otroun servicio Web tradicional, para garantizar la com-patibilidad hacia atrás con clientes para otros tipos dedispositivos. El uso de estándares XML posibilita que,a través de este servicio, podamos interoperar a nivelde datos con otras plataformas como J2ME (Java paraDispositivos Móviles) y también dispositivos Micro-

soft Zune, cuyas posibilidades de programación aca-ban de ver la luz recientemente, gracias a la nueva ver-sión de XNA (XNA 3.0, por ahora en fase CTP).

Núcleo del sistemaPor debajo de esta fachada se encuentra la lógica delsistema, ofreciendo todos los métodos para la bús-queda de rutas, así como un acceso de más alto nivela la capa de acceso a datos. El acceso a datos se hacepor medio de LINQ, ofreciendo una serie de méto-dos con funcionalidad básica y generando una seriede clases de entidad (usuario, ruta, vehículo) que pue-

dnm.comunidad.net<<

Figura 2. Arquitectura de Windows Drive.

Prácticamente todos los servicios de Live pueden ser accedidos pornuestras aplicaciones para hacer

uso de sus ventajas

dotN

etM

anía

<<

51

dotN

etM

anía

<<

52

dnm.comunidad.net<<

den ser utilizadas por diversos módulos de la aplica-ción. Por último, estas clases de entidad tienen surepresentación como tablas en el servidor de basesde datos SQL Server 2008, que almacena toda lainformación necesaria para el funcionamiento deWindows Drive.

Tecnologías empleadas en la capa de presentaciónSobre este núcleo de datos, lógica y servicios, existenvarios tipos de clientes que pueden consumir las fun-cionalidades del sistema, además de hacer uso de dife-rentes API de Windows Live. En la figura 3 se pre-senta uno de estos clientes, desarrollado con WPF.

Se trata de la ventana de información acerca de unaruta, para la cual se muestra información reducidasobre el usuario que la ofrece, su vehículo, y mapasinteractivos donde consultar imágenes reales sobrelos puntos de origen y destino, así como un mapa decarreteras con información de tráfico para mostrar elitinerario completo. Toda esta información nos la pro-porciona Live Maps.

En la imagen se puede apreciar el uso de diversasAPI de Live: Virtual Earth (http://dev.live.com/virtuale-arth) para la visualización de mapas y el marcado de pun-tos y rutas, Live Contacts (http://dev.live.com/contacts)para la lista de contactos de Messenger embebida en laaplicación, Live Alerts (http://dev.live.com/alerts) para elsistema de avisos y Live Search (http://dev.live.com/live-search) para las búsquedas. Todos estos controles están

alojados en páginas ASP.NET y embebidos enformularios WPF mediante el uso del controlFrame.

Otro de los clientes desarrollados es unaactividad de Messenger que permite com-partir rutas con otros usuarios de mododirecto, en una ventana de conversación(figura 4). Esta funcionalidad se implemen-ta mediante el uso de la API de MSN Acti-vities (http://msdn.microsoft.com/live/msnmes-senger).

Al margen de estos clientes, el equipo deWindows Drive está trabajando en el desa-rrollo de otros, que nos permitan llevar nues-tros servicios a nuevos dispositivos, como porejemplo una TV con Windows Media Cen-ter (haciendo uso de la SDK de WindowsMedia Center) y dispositivos Microsoft Zunemediante el uso de la nueva CTP de XNAGame Studio 3.0.

Por último, comentar que es posible inte-grar el uso de estas herramientas de Live conVisual Studio 2008, mediante el uso de larecién publicada CTP de Marzo 2008 de lasWindows Live Tools for Visual Studio 2008(http://msdn.microsoft.com/en-us/library/cc305087.aspx) y que, al margen de la páginadedicada a herramientas de desarrollo de Live(http://dev.live.com), una buena fuente de infor-mación al respecto es la Web del MIX'08 deLas Vegas (http://www.visitmix.com), desde lacual podemos descargar vídeos y presenta-ciones de cada una de las sesiones, entre lascuales hubo bastantes dedicadas a estas tec-nologías emergentes de la Web social.

Figura 4. Actividad de Messenger para compartir rutas.

Figura 3. Captura del cliente WPF

dotN

etM

anía

<<

53

dnm.comunidad.net<<

Los cuatro son jóvenes estudiantes deinformática en las universidades de Ovie-do y Alicante, además de haberse aventu-rado ya en el mundo empresarial, demos-trando su carácter emprendedor y forman-do una empresa… ¿No son demasiadascosas a vuestra edad, chicos?

Héctor Juan y David Rodríguez: Efecti-vamente, son muchas cosas a la vez, pero elmomento de hacerlas es ahora cuando somosjóvenes y aún tenemos tiempo e ilusión. Tan-to Héctor como yo, de 24 y 25 años respecti-vamente, somos estudiantes en la Universidadde Oviedo y socios en nuestra propia empre-sa, Fairway IS (www.fairwayis.net).

Carlos Junquera: Yo también salgo de laUniversidad de Oviedo, tengo 26 años. En micaso, hace unas semanas que emigré a Madridpara unirme a la plantilla de Microsoft Ibéri-ca, donde he sido recibido de una forma excep-cional y estoy muy ilusionado con esta nuevaetapa profesional.

Miguel Llopis: Pues yo, además del más pequeño(23 años), soy el forastero del grupo (risas de los cua-tro). Estoy terminando mis estudios de IngenieríaInformática en la Universidad de Alicante. Para quiena estas alturas se esté preguntando cuál fue la extrañaalineación de planetas que hizo que nos conociéra-mos viviendo a casi mil kilómetros de distancia: la res-puesta la puede encontrar en la gran iniciativa deComunidades de Estudiantes de Microsoft Ibérica(www.dotnetclubs.com), a la cual debemos buena partede nuestros logros, conocimientos y presencia en elpanorama nacional relacionado con tecnologías de

desarrollo de Microsoft. Y también, por supuesto, elhaber llegado a conocer la competición Imagine Cup.En pocas palabras, ¿qué es Imagine Cup?

M.L.: Imagine Cup es una competición interna-cional para estudiantes organizada año tras año porMicrosoft. Cada año, la competición lleva asociadoun lema, que guarda relación con alguno de los dere-chos fundamentales del ser humano redactados porla UNESCO, organización colaboradora en Imagi-ne Cup. En torno a ese lema, existen diferentes cate-gorías técnicas y no técnicas sobre las cuales los estu-diantes deben agudizar su ingenio y plantear diver-

Entrevista a los ganadores de la final española de Imagine Cup 2008

Con motivo del gran éxito que han obtenido en la final española de Imagi-ne Cup 2008 y de la próxima celebración del evento mundial, en el queestarán representando a España, dotNetManía entrevistó a los integrantesdel equipo triunfador: Miguel Llopis, Héctor Juan, Carlos Junquera y DavidRodríguez.

Los integrantes del equipo Windows Drive: Miguel Llopis, Héctor Juan, Carlos Junquera y David Rodríguez, el día de la final nacional

dotN

etM

anía

<<

54

dnm.comunidad.net<<

sas soluciones. En concreto, este añoha habido 9 categorías diferentes: desa-rrollo de software, desarrollo de jue-gos con XNA, algoritmia, desafío IT,diseño de interfaces, fotografía... Anivel nacional, se gestiona una de estascategorías: desarrollo de software. Paramás información, se puede acceder ala web oficial del concurso (www.ima-ginecup.com).¿En qué consiste el lema de la com-petición de este año?

M.L.: Este año, el lema escogidogira en torno a la problemática medio-ambiental de nuestros días (“Imaginaun mundo donde la tecnología faciliteun medioambiente sostenible”). Es untema amplio y que da lugar a interpre-taciones variadas para resolver proble-mas de muy diversa índole relaciona-dos con el medioambiente. Esto es algoque intuíamos desde un principio y queademás pudimos comprobar de prime-ra mano en la final celebrada en Madriden el mes de abril, en la que las cuatropropuestas presentadas, al margen dela nuestra, abordaban problemas dife-rentes entre sí: desde la prevención deincendios forestales hasta la separaciónde tipos de residuos para el posteriorreciclaje, pasando por la educaciónmedioambiental o el uso de nuevas víasde comunicación con Ayuntamientos yotras organizaciones para mejorar lasinfraestructuras existentes (manteni-miento de contenedores, limpieza deparques naturales, etc.).

¿Cuál es la idea que vosotros pro-ponéis?

M.L.: Nuestra idea parte de unapremisa básica que forma parte del pro-pio concepto “Imagine Cup”; esta pre-misa consiste en la convicción de quela innovación en software permite cam-biar el mundo en que vivimos. Par-tiendo de esta idea, nos propusimos cre-ar un proyecto que fuera totalmenteviable en función de los recursos de losque hoy en día disponemos todos losinternautas, y que además fuera de apli-cación práctica en nuestra vida cotidia-na y sencilla de comprender y utilizarpara cualquier persona. En base a estasconsideraciones, decidimos abordar elgrave problema del Cambio Climático,que tantos efectos secundarios negati-vos aporta al planeta; además, tratamosde lograr que la solución propuesta fue-ra únicamente dependiente del usuariofinal, sin la intervención de gobiernosu otros organismos oficiales. Esta filo-sofía se debe al hecho de que, segúnnuestro juicio y basándonos en diver-sos estudios que reflejan los niveles deaplicación de diversos tratados inter-nacionales a nivel gubernamental comoel Protocolo de Kioto o más reciente-mente el Tratado de Bali, los gobiernoshan demostrado una incapacidad mani-fiesta para dar un cambio de rumboefectivo en materia de emisiones degases contaminantes. Por tanto, pensa-mos que la verdadera solución al pro-blema debe partir del ciudadano que,

siendo a su vez usuario de internet, serácapaz, gracias a nuestra plataforma, delograr un gran cambio colaborativo conunas mínimas modificaciones en su con-ducta cotidiana.

Considerando diversos análisis de lascantidades de dióxido de carbono (gasque es el causante principal del calenta-miento global), determinamos que laactividad diaria de una persona que másemisiones genera es el uso del vehículoprivado. Cuando realizamos un despla-zamiento en coche, estamos liberando ala atmósfera 1 kg de CO2 por cada 2 kmrecorridos... Una persona que realiceanualmente 20.000 km con su vehículoestará generando alrededor de 8,5 tone-ladas de CO2, ¡esto es más CO2 por per-sona al año de lo que 8 árboles son capa-ces de neutralizar a lo largo de toda suvida! ¡Imaginad el impacto total demillones de ciudadanos siguiendo estosmismos hábitos!

H.J.: Nuestra solución persiguehacer más sencilla, práctica y cómodala colaboración entre usuarios paracompartir vehículo. Pensemos que siconseguimos compartir nuestros des-plazamientos con al menos una perso-na más, estaremos reduciendo a lamitad el uso de vehículos privados, conlo que estaremos emitiendo la mitadde gases. Además, el hecho de com-partir vehículos trae otra serie de ven-tajas asociadas: reducción del tráfico(y de los molestos atascos), con lo quese disminuirá la contaminación acús-tica, fruto en gran medida de estos; asícomo la reducción en el consumo decombustible o del espacio necesariopara plazas de aparcamiento, pudien-do reacondicionar dichas zonas paraarmonizarlas más con el medioam-biente (zonas verdes, parques, etc.)¿Qué tecnologías habéis utilizadopara crear el proyecto, y por qué?

C.J.: Debido a que nuestra solucióntrata de llegar al mayor número deusuarios posible, la idea central de lamisma radica en el uso de tecnologíasWindows Live, tales como Messenger,Live Maps, Live ID... Windows Livees una de las redes sociales de mayoralcance a nivel mundial, con más de 420millones de usuarios al mes (y más de

Junto a Rosa María García, presidenta de Microsoft Ibérica, durante la entrega de premiostras la final… Con el “pasaporte” a París ya en sus manos

dotN

etM

anía

<<

55

dnm.comunidad.net<<

mil millones de logins al día), por lo queconsideramos que un proyecto de lascaracterísticas del nuestro debía teneren Windows Live a su mejor aliado.

D.R.: Además de este importante fac-tor de comunicación, el resto de tecno-logías empleadas han sido incorporadasde manera consecuente: visualización derutas sobre Live Maps, haciendo uso dela SDK de Virtual Earth; almacenamientode información en nuestro sistemahaciendo uso de SQL Server 2008, parapoder hacer uso de las nuevas funciona-lidades de cálculos geográficos que el nue-vo motor espacial de SQL Server nosofrece; capa de servicios implementadahaciendo uso de WCF, lo que permiteconsumir toda la funcionalidad de nues-tro sistema desde un conjunto muyamplio de clientes: cliente Windows(WPF), cliente Windows Mobile, clien-te Web (ASP.NET AJAX y Silverlight2.0), cliente embebido en Messenger(mediante el uso de una actividad de Mes-senger), así como clientes para otras pla-taformas en los que ahora mismo esta-

mos todavía trabajando (Windows MediaCenter, clientes móviles basados en tec-nología J2ME, e incluso, dispositivosMicrosoft Zune haciendo uso de XNA).

C.J.: El uso de todas estas tecno-logías Microsoft nos posibilita cumplircon uno de nuestros objetivos más

importantes: llegar al mayor númerode usuarios posible, de muchas formasdiferentes adecuadas a cada contexto deuso, y que cada una de estas vías pro-porcione una experiencia de usuarioenriquecida, de última generación.Imagine Cup persigue la innovacióntecnológica en torno a un lema deter-minado, ¿existen soluciones parecidasa la vuestra a nivel mundial?

H.J.: Sin duda, al tratarse de un pro-blema de gran importancia a nivel inter-nacional, existen diferentes sistemasorientados a la compartición de vehí-culos. Estos sistemas han proliferadobastante en los últimos años, fruto engran medida de la creciente importan-

cia y uso de la Web 2.0 por todos cono-cida. Este tipo de iniciativas surgen deorganismos públicos, ayuntamientos,organismos provinciales, e inclusoempresas privadas que ofrecen este tipode servicios. Existen en España unos 15municipios que ofrecen estos sistemasa través de la Web, y en otros países,especialmente de Europa Central, suuso está bastante más extendido.¿Qué ventajas competitivas pensáisque aporta vuestro proyecto respec-to a las soluciones existentes?

M.L.: Las soluciones existentes fun-cionan con relativo éxito, y han sido unmodelo muy válido en el cual fijarnosy analizar puntos fuertes y aspectos quese podrían mejorar. De este segundogrupo, nos hemos centrado en añadirvalor especialmente en las siguientescaracterísticas:

• Visibilidad del sistema: las solu-ciones actuales se limitan a exponersus funcionalidades a través de unapágina Web; este sistema está total-mente desconectado de las aplica-ciones que un usuario frecuenta nor-malmente. De ese modo, el públicoen general no llega a conocer demanera eficaz las soluciones que yahay y, por tanto, su uso está menosextendido de lo que debiera. Ennuestro caso, al integrar totalmen-te nuestro sistema con Live, conta-mos con un público objetivo decientos de millones de personas entodo el mundo: gente que hace usode la red Windows Live y que

Los desarrolladores de Windows Drive junto a los miembros del jurado: Javier Soriano (Secretarioacadémico de la Facultad de Informática de la UPM), Ramón Miranda (CTO Avanade España), Rosa MaríaGarcía (Presidenta de Microsoft Ibérica), Lydia Aguirre (Directora ElPais.com) y David Carmona(Responsable técnico de Comunidades de Microsoft Ibérica)

Miguel Llopis en un momento de la presentación de Windows Drive

dotN

etM

anía

<<

56

dnm.comunidad.net<<

encontrará la opción de WindowsDrive dentro de la plataforma Liveal igual que ahora encuentra otras,como por ejemplo los juegos, através de Messenger.

• Privacidad y seguridad del usua-rio: uno de los puntos disuasoriospara el ciudadano respecto a estossistemas es el temor a compartirvehículo (ya sea el propio o el de otrapersona) con desconocidos. Estehecho genera muchas reticencias,bastante lógicas y justificadas, quehacen imposible la aplicación efec-tiva de estos sistemas. Nosotros plan-teamos la idea desde el concepto deuna cadena de colaboración que seestablece entre un usuario y sus con-tactos habituales de Messenger (ami-gos, compañeros de trabajo, fami-liares…). El usuario es capaz deaumentar el alcance de su red exten-diéndola en base a estas relacionesentre contactos para, por ejemplo,admitir también la posibilidad decompartir vehículo con los contac-tos de sus contactos, y así sucesiva-mente. El caso extremo implicaríapoder compartir vehículo con cual-quier usuario de cualquier parte delplaneta, pero en todo momento serácada usuario de forma individualquien establezca sus preferencias ysu equilibrio entre amplitud de la redy privacidad.

• Mejor experiencia de usuario:mientras que los sistemas actuales sebasan en una simple aplicación Webpoco atractiva visualmente, nosotrosofrecemos una amplia variedad declientes y dispositivos compatibles,de modo que al final el usuario seauno de los grandes beneficiados deluso de nuestro sistema.

• Solución multiplataforma e inte-roperable desde otros sistemas:fruto de la arquitectura empleaday de las características de la plata-forma .NET, disponemos de ungran número de plataformas desdelas cuales se puede usar el sistema.A su vez, las posibilidades de expan-sión en el futuro a nuevos disposi-tivos son realmente variadas e inte-resantes.

• Mejoras en la búsqueda de rutas:Para comprender este punto, es nece-sario ponerse en situación y pensar encómo funcionan los sistemas existen-tes hoy en día: un usuario que deseerealizar un trayecto debe introducir enel sistema los puntos de origen y des-tino de su ruta; el sistema entonces seencarga de detectar rutas cuyo origeny destino coincidan (literalmente) conlos introducidos por el usuario. Esto esun sistema muy simple y que dismi-nuye mucho las posibilidades de encon-trar rutas que se ajusten a las necesi-dades del usuario y, por tanto, al finalse trata de otro elemento disuasoriopara el uso del sistema de comparticiónde vehículos. Mediante la implemen-tación de algoritmos de búsqueda derutas y ponderación de las mismas, encombinación con el uso de funcionesdel motor espacial de SQL Server2008, conseguimos resolver en la medi-da de lo posible este problema. Imagi-nemos un caso práctico: un usuariodesea realizar la ruta Alicante – Ovie-do en una fecha y hora determinadas.En el caso de los sistemas existentespreviamente al nuestro, el sistemadevolvería rutas con el mismo origeny destino, y mismos horarios. Nuestrosistema es capaz de detectar rutas com-puestas, por ejemplo, entre Alicante yMadrid y posteriormente Madrid yOviedo, realizando también estima-ciones acerca de los márgenes de tiem-po entre una y otra ruta. Por compa-ración, podríamos decir que se trata dealgo parecido a un sistema de búsque-da de vuelos, pero con la complejidadañadida de que el número de aero-puertos es finito, mientras que el núme-ro de puntos geográficos en nuestroplaneta no lo es… Aún así, nuestro sis-tema de búsqueda de rutas está todavíasiendo perfeccionado y se basará en elaprendizaje basado en resultados pre-vios y valoraciones de los usuarios sobrerutas que el sistema le ha ofrecido, paraajustar mejor estos criterios de bús-queda.

¿Cómo ha sido la experiencia deImagine Cup España para vosotros?

D.R.: Ha sido una grandísima expe-riencia. No solo por el resultado; quizá

ha sido incluso mejor por el camino rea-lizado, el proceso de investigación,diseño y desarrollo de este sistema ytodo lo que con él hemos aprendido. Elreto de construir algo novedoso a nivelmundial, emplear las últimas tecno-logías existentes (muchas de ellas,hechas públicas apenas unas semanasantes de la final, durante el Mix’08 enLas Vegas) y el gran esfuerzo que supo-ne compatibilizar todo este trabajo connuestros estudios y empleos diarios.

Al fin y al cabo, se trata de una com-petición para estudiantes y el fin prin-cipal es el aprendizaje a todos los nive-les: técnico, humano, etc.¿De qué forma afrontáis la finalmundial del mes de julio en París?

M.L.: Afrontamos la final con laintención de desempeñar un gran papel,dar lo mejor de nosotros para llevar lomás lejos posible nuestra idea y, tam-bién por supuesto, al país al que esta-remos representando entre los más de100 países participantes: España.

Serán cinco días (del 3 al 8 de julio)en los que aprenderemos aún más si cabede esta competición, del intercambio cul-tural y enriquecimiento mutuo que supo-ne compartir la experiencia con más demil estudiantes de tantos países diferen-tes, y sobre todo, una oportunidad úni-ca para demostrar de qué somos capa-ces los estudiantes de este país.¿Algunas palabras o consejos de caraa la próxima edición de Imagine Cuppara aquellos estudiantes que leenesta revista?

M.L.: Nuestro consejo es que lucheny hagan todo aquello que sea posible paralograr que los sueños, ideas y proyectosque tengan en mente se conviertan algúndía en realidades. Estoy seguro de quemuchos de ellos tienen la capacidadnecesaria para lograrlo pero, de no serasí, que al menos no se pueda decir deellos que no lo intentaron con todo suempeño. Imagine Cup, como tantasotras cosas en la vida, es un desafío máspara demostrar al mundo entero todonuestro potencial.Pues en dotNetManía pensamos queestaremos muy bien representados enesa final, y desde aquí os deseamos lamejor de las suertes.

The Practical Guide to Defect Prevention (Best Practices) Marc McDonald, Robert Musson y Ross SmithEditorial: Microsoft PressPáginas: 480Publicado: 2007ISBN: 978-0735622531Idioma: inglés

Analizamos este mes un par de obras de Microsoft Press dedicadas a la gestión deproyectos de software, que han obtenido las mejores calificaciones de sus lectores. Estaprimera obra, de Marc McDonald, Robert Musson y Ross Smith, se centra en la pre-vención de defectos, más que en la metodología en sí. Los autores son líderes reconoci-dos en el mercado norteamericano, y subrayan con claridad cuáles son las técnicas quepara ellos han resultado más efectivas en la eliminación de defectos del software en pro-yectos de diferente envergadura.

La obra ofrece varias colecciones de técnicas y métodos para eliminar el código erró-neo, antes de que un bug sea publicado. También suministra una recopilación de herra-mientas y consejos que permiten el uso inmediato de las técnicas explicadas en sus capí-tulos iniciales. Esto incluye amplia cobertura de metodologías organizativas tales comoSix Sigma, Agile, Burton y otras, así como de las herramientas adecuadas para la gestiónde las técnicas que recomiendan.

I. M. Wright’s “Hard Code”Eric BrechnerEditorial: Microsoft PressPáginas: 240Publicado: septiembre de 2007ISBN: 978-0735624351Idioma: inglés

Se trata de un conjunto de los mejores ensayos extraídos de la popular columna delmismo título disponible en http://blogs.msdn.com/eric_brechner, donde el autor reca-pacita sobre las mil y una adversidades que asoman diariamente en el trabajo del desa-rrollador estándar, todo ello en un tono bastante provocativo y no menos inteligente (loprimero no tiene por qué implicar lo segundo).

Su público es cualquiera relacionado con el desarrollo: programadores, jefes de pro-yecto y arquitectos. Su estilo, directo y en ocasiones provocador, facilita no poco la lec-tura, y sus conclusiones se agradecen por lo sensatas y bien pensadas. Resultan más quenotables sus análisis “Project Mismanagement” y “Google: Serious threat or poor spe-lling?”, fruto de su conocimiento de la gestión de proyectos en la compañía de Redmond.

biblioteca.net

nove

dad

es LINQ Programming

Joseph Mayo. Editorial: McGraw-Hill Osborne Media. Páginas: 450. ISBN: 978-

0071597838. Fecha de publicación: noviembre de 2008.

ASP.NET 3.5 Programming Brian Madsen. Editorial: McGraw-Hill Osborne Media. Páginas: 608. ISBN: 978-

0071604109. Fecha de publicación: diciembre de 2008.

TEXTO: MARINO POSADAS

dotN

etM

anía

<<

58

desvánMarino Posadas

¿Cuánto vale su sitio Web?, o dicho en inglés, como reza elartículo de Georgina Laidlaw, “What'sYour Web Site Worth?”. En el artícu-lo se analizan los parámetros que

deberían considerarse a la hora de valorar la posible venta deun sitio Web. Según su autora, no se trata de un conjunto intan-gible de valores, sino de algo muy mensurable con las herra-mientas hoy disponibles para la Web (disponible enhttp://www.sitepoint.com/article/whats-web-site-worth). Y si sequiere ir más alla, dentro del mismo sitio Web encontramos“Google Web Site Optimizer Tool” (http://www.sitepoint.com/article/web-site-optimizer-tool), de Alex Walker, para compro-bar qué partes sobran o no son bien comprendidas en nuestrossitios Web.

“Windows XP bests OS X in RIA test on Intel” es un artí-culo de Phil Manchester, donde seexplican los resultados de una serie depruebas de rendimiento realizadas con

distintos sistemas operativos para probar el comportamien-to de aplicaciones RIA (Rich Internet Applications), y don-de parece que XP le gana por la mano incluso al sistema ope-rativo de Apple. Para más datos, ver: http://www.regdevelo-per.co.uk/2008/05/23/ria_benchmarks.

KurzweilAI.net: Información interdiscipli-naria. Un sitio más que notable por lainformación que contiene (no solo

de informática, sino de todas las ciencias), pero especialmentepor la manera en que se accede a la información, mediante ungrafo superior que interrelaciona todas las ciencias y donde pode-mos conectar distintas disciplinas y seleccionar los artículos deconexión entre ambas. Para muestra, un botón: http://www.kurz-weilai.net/brain/frame.html?startThought=Life.

MuvEnum. Sitio dedicado a lacreación de micro-utilidades,la mayor parte de ellas gratui-

tas. Este mes nos gustaría destacar los complementospara Outlook 2007, y en específico el complemento “Openlast closed tag”, que funciona para Internet Explorer 7.0.Estos complementos están disponibles en la página:http://www.muvenum.com/blog/category/software-releases.

documentos en la red

utilidades del mes

sitios del mes

¿Google como amenaza?

Así lo ven al menos unos cuantos autores que empiezana preocuparse por el creciente poder que ejerce Goo-gle sobre el significado de las búsquedas en internet, ypor tanto sobre la información misma de la Web. Porun lado, Joe Wilcox, quien recuerda (eWeek,http://www.microsoft-watch.com/content/web_services_browser/the_google_problem.html), que una compañía queengrosa diariamente la información que posee en tér-minos de terabytes, es notablemente cerrada respecto asu “modus operandi”, sus procesos y trabajo interno, yno digamos, su tecnología. Y apenas muestra unas pocasAPI a los programadores. El lado de la balanza está cla-ramente desequilibrado. Y la reciente adquisición deDoubleClick hace que la información personal que alma-cena llegue a un nivel tal de privacidad, que está siendovigilada en este momento por la Federal Trade Comis-sion de EE.UU. Mientras, la compañía de Redmond seconvierte en más y más transparente, a través de MSDN,Channel9, Channel10 y más de 4.000 bloggers que tra-bajan para Microsoft y producen terabytes de informa-ción relativa a sus productos, su modo de vida y sus expec-tativas. Y Wilcox se pregunta, “si de verdad importa elcontrol de monopolios, ¿cómo es que no se hace nadarespecto a las prácticas de Google, utilizado diariamen-te por millones de personas en todo el mundo?”.

A esto se suma el analista y conferenciante Ryan Ste-wart, quien explica recientemente en su blog cómo Goo-gle, literalmente, le “hizo desaparecer” del mapa(http://blog.digitalbackcountry.com/?p=1436). ¿Por qué?Por haber sido “hackeado”, y su dominio utilizado porlos “spammers”. Hasta ahí, comprensible, hasta ciertopunto; pero para volver a “existir”, tuvo que investigar,conseguir y acceder a una serie de cuentas de Google sinlas que no se puede ni siquiera solicitar la reinserción enel “mundo de los vivos en la Web”, y además asociar suURL con las cuentas Google correspondientes. Y no hayvuelta de hoja, ni sitio donde quejarse. Y acaba pre-guntándose “¿Todavía hay alguien que crea que esto esuna historia de buenos y malos?”.

Sin entrar ni salir en las opiniones, pienso que seríadeseable que la versatilidad de la busqueda de informa-ción en Internet fuera real. Quizá con la proliferaciónde buscadores temáticos especializados. Quizá con unmayor control a la hora de saber por qué un sitio sale ono y en qué posición. Estar en un buscador es existir enla Web. Y eso, en el mundo de hoy, no es nada trivial.

noticias.noticias.noticias

Regdefrag. Otra herra-mienta para mantenerel Registro de Win-

dows, eliminando los “agujeros” dejados por algunos pro-gramas al desinstalar, así como el espacio no utilizado.Gratuito y accesible desde http://www.regdefrag.com.