dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en...

60
WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de problemas de rendimiento en SQL Server 2000 y 2005 (II). Análisis del uso de los recursos del sistema • Microsoft Virtual Server 2005 dotNetManía nº26 mayo 2006 • 6,50 (España) Visual Basic • C# • ASP.NET • ADO.NET • .NET Framework • Windows Server System dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

Transcript of dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en...

Page 1: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio2005 • Lo que nos traerá Orcas: LINQ en acción •Detección de problemas de rendimientoen SQL Server 2000 y 2005 (II). Análisisdel uso de los recursos del sistema •Microsoft Virtual Server 2005

dotNetManíanº

26 m

ayo

2006

• 6

,50

€ (E

spañ

a)Visual Basic • C# • ASP.NET • ADO.NET • .NET Framework • Windows Server System

dotNetManíawww.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

Page 2: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de
Page 3: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

Bienvenido al número 26, de mayode 2006, de dotNetManía.

A finales del mes pasado se celebró lafinal española de la Imagine Cup, cuya ver-sión internacional tendrá lugar en Indiadel 6 al 13 de agosto, bajo el lema Imaginaun mundo donde la tecnología nos permita vivirde manera saludable. Enhorabuena al equi-po de la Universidad de Sevilla y ¡suertepara la final!

Gran nivel, como en años pasados, en lostrabajos presentados, lo que augura grandesprofesionales del mañana... que quizá apues-ten por tecnologías Microsoft. Y es que laimaginación de los participantes no es la úni-ca; en una realidad como la actual, es muydifícil que una compañía como Microsoftconsiga animar de tal manera a los estu-diantes más destacados de las universidadesde todo el mundo. Verdaderamente imagi-nativa e inteligente la iniciativa, también porparte de Microsoft.

Este mes Iván González entrevista aChris Adams, Program Manager del equi-po de desarrollo de IIS, en una entrevista enla que podrá descubrir alguna de las nove-dades del IIS 7 de primera mano, directa-mente desde el equipo de desarrollo.

“VSTO: Cuando Office conoció a.NET” es una introducción práctica a VisualStudio Tools for Office, o de cómo desarro-llar aplicaciones .NET con interfaz Office.

Comenzamos una serie sobre webpartsde José Manuel Alarcón, seguimos con laserie de cinco de Eladio Rincón sobre ladetección de problemas de rendimiento conSQL Server 2000 y 2005 y también con laserie de artículos “Lo que nos traerá Orcas...”de Octavio Hernández. Le juro, amablelector, que no me gustan las series, pero hayveces que no queda más remedio.

Precisamente porque no nos gustandemasiado las series, hemos empezado laedición de lo que llamamos “CuadernosTécnicos de dotNetManía”. Este mestenemos la suerte de poder obsequiarle (solopara suscriptores de este mes y hasta ago-tar las unidades) el tercero: “ProgramaciónSegura con .NET Framework”, de MarinoPosadas, gracias al patrocinio de Microsofty Alhambra-Eidos. Espero que la iniciati-va sea de su agrado; siempre que podamos,la repetiremos.

Quiero dar la bienvenida a Juan Bláz-quez, al que llevo persiguiendo hace tiem-po para que nos escriba sobre asuntos máspropios de los técnicos de sistemas, peroque muchos desarrolladores agradecerán.Comenzamos con asuntos de virtualización,primero con un artículo introductorio aVirtual Server 2005 y al que seguirán otrosdos más.

Pero, por supuesto, dentro hay más.Espero que le guste.

dotN

etM

anía

<<

3

La copa de la imaginación

dotNetManíaDedicada a los profesionales de la plataforma .NET

Vol. III •Número 26 • Mayo 2006Precio: 6,50€

EditorPaco Marín

([email protected])

Atención al suscriptorPilar Pérez

([email protected])

Redactor JefeMarino Posadas

([email protected])

Consejo de RedacciónDino Esposito, Guillermo 'guille' Som, Jorge

Serrano, José Manuel Alarcón, LorenzoPonte, Luis Miguel Blanco, Miguel Katrib

(Grupo Weboo) y Octavio Hernández.

Colaboradores habitualesAntonio Quirós, Braulio Díez, Carlos

Quintero, Eladio Rincón, Javier Aragonés,José Miguel Torres, Pepe Hevia, Salvador

Ramos y Sergio Vázquez.

Además colaboran en este númeroJuan Blázquez

IlustracionesYamil Hernández

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

www.dotnetmania.com

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

ImprimeGráficas Vallehermoso

www.graficasvallehermoso.com

ISSN1698-5451

Depósito LegalM-3.075-2004

>>

<<

dnm.editorial

Paco MarínEditor de dotNetManía

Page 4: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

26dnm.sumario

dnm

.sum

ario

Entrevista a Chris Adams, Program Manager del equipo de desarrollo de IIS 10-12

El camino hacia Windows Vista está ya cada vez más próximo a su fin. Y discurriendoen paralelo circula el camino hacia IIS 7.0, versión que será sin duda de las másrevolucionarias para este producto. Chris Adams, responsable de algunas de lasnovedades más importantes nos comenta de primera mano el esfuerzo que estárealizando el equipo de desarrollo para crear la mejor plataforma Web del momento..

WebParts en ASP.NET 2.0 (I) 14-18Una de las novedades más espectaculares que ofrece ASP.NET 2.0 es la posibilidad decrear portales personalizados. Éstos pueden ser modificados visualmente a voluntad de sususuarios, pudiendo almacenar sus preferencias para el futuro. Y lo mejor de todo: no esnecesario apenas escribir código para conseguirlo. Es el poder los WebParts.

Macros en Visual Studio 2005 20-24La forma más sencilla de automatización que ofrece Visual Studio son las macros. Eneste artículo veremos cómo aprovecharlas para ahorrarnos tiempo en tareas repetitivas.

Lo que nos traerá Orcas: LINQ en acción 26-28Con la integración de LINQ en los lenguajes de programación, la utilización de lasexpresiones de consulta para iterar sobre los elementos de colecciones o arrays propioso devueltos por algún método de la librería de clases de .NET Framework será algonatural e inmediato.

VSTO:Cuando Office conoció a .NET 32-38Excel es una estupenda hoja de cálculo, que expone una funcionalidad extendida ymuy interesante a la par que peligrosa… ¿Cuántas veces hemos tenido que pelearnoscon marañas de código VBA para modificar una hoja de este tipo? ¿Cuántas vecesnos han echado en cara los usuarios que la interfaz de nuestras aplicaciones es muypobre y que ellos se manejan mejor con sus hojas Excel?… Con VSTO por fin vamosa poder poner fin a estos problemas y desarrollar aplicaciones .NET con interfazOffice.

Detección de problemas de rendimiento en SQL Server 2000 y 2005 (II).Análisis del uso de los recursos del sistema 39-43

Este es el segundo de una serie de artículos enfocados a la detección de problemas de rendimientoen servidores SQL Server 2000 y 2005; en él nos centraremos en analizar cuál es el usoque se hace de los recursos del sistema.

Microsoft Virtual Server 2005 44-48Virtualización. Un concepto y tecnología que está dejando atrás su consideración de“atracción de feria” para convertirse en una respuesta sensata y limpia para los retosde infraestructura actuales. Microsoft, con Virtual Server 2005, aporta un argumentode peso más a favor de esta tendencia y respalda el potencial de una tecnología maduraaunque desconocida.

dnm.todotnet.qa 49-51Trucos para ASP.NET. Este mes respondemos a tres preguntas que cubren diferentes aspectos de ASP.NET2.0, con una especie de hilo conductor oscilando alrededor de cookies y proveedores.En general las preguntas abordan cuestiones sobre herramientas y mecanismosespecíficos para facilitar y simplificar características comunes de la codificación queeran particularmente tediosas en ASP.NET 1.1.

dnm.laboratorio.net 52-53RSSMASTERCookie Detect

dnm.biblioteca.net 54Improving .NET application performance and scalabilityMicrosoft Visual C# step by step

dnm.desvan 58

Page 5: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de
Page 6: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

La edición CTP de abril deAtlas es principalmente una edi-ción que repara los bugs reporta-dos por los usuarios de su prede-cesora, la CTP de marzo.

También se han hecho algu-nos cambios en la Web de Atlas(http://atlas.asp.net), tales comouna nueva apariencia con carac-terísticas de Atlas en algunos con-troles. Hay también bastantematerial de aprendizaje disponi-ble tales como webcasts, screens-casts, vídeos de expertos, docu-mentación actualizada y tutoria-les para el inicio rápido.

Atlas Control Toolkit

Además se ha liberado tambiénuna versión de controles y exten-sores con código fuente llamadoAtlas Control Toolkit.

Atlas Control Toolkit es unacolección de ejemplos y compo-nentes que hacen más fácil quenunca la construcción y el consu-mo de controles y extensorescliente de Atlas. El toolkit aportaejemplos y un potente SDK listospara funcionar. Además simplifi-ca la creación y reutilización de

sus propios controles y extensorespersonalizados.

Los primeros ejemplos de con-troles y extensores que componenactualmente Atlas Control Toolkitson: CascadingDropDown, CollapsiblePanel, ConfirmButton, DragPanel,HoverMenu, PopupControl, ReorderList, TextBoxWatermark y ToggleButton y puede verlos en acción enhttp://atlas.asp.net/atlastoolkit.

Puede descargarlo desde:http://atlas.asp.net/default.aspx?tabid=47&subtabid=477.

Release Candidate 1 de Visual Studio2005 Web Application Project

Previamente Microsoft anun-ció la disponibilidad de la ReleaseCandidate 1 de Visual Studio 2005Web Application Project, cuyaversión final –suponemos– seincluirá en el primer service pack deVisual Studio 2005.

Visual Studio 2005 WebApplication Project aporta unnuevo modelo de proyecto quepuede usarse como alternativa almodelo de proyecto Web inclui-do en el paquete de Visual Studio.NET 2005. Este nuevo modelo

es ideal para los desarrolladoresde sitios Web que estén convir-tiendo sus proyectos Web deVisual Studio .NET 2003 a VisualStudio 2005.

El nuevo modelo de proyectoes similar al modelo de proyectoWeb de Visual Studio .NET 2003pero con las nuevas característi-cas de Visual Studio 2005 yASP.NET 2.0.

Según Scott Guthrie, ProductUnit Manager del equipo de WebPlatform and Tools (y uno de los padresde ASP.NET), a este nuevo modelode proyecto están “tentados” de lla-marle ASP.NET Web Projects.

Puede descargarse pública-mente desde: http://msdn.micro-soft.com/asp.net/reference/infrastruc-ture/wap/default.aspx.

Más información en el sitio ofi-cial de Microsoft en: http://msdn.microsoft.com/asp.net/reference/infras-tructure/wap o leer el artículo deOmar Khan y Michael Bund-schuh en http://msdn.microsoft.com/vstudio/default.aspx?pull=/library/en-us/dnvs05/html/WAP.asp o en elblog del propio Scott Guthrie en:http://weblogs.asp.net/scottgu/archi-ve/2005/12/07/432630.aspx.

dotN

etM

anía

<<

6

dnm.noticias<<

Microsoft libera la edición CTP de abril de Atlas

no

ticia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s

Microsoft ha actualizado la edición CTP de marzo reparando los fallos reportadosy añadiendo nuevos controles y documentación.

Service Pack 1 de SQL Server 2005

Microsoft ha anun-ciado la disponibili-dad del Service Pack 1

de SQL Server 2005, el mayor hito desde el lanzamiento deSQL Server 2005 en noviembre pasado.

Este service pack sigue las recomendaciones hechas porlos clientes y socios a lo largo de 92 países. Incluye funcio-

nalidad Database Mirroring preparada para un entorno deproducción, el nuevo SQL Server Management StudioExpress, junto a otros servicios avanzados para SQL Server2005 Express Edition como el SQL Server ReportingServices, Full Text Search y el Express Edition Toolkit.

Puede descargarlo gratis desde: http://www.microsoft.com/sql/sp1.mspx .

Page 7: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dnm.noticias

dnm.noticias

dotN

etM

anía

<<

7

Microsoft ha dado a conocerel nombre del proyecto ganadoren la final española de ImagineCup, el concurso para estudiantesuniversitarios que premia los tra-bajos tecnológicos más creativos yoriginales y que ha contado con laparticipación de más de novecien-tos alumnos. Al evento asistióRosa María García, consejeradelegada de Microsoft Ibérica,Beatriz Ordóñez, responsable deProgramas Académicos deMicrosoft Ibérica, así como integrantesde los 22 Clubs .NET que actualmenteexisten en España, y que ofrecieron apo-yo incondicional a sus compañeros.

Ganador: Step by Step

El proyecto ganador ha sido Step byStep, presentado por los estudiantes JavierCantón, Javier Fernández, MiguelÁngel Ramos y Juan María Laó de laEscuela Técnica Superior de IngenieríaInformática de la Universidad de Sevilla.Para ellos es el viaje a la India y la posibi-lidad de ganar 25.000, 15.000 ó 10.000dólares que son para el primer, segundoy tercer equipo clasificado.

Step by Step es un revolucionario yoriginal sistema de entrenamiento físicoque, desde casa y de forma cómoda y sen-cilla, se ejecuta sobre un PC que capturalos movimientos gracias a dos webcams ytiras de material reflectante que se colo-can sobre el cuerpo.

Una amplia variedad de paquetesde ejercicios se encuentran disponi-bles online para que el usuario puedaseleccionar qué tipo de ejercicios sonaquéllos que le permiten mantenerseen forma, cuidar su peso y mejorar sutono muscular e imagen. Al registrar-se en el sistema, se genera un histo-rial personalizado que le permite alusuario conocer los ejercicios adqui-ridos, el baremo de sus puntuacionesy realizar un chequeo y calibrado delas cámaras.

Segundo clasificado: eCoology

El proyecto eCoology, de laUniversidad de Valencia, ha obtenido elsegundo puesto. Por ello, cada uno de losintegrantes del equipo ha recibido un dis-positivo Smartphone.

Basado en un Ecosistema HíbridoAumentado (incorporando gráficos virtua-les en un entorno real), el proyectoeCoology permite a los más pequeñosconvertirse en los responsables del cuida-do de animales y plantas, cumpliendo asíuna serie de objetivos que les llevarán aobtener puntos extra, que podrán ser uti-lizados en la compra de objetos o dona-dos, como medida de protección del entor-no. La superación correcta de los distin-tos objetivos, premiará a los menores conun aumento en su reconocimiento social.

Gracias a este divertido juego, las nue-vas tecnologías se convierten en comple-mento de los métodos educativos tradi-cionales, fomentando positivas conductascomo una buena y equilibrada alimenta-ción, conservación del medio ambientey respeto a los demás.

Tercer clasificado:Virtual Raicahal

Bajo el lema “si alguna vez ha necesita-do que le receten un medicamento, usted seráuno de los muchos beneficiarios del sistemaVirtual Raicahal” se presentaban los estu-diantes de la Universidad Pontificia deSalamanca (Campus de Madrid) quienesquedaron en tercera posición con su pro-yecto Virtual Raicahal, recibiendo cadauno de sus integrantes una XBox.

Éste es un sistema automatiza-do y personalizado que permitegestionar recetas médicas, ademásde incluir varios módulos comple-mentarios como son médico virtualy teleasistencia sanitaria.

El sistema, instalado en los cen-tros de salud, gestiona las activida-des desarrolladas por los facultati-vos sanitarios, el historial clínico delos pacientes y la red de farmacias.Cada paciente dispone de un chipRFID que le identifica y que con-

tiene información sobre el tratamientoque debe seguir, evitando que tenga queacudir periódicamente al centro médicoa recoger las tradicionales recetas de papel.

Finalista: Zonesoft

Zonesoft es el asistente personal idó-neo para todas aquellas personas quesufren algún tipo de enfermedad, pade-cen sobrepeso o que, simplemente, se inte-resan por los alimentos que consumen ensu dieta diaria. Gracias a esta aplicación,desarrollada por los alumnos de laFacultad de Ingeniería de la Universidadde Deusto, es posible seguir cómodamentela llamada “Dieta de la zona”, que vieneutilizándose con resultados garantizadosdesde hace más de 15 años.

Finalista: Incubap Monitoring System

Los alumnos de informática de laUniversidad Pontificia de Salamanca handesarrollado un sistema de seguimiento yestudio de bebés prematuros. IncubapMonitoring System se compone de tresmódulos con los que se pueden detectarsíntomas de apnea, poniendo en marchala incubadora y aviso al personal sanitario;controlar los decibelios a los que el bebéestá expuesto, reproduciendo música paraestimular al bebé; y un módulo de visua-lización remota que registra diagnósticosa distancia en tiempo real.

Más información en: http://www.desa-rrollaelfuturo.com.

La universidad de Sevilla gana la tercera edición deImagine Cup EspañaLos ganadores representarán a España en la gran final internacional de esta competición frente a los cien países participantes que tendrá lugar en India del 6 al 13 de agosto

Juan María Laó, Javier Cantón,Miguel Ángel Ramos y Javier Fernández

Page 8: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dotN

etM

anía

<<

8

dnm.noticias<<

dnm.noticias

Visual Studio Express será gratuito siempre

Microsoft anunció el 19 de abril que todaslas ediciones de Visual Studio Express,incluyendo Visual Basic, Visual C#, VisualJ#, Visual C++ y Visual Web Developerserán gratuitas para siempre. Antes deeste anuncio, las ediciones de VisualStudio Express eran gratuitas por un añocomo parte de la promoción que comen-zaba el 7 de noviembre de 2005. Con esteanuncio, la oferta promocional es ahorapermanente y las ediciones expressseguirán siendo gratis. Más informacióny descargas: http://msdn.microsoft.com/vstudio/express

Nuevo sitio web de MSDN:Coding4Fun

Junto al anuncio de la gratuidad depor vida de las ediciones express, Microsoftanunció también la disponibilidad denuevo contenido para el aprendizajeen el sitio MSDN Coding4Fun enhttp://msdn.microsoft.com/coding4fun, queaporta herramientas y recursos para lacomunidad de desarrolladores.

Nuevos Code Snippets

Los Intellisense Code Snippets son blo-ques de código reutilizables orientadosa una tarea determinada. Visual Studio2005 incluye code snippets que cubrentareas que van desde la creación deexcepciones propias al envío de mensa-jes o dibujar un círculo. Además de esteconjunto de code snippets, Microsoft hapuesto un conjunto adicional para sulibre descarga en MSDN en:http://msdn.microsoft.com/vstudio/down-loads/codesnippets.

Documentación sobre WCF

El equipo de Windows CommunicationFoundation Documentation ha comenzadoa liberar quincenalmente actualizacionesde la documentación de producto. Estarádisponible en la pestaña “Resources” bajoel epígrafe “Documentation Updates”(http://windowscommunication.net/default.aspx?tabindex=3&tabid=45).

Además, en http://windowscommuni-cation.net podrá encontrar ejemplos, foros,FAQ, noticias, etc., sobre esta tecnología.

Además...

Top Ten Days con Dino Esposito

Los Top Ten Days con Dinoson un conjunto de seminariosde Solid Quality Learningdiseñados para impartir una for-mación concisa, concreta y pro-

funda sobre las tecnologías .NET. Estos seminarios cubren un amplio

rango de temáticas que correctamente uti-lizadas deberían ahorrar tiempo, dinero yestrés en el desarrollo de aplicaciones. Losseminarios Top Ten Days han sido diseña-dos por el propio Dino Esposito. Dino esel experto más reconocido de la industria

en ASP.NET y sus tecnologías relaciona-das, así como en Windows WorkflowFoundation. Con más de 10 libros publica-dos y contribuciones a más de otros 20, esdifícil encontrar otro profesional con másexperiencia en estos campos. Le conocerápor su columna en esta revista TodotNet QA,pero además, Dino es el autor de la colum-na Cutting Edge de MSDN Magazine y unode los principales contribuidores delMSDN ASP.NET Developer Center.

Más información en: http://www.sqlu.com/DinoInfo.aspx.

Dino Esposito visitará España para impartir una serie de seminarios bajo ladenominación “Top Ten Days con Dino”

Microsoft Research Cambridge, encolaboración con un grupo de 34 presti-giosos científicos de todo el mundo –cono-cidos con el nombre de Grupo de laCiencia de 2020–, ha dado a conocer elinforme “Hacia la Ciencia de 2020”, el pri-mer estudio que analiza de forma íntegrala aportación de la informática a la trans-formación de la ciencia de cara al año 2020y sucesivos.

El estudio recoge una serie de reco-mendaciones, haciendo especial énfasis en:situar a la ciencia y a la innovación cientí-fica como prioridades para la sociedad,reconsiderar la educación de los futuroscientíficos y encontrar nuevas fórmulas paraque la investigación científica reciba unamayor atención por parte de la sociedad,al tiempo que aumente su peso en la agen-da política. Por ello, Microsoft ResearchCambridge otorgará 2,5 millones de eurosa la comunidad científica para poner enmarcha una serie de planes de investiga-ción basados en los principios expuestospor el Grupo de la Ciencia de 2020.

La compañía, junto con los responsa-bles de este estudio, ha dado a conocer asíuna serie de nuevas investigaciones queindican que los avances en el campo de lainformática generarán una transformaciónradical en el ámbito científico, y desem-peñarán un papel fundamental a la horade abordar los principales desafíos globa-les, desde los relacionados con el medioambiente y la energía, hasta los que tienenque ver con la medicina y la salud.

Responder a los mayores retos del planeta

Este colectivo científico informa deque las nuevas herramientas de softwaredispondrán de la potencia necesaria parallevar a cabo una profunda transforma-ción de la ciencia en la próxima décaday años sucesivos. Estos avances puedenacelerar la capacidad de los científicospara hacer frente a algunos de los mayo-res retos a los que se enfrenta nuestroplaneta, tales como el cambio climáticoo las epidemias globales. Según el infor-me, las herramientas de software haránposible localizar epidemias potencialescomo, por ejemplo, la gripe aviar, el sín-drome respiratorio agudo severo y lamalaria, ayudando a evitar desastres y amejorar la respuesta en caso de que seanecesario actuar.

“La repercusión del comportamientodel hombre sobre el planeta hace que setambaleen los sistemas de los que depen-demos, por ello es vital que, con ayuda delos avances científicos, mejoremos nues-tro conocimiento de los complejos siste-mas biológicos y físicos”, ha declarado elprofesor Stephen Emmott, director delos programas de investigación científicade Microsoft en Europa y presidente delGrupo de la Ciencia de 2020. Se puedeencontrar más información sobre el equi-po de trabajo Grupo de la Ciencia de 2020,sus iniciativas y otros proyectos en la direc-ción http://www.research.microsoft.com/towards2020science.

Microsoft Research Cambridge donará 2,5millones de euros para que científicos de todoel mundo investiguen en nuevas áreas

Page 9: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de
Page 10: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

Entrevista a Chris Adams

El camino hacia Windows Vista está ya cada vez más próximo a su fin.Y discurriendoen paralelo circula el camino hacia IIS 7.0, versión que será sin duda de las más revo-lucionarias para este producto.Chris Adams, responsable de algunas de las novedadesmás importantes nos comenta de primera mano el esfuerzo que está realizando elequipo de desarrollo para crear la mejor plataforma Web del momento.

¿podrías introducir a nuestros lectores sobretu persona y sobre el papel que juegas dentro del equi-po de IIS en Redmond?

Mi nombre es Chris Adams y soy ProgramManager en el equipo de IIS o la unidad de productode IIS, que a su vez es parte del equipo Web Platformand Tools en Microsoft. Este equipo incluye obvia-mente a IIS, al equipo de desarrollo de ASP.NET yal equipo de desarrollo de la edición Express de VisualStudio denominada Visual Web Developer (VWD).Estos tres grupos conforman lo que se denomina WebPlatform and Tools, del cual como decía formo par-te. Mi papel como Program Manager es trabajar conla comunidad. Pensando específicamente en térmi-nos estratégicos es cómo hacer que la comunidad estéinvolucrada, cómo construir esa comunidad, descu-brir cuáles son sus necesidades y dentro de esto estaríaparticipar como ponente en eventos para la comuni-dad y en general intentar comprender las acciones arealizar para que IIS tenga su legión de seguidores.La siguiente área en la que me centro y en la cual hetrabajado mucho en el pasado es el área de soporte deIIS, haciendo que IIS sea un producto más fácil desoportar. Soy el responsable del toolkit de diagnósti-co que permite al equipo de IIS producir un kit o con-junto de herramientas que ayude a nuestros clientesa solventar sus mayores problemas.

Sabemos que el equipo y tú estáis trabajando dura-mente en la nueva versión de IIS, la 7.0. ¿Puedeshablarnos acerca de los cambios y novedades en estanueva versión?

IIS 7.0 es probablemente el cambio más apasio-nante y más exigente que hemos hecho a la plata-forma Web desde IIS 4.0. IIS 4.0 introdujo unmontón de novedades, un montón de cambios con

respecto a la versión 3.0, comparativamente muchosmás de los que hubo posteriormente en las versio-nes 5.0 e incluso la 6.0. Aunque cada versión intro-duce sus propios cambios y desafíos para nosotros,como la reestructuración de la arquitectura o la segu-ridad en IIS 6.0, la verdad es que IIS 7.0 tiene muchasmás áreas de atención, lo que significa invertir muchomás tiempo en el núcleo del servidor: por ejemplo,para mejorar la capacidad de diagnóstico hemos rees-crito complementamente la interfaz de usuario, ytambién hemos invertido tiempo evaluando las mejo-ras de seguridad en IIS 6.0 y cómo podemos apro-vechar eso en IIS 7.0. La siguiente versión posible-mente introducirá los mayores cambios que haya-mos visto en mucho tiempo, en particular en cosascomo el almacenamiento de la configuración, puesla metabase desaparece, y otro de los grandes pila-res de trabajo es la compatibilidad. Nadie debe tenermiedo cuando digo que la metabase desaparece;podremos seguir trabajando contra ella en nuestrocódigo o nuestros scripts, ya que para cualquier cosaque espere que la metabase esté ahí, existirá una espe-cie de traductor que leerá y modificará la informa-ción en el nuevo sistema de almacenamiento de laconfiguración. Estas son las principales áreas en lasque nos estamos centrando en IIS 7.0. Otra de lascosas clave es la sincronización del cliente y del ser-vidor, lo que implica que tenemos un caminopequeño para completar el desarrollo, los tests y todolo demás porque vamos a publicar un servidor Webcompleto en Windows Vista, con algunas limitacio-nes de acuerdo porque es un sistema cliente, perouno no estará obteniendo un producto a medias ouna versión recortada sino que estará obteniendouna versión completa, de modo que se pueda empe-

Iván González

dnm.directo.entrevistas

Iván Gonzálezes MVP en Windows Server–IIS.Es

Development Advisor en PlainConcepts,webmaster de geeks.ms

e imparte conferencias y cursospara TechNet y CampusMVP

<< Primero Chris,

Page 11: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

zar a desarrollar y luego continuar si se quiere o publi-car cuando Longhorn Server esté disponible.Tenemos poco tiempo para introducir todos esoscambios, pero… ¡están en camino! Un cliente quesea nuevo en IIS se encontrará con una curva deaprendizaje nueva y bastante suave. Para los clientestradicionales, aquellos que han trabajado con las ver-siones anteriores, que hayan seguido la evolución deIIS, la curva de aprendizaje creo que será un pocomás significativa por aquello de los cambios.

Ahora que en IIS 7.0 el pipeline de ejecución deIIS y el pipeline de ASP.NET están integrados, ¿cuá-les crees que serán los beneficios de esto para los desa-rrolladores?

El principal cambio en IIS 7.0 es la idea de exten-sibilidad. Nunca en ninguna de las versiones anterio-res habíamos ofrecido la posibilidad de sacar la formaen que nosotros hacíamos algo y sustituirlo por algohecho por ti mismo, eso nunca había sido posible.Existía la posibilidad de escribir contra un par de inter-faces, ISAPI y CGI, pero es todo lo que se podía hacer,no podías reemplazar, por ejemplo, el mecanismo deautenticación. Si no te gustaba como hacíamos laautenticación básica, no lo podías cambiar, no podíasescribir una ISAPI contra unos interfaces para solu-cionar eso. Con IIS 7.0, para los desarrolladores la his-toria es muy diferente y mucho más potente, porquecualquier cosa que uno crea que puede hacer mejor,ciertamente tendrá la posibilidad de hacerlo. Lo mara-villoso de esto es que abrimos el servidor Web expo-niéndolo. Desde mi perspectiva, si quieres escribirloen código nativo, hazlo, si quieres hacerlo en códigomanejado, hazlo, siendo la clave que nosotros no pena-lizamos porque lo hagas de una forma o de otra. Esoes el pipeline integrado de IIS 7.0, que si haces algo encódigo nativo y luego quieres hacer lo mismo u otracosa en código manejado no te tengas que ir a otropipeline, lo cual implicaría rehacer parte del trabajo.Permitir a la gente acceder al núcleo del servidor Webbien sea con código nativo o manejado, y permitir queescojan el lenguaje con el que se sientan más cómo-dos. Para los desarrolladores esto es algo poderoso.Para el desarrollador Web, la posibilidad de hacer, porejemplo, autenticación por formularios para conteni-dos fuera de ASP.NET es del tipo de cosas útiles quepermite este nuevo pipeline, significando que el desa-

rrollador tiene realmente el control final de la expe-riencia de usuario, mientras antes sólo podía asegu-rarse de que el servidor estaba correctamente confi-gurado para que la aplicación funcionase.

¿Qué se espera del mercado y de los desarrolla-dores en esos términos de extensibilidad? ¿Podemosesperar algo similar al mercado de los componentesvisuales aplicado a IIS?

Parte de la diferencia es que nosotros queremosintentar tomar el modelo de ASP.NET. Desde luegoque queremos que haya un mercado de módulos deterceros, pero también que cualquier persona que sevaya con su portátil a un picnic tenga esa posibilidad.Nosotros queremos que absolutamente todos los desa-rrolladores tengan la posibilidad de escribir módulos.Y que si lo hacen, los puedan compartir si lo deseancon todo el mundo y explicarles cómo lo han hecho ycómo se usa. Desde el punto de vista de la extensibi-lidad, queremos que todos los desarrolladores tenganla oportunidad de conocer cómo funciona IIS 7.0 yluego decidir por sí mismos cómo se van a beneficiarde estas nuevas capacidades de extensibilidad. Tambiénestamos trabajando duro con las empresas de compo-nentes para ayudarles a comprender los cambios sig-nificativos y cómo pueden construir mejores módu-los y para revolucionar el mercado. Obviamente estaes nuestra estrategia. Y llegar a todos los espectros,desde el entusiasta hasta el experto en IIS, porque tra-bajar antes contra los interfaces de IIS no era una cosasencilla y ese es un muro que queremos romper.

Nos comentabas antes que una de tus áreas detrabajo está en la parte de diagnóstico. Seguramentemuchos desarrolladores hagan uso de sus posibili-dades para conocer cómo funciona su aplicación.¿Puedes hablarnos un poco más acerca del diagnós-tico en IIS 7.0?

Hay un par áreas diferentes dentro de lo queconocemos como diagnósticos. Cuando digo un parde áreas quiero decir que IIS 6.0 y ASP.NET 1.0introdujeron lo que podemos considerar el núcleo,la característica central para el diagnóstico que esEnterprise Tracing for Windows (ETW). La infraes-tuctura de ETW en ASP.NET 1.0 es muy fuerte ymuy útil desde la perspectiva de ver qué sucede den-tro de algo que hasta ese momento era una cajanegra. Y esa es la línea que se va a seguir en IIS 7.0,

La siguiente versión posiblemente introducirá los mayores cambios que hayamos visto en mucho tiempo, en particular en cosas como el

almacenamiento de la configuración, pues la metabase desaparece

dotN

etM

anía

<<

11

dnm.directo.entrevistas<<

Page 12: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

trabajando sobre la base anterior con la diferenciade que ahora la caja negra ya no será tal si no queestará construida en base a múltiples componentes.Me gusta referirme a esto como la “legolización”;si conoces los legos, sabes que tienes la posibilidadde poner las diferentes piezas juntas… y así es nues-tro servidor Web. Puedes coger los legos y juntar-los para construir lo que tú quieras y nunca mástenerlo todo, y luego usar las trazas y el diagnósti-co para ver qué sucede. Con esta nueva estructurabasada en componentes del servidor podemos sacarfuera aquellas cosas que no vayamos a usar o quenos supongan un problema, por ejemplo si no usa-mos WebDAV lo sacamos, si no usamos autentica-ción anónima la sacamos… Eso ayuda.

Otra de las cosas de las que estamos orgullososes algo que llamamos Fail Request Tracing. El propó-sito de esto es que el desarrollador o el profesionalde IT puedan indagar en lo que el servidor está deter-minando como una petición fallida. Para cada peti-ción fallida, bien sea que devuelve un error 500 oque tarda más de 10 segundos en ejecutarse, voy aquerer trazar la ejecución de esa petición. Si pode-mos indicar el criterio y el servidor Web luego ins-trumenta la ejecución de modo que construyaautomáticamente un log para nosotros para quepodamos ver nuestras peticiones fallidas, eso tam-bién ayuda. La idea incluye también que el desarro-llador y el profesional de IT puedan trabajar máscerca de lo que lo hacen hoy, cuando básicamente seapuntan el uno al otro diciendo “esto es tu culpa”.Es muy potente que tú puedas decir para cada unode los módulos en qué estado está y qué está suce-diendo dentro de cada uno de ellos. Cuando puedesdecir eso…, esa es la forma en la que la diagnosisdebe funcionar. Otra cosa que es realmente populares la posibilidad de hablar directamente al servidorWeb y extraer piezas clave de información. No esgenial poder lanzar, por ejemplo, una simple con-sulta al servidor para preguntar cuántos procesos detrabajo (worker processes) se están ejecutando en unmomento dado. Uno puedo hacer eso actualmenteen IIS 6.0. Lo que no se puede hacer en IIS 6.0, y síse puede hacer de forma muy sencilla en IIS 7.0, esconsultar en tiempo real qué peticiones se están pro-cesando dentro de un proceso de trabajo.

¿Qué novedades hay para los ISP o todos aque-llos que tengan que desplegar un gran número de ser-vidores Web?

Para los entornos de hosting dedicado o compar-tido creo que IIS 7.0 supondrá seguramente un saltomucho mejor y mucho mayor que los que supusieroncualquiera de las versiones anteriores. El porqué digoesto es porque con esta estructura de componentes,combinada con la escalabilidad del número de proce-sos de trabajo que Windows proporciona, supone quehoy en día IIS haga un muy buen trabajo, llegando aescalar hasta 1.500 procesos de trabajo en un únicosistema, lo que supone miles de aplicaciones. El pro-blema de los procesos de trabajo en IIS 6.0 es que cadauno de ellos lleva dentro todo el servidor Web, queantes estaba implementado de forma monolítica enuna sola DLL. Eso suponía que para cada proceso detrabajo teníamos cargada en memoria cierta funcio-nalidad que posiblemente no íbamos a usar. En IIS7.0 ya no sucede lo mismo: ahora para cada aplica-ción, para cada proceso de trabajo podemos decidirqué módulos queremos que se ejecuten. Esto reduceel consumo de memoria en el servidor y por tantoaumenta de algún modo también el número máximode procesos de trabajo que podemos ejecutar. Y esees uno de los parámetros más importantes para lasempresas de hosting: cuántos sitios Web puedo ejecu-tar en una única máquina. Aunque haya exagerado,una de sus mayores preocupaciones es el TCO, cómopueden implementar Windows con menor coste jun-to con el diagnóstico. El diagnóstico es otro de losgrandes problemas de los ISP, que cuentan con clien-tes que pueden ser personas con perfil incluso no téc-nico. Eso supone para ellos un coste importante a lahora de proporcionar soporte y resolver los proble-mas de sus clientes. Un servidor Web con mejorescapacidades de diagnóstico implica que el coste y elesfuerzo de resolver los problemas de los clientes seránmenores. En el caso de las empresas, las cosas suelenser más lentas y aquí el factor desarrollo será el queimpulse más al cambio. Un dicho muy común dentrode las empresas es “si no está roto, no lo arregles” yrefleja un poco su actitud más conservadora. En estoscasos, los desarrolladores serán las personas con másinfluencia, ejerciendo presión sobre el personal de ITsolicitando IIS 7.0.

dotN

etM

anía

<<

12

dnm.directo.entrevistas<<

El principal cambio en IIS 7.0 es la idea de extensibilidad. Nunca en ninguna de las versiones anteriores habíamos ofrecido la posibilidad de sacar la forma

en que nosotros hacíamos algo y sustituirlo por algo hecho por ti mismo

Page 13: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de
Page 14: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

WebParts en ASP.NET 2.0 (I)Una de las novedades más espectaculares que ofrece ASP.NET 2.0 es la posibilidad decrear portales personalizados. Éstos pueden ser modificados visualmente a voluntadde sus usuarios,pudiendo almacenar sus preferencias para el futuro.Y lo mejor de todo:no es necesario apenas escribir código para conseguirlo. Es el poder los WebParts.

<< una idea de la funcionalidad queofrecen los WebParts de ASP.NET 2.0 fijémonos porun momento en la conocida aplicación para intranetsSharepoint Team Services. Sharepoint forma parte deOffice System y, de manera gratuita, podemos instalar-la en Windows Server 2003 para crear potentes intra-nets en muy poco tiempo. Una de las cosas que más lla-man la atención de esta interesante aplicación es la faci-lidad con la que los usuarios y los administradores pue-den personalizar los contenidos de cada página del por-tal. Una vez puesta una página en modo de personali-zación basta con arrastrar “bloques de funcionalidad”de una zona a otra para recolocarlos, pudiendo ademásañadir nuevos “bloques” desde uno o más catálogos dis-ponibles. Estos “bloques” proporcionan servicios a losusuarios del portal o bien encapsulan cierta funcionali-dad para éstos que se evidencia con una determinadainterfaz de usuario. Por ejemplo, un bloque puede per-mitir hacer búsquedas en Google, otro visualiza una lis-ta de productos de la empresa, etc... A cada uno de estosbloques elementales que forman parte de un portal seles denomina WebPart.

Conseguir una funcionalidad similar y además de unmodo genérico en nuestras aplicaciones Web es todo undesafío. Incluso con un entorno tan potente como es.NET 1.1 resultaría muy complicado. El motivo es quese requieren programas muy complejos tanto en el ser-vidor (C# o VB) como en el cliente (JavaScript).

Por suerte, los chicos del equipo de ASP.NET enMicrosoft han hecho todo este trabajo por nosotros y enla versión 2.0 de la plataforma tenemos disponible todala potencia necesaria para dotar de esta funcionalidad anuestras propias aplicaciones. Y lo mejor de todo: paraconseguir las características más comunes apenas ten-dremos que escribir código.

En la barra de herramientas de Visual Web Developer2005 tenemos un nuevo grupo llamado WebParts. En élhay 13 controles Web que son los que nos proporcio-nan toda la funcionalidad necesaria para crear aplica-ciones personalizables mediante “bloques”.

Nuestra primera página personalizableDe todos estos controles el más importante es el pri-

mero: WebPartManager. Éste es el que se encarga de ges-tionar la información de cada uno de los bloques de fun-cionalidad disponibles, es decir, su ubicación, estado, visi-bilidad, conexiones, etc... Sólo puede haber un control deeste tipo en cada página. Si añadimos otro se generará unaexcepción para indicarlo al intentar cargarla.

Si vamos a hacer uso de esta nueva tecnología tene-mos que asegurarnos de que el control WebPartManagerde nuestra página aparece en la página antes que cual-quier otro control del mismo grupo, o se producirá unaexcepción. En el contexto de una página ASPX la pala-bra “antes” quiere decir que el control debe estar situa-do por encima y/o a la izquierda de cualquier otro con-trol del grupo, o lo que es lo mismo, su definición estáescrita antes en el HTML de la página.

Cree una nueva página ASPX y, usando las nuevasherramientas para distribución de elementos, añada enella una tabla de dos filas y tres columnas con un anchodel 100%. A la columna de la derecha asígnele un anchode 150 píxeles. Las otras dos déjelas con el valor pordefecto para que se adapten al resto del espacio dispo-nible. Asigne el valor “top” a la propiedad vAlignde todaslas celdas. Ahora, en la celda superior izquierda, arras-tre un control WebPartManager.

Lo siguiente que debemos hacer es definir qué zonasde nuestra página van a servir para albergar “bloques”,

Para que nos hagamos

José M.Alarcón

dnm.asp.net

José Manuel Alarcón es redactor de dotNetManía.

Es ingeniero industrial yespecialista en consultoría de

empresa.Ha escrito varios libros,y ha publicado más de

doscientos artículos sobreinformática e ingeniería en

revistas especializadas.Visita sublog en www.jasoft.org.

Page 15: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

o lo que es lo mismo, WebParts. El con-trol adecuado para ello se llama, como erade esperar, WebPartZone. Arrastre sendoscontroles WebPartZone a las celdas prime-ra y segunda de la fila inferior de la tabla.Seleccionándolos, cambie su propiedadHeaderTextpara mostrar las cadenas “Zona1” y “Zona 2”. Estos son los nombres conlos que se mostrarán ambas zonas a la horade personalizarlas. Cambie también suancho aplicándole un valor de 100%.Puede utilizar la etiqueta inteligente (smarttag) de estos dos controles para asignarlesun estilo estético determinado, por ejem-plo el estilo profesional.

Ahora, cada una de estas zonas estápreparada para albergar uno o más blo-ques de funcionalidad, tal y como hemosvisto. Los controles WebPartZonedisponende muchísimas propiedades que podemosutilizar para personalizar casi cualquieraspecto de su comportamiento o estética.La mayoría son bastante evidentes por loque le recomiendo que los investigue porsu cuenta. Existe una propiedad intere-sante llamada LayoutOrientation que sir-ve para indicar en qué sentido, vertical (pordefecto) u horizontal, se irán colocandolos distintos bloques dentro de la zona.Cuando elegimos el sentido horizontalcada WebPart se coloca al lado de la ante-rior en lugar de encima. Puede ser útil parazonas configurables que ocupen una fran-ja horizontal entera de nuestra página.

Añadiendo bloques de funcio-nalidad

Con lo que hemos hecho hasta ahoraya disponemos de una pequeña base sobrela que construir nuestro portal personali-zable. Los que todavía nos hacen falta sonlos distintos elementos que constituyenlos “bloques de funcionalidad” o WebParts.

En ASP.NET 2.0 se pueden definirdos tipos de WebParts: auténticos ogenéricos. Estos últimos son, en reali-dad, controles normales de ASP.NET.Cualquier control existente deASP.NET puede comportarse como unWebPart. Ello incluye a los controles quetenemos en la barra de herramientas,controles creados por nosotros mismoso incluso controles de usuario (.ascx).

Por ejemplo, desde la barra de herra-mientas, arrastre sobre el recuadro edita-ble de la zona 1 un control de tipo calen-

dario. Verá que al hacerlo el control apa-rece automáticamente rodeado por unaventana y que en el título pone “Sin títu-lo” (o “untitled” si usa la versión de VS2005en inglés). Vaya al código fuente HTMLde la página y busque, dentro de la zona1, la etiqueta ZoneTemplate, en la que apa-recerá definido el control de calendarioque acaba de arrastrar. Escriba a mano lapropiedad Title asignándole un valorcualquiera, por ejemplo, “Calendario”.

Como se puede observar en la figura1, la propiedad Title aparece subrayada,marcando un error. Lo que indica el errores que, en efecto, el control Calendar nodispone de una propiedad Titleque poda-mos asignar. Sin embargo, como ense-guida comprobaremos, al ejecutar la apli-cación no se produce excepción alguna yel título se asigna sin problemas. De hechosi vuelve a la vista de diseño de la páginaverá que el nuevo título aparece encimadel calendario. El motivo es que cuandoarrastramos a una zona un WebPart “noreal” como este control de calendario, lainfraestructura de WebParts crea automá-ticamente un control WebPart genérico(que de hecho se llama GenericWebPart).Éste actúa de envoltorio sobre el controlcomún para dotarlo de la funcionalidadbásica que todo bloque debe tener.

Para rematar este ejemplo inicialvamos a crear un control de usuario queusaremos también como bloque.Agregue un nuevo control de usuario al

proyecto y llámele Bienvenido.ascx. Enél agregue únicamente una tabla con unacelda y en ella escriba algún texto debienvenida y coloque si lo desea el logo-tipo de su empresa. Grábelo y arrástre-lo sobre la zona 2 de nuestra página deejemplo. Asígnele un título de maneramanual como lo hemos hecho ante-riormente con el calendario.

Añadamos un toque final a nuestroejemplo. Agregue dos controles de tipo

LinkButton a la celda central dela fila superior de la tabla.Asígneles los textos “Páginanormal” y “Personalizar” res-pectivamente. Haciendo dobleclic sobre ellos, escriba el códi-go del fuente 1 para sus even-tos de pulsación.

La propiedad DisplayModecontrola cómo se mostrará lapágina en lo que respecta a lasdiversas zonas personalizables.El modo de diseño permite a

los usuarios arrastrar y soltar bloques entrezonas, mientras que el modo de navega-ción o modo normal deja la página conun comportamiento tradicional.

El aspecto de su página a estas alturasdebería ser aproximadamente como el dela figura 2. Si ejecuta la aplicación verá quela página ya obtiene la funcionalidad bási-

dotN

etM

anía

<<

15

dnm.asp.net<<

Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.ClickWebPartManager1.DisplayMode = WebPartManager.BrowseDisplayMode

End Sub

Protected Sub LinkButton2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton2.ClickWebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode

End Sub

Figura 1

Fuente 1

Figura 2

Page 16: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

ca de arrastrar y soltar bloques entre zonascuando usamos el enlace de personalizar.

CatálogosHaga un experimento con la página

recién creada. Usando el menú automá-tico que aparece en la barra de título delos dos bloques disponibles, cierre ambosWebParts (opción “Cerrar” o “Close”, daigual que esté en el modo de personaliza-ción o no). Cierre el navegador y vuelvaa ejecutar la aplicación. ¡Han desapareci-do para siempre! Si ahora pulsa sobre elenlace de personalización verá que laszonas aparecen en blanco y no tiene nadaque arrastrar sobre ellas.

Al personalizar una página, durante elpostback al servidor, el WebPartManagerde lapágina se ocupa automáticamente de per-sistir el estado de las zonas para cada usua-rio. Por defecto se usa la autenticaciónWindows, es decir, que se guarda la per-sonalización asociándola con su nombre deusuario del sistema, en mi caso KRASIS\Jose.Luego entraremos en más detalle sobreeste asunto de la personalización. Lo quenos interesa ahora es que al haber cerradolos bloques que teníamos en la página loshemos perdido para siempre, lo cual obvia-mente es inadmisible en una aplicación real.Vamos a ponerle remedio usando otro ele-mento de la infraestructura de WebParts deASP.NET 2.0: los catálogos.

Un catálogo es una lista de WebPartsque podemos añadir a nuestra página per-sonalizable. Existen tres tipos de catálo-gos disponibles:• Catálogo de página: existe uno sólo por

cada página de nuestra aplicación.Contiene referencias a los bloques dis-ponibles inicialmente en nuestra pági-na. Sólo contiene elementos que per-teneciesen a la página originalmente (taly como la hemos diseñado) y que elusuario actual haya cerrado. Es el quenecesitamos para recuperar nuestrosbloques perdidos.

• Catálogo declarativo: se usa para definirlistas personalizadas de WebParts quepueden estar originalmente en la pági-na o no. Son muy útiles para crear lis-tas agrupadas por tipos de elementosque nuestros usuarios pueden quererutilizar en las zonas de la página.

• Catálogo de importación: su propósito eshabilitar la importación de definiciones

de WebParts desde otros sistemas o por-tales. De momento no los estudiaremos.

Catálogo de páginaPara poder agregar de nuevo los ele-

mentos originales a nuestra página vamosa añadir un catálogo de página que nos per-mita recuperarlos. Si queremos disponerde uno o más catálogos de bloques en unapágina debemos definir en qué zona deésta los mostraremos. Esto se consigueusando el control CatalogZone del grupoWebParts en la barra de herramientas.Arrástrelo a la celda de la derecha de la filainferior de nuestra tabla, que todavía esta-ba libre. Establezca su propiedad HeaderText con el texto “Catálogo de bloques”.

Si se fija verá que hay una pequeñafranja en el control que es editable. En ellapuede arrastrar elementos desde la barrade controles. Los únicos que están per-mitidos son PageCatalogPart, DeclarativeCatalogPart e ImportCatalogPart, que secorresponden con los tres tipos indicadosen el apartado anterior. Si arrastra cual-quier otro control verá que se muestra unmensaje de error.

Arrastre un control PageCatalogParten la zona. Cambie su título para que diga“Elementos básicos”.

Ahora añada otro botón de tipo enla-ce con el texto “Catálogo”, y escriba elsiguiente código en su manejador:

WebPartManager1.DisplayMode = WebPartManager.CatalogDisplayMode

Esto hará que se muestre el catálogoy pueda seleccionar sus elementos.

Ahora debería tener una página pare-cida a la de la figura 3. Ejecute la aplica-ción de nuevo y utilice el enlace del catá-logo. Como puede comprobar, los ele-mentos que antes había eliminado estándisponibles en la lista.

Puede añadirlos a cualquier zonaseleccionándolos, escogiendo la zona enla lista de abajo y pulsando el botón corres-pondiente. Es posible añadir varios al mis-mo tiempo o de forma individual. Al ter-minar pulse el botón “Cerrar” para vol-ver al modo de navegación.

Controles WebPart auténticosAntes de continuar con los otros tipos

de catálogo vamos a crear algunosWebParts adicionales.

Como ya se ha comentado antes, apar-te de poder usar cualquier control comúncomo WebPart gracias a la clase GenericWebPart, podemos crear WebParts autén-ticos. Éstos son controles personalizadosque derivan de la clase WebPart.

Por ejemplo, vamos a crear un Web-Part sencillo que se encargue de mostrarel nombre del usuario Windows actual.Es decir, mostrará el nombre de la cuen-ta de usuario que se suplanta durante laejecución de la aplicación ASP.NET y que,a todos los efectos, es la que se usa paracontrolar accesos a recursos de disco o debases de datos. Cuando ejecutemos la apli-cación desde Visual Web Developer 2005,con el servidor Web de desarrollo y no enIIS, el usuario actual será el mismo quehemos usado para autenticarnos enWindows, ya que por defecto se usa auten-ticación Windows.

Cree una nueva clase llamada UsuarioWebpart dentro de la carpeta App_Code.Escriba el código del fuente 2.

Fíjese en lo sencillo del código. Alheredar de la clase WebPart ya se obtieneautomáticamente toda la funcionalidadesperada en un bloque personalizable. Loúnico que tenemos que hacer, al igual queen el caso de estar creando un controlWeb, es escribir el código necesario paravisualizar el contenido, para lo cual sobre-

escribimos el méto-do RenderContents.En este caso sólodebemos escribir elnombre del usuarioWindows actual,que lo obtenemosde la clase Thread.Además en el cons-tructor de nuestrocontrol le asigna-mos un título por

dotN

etM

anía

<<

16

dnm.asp.net<<

Figura 3

Page 17: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

defecto y especificamos que no se podrácerrar ni ocultar, asegurándonos así de quesiempre va a estar presente en la página.

Para utilizar el control en una pági-na sólo hay que registrarlo de la siguien-te manera:

<%@ Register Namespace=”Jose.WebParts”TagPrefix=”uwp” %>

Siendo “uwp” el prefijo que queremosusar en el HTML de la página para iden-tificar a los controles contenidos dentrodel espacio de nombres indicado (pode-mos usar cualquier otro, este lo he elegi-do yo). Ahora se puede incluir dentro deuna zona escribiendo simplemente:

<ZoneTemplate><uwp:UsuarioWebpart ID=”UsuarioWP1”

runat=”server” /></ZoneTemplate>

Ejecute la página y verá como el con-trol aparece en la zona mostrando el nom-bre del usuario actual. Si despliega su menúlateral verá que la única opción disponiblees minimizarlo ya que hemos deshabilita-do la posibilidad de cerrarlo u ocultarlo.

Mejorando el uso de los con-troles genéricos

Está claro que la creación desde cerode un WebPart de la forma que acaba-mos de ver es la que mayor control nosotorga porque podemos modificar sucomportamiento. Sin embargo esmucho menos productiva que usandocontroles de usuario ya que perdemosla capacidad de diseñarlos visualmente,arrastrando y soltando controles desdela barra de herramientas.

Podemos, sin embargo, obtener lomejor de ambos mundos si nos fijamos

un poco como funciona por debajo elmodelo de trabajo con controles genéri-cos. Cuando arrastramos sobre una zonapersonalizable algún control que no esespecíficamente un WebPart, lo que ocu-rre en tiempo de ejecución es queASP.NET incluye de forma automáticaun control GenericWebPart que gestionala personalización del nuestro. La claseGenericWebPart hereda también de la cla-se base WebPart por lo que tiene todas suspropiedades. Lo interesante de esto esque, indagando un poco podemos llegara la conclusión de que somos capaces decontrolar al WebPart genérico desde nues-tro control. ¿Cómo? Muy sencillo: por-que el bloque genérico es un control con-tenedor que contiene a nuestro controldirectamente. Por ello, la propiedadParent de éste último nos da acceso direc-to al primero. ¿Lioso? En absoluto, veá-moslo con un ejemplo.

Imaginemos que queremos evitar quenuestro control de bienvenida se puedamover de zona, aunque sí permitiremoscerrarlo u ocultarlo. De este modo, si semuestra, siempre lo hará a la derecha quees donde lo hemos colocado original-mente. Si añadimos el código del fuente3 (en VB.NET) para el evento de cargade nuestro control de usuario:

conseguimos lo que estábamos buscando.Con esta técnica obtenemos todas las ven-tajas de usar diseñadores visuales con lacapacidad de control de comportamien-to y estética que nos ofrece el haber deri-vado de una clase base WebPart.

Catálogos personalizadosHasta ahora hemos visto uno de los

tres tipos de catálogos de componentesdisponibles: el que permite volver a aña-dir elementos que estaban originalmente

en la página y que se han cerrado. Ahoravamos a ver el segundo y más importan-te tipo que nos permite construir listas decomponentes reutilizables para facilitar suselección en cualquier momento por par-te de los usuarios.

En la celda de la derecha, justo deba-jo del catálogo de página que colocamosantes, añada un control de tipo DeclarativeCatalogPart y establezca su propiedadTitle como “Catálogo de componentes”.Por defecto aparecen sobre su superficiealgunas instrucciones de cómo utilizarlo.Haga uso de la etiqueta inteligente del con-trol y escoja la opción “Editar plantilla”.Al igual que en las zonas, ahora aparece unrecuadro sobre el que podemos arrastrarelementos. Todo lo que arrastremos aquíestará disponible para que lo agreguen losusuarios a cualquiera de las zonas.

Arrastre un control calendario desdela barra de herramientas. Vaya al códigoHTML y, a mano, asígnele un título conel que quiere ponerlo disponible.

A continuación arrastre también elcontrol para mostrar el usuario actual quehabíamos creado, desde la zona 1 al hue-co disponible en el catálogo declarativodebajo del calendario. Al hacerlo ¡hadesaparecido! ¿A qué se debe esto? Puesa que como no tenemos la aplicación en

ejecución no hay usuario alguno quemostrar, y dado que en la plantilla delcatálogo no aparecen las barras de títu-lo de los WebPart, pues el efecto es quedesaparece el control. Vamos a ponerleremedio cambiando el código originaldel control por el del fuente 4.

Recompile (o ejecute) de nuevo el sitioWeb para que este cambio sea efectivo.Ahora verá como el control aparece en laplantilla del catálogo poniendo “Usuariodesconocido”. Hay que asegurarse siem-pre que nuestros controles dibujan algo

dotN

etM

anía

<<

17

dnm.asp.net<<

Imports Microsoft.VisualBasicNamespace Jose.WebPartsPublic Class UsuarioWebpartInherits WebPartPublic Sub New()

Me.Title = “Usuario Windows actual”Me.AllowClose = FalseMe.AllowHide = False

End SubProtected Overrides Sub RenderContents(

ByVal writer As System.Web.UI.HtmlTextWriter)writer.Write(System.Threading.Thread.

CurrentPrincipal.Identity.Name)End Sub

End ClassEnd Namespace

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadDim padre As GenericWebPart = DirectCast(Me.Parent, GenericWebPart)padre.AllowZoneChange = False

End Sub

Fuente 2

Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)Dim usuario As String = System.Threading.Thread.CurrentPrincipal.Identity.NameIf usuario = “” Then usuario = “Usuario desconocido”

writer.Write(usuario)End Sub

Fuente 3

Fuente 4

Page 18: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

en la página, aún cuando sea un valor pordefecto, para evitar efectos desagradablesmientras estamos en tiempo de diseño.

Si pulsa sobre el enlace “Terminar edi-ción de plantilla” en la etiqueta inteligen-te del control de catálogo declarativodebería tener algo como lo que se ve enel detalle de la figura 4. Ejecute ahora laaplicación de nuevo. Al pasar a modo catá-logo, además del catálogo de página conlos elementos iniciales que hayamos cerra-do, disponemos de un nuevo catálogo conlos dos componentes que hemos defini-do. Seleccione uno o varios controles dela lista y agréguelos a la zona especificadaen la lista desplegable de la parte inferior.Fíjese en que puede añadir los controlestantas veces como desee. Cuando termi-ne pulse el botón de cerrar para volver almodo normal de navegación.

Almacenamiento de preferen-cias

Ya hemos comentado que cuandocambiamos algo en la disposición, aspec-to o composición de los elementos de lapágina personalizable, su estado se man-tiene las próximas veces que lo visitemos.Esto es porque de manera automática lainfraestructura de WebParts emplea la clase Personalization que viene conASP.NET 2.0 para almacenar nuestraspreferencias. La pregunta es ¿dónde?.

Por defecto se crea y utiliza una basede datos SQL Server 2005 Express lla-mada ASPNET_DB.mdbque podemos ver bajola carpeta App_Data de nuestra aplicación.Si la examinamos veremos que existe unatabla llamada aspnet_personalizationperuser que es la que contiene las prefe-rencias de cada usuario. El campo Page

Settings de esa tabla almacena en forma-to binario dichas preferencias, y el cam-po UserId identifica al usuario. Este iden-tificador es de tipo GUID y no sólo rela-ciona las preferencias con el nombre deusuario sino que también lo hace con unaaplicación concreta de modo que se pue-den guardar diversas preferencias rela-cionadas con el mismo usuario (podemoscomprobar esto analizando la tabla asp-net_users).

Si tenemos SQL Server 2005Express, instalada por defecto con VisualStudio, la base de datos de adjunta diná-micamente en tiempo de ejecución y todofuncionará perfectamente. Sin embargo,si usamos la versión completa de SQLServer 2005 obtendremos un error. Elmotivo es que esta versión carece de lacapacidad de adjuntar dinámicamente labase de datos. Para hacerlo funcionardeberemos adjuntarla manualmenteusando SQL Server 2005 ManagementStudio (botón derecho sobre el nodo“Databases” y elegir la opción “Attach”).

Una vez hecho esto deberemos cam-biar la cadena de conexión por defectopara que la aplicación pueda encontrarlos datos. Abra el archivo web.config yescriba el código del fuente 5:

sustituyendo .\SQL2005 por el nombre dela instancia de su servidor.

Es típico que pase esta situación deno poder trabajar con la base de datosde ASP.NET cuando pasamos la apli-cación a un servidor de producción,donde normalmente no se usa la versiónExpress del producto. Como hemos vis-to es algo fácil de solucionar y esperoque alguna vez le sirva y le ahorre tiem-po y desesperación.

CompatibilidadAntes de terminar por hoy querría

hacer un par de comentarios sobre lacompatibilidad de los WebParts que

seguramente algún lector tiene enmente ya.

Primero: la interfaz de arrastrar y sol-tar tan característica de estos compo-nentes no funciona con navegadores queno sean Internet Explorer (FireFox ycompañía). Eso no quiere decir que nonos sirva para usar con ellos ya que siem-pre podemos gestionar los bloques aun-que no arrastrando y soltando. La ver-dad es que es una verdadera lástima ypersonalmente pienso que no hubierasido tan complicado hacer que funcio-nara en cualquier navegador compati-ble con DOM (aunque seguramente esmucho aventurar). De todos modos hayrumores de que Microsoft piensa sacaruna actualización para tener esta carac-terística. A ver si es cierto.

Segundo: los WebParts creados conesta infraestructura no son compatiblescon las tecnologías Sharepoint 2.0. Detodos modos no todo son malas noticiasal respecto: la versión 3.0 de Sharepointque verá la luz junto con Office 12 aprincipios de 2007 unificará las dosinfraestructuras. Estos son grandes noti-cias ya que lo que hagamos conASP.NET 2.0 será compatible conSharepoint 3.0 y viceversa.

Suma y sigue

En esta primera parte del artículohemos rascado la superficie de lo quese puede hacer con la nueva infraes-tructura de WebParts de ASP.NET 2.0.Pero aún nos quedan muchísimascosas por ver. En las siguientes partesvamos a ver cuestiones avanzadas querequerirán más código pero nos daránmayor potencia, como por ejemplo ladefinición de acciones y propiedadespersonalizadas, la edición de propie-dades de los bloques, los editores pro-pios, las conexiones y traspasos dedatos entre bloques, etc... Todo unmundo por descubrir.

dotN

etM

anía

<<

18

dnm.asp.net<<

<connectionStrings><remove name=”LocalSqlServer”/><add name=”LocalSqlServer”

connectionString=”server=.\SQL2005;Integrated Security=SSPI;Database=ASPNET_DB;”providerName=”System.Data.SqlClient” />

</connectionStrings>

Figura 4

Fuente 5

Page 19: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de
Page 20: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

Macros en Visual Studio 2005

La forma más sencilla de automatización que ofrece Visual Studio son las macros.En este artículo veremos cómo aprovecharlas para ahorrarnos tiempo en tareas repetitivas.

<< mejoras que trajo Visual Studio .NET2002 allá por ese año comparado con el IDE de VisualBasic 6.0 son las macros. En Visual Studio una macroes simplemente una subrutina (escrita en Visual Basic.NET necesariamente) con una serie de instruccio-nes que permiten manejar algún aspecto del IDE des-de código. Por ello son adecuadas para automatizartareas repetitivas que ejecutemos de forma cotidiana,como por ejemplo añadir un encabezado a un archi-vo cada vez que lo creamos (incluso sin tener que tecle-ar nada) o reformatear el código con arreglo a nues-tras preferencias. Prácticamente no hay límites a loque podemos hacer con una macro, salvo tal vez uno:no podemos crear formularios para pedir datos deentrada para la macro. Podemos usar la funciónInputBox como siempre para pedir algún dato suelto,pero si queremos un formulario tendríamos que cre-arlo en un proyecto separado, compilarlo y referen-ciarlo desde nuestro proyecto de macros, o bien cons-truir un complemento (add-in), pero eso ya no seríauna macro. También tendríamos que crear un com-plemento (que se distribuye compilado) si la protec-ción de la propiedad intelectual es una preocupación,ya que el código fuente de las macros es visible. Noobstante, el código fuente de las macros se puede con-vertir fácilmente en un complemento, por lo que siem-pre podemos empezar por escribir una macro y si másadelante lo necesitamos, la convertimos en un com-plemento.

El editor de macrosTodo lo relacionado con las macros tiene su propio

menú en el IDE de Visual Studio (“Herramientas”,“Macros”). Las macros tienen su propio editor (sub-

menú “IDE de macros”) que al pulsarlo abre otroIDE de desarrollo, muy similar al de Visual Studio,pero con menos funciones. De hecho son ejecutablesdistintos: el ejecutable del IDE de Visual Studio sellama devenv.exe y el de macros se llama vsaenv.exe.Este IDE de macros tiene un explorador de proyec-tos (no explorador de soluciones ya que el conceptode solución no existe en este entorno). Las macros,siendo subrutinas como hemos comentado, se agru-pan en módulos de Visual Basic, y los módulos seagrupan en proyectos; todo ello se muestra en esteexplorador de proyectos. Si nos fijamos en el menú“Proyecto” de este IDE veremos que tiene los sub-menús “Agregar módulo”, “Agregar clase”, etc. perono tiene “Agregar formulario”, como ya comenta-mos antes.

El explorador de macrosEl IDE de Visual Studio proporciona una ventana

llamada “Explorador de macros” (ver figura 1), accesi-ble desde el menú “Ver”, “Otras ventanas”, “Exploradorde macros”, que nos muestra los proyectos, módulos ymacros, pero esta vez desde el punto de vista del usua-rio de macros y no del creadorde macros. El menú de con-texto de una macro en esteexplorador tiene entre otros elsubmenú “Ejecutar” para eje-cutar la macro (también pode-mos ejecutarlas haciendo dobleclic), mientras que el submenú“Editar” nos llevará al IDE demacros para poder modificar lamacro.

Carlos Quintero

dnm.plataforma.net

Una de las grandes

Carlos J.Quinteroes Microsoft MVP de .NET desdeprincipios del año 2004. Es autor

del popular complemento MZ-Tools 3.0 para VB6,VB5 y VBA, de

MZ-Tools 4.0 para Visual Studio.NET 2002/ 2003, y de MZ-Tools

2005 para Visual Studio 2005.Están disponibles en

http://www.mztools.com Figura 1

Page 21: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

Gestión de proyectos demacros

Por defecto existen dos proyectos demacros: uno llamado MyMacros y otro lla-mado Samples (al menos en la versióninglesa). El primero es el que normal-mente usaremos para guardar nuestrasmacros y el segundo es un proyecto pro-porcionado por Microsoft con multitudde pequeñas macros que nos sirvan deejemplo.

Podemos añadir y quitar proyectosde macros pero dado que los proyectosson independientes entre sí (no hay unasolución que los una), los proyectos demacros se añaden desde el IDE princi-pal y no desde el IDE de macros comopodríamos pensar (en cambio, losmódulos de un proyecto de macros sepueden crear desde cualquiera de los dosIDE usando el menú de contexto de unproyecto). Para crear un proyecto usa-remos el menú “Herramientas”, “Ma-cros”, “Nuevo proyecto de macros…”desde el IDE de Visual Studio, que nospedirá el nombre del proyecto.

Los proyectos de macros se puedenpasar de una máquina a otra (en un equi-po de desarrolladores, por ejemplo) ypara ello se cargan con el menú “Herra-mientas”, “Macros”, “Cargar proyectode macros” (se descargarían con el sub-menú “Descargar proyecto de macros”).

Cuando se graban, los archivos de pro-yectos de macro se guardan en un únicoarchivo con la extensión .vsmacros si lapropiedad StorageFormat de la ventanade propiedades tiene el valor “Binary(.vsmacros)”. Si en cambio establecemosesa propiedad al valor “Text (UNICO-DE)”, se guardan en varios archivos detexto. La ventaja de usar el formato tex-to es que otros programadores puedenmirar el código fuente de las macros antesde cargarlos en su IDE. Nótese que guar-dar un proyecto de macros en formatobinario no protege el código fuente, yaque una vez cargado el proyecto, el códi-go fuente se hace accesible.

En el IDE de macros no se puedenguardar los cambios de módulos indivi-dualmente como podemos hacer con losarchivos de un proyecto en el IDE deVisual Studio, sino que los proyectos seguardan como un todo. Por defecto losproyectos de macros se guardan física-mente en la carpeta C:\Documents andSettings\<usuario>\Mis documentos\

Visual Studio 2005\Projects\VSMacros80.Sin embargo, sí podemos exportar unmódulo individual mediante el menú“Archivo”, “Exportar…”.

Referencias en los proyectosde macros

Los proyectos tienen también su nodo“Referencias” para establecer los ensam-blados que puede usar nuestro códigofuente. Las referencias más importantesrelacionadas con la extensibilidad que vie-nen añadidas por defecto se detallan en latabla 1. De hecho, las tres primeras sontan importantes que no se pueden quitardel proyecto de macros.

Para añadir una referencia usamosel menú de contexto “Agregar referen-

cia”, que nos muestra el cuadro de diá-logo de la figura 2. Aunque en princi-pio parece como el del IDE de VisualStudio hay un pequeño detalle quedebería llamar nuestra atención: no per-mite navegar para buscar un ensambla-do en alguna carpeta de nuestro siste-ma de archivos. Para añadir ensambla-dos que hayamos creado nosotros mis-mos tenemos que copiarlos a la carpetaC:\Archivos de programa\Microsoft

Visual Studio 8\Common7\IDE\Public

Assemblies. Una vez ahí, nuestro ensam-blado aparecerá en la lista de dicho cua-dro de diálogo.

Grabando macrosLa forma más fácil de escribir

nuestra primera macro es… ¡no escri-birla, sino grabarla y que Visual Studio

la escriba por nosotros! La macro quese graba tiene un nombre especial, que

dotN

etM

anía

<<

21

dnm.plataforma.net<<

Referencia DescripciónEnvDTE Contiene el modelo de extensibilidad de Visual Studio.

EnvDTE80Contiene clases del modelo de extensibilidad específicas para VisualStudio 2005.

VSLangProjContiene clases del modelo de extensibilidad específicas para loslenguajes VB.NET y C#.

VsWebSite.InteropContiene clases del modelo de extensibilidad específicas para proyectosWeb de Visual Studio 2005.

Tabla 1

Figura 2

Prácticamente no hay límites a lo que podemos

hacer con una macro

Los proyectos de macrosse pueden pasar de unamáquina a otra (en un

equipo de desarrolladores,por ejemplo)

Page 22: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

es TemporaryMacro, y está en el módu-lo RecordingModule del proyectoMyMacros. Sabiendo esto, el grabadorde macros de Visual Studio funcionade la siguiente manera: se inicia la gra-bación pulsando el menú “Herra-mientas”, “Macros”, “Grabar Tempo-raryMacro”. Aparece una nueva barrade botones con los botones “Pausar”,“Parar” y “Cancelar”. En este puntopodemos ejecutar cualquier acción enel IDE o en nuestro código fuente ylas acciones se irán grabando en lamacro. Cuando hayamos terminado,pulsaremos el botón “Parar”. Ahorapodemos, o bien volver a ejecutar lamacro con el menú “Herramientas”,“Macros”, “Ejecutar Temporary-Macro”, o bien editar la macro paraver su código fuente buscando en elexplorador de macros dicha macro ypulsando el menú de contexto“Editar”. Hay varios puntos que con-viene indicar sobre la grabación demacros:• La macro donde se graban las

acciones siempre tiene ese nom-bre, por lo que al grabar una nue-va macro se sobrescribe el códigofuente la macro anterior. Por tan-to, si queremos conservar unamacro grabada anteriormente ten-dremos que renombrarla a manoen el editor de macros o bien pul-sar el menú “Herramientas”,“Macros”, “Guardar Tempo-raryMacro” del IDE principal, quenos brindará la oportunidad derenombrar la macro en el explora-dor de macros.

• Si durante la grabación de unamacro nos damos cuenta de que nohemos guardado la macro tempo-ral anterior, podemos cancelar lagrabación mediante el botón“Cancelar”.

• Se puede establecer en qué proyec-to se guardará la macro grabadausando el explorador de macros,seleccionando el proyecto deseadoy pulsando el menú de contexto“Establecer como proyecto de gra-bación”. Esto agregará un móduloRecordingModule a este proyectodonde se creará la subrutinaTemporaryMacro.

Ejecución de macros

Las macros se pueden ejecutar demuchas maneras, no solamente usan-do el explorador de macros del IDEprincipal (seleccionando la macro dese-ada y pulsando su menú de contexto“Ejecutar”, o el menú “Herramientas”,“Macros”, “Ejecutar macro”). Resultaque cada macro (cada subrutina) tieneasociado un comando en el IDE quepodemos descubrir en el menú“Herramientas”, “Personalizar…”,ficha “Comandos”, categoría “Macros”.La figura 3 muestra dicho cuadro dediálogo.

Como vemos, el nombre completo delcomando de una macro está compuestopor el nombre de su proyecto, el de sumódulo y su propio nombre. Dado quelas macros tienen comandos asociados,podemos ejecutar una macro de estas otrasmaneras (más cómodas algunas de ellas):• Usando la ventana de comandos de

Visual Studio y tecleando el nombrecompleto del comando de la macro.Dado que la ventana de comandostiene Intellisenseno hará falta es-cribir mucho paraencontrar nuestramacro, pero sivamos a ejecutarla macro con fre-cuencia de estamanera es conve-niente asignar unalias a la macromediante una ins-trucción comoésta:

>alias mimacro

Macros.Module1.MacroMuyUsada

Nota: si la subrutina de lamacro recibe parámetros (quehemos añadido a mano editan-do el código de la macro), usarla ventana de comandos es laúnica forma de hacerle llegarvalores a dichos parámetros.

• Asociando una combina-ción de teclas al comando de lamacro, en el menú

“Herramientas”, “Personalizar…”,botón “Teclado…”, y buscando elcomando que contiene el nombre denuestra macro, como haríamos concualquier comando del IDE.

• Creando un botón en una barra debotones asociado a nuestro coman-do, mediante el menú “Herra-mientas”, “Personalizar…”, ficha“Comandos”, categoría “Macros”,seleccionado el comando de nuestramacro en la lista y arrastrándolo ysoltándolo en la barra de botonesque queramos.

Escribiendo macrosLas macros algo más complicadas

que no sean una grabación de accionesen el IDE tendremos que escribirlas amano. Podemos partir de una macrograbada y modificarla o bien escribirladesde cero, simplemente añadiendo unasubrutina al módulo que queramos.Antes de ponernos a escribir macrosconviene que revisemos la ventana depropiedades del proyecto de macros, yaque los proyectos de macros tienen su

dotN

etM

anía

<<

22

dnm.plataforma.net<<

Figura 3

Figura 4

Page 23: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

espacio de nombres raíz (root namespa-ce), su opción Option Strict On, etc.,como si se trataran de proyectos nor-males de Visual Studio. En la figura 4podemos ver las propiedades de un pro-yecto de macros, que son algo más redu-cidas que las de un proyecto normal.

Una vez revisadas estas propiedadesya podemos empezar a escribir código.Para ello conviene estar familiarizadocon el modelo de extensibilidad deVisual Studio (espacio de nombresEnvDTE), que fue tratado en un artículoanterior. La clase más importante esEnvDTE.DTE, y el entorno de macros nosproporciona una instancia implícita deesa clase con el nombre DTE (que ya nossonará familiar si hemos editado algu-na macro grabada). Aunque medianteuna macro podemos manejar casi cual-quier aspecto del IDE, lo más normalserá que las macros realicen alguna ope-ración con el documento de texto acti-vo, o bien que ejecuten alguna accióncuando ocurra algún evento en el IDE.Para obtener el documento activo usa-remos la propiedad DTE.ActiveDocument,que nos devuelve una instancia de unEnvDTE.Document. Un documento no esnecesariamente un documento de tex-to (puede ser un diseñador de un for-mulario, por ejemplo). Para los docu-mentos de texto existe otra clase llama-da EnvDTE.TextDocument, y la forma deobtener una instancia de esta clase a par-tir de la otra es mediante la propiedadDocument.Object(“”). Como vemos, estapropiedad recibe un parámetro, que esel tipo de objeto que queremos obtener.Podemos usar “TextDocument”, omi-tirlo o pasarlo como “”. Una vez quetenemos la instancia de EnvDTE.

TextDocument ya podemos usar sus pro-piedades y métodos, que son pocos peroimportantes:• Las propiedades StartPoint y

EndPoint nos dan los puntos de tex-to (del tipo EnvDTE.TextPoint) decomienzo y fin del documento. Unpunto de texto sólo permite obtenerinformación de posicionamiento delmismo (línea, columna, etc.) pero nopermite añadir, modificar o borrartexto. Para eso necesitamos un pun-to de edición (del tipo EnvDTE.EditPoint). Se puede crear un pun-to de edición a partir de un punto

de texto mediante el métodoTextPoint.CreateEditPoint.

• La propiedad Selection nosdevuelve la selección de texto (deltipo EnvDTE.TextSelection), que asu vez tiene gran cantidad de pro-

piedades y métodos para hacertodo eso que hacemos con el tecla-do casi sin ser conscientes de ello(movernos de línea, insertar,borrar, copiar, pegar, reemplazar,etc.).

<<

23

dnm.plataforma.net<<

Sub ComentarProcedimiento()Dim documentoActivo As DocumentDim documentoTextoActivo As TextDocumentDim procedimientoActual As EnvDTE.CodeElementDim puntoEdicionComienzo As EnvDTE.EditPointDim puntoEdicionFin As EnvDTE.EditPointDim prefijoComentario As String

Try' Obtiene el documento activodocumentoActivo = DTE.ActiveDocument

If Not (documentoActivo Is Nothing) Then' Si es de tipo texto...

If documentoActivo.Kind = EnvDTE.Constants.vsDocumentKindText Then' Obtiene el documento de textodocumentoTextoActivo = CType(documentoActivo.Object, _

EnvDTE.TextDocument)

' Obtiene el procedimiento donde está el cursorprocedimientoActual = documentoTextoActivo.Selection.ActivePoint._

CodeElement(vsCMElement.vsCMElementFunction)

If Not (procedimientoActual Is Nothing) Then' Establece el prefijo para comentar una línea según el lenguaje Select Case documentoActivo.ProjectItem.FileCodeModel.Language

Case EnvDTE.CodeModelLanguageConstants.vsCMLanguageVBprefijoComentario = "' "

Case EnvDTE.CodeModelLanguageConstants.vsCMLanguageCSharpprefijoComentario = "// "

End Select

' Obtiene los puntos de inicio y fin del procedimiento actualpuntoEdicionComienzo = procedimientoActual.StartPoint.CreateEditPointpuntoEdicionFin = procedimientoActual.EndPoint.CreateEditPoint

' Mueve el punto de inicio al comienzo de la líneapuntoEdicionComienzo.StartOfLine()

' Ejecuta el bucle mientras no se alcance el punto de fin del procedimientoDo While (puntoEdicionFin.GreaterThan(puntoEdicionComienzo))

' Añade el prefijo a la línea para comentarlapuntoEdicionComienzo.Insert(prefijoComentario)

' Mueve al comienzo de la siguiente líneapuntoEdicionComienzo.LineDown()puntoEdicionComienzo.StartOfLine()

LoopEnd If

End IfEnd If

Catch ex As ExceptionMessageBox.Show(ex.ToString)

End Try

End Sub

Fuente 1

dotN

etM

anía

Page 24: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

• El método ReplacePattern nos per-mite reemplazar texto (literal, usan-do comodines o expresiones regula-res) por otro texto.

En el fuente 1 se muestra a modo deejemplo una macro que al ejecutarsecomenta cada línea del procedimientodonde está el cursor (para eliminar unprocedimiento del código fuente sinborrarlo físicamente por si lo queremosrecuperar más tarde).

Ya que tenemos la macro escrita,podemos ejecutarla directamente; perolo más aconsejable es depurar la macrocomo hacemos en el IDE de VisualStudio: simplemente ponemos un pun-to de ruptura en la línea deseada y pul-samos [F5].

Manejando eventos del IDEHasta ahora hemos visto que las

macros se ejecutan cuando el progra-mador las invoca voluntariamentemediante algunos de los métodos yaexplicados, pero existe otra forma de queuna macro se ejecute que puede ser muyinteresante en algunos escenarios: unamacro también se puede ejecutar cuan-do ocurre algo en el IDE de VisualStudio. Para ello el IDE nos propor-ciona un buen número de eventos y loque tendremos que hacer es establecerun manejador de eventos para aquellosque nos interesen. Si nos vamos al explo-rador de proyectos del IDE de macros,

veremos que cada proyecto tiene unmódulo especial con el nombreEnvironmentEvents. En él hay un bloquede código generado automáticamentepor el IDE (que no debemos modificar)y que contiene los eventos que se mues-tran en el fuente 2 (se ha eliminado elatributo <System.ContextStaticAttribute()> que precede a todos ellos pormotivos de espacio).

Como vemos, tenemos eventos paralos documentos, ventanas, lista de tare-as, compilación, depurador, proyectos,archivos, etc. A modo de ejemplo, elcódigo del fuente 3 muestra una macroque se ejecuta cuando se realiza unacompilación (build).

Como es de imaginar, los eventosde macro implican un riesgo para laseguridad, por lo que hay una propie-dad en la ventana de propiedades delproyecto llamada Security que nos per-mite habilitar o deshabilitar los even-tos de macro. También es posible queal cargar un proyecto de macros el IDEnos muestre un aviso indicando que elproyecto que estamos intentando car-gar contiene código que maneja even-tos de macro y ofreciendo la posibili-dad de deshabilitar dicho código. Si noestamos seguros de la procedencia delproyecto de macros que estamos car-gando, es recomendable deshabilitarlos eventos de macro y revisar el códi-

go fuente de los eventos antes de vol-ver a habilitarlos.

Con esto finalizamos este artículosobre macros, que aunque simples comoparecían tienen sus peculiaridades quehemos ido desgranando. Ahora ya sólonos queda invertir un poco de tiempoen crear macros que nos sirvan para aho-rrar tiempo en el día a día con las tare-as más repetitivas.

dotN

etM

anía

<<

24

dnm.plataforma.net<<

Public WithEvents DTEEvents As EnvDTE.DTEEventsPublic WithEvents DocumentEvents As EnvDTE.DocumentEventsPublic WithEvents WindowEvents As EnvDTE.WindowEventsPublic WithEvents TaskListEvents As EnvDTE.TaskListEventsPublic WithEvents FindEvents As EnvDTE.FindEventsPublic WithEvents OutputWindowEvents As EnvDTE.OutputWindowEventsPublic WithEvents SelectionEvents As EnvDTE.SelectionEventsPublic WithEvents BuildEvents As EnvDTE.BuildEventsPublic WithEvents SolutionEvents As EnvDTE.SolutionEventsPublic WithEvents SolutionItemsEvents As EnvDTE.ProjectItemsEventsPublic WithEvents MiscFilesEvents As EnvDTE.ProjectItemsEventsPublic WithEvents DebuggerEvents As EnvDTE.DebuggerEventsPublic WithEvents ProjectsEvents As EnvDTE.ProjectsEventsPublic WithEvents TextDocumentKeyPressEvents As EnvDTE80.TextDocumentKeyPressEventsPublic WithEvents CodeModelEvents As EnvDTE80.CodeModelEventsPublic WithEvents DebuggerProcessEvents As EnvDTE80.DebuggerProcessEventsPublic WithEvents DebuggerExpressionEvaluationEvents AsEnvDTE80.DebuggerExpressionEvaluationEvents

Fuente 2

Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, _ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone

MessageBox.Show("Compilación completada")

End Sub

Fuente 3

Bibliografía

[1]“Visual Studio Macros (MSDN)”,

http://msdn2.microsoft.com/library/b4c73967.aspx

[2]“Automation and Extensibility Reference”,

http://msdn2.microsoft.com/library/1xt0ezx9(en-US,VS.80).aspx

Una macro también se puede ejecutar cuando ocurre algo en el IDE de Visual Studio

Page 25: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de
Page 26: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

presentamos los conceptosfundamentales relacionados con la tecnología LINQ,que hace posible, mediante una combinación de exten-siones al lenguaje y librerías de código manejado, dis-poner de un mecanismo que permite expresar de mane-ra uniforme las consultas sobre colecciones de datosprovenientes de las más disímiles fuentes.

Nuestro artículo de este mes se aparta del corte másteórico de sus predecesores y está dedicado a mostraralgunos ejemplos prácticos de posibles aplicacionesfuturas de la tecnología LINQ. En él presentaremospropuestas de mecanismos para acceder medianteexpresiones de consulta a diversas fuentes de informa-ción comúnmente utilizadas por las aplicaciones.

Requisitos preliminaresNaturalmente, este artículo hace referen-

cia a los conceptos presentados en su prede-cesor [2], cuya lectura previa recomendamos.Y para probar los ejemplos de código queacompañan al artículo, el lector deberá insta-lar la presentación preliminar de LINQ paraVisual Studio 2005 disponible en la URL quese indica en la bibliografía [1].

La arquitectura de LINQEn nuestro artículo anterior presenta-

mos la arquitectura de LINQ (figura 1).Allí vimos cómo esta tecnología ofrece unmecanismo estándar que permite utilizarexpresiones de consulta sobre objetos en

memoria que implementen la interfaz genéricaSystem.Collections.Generic.IEnumerable<T> (entre losque se incluyen los arrays), y además un mecanismo deextensibilidad que permite desarrollar proveedores LINQa medida en los casos en que la situación así lo exija. Afalta de una terminología oficial aún al respecto, llama-remos “proveedor LINQ” a cualquier clase o conjuntode clases que implemente el patrón LINQ al que hacía-mos referencia en nuestro artículo anterior para hacerposible el acceso a una fuente de información determi-nada mediante las expresiones de consulta integradas enC# 3.0 y otros lenguajes. Bajo esta definición, podemosconsiderar proveedores a las dos tecnologías derivadasde LINQ que ofrece Microsoft: DLinq, para la ejecu-ción de consultas contra bases de datos relacionales, yXLinq, para la ejecución de consultas al estilo LINQsobre documentos XML.

Lo que nos traerá Orcas:LINQ en acción

Con la integración de LINQ en los lenguajes de programación, la utilización delas expresiones de consulta para iterar sobre los elementos de colecciones oarrays propios o devueltos por algún método de la librería de clases de .NETFramework será algo natural e inmediato.

Octavio Hernández

dnm.futuro

<< En nuestra entrega anterior

Octavio Hernándezes colaborador habitual

de dotNetManía,Ingeniero en

Informática de Sistemasy MVP de C#.

Figura 1.Arquitectura de LINQ

Page 27: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

Aplicaciones inmediatas deLINQ

Como mostramos en nuestra entregaanterior, las expresiones de consulta ope-ran sobre objetos que implementan lainterfaz genérica System.Collections.Generic.IEnumerable<T>, entre los que seencuentran los arrays. Por esta razón, lautilización de las expresiones de consultaen toda una serie de situaciones en las queactualmente se itera sobre los elementosde una colección o array devuelto por algúnmétodo de la librería de clases de .NETFramework es directa e inmediata.Numerosos ejemplos vienen a la mente:• Enumeración de procesos o hilos de

un proceso.• Navegación por la bitácora de suce-

sos del sistema.• Navegación por el sistema de fiche-

ros local.• Enumeración de unidades de red,

recursos compartidos, etc.• Enumeración de usuarios y grupos

del Directorio Activo.• Enumeración de características de en-

samblados o clases mediante reflexión.

Con toda seguridad, el lector podráidentificar muchas más situaciones simi-lares. A modo de ejemplos, el fuente 1muestra un fragmento de código en elque se utiliza una expresión de consul-ta para listar en orden alfabético los pro-cesos “reales” que han estado activos enel sistema durante más de una hora, y elfuente 2 – un ejemplo algo más com-plejo en el que se presentan, agrupadassegún su tipo, todas las propiedadespúblicas de un tipo de datos, obtenidasmediante reflexión.

Definición de un iteradorgenérico

No siempre es posible aprovechar demanera inmediata las bondades que apor-ta LINQ, ya sea porque las librerías anuestra disposición no ofrecen propieda-des o métodos que devuelvan un array oiterador al que aferrarse, o bien porque lautilización de tales recursos no satisfaríaciertos requisitos. En tales casos, la puer-ta de entrada a la utilización de las expre-siones de consulta es la programación deun iterador genérico que produzca lasecuencia de datos de la forma adecuada.La revista ya ha dedicado varios artículostanto a los iteradores como a los tipos

genéricos [3, 4], por lo que noentraremos aquí en detalles sobreestas herramientas lingüísticas, sinoque pasaremos directamente a des-cribir la aplicación de las mismas.

Un iterador genérico para reco-rrer el sistema de ficheros

Los ejemplos presentados ante-riormente adolecen de un defectoencubierto, ciertamente no acha-cable a LINQ sino al hecho de quelas consultas utilizadas se “nutren”de métodos que devuelven un array.La verdadera ejecución de esas

expresiones de consulta comienza sólo apartir de que el método “productor” delarray termina su trabajo. Esto da al tras-te con la ejecución bajo demanda o dife-rida a la que hacíamos referencia en nues-tro artículo anterior y que constituye unode los principales atractivos de los itera-dores, e impone requisitos adicionales dememoria y tiempo de ejecución al siste-ma. Tratándose de procesos activos o depropiedades de una clase, conjuntos dedatos que difícilmente rebasarán uno odos centenares de elementos, los reque-rimientos adicionales de memoria y pér-dida de rendimiento asociados al uso deesos métodos que devuelven arrays nodeberían constituir un problema grave;

dotN

etM

anía

<<

27

dnm.futuro<<

static void Procesos(){var procesos = from p in Process.GetProcesses()where p.ProcessName != “Idle” &&DateTime.Now- p.StartTime > new TimeSpan(1,0,0)

orderby p.ProcessNameselect p;

foreach (var p in procesos)Console.WriteLine(p.ProcessName);

Console.ReadLine();}

Fuente 1.Aplicación de una expresión de consulta a la enumeración de procesos

static void Reflexion(Type tipo){BindingFlags flags = BindingFlags.DeclaredOnly |BindingFlags.Public |BindingFlags.Instance | BindingFlags.Static;

var resumen = from prop in tipo.GetProperties(flags)orderby prop.PropertyType.FullName, prop.Namegroup new {Tipo = prop.PropertyType.FullName, Nombre = prop.Name,Categoria = (prop.GetGetMethod().IsStatic ?

“Estática” : “De instancia”)} by prop.PropertyType.FullName;

ObjectDumper.Write(resumen, 2);Console.ReadLine();}

Fuente 2.Aplicación de una expresión de consulta a la reflexión de tipos

Figura 2. Ejecución de la expresión de consulta del fuente 2 sobre la estructura DateTime

Key=System.DateTime Group=...Group: Tipo=System.DateTime Nombre=Date Categoria=De instanciaGroup: Tipo=System.DateTime Nombre=Now Categoria=EstáticaGroup: Tipo=System.DateTime Nombre=Today Categoria=EstáticaGroup: Tipo=System.DateTime Nombre=UtcNow Categoria=Estática

Key=System.DateTimeKind Group=...Group: Tipo=System.DateTimeKind Nombre=Kind Categoria=De instancia

Key=System.DayOfWeek Group=...Group: Tipo=System.DayOfWeek Nombre=DayOfWeek Categoria=De instancia

Key=System.Int32 Group=...Group: Tipo=System.Int32 Nombre=Day Categoria=De instanciaGroup: Tipo=System.Int32 Nombre=DayOfYear Categoria=De instanciaGroup: Tipo=System.Int32 Nombre=Hour Categoria=De instanciaGroup: Tipo=System.Int32 Nombre=Millisecond Categoria=De instanciaGroup: Tipo=System.Int32 Nombre=Minute Categoria=De instanciaGroup: Tipo=System.Int32 Nombre=Month Categoria=De instanciaGroup: Tipo=System.Int32 Nombre=Second Categoria=De instanciaGroup: Tipo=System.Int32 Nombre=Year Categoria=De instancia

Key=System.Int64 Group=Group: Tipo=System.Int64 Nombre=Ticks Categoria=De instancia

Key=System.TimeSpan Group=...Group: Tipo=System.TimeSpan Nombre=TimeOfDay Categoria=De instancia

Page 28: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

pero en el caso de secuencias más gran-des, el comportamiento de una aplicaciónque utilizara consultas de este tipo podríadejar mucho que desear.

Un ejemplo típico de enumeraciónpotencialmente problemática podría serla que se encargara de recorrer la lista deficheros contenida en un disco. Si bien laclase System.IO.Directory ofrece losmétodos estáticos GetFiles() y GetDirectories(), que producen arrays, las libreríasde clases de .NET Framework 1 y 2 nohan incluido hasta el momento ningúnmecanismo que permita navegar por elsistema de ficheros del modo eficiente yperezoso que hacían posible las funcionesFindFirstFile() y FindNextFile() de laAPI de Windows1.

Precisamente un iterador con esascaracterísticas ha sido presentado por CarlDaniel en un reciente artículo [5].Apoyándose en llamadas a las funcionesde bajo nivel antes mencionadas, Carl haimplementado la clase FindFiles.FileSystemEnumerator, basándose en la cual esposible implementar expresiones de con-sulta eficientes sobre un sistema de fiche-ros. No describiremos aquí los complejosdetalles de la implementación de esta útilclase, pues él lo ha hecho de manera exce-lente. Nos limitaremos a mostrar un ejem-plo de una expresión de consulta que seapoya en ella.

El fuente 3 presenta un fragmentode código en el que se recuperan, me-diante una expresión de consulta, los 10primeros ficheros con extensión .jpg dis-ponibles en el directorio C:\Archivos deprograma y sus subdirectorios. Inicial-mente se construye un objeto de la cla-se FileSystemEnumerator. El constructorde esta clase prepara las condiciones parael funcionamiento posterior del métodoenumerable Matches(), que se utilizacomo generador de la entrada para laexpresión de consulta. La aplicación deloperador estándar Take(int n) (sin equi-valente sintáctico directo en C# 3.0, almenos hasta el momento) limita el resul-tado de la consulta a los 10 primeros ele-mentos de la secuencia original.

El proyecto de Visual Studio 2005 queacompaña a este artículo (disponible enwww.dotnetmania.com) implementa tam-bién otra expresión de consulta equiva-lente a la anterior, pero basada en la uti-

lización del método Directory.GetFiles(). El lector podrá comprobar fácil-mente que la diferencia en tiempo de res-puesta y consumo de memoria entreambas variantes es más que significativa.

Redefiniendo el mecanismoestándar

Los ejemplos presentados anterior-mente son directos e intuitivos, y lapotencia expresiva que aportan las expre-siones de consulta podría hacernos pen-sar que hemos alcanzado un hito muysignificativo e invitarnos a hacer un altoen el camino. Esto ciertamente (en mimodesta opinión) es así, pero los crea-dores de LINQ no se detuvieron ahí, sinoque fueron más allá e implementaron latecnología en base a una arquitecturaabierta, donde la semántica de las expre-siones de consulta puede variar en fun-ción a) del origen de los datos a los quese accede, o b) de las necesidades deldesarrollador. El desarrollo de un pro-veedor LINQ a medida no es una tareatrivial; ya en nuestro artículo anteriormostramos los principios bajo los cualesse deben redefinir los operadores están-dar en tales casos.

Un ejemplo muy claro de la adapta-ción del comportamiento de las expresio-nes de consulta en función de estos facto-res es DLinq, el proveedor LINQ para elacceso a bases de datos relacionales. Losoperadores de DLinq no ejecutan direc-tamente las consultas integradas (lo cualpodría ser realmente desastroso desde elpunto de vista del rendimiento), sino que

las transforman en sentencias SQLsemánticamente equivalentes, queal final de la cadena de evaluaciónse envían al servidor de bases dedatos para su procesamiento.Estudiaremos DLinq con másdetalle en una próxima entrega.

AgradecimientosQuiero agradecer a Carl

Daniel por su excelente artículo eimplementación de la claseFileSystemEnumerator. Cuando loleí, yo empezaba a implementarun iterador para enumerar cla-ves y valores del registro de

Windows2, pero lo abandoné en favor delejemplo de Carl, que me pareció muchomás útil e interesante.

ConclusiónEn este artículo hemos presentado

algunos ejemplos prácticos de cómo lasexpresiones de consulta podrán ser utili-zadas en un futuro muy próximo desde elpropio lenguaje de programación pararecuperar, filtrar y organizar convenien-temente secuencias de datos provenien-tes de los más diversos orígenes.

dotN

etM

anía

<<

28

dnm.futuro<<

1 Hay que señalar,no obstante,que este problema sí quedará bien resuelto con la aparición en un futuro de WinFS,al que dotNetManía ya ha dedicadodos buenos artículos [6, 7].

2 Puede servir como ejercicio para el lector interesado

static void FicherosB(){

FileSystemEnumerator fse = new FileSystemEnumerator(

“C:\\Archivos de programa”,“*.jpg”, true);try{IEnumerable<FileInfo> datosFicheros = (from f in fse.Matches() select f).Take(10);

foreach (var s in datosFicheros)Console.WriteLine(s);

Console.ReadLine();}finally {fse.Dispose();

}}

Fuente 3. Ejemplo de utilización de la claseFileSystemEnumerator

Referencias

[1] Recursos relacionados con C# 3.0 y LINQ:http://msdn.microsoft.com/vcsharp/future.

[2]Hernández, Octavio “Lo que nos traerá Orcas:la tecnología LINQ”, publicado en dotNet-Manía Nº 25, abril de 2006.

[3]Katrib M., Del Valle M., “Enumeradores e ite-radores en C# 2.0”, publicado en dotNetManíanº 7, septiembre de 2004.

[4]Hernández, Octavio “Novedades en el están-dar de C#”, publicado en dotNetManía nº 20,noviembre de 2005.

[5]Daniel, Carl “File System Enumerator usinglazy matching”, en: http://www.codeproject.com/csharp/FileSystemEnumerator.asp.

[6]Porras, Aurelio “Primeros pasos con WindowsStorage Foundation (I)”, publicado endotNetManía nº 22, enero de 2006.

[7]Porras, Aurelio “Primeros pasos con WindowsStorage Foundation (II)”, publicado endotNetManía nº 23, febrero de 2006.

Page 29: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de
Page 30: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de
Page 31: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de
Page 32: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

Son las siglas de Visual Studio Tools forOffice 2005 (de aquí en adelante VSTO). Es un com-plemento de Visual Studio, disponible desde la versión2003, que nos permite crear aplicaciones basadas eninterfaz Office de igual manera que creamos una apli-cación con interfaz Web o Windows.

¿Cómo funciona? Al crear un nuevo proyecto conVSTO obtenemos como interfaz de presentación undocumento Excel o Word. Asociado a dicho docu-mento existe una clase de código (al igual que las pági-nas .aspx y su fuente .aspx.cs) sobre la que progra-mamos la lógica de nuestra aplicación; esto lo hace-mos apoyándonos en el modelo de objetos de Office.Una vez finalizada, lo que obtenemos es un docu-mento .xls o .doc y una DLL asociada donde está lafuncionalidad que hemos creado. Así pues, el usuariosólo se tiene que preocupar de abrir el documentocreado como hace con cualquier otro.

¿Qué diferencias tiene con VBA? La principal dife-rencia con respecto al uso de macros o scripts de VisualBasic es que realmente podemos separar el código dela capa de presentación y usar toda la potencia que el.NET Framework nos ofrece.

¿Qué novedades trae con respecto a 2003? Esta nue-va versión nos trae muchas mejoras, entre las quepodemos destacar el panel de acciones (Actions Pane) ylas etiquetas inteligentes (Smart Tags):• Panel de acciones: Gracias a él podemos intro-

ducir nuestros propios controles Windows enun panel. Éste se muestra de forma similar a

una docking window, sien-do independiente deldiseño de la hoja de tra-bajo.

• Etiquetas inteligentes:Sirven para detectarpatrones de texto en undocumentoy nospermi-t e nrealizar de forma rápida transformaciones/che-queos sobre el mismo.En este artículo mostraremos cómo desarrollar solu-

ciones Excel y Word con VSTO 2005.

ExcelVamos a comenzar con un ejemplo, como se

dice en las películas, “basado en hechos reales”.Imaginemos una escuela de negocios que realizasegmentaciones de sus antiguos alumnos paraincluirlos en campañas comerciales (invitaciones aeventos, seguimientos…) ¿Cómo se venía hacien-do esto hasta ahora? El encargado de marketingcopiaba y pegaba una lista de antiguos alumnos enuna hoja Excel, le iba añadiendo datos de aquí y deallá, realizaba filtrados y, por último, volvía a copiary pegar los resultados en una plantilla de Word, deforma que el comercial podía comenzar con su tra-

VSTO:Cuando Office conoció a .NET

Braulio Díez

dnm.plataforma.net

<< ¿Qué es VSTO 2005?

Reyes GarcíaHa sido consultora “todo

terreno”.Hoy día se dedica algratificante mundo de la

docencia.

Braulio Díezcolabora habitualmente condotNetManía. Es MCSD en

programación distribuida con Visual C++.

Trabaja como SolutionsDeveloper de Avanade.

Excel es una estupenda hoja de cálculo,que expone una funcionalidad extendida y muyinteresante a la par que peligrosa… ¿Cuántas veces hemos tenido que pelearnos conmarañas de código VBA para modificar una hoja de este tipo? ¿Cuántas veces nos hanechado en cara los usuarios que la interfaz de nuestras aplicaciones es muy pobre yque ellos se manejan mejor con sus hojas Excel?… Con VSTO por fin vamos a poderponer fin a estos problemas y desarrollar aplicaciones .NET con interfaz Office.

Reyes García

Page 33: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

bajo. Para mejorar la productividad y acelerar cier-tas tareas, se implanta un sistema centralizado quecontiene todos los datos referentes a los clientes delcentro, todo es estupendo… Pero los empleadosson reticentes a usar la nueva aplicación, ya que noles da exactamente la funcionalidad que tenían conExcel. ¿Nos suena de algo?

Vamos a realizar una aplicación .NET que leade nuestra base de datos la pobla-

ción a segmentar, y permitaal usuario manejarla direc-tamente desde Excel (consus opciones de filtrados,

cálculos de globa-les,…). Una vez termi-nada, el usuario podrá

exportar los datos a Word,con lo que un comercial podrá

contactar con losclientes seleccio-

nados.

Creando el proyecto

Para crear el proyecto realizamos los siguientespasos:• Pulsamos sobre “New Project”.• Elegimos en “Project types”, “Office” y como plan-

tilla, “Excel WorkBook” (ver figura 1). Si no veesta opción es que no tiene instalado Visual StudioTools for Office.

• En el siguiente diálogo seleccionamos la opción“Create a new document” y le damos un nombrea la hoja Excel que vamos a crear, por ejemplo,Herramienta de Segmentación.

¡Acabamos de crear un nuevo proyecto! Como seve en figura 2, el proyecto está compuesto de un libroExcel con su code-behind, así como un fichero por cadahoja del libro (que también tienen su fichero code-behind asociado).

Enlazando con una base de datos

El sistema del que debemos leer tiene una base dedatos Access con una tabla que contiene los datos delos antiguos alumnos. Vamos a conectar con ella des-de nuestra aplicación y a mostrar los datos:• Mostramos la ventana de orígenes de datos (data

sources), para ello elegimos la opción del menú“Data>>Show Data Sources” y en la ventana quese nos muestra pinchamos el enlace “Add new DataSource” (ver figura 3).

• Un asistente nos permite conectarnos a la base de datosdel sistema y elegir las tablas, vistas y procedimientosalmacenados que queremos utilizar (ver figura 4).

dotN

etM

anía

<<

33

dnm.plataforma.net<<

Figura 1.Tipo de proyecto “Office”,proyecto “Excel Workbook”

Figura 2. El nuevo proyecto creado

Figura 3.Añadir un origen de datos

Figura 4. (1) Elegir a qué nos queremos conectar, (2) conexión abase de datos, (3) tablas a leer

Page 34: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

• Una vez seleccionadas las tablas, tendre-mos disponible un DataSet “tipado” conel que podremos obtener la informaciónde nuestra base de datos.

• Arrastramos y soltamos la tabla que quere-mos usar, desde la ventana de orígenes dedatos a la celda de la hoja Excel en la quere-mos insertarlo.

• Le damos algo de formato y… ya tenemostodos los datos cargados en la hoja de cálculo, per-mitiéndonos realizar: filtrados, cálculo de totales,gráficas… (ver figura 5).

Haciendo uso del panel de acciones

Vamos a añadir funcionalidad para guardar la selec-ción que ha realizado nuestro cliente. Para ello vamos autilizar el panel de acciones, una ventana adicional en laque podemos insertar controles Windows.

Para crear nuestra entrada en el panel de accio-nes, realizamos los siguientes pasos (ver figura 6).• Nos vamos al Solution Explorer y pinchamos con

el botón derecho sobre la raíz de nuestro proyec-to, elegimos la opción del menú de contexto“Add>>New Item”.

• Elegimos crear un control de usuario (User Control)(¡Ojo!, no confundir con Custom Control).

• Nos aparece el control en blanco. Para adornar-lo, del panel de herramientas Common Controls leañadimos algunos controles estáticos.

Añadimos un botón que se llamará “Exportar aWord”, nos suscribimos al evento OnClick, y añadimosel código que graba tanto el DataSet (XML - Datos)como el esquema (XSD - Estructura) de la selección depersonas que hemos realizado (ver fuente 1). Para poderutilizarlo más adelante, lo encapsulamos todo dentro delespacio de nombres EjemploDNM.• Asociamos nuestro control de usuario al panel de

acciones de nuestra hoja Excel (ver fuente 2).

dotN

etM

anía

<<

34

dnm.plataforma.net<<

Figura 6.Utilización del panel de acciones

private void btnExportWord_Click(object sender, EventArgs e){

ListObject lstAlum = Globals.Sheet1.ant_AlumnoListObject;

// Llamamos al método en el que buscamos los elementos seleccionados// y lo guardamos como XML.DataSet Segmentacion = GuardarSeleccionEnXML(lstAlum);

// Para su uso posterior en Word, le damos un título y un espacio de nombres.Segmentacion.Namespace = “EjemploDNM”;Segmentacion.DataSetName = “Segmentacion”;// Guardamos los datos (para este ejemplo lo guardamos todo en el raíz del disco duro). // En una aplicación en producción lo ideal sería escribir el Dataset en la base de datos.Segmentacion.WriteXml(@”C:\Test.xml”);// Guardamos el esquema del Dataset.Segmentacion.WriteXmlSchema(@”C:\Test.xsd”);

MessageBox.Show(@”Se grabó con éxito la selección, para el ejemplo C:\Test.xml ;-)”);}

Fuente 1.Al pulsar “Exportar a Word”.

Figura 5.Nuestros datos en Excel

// Declaramos e instanciamos nuestro User Control.private MainPanel _mainPanel = new MainPanel();

(…)

private void ThisWorkbook_Startup( object sender,System.EventArgs e)

{// Añadimos nuestro control de usuario al panel de accionesthis.ActionsPane.Controls.Add(_mainPanel);

}

Fuente 2.Asociamos el panel de acciones a nuestra hoja Excel (fichero WorkBook.cs).

Page 35: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

• Compilamos, ejecutamos y ¡ya tenemos nuestraaplicación completa! (ver figura 7).

MS Word

Recogiendo datos de un XML

Creamos un nuevo proyecto, esta vez escogemos“Office>>Word Document”. Vamos a realizar lossiguientes pasos:

• Creamos la plantilla, con un título y una tabla quecontendrá las cabeceras “nombre/apellidos/empre-sa/cargo”, para ello sólo tenemos que manejar MSWord (ver figura 8).

• Para rellenar la tabla con la estructura de nues-tro DataSet, escogemos la opción del menú deMS Word “Tools>>Microsoft Office WordTools>>Template and Addins”. Nos aparece undiálogo, y para cargar nuestro esquema pulsa-mos sobre el botón “Add Schema” en el que car-garemos el esquema asociado nuestro DataSet(XSD) (ver figura 9).

• Al pulsar sobre el botón “Add Schema” se nosabre una caja de selección de fichero, seleccio-namos el esquema (XSD) de nuestra segmenta-ción (se encuentra en la raíz del disco duro). Nosaparece un diálogo en el que se indica que el

dotN

etM

anía

<<

35

dnm.plataforma.net<<

Figura 7.Aplicación resultante

Figura 8. La plantilla que vamos a rellenar

Figura 9.Abrimos el diálogo para añadir el esquema de nuestra aplicación

La principal ventaja de VSTO sobre el uso de macros o scripts de Visual Basic es que realmente podemos separar el código de la capa de presentación,

además de utilizar toda la potencia que .NET Framework nos ofrece

Word, Excel, Outlook,Visio…

VSTO 2005 incluye funcionalidad para:

• MS Word• Excel• Outlook

Microsoft ha prometido hacer una segundaentrega en la que se cubriría el resto de herra-mientas Office (Visio, PowerPoint,Publisher…).

][

Page 36: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

espacio de nombres es EjemploDNM y donde tene-mos que introducir un nombre amistoso paranuestro esquema; elegimos “Segmentación”,cerramos los diálogos pulsando “Ok” (ver figu-ra 10).

• Aparece un panel de acciones que nos permiteposicionar nuestro esquema en el documento;para ello seleccionamos la tabla que hemos cre-ado y hacemos doble clic sobre el nodo raíz denuestro esquema (“Segmentación”). Repe-tiremos la operación para los nodos hijos, cre-ando así la primera fila de datos. Para repetir-la, nos ponemos al final de la misma y pulsa-mos la tecla [Tab] (ver figura 11).

• Ya tenemos el “esqueleto” montado, y sólo nosfalta mostrar los datos. Pulsamos con el botónderecho sobre el documento y elegimos laopción del menú contextual “View Code”. Enel evento de arranque del documento añadimosel código necesario para cargar los datos de laselección (DataSet –XML) en la estructura quehemos creado (ver fuente 3).

• Elegimos la opción de esconder las etiquetas delesquema y arrancamos nuestro proyecto. Ya tene-mos la selección de candidatos cargada en el docu-mento (ver figura 12).A partir de este momento, cada vez que el

comercial abra el documento de Word, en nuestroejemplo Word_Tool.doc, aparecerá la última selecciónrealizada por el departamento de marketing.

dotN

etM

anía

<<

36

dnm.plataforma.net<<

Las etiquetas inteligentes permiten detectar las ocurrencias de un patrón de texto en un documento y realizar de forma rápida

transformaciones o chequeos sobre el mismo

private void ThisDocument_Startup(object sender,System.EventArgs e)

{// Cargamos los datos que generamos con el XML y // Word los encaja en la estructura que hemos // creado. En una aplicación en producción lo ideal // sería cargar el Dataset de la base de datos.this.SegmentacionNode.Load(@”C:\test.xml”);

}

Fuente 3. Cargando los datos en MS Word

Figura 11. Insertando el esquema en el documento

Figura 10. Espacio de nombres y alias de nuestro XSD

Figura 12. La lista final de seleccionados

Page 37: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dotN

etM

anía

<<

37

dnm.plataforma.net<<

// El Smart Tag que vamos a crear.private Microsoft.Office.Tools.Word.SmartTag _nifTag;

// La acción que vamos a asociar al Smart Tag.Microsoft.Office.Tools.Word.Action _formateaNIF;

private void ThisDocument_Startup(object sender, System.EventArgs e){

// Creamos el Smart Tag. Parámetros:// “SmartTagType”: Un identificador único, un namespace + un nombre separado por ‘#’// “Caption” : Título que se mostrará en el menú del Smart Tag._nifTag = new Microsoft.Office.Tools.Word.SmartTag

(“http://www.vsto2005demo.com#smarttag”,“NIF Detectado”);

// Creamos la acción._formateaNIF = new Microsoft.Office.Tools.Word.Action(“Formatear NIF”);

// Le asociamos un método para que se muestre indicando la acción._formateaNIF.BeforeCaptionShow += new

Microsoft.Office.Tools.Word.BeforeCaptionShowEventHandler(FormateaNIF_BeforeCaptionShow);

// Le asociamos un método para cuando se quiera ejecutar la acción. _formateaNIF.Click += newMicrosoft.Office.Tools.Word.ActionClickEventHandler(FormateaNIF_Click);

// Le decimos al Smart Tag qué patrones debe reconocer como NIF,// en este caso: 12345678Z, 12345678-Z, 12345678 Z (podríamos asociar// más patrones al Smart Tag)._nifTag.Expressions.Add(new Regex(@”(?<numeros>\d{8})(-|\s)?(?<letra>\w)”));

// Asociamos la acción que hemos creado al Smart Tag// Podríamos asociar más de una (por ejemplo, una para validar si el // nif es válido o no)._nifTag.Actions = new Microsoft.Office.Tools.Word.Action[] { _formateaNIF };

// Añadimos el Smart Tag al documento.this.VstoSmartTags.Add(_nifTag);

}

void FormateaNIF_BeforeCaptionShow(object sender,Microsoft.Office.Tools.Word.ActionEventArgs e)

{_formateaNIF.Caption = “Escribe el NIF: “ +e.Text + “ con formato 12345678-Z”;

}

void FormateaNIF_Click(object sender,Microsoft.Office.Tools.Word.ActionEventArgs e)

{// Extraemos los números del patrón.string numeros = e.Properties.get_Read(“numeros”);

// Extraemos la letra asociada al NIF.string letra = e.Properties.get_Read(“letra”);

// Reemplazamos el NIF por el formato que queremos:// en este caso dddddddd-l (subrayado y en negrita).e.Range.Text = numeros + “-” + letra;e.Range.Bold = 1;e.Range.Underline = Microsoft.Office.Interop.Word.WdUnderline.wdUnderlineSingle;

}

Fuente 4

Page 38: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

Creando etiquetas inteligentes

Para finalizar la sección de Word, presentaremosuna de las novedades más llamativas de esta versión,el soporte para crear etiquetas inteligentes. Esta herra-mienta detecta, en un texto Word, si una cadena per-tenece a un patrón dado1, y en ese caso nos muestraun cuadro desplegable en el que podremos elegir dife-rentes opciones de formato.

¿Es complicado implementar unaetiqueta inteligente? No, sólo tenemosque instanciar una clase de Smart Tagque reconoce una lista de patrones, yasociarle uno o más objetos del tipoAction. Aquí es donde decidimos quétransformación vamos a aplicar alpatrón encontrado (ver figura 13).

Vamos a crear una aplicación quedetecte en un documento cuándo se hatecleado un NIF y nos dé la opción deaplicarle un formato uniforme. Para ellocreamos un nuevo proyecto Word y:• Para usar las etiquetas inteligentes,

le añadimos la referencia a MicrosoftSmart Tags 2.0 Type Library utili-zando “Project>>Add References>>COM” (ver figura 14).

• En el evento de arranque del docu-mento añadimos código para cre-ar la etiqueta inteligente, así comouna acción que nos formateará elNIF como “12345678-X” , o sea,subrayado, en negrita y con for-mato “dddddddd-w” (ver fuente 4).

• Ya hemos creado la etiqueta inte-ligente. Si compilamos y ejecuta-mos, podemos verlo en acción (verfigura 15).

dotN

etM

anía

<<

38

dnm.plataforma.net<<

Figura 15.Cómo funciona la etiqueta inteligente

Para saber másSobre Excel

“An Office Developer's Timesaver: Using VSTO 2005 toIntegrate Excel”http://www.devx.com/OfficeProDev/Article/28036

“Building an Excel 2003 Invoice Application using Visual Studio2005 Tools for Office”http://msdn.microsoft.com/office/understanding/vsto/default.aspx?pull=/library/en-us/odc_vsto2005_ta/html/officevstobuildingexcelinvoices.asp

Sobre Word

“Visual Studio 2005 Tools for Office Hands-on Labs for Word 2003” http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odc_vsto2005_tr/html/OfficeVSTO2005WordLabs.asp

“Walkthrough: Creating a Smart Tag that Converts Temperaturesfrom Fahrenheit to Celsius”http://msdn2.microsoft.com/en-us/library/ms268701.aspx

General

“Five things you must know about VSTO 2005”http://www.devx.com/OfficeProDev/Article/29479

“Nine compelling reasons to move from VBA to VSTO 2005”http://www.devx.com/OfficeProDev/Article/28088/2046

“MSDN Web Cast: Data Binding Relational Data in Visual Studio2005 Tools for the Microsoft Office System”http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?eventID=1032272970&EventCategory=5&culture=en-us&CountryCode=US

Figura 14.Agregar referencia

Figura 13. Esquema de cómo funciona una etiqueta inteligente

1 Dichos patrones son expresiones regulares, sobre las que Jorge Serrano escribió un excelente artículo –(dotNetMania Nº 15,mayo de 2005)

Page 39: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dotN

etM

anía

<<

39

Detección de problemas de rendimiento enSQL Server 2000 y 2005 (II)

Análisis del uso de los recursos del sistema

Este es el segundo de una serie de artículos enfocados a la detección de pro-blemas de rendimiento en servidores SQL Server 2000 y 2005; en él nos cen-traremos en analizar cuál es el uso que se hace de los recursos del sistema.

<< en el artículo anterior, el análisisde los tipos de espera que retardan el procesamien-to de las peticiones de las conexiones nos dará unaidea de cuáles pueden ser los problemas que estáteniendo el servidor. En base a los resultados obte-nidos, deberemos auditar más o menos contado-res relativos al problema específico encontrado;por ejemplo, si las pruebas anteriores denotan pro-blemas en los dispositivos de E/S, se auditarán máscontadores de rendimiento relacionados con lasunidades E/S para afinar la auditoría.

Qué son los recursos del sistemaHace pocas semanas tuve que diseñar una meto-

dología que exponía el uso que se hacía de los méto-dos de los objetos de una aplicación comercial. Elproyecto consistía en diseñar un mecanismo paraque los desarrolladores expusieran información “alexterior” de cuál era el uso que se hacía de la aplica-ción. La estrategia que seguimos fue implementarcontadores de rendimiento personalizados que cadavez que se activaba algún método incrementara losvalores de algunos contadores de rendimiento (siquiere más información sobre creación de contado-res de rendimiento personalizados, puede leer elsiguiente artículo de mi amigo David Carmona:http://www.microsoft.com/spanish/msdn/articulos/archi-vo/270102/voices/Contadores.asp).

El método es muy sencillo: cada vez que la apli-cación pasa por una sección de código determinada,el desarrollador de la aplicación se encarga de incre-mentar un valor de una variable concreta (contador).Extrapolemos este ejemplo a una aplicación comer-cial como SQL Server, o yendo más allá aún a otrotipo de aplicación, como un sistema operativo. Laaplicación comercial expone cuestiones de su nego-cio como número de pedidos, cancelaciones o reno-vaciones realizadas por minuto, o en el caso de SQLServer serán número de conexiones de usuario, tran-sacciones activas, uso del caché de procedimiento,mientras que el sistema operativo expondrá “su nego-cio”: acceso a dispositivos (interfaces de E/S, memo-ria, procesador, etc.), información sobre los proce-sos que se están ejecutando (tiempo usado, porcen-taje de procesador, etc.), en definitiva, los recursosque usa el sistema operativo.

Herramientas, y cómo medir el uso delos recursos

Como en el artículo anterior, utilizaremos herra-mientas/procedimientos estándares para capturarinformación del uso de los recursos en un período detiempo; para ello nos apoyaremos en el monitor derendimiento (también conocido como sysmon), ytablas de sistema de SQL Server que exponen con-tadores relativos a SQL Server.

Eladio Rincón

dnm.servidores.sql

Como comentamos

Eladio RincónEs Director de Tecnología de

Bases de Datos de SolidQuality Learning y

colaborador habitual dedotNetManía. Es MVP en SQL

Server y uno de los fundadoresdel grupo de usuarios de SQL

Server en España GUSE.

Page 40: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dotN

etM

anía

<<

40

dnm.servidores.sql<<

Monitor de rendimiento (sysmon operfmon)

El monitor de rendimiento es unaherramienta incluida con el sistemaoperativo que nos permite ver demanera gráfica la evolución de conta-dores seleccionados previamente. Laherramienta ofrece varias opciones: verinformación instantánea de contado-res, programar captura de contadores,y análisis de información de datos cap-turados. No pretendo enseñar el fun-cionamiento de la herramienta, tan sólosugerirle que programe la captura dedatos y guarde la captura en un fiche-ro (opción “Counter Logs”, en laopción “Performance Logs andAlerts”); para aprender fácilmente acrear programaciones de captura decontadores, visite la URL de recursosal final del artículo (Technet: MonitoringServer Performance). En nuestros tra-bajos de auscultación, nunca hemosnecesitado poner una frecuencia demuestreo inferior a 10 segundos; porotro lado, creamos las trazas de audi-toría en el propio servidor, y en muycontadas ocasiones hemos ejecutado latraza desde otra máquina en la red. Unavez grabada la traza al fichero progra-mado, los datos grabados se puedenconsultar desde la misma utilidad; para

ello deberá añadir como fuente dedatos el fichero grabado. Tendrá laposibilidad de mostrar cada uno de loscontadores auditados, y tras trabajar unpoco sobre las escalas de presentaciónde los contadores (la escala que elige elproducto no suele muy ser acertada),podrá obtener un resultado como elque muestra la figura 1.

En el recuadro rojo se puede ver queel contador de número de conexiones(en color negro), tiene un pequeño valleque supone un poco más del 10% sobrela media general; casualmente, en esevalle, la longitud media de la cola deldisco I (en color verde) tiene valoresmuy altos: hasta 20 veces superiores ala media normal. Eso nos da una venta-na de tiempo que deberemos analizarpara ver qué es lo que está sucediendo.Por otra parte, en el recuadro marrónse puede observar que el contador de laesperanza de vida de las páginas tieneun valle un tanto extraño; este será unperíodo de tiempo que habrá que ana-lizar para ver qué actividad estaba suce-diendo en el servidor.

Tablas de sistema de SQL Server

SQL Server tiene una tabla de sis-tema que expone la misma informa-ción que el monitor de rendimiento

en relación a los contadores de SQLServer; sin embargo, no expone infor-mación relativa a memoria del servi-dor, procesador, disco, red, etc.; latabla de sistema es sysperfinfo (en laversión 2005 sys.dm_os_performance_counters) y se encuentra en la base dedatos master; un ejemplo de consultasería el siguiente:

Y el resultado podría ser similar alque muestra la tabla 1.

Auque no es un método que utili-cemos con frecuencia, el proceso sebasa en una idea similar a la gestión delos tiempos de espera tratados en elartículo anterior: crear un histórico dela evolución de los contadores, y pos-teriormente consultarlo con algunaaplicación (generalmente usamosMicrosoft Excel por la posibilidad degenerar gráficos sobre columnas de unaforma muy sencilla).

Contadores más significativosLos contadores de rendimiento

están agrupados en objetos; habrá obje-tos de memoria, procesador, disco,interfaz de red, Exchange, SQL Server,.NET, ASP.NET, etc. En definitiva, loscontadores están agrupados por catego-rías. Vamos a analizar las categorías mássignificativas y explicar los contadoresmás importantes.

Figura 1.Análisis de contadores de rendimiento

SELECTinstance_name, cntr_value

FROMsys.dm_os_performance_counters

WHEREobject_name = 'MSSQL$INSTANCE1:Plan Cache'AND counter_name = 'Cache Hit Ratio'

instance_name cntr_value

Temporary Tables & Table Variables 0

Extended Stored Procedures 69

Bound Trees 58

SQL Plans 625

Object Plans 1

TOTAL 753

Tabla 1.Valores de contadores de SQL Server

Page 41: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dotN

etM

anía

<<

41

dnm.servidores.sql<<

Memoria

Categoría que informa sobre el uso que se hace dela memoria en el servidor; el sistema operativo inten-ta asignar memoria en base a las necesidades de los pro-cesos. Cuando un proceso requiere memoria, el meca-nismo de asignar memoria al proceso se conoce comopaginación, que se basa en que el núcleo de sistema ope-rativo libere memoria no usada por otros procesos y selo asigne al proceso que la demanda. Esta paginaciónpuede ser de dos tipos: soft, que consiste en acceder alfichero de paginación (pagefile.sys) para asignarmemoria física, y hard, que consiste en acceder a pági-nas de memoria que si bien están en memoria física,están en un área de trabajo distinta al de la aplicaciónque requirió la memoria.• Memory:Pages/sec: número de páginas leídas o escri-

tas a disco para resolver un fallo de página hard (hardpage fault). Valores altos de forma continua indicanmucha actividad de paginación de memoria a dis-co, lo cual puede ser síntoma de falta de memoria;habrá que evaluar los contadores siguientes…

• Memory:Pages faults/sec: indica que el sistemaoperativo está paginando; audita paginación softy hard, por lo que habrá que restarle el valor dePages/sec para conocer cuáles fueron soft. Resumen:o Fallos de página hard: Memory:Pages/sec.o Fallos de página soft: Memory:Page faults/sec –

Memory:Pages/sec• Memory:Available Bytes, KBytes, MBytes: indica

cuánta memoria física está disponible para ser usada.

Consideraciones• ¿Qué pasará cuando se inicie el servicio SQL Server?

El proceso de SQL Server requerirá memoria físi-ca, lo cual implicará un volumen alto de fallos depáginas soft; una vez finalizada la asignación inicial,el valor del contador se estabilizará.

• Utilice el contador Memory:Available MBytes paraconfirmar la falta de memoria.

• Si hay valores altos de Memory:Pages/sec, antes deconcluir que al sistema le falta memoria, identi-fique cuál o cuáles son los procesos que hacenmayor uso de memoria; para ello, revise los con-tadores de proceso (Process):o Process:Page faults/sec, para confirmar que los

fallos de página son del proceso, y:o Process:Working Set y Process:Working Set Peak

para saber si el sistema operativo realiza peti-ciones al proceso para asignarle la memoria aotro proceso.

• Recuerde la importancia de los fallos de página:o Los fallos de página hard requerirán de acti-

vidad de E/S y CPU para resolver dichosfallos, mientras que:

o Los fallos de página soft requerirán sólo derecursos de CPU para asignar páginas dememoria.

Procesador

Los contadores de procesador (Processor) muestraninformación del uso que se hace de los procesadores dela máquina; en el caso de SQL Server, el motor tiene ungestor que organiza los accesos de los procesos a los pro-cesadores; dicho gestor se llama UMS, y existirá uno porcada procesador lógico asignado a SQL Server (las con-figuraciones hyperthreading y/o Core Duo hacen que elsistema “vea” más procesadores de los que en realidadhay). UMS es quien se encarga de organizar los proce-sos de SQL Server para que accedan de manera secuen-cial a los procesadores (en este caso, SQL Server reali-za parte de la tarea que en otro tipo de aplicaciones seríagestionada por el propio sistema operativo). Los conta-dores de procesador que típicamente auditamos son:• Processor:% CPU Usage: hay una instancia por

cada uno de los procesadores del sistema, y unainstancia llamada _Total que es la suma de todoslos procesadores. Como norma general analiza-mos en rendimiento de la instancia _Total, y paracasos más avanzados solemos dividirlo por cadaprocesador asignado a SQL Server.

• System:Processor queue length: representa la colade espera en el procesador, es decir, los threads queestán esperando a hacer uso de la CPU; en sistemascon mucha actividad puede llegar a tener valoressobre 10 por procesador, sin que ello indique queexiste un problema de contingencia de CPU.

ConsideracionesAl hilo del uso de los procesadores del sistema,

debo indicar que no existe una regla para decir que aun sistema le faltan procesadores solamente porque elporcentaje de uso de procesador pase de un valor (hayliteratura que indica valores superiores al 70, 75 u 80%en períodos largos). Por ejemplo, supongamos que unsistema gestiona 2.000 conexiones concurrentes, y quepor motivos de un diseño no muy apropiado cada peti-ción que llega al servidor debe tener su propio plan deejecución (parsing, árbol relacional, plan de ejecución,etc.); como estas operaciones requieren de uso de CPU,para 2.000 conexiones la CPU se va a poner por lasnubes. ¿Es este un caso de más unidades de CPU?Evidentemente, no. Habrá que mejorar cómo lleganlas consultas. Puede parecer bastante trivial, pero si nose ha conseguido localizar la carga de usuarios y com-pilaciones de las peticiones, se podría pensar que es unproblema de procesadores.

Disco

Las unidades de E/S son probablemente el recursomás delicado de un SGBD; para conocer su actividadexisten distintas técnicas: usando el monitor de rendi-miento, consultando tablas virtuales de SQL Server, oaccediendo a Dynamic Management Views (DMV) enSQL Server 2005.

Page 42: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dotN

etM

anía

<<

42

dnm.servidores.sql<<

Tablas virtuales de sistema o DMV

Cuando vamos a un cliente, uno de los recursosque primero auditamos es la actividad de las unida-des físicas (SAN, NAS, discos SCSI, discos IDE, con-troladoras de disco, etc.).

Lo primero que necesitamos conocer es cuál esla actividad general que ocurre en el sistema en rela-ción a las operaciones de Entrada/Salida (IO); paraello, capturamos durante un período de tiempo (gene-ralmente un día), a intervalos regulares, cuál es el usoque se hace de cada fichero de base de datos de la ins-tancia de SQL Server; con tal fin usamos la funciónde sistema ::fn_virtualfilestats, que nos devuelveuna vista instantánea del uso de los ficheros de basede datos con la siguiente consulta:

El resultado será similar al que se muestra en latabla 2. La información que muestra dicha tabla es lasiguiente:• DbId: identificador de la base de datos.• FileId: identificador del fichero de base de datos.• NumberReads: número de lecturas realizadas en el

fichero.• NumberWrites: número de escrituras realizadas en

el fichero.• BytesRead: número de bytes leídos.• BytesWritten: número de bytes escritos.• IOStallMS: número de milisegundos que ha espe-

rado el fichero a realizar la operación (tanto lec-tura como escritura).

En la versión 2005 de SQL Server, la misma fun-ción sigue existiendo, aunque se recomienda usar laDMV sys.dm_io_virtual_file_stats:

La principal mejora frente a la versión 2000, esque ahora se reporta el valor de IOStall separado paralecturas y escrituras, lo cual permite afinar un pocomás en los tipos de operaciones realizadas. Para másinformación sobre la DMV o la función deberéis con-sultar los libros en pantalla de SQL Server.

De nuevo, aplicando la técnica explicada en el artí-culo anterior, guardamos en una tabla histórica la evo-lución del uso de los ficheros de bases de datos parapoder identificar posibles cuellos de botella; por ejem-plo, valores altos de IOStall indicarán que hay conten-ción de disco al realizar operaciones sobre el fichero físi-co. A continuación se debería corroborar la informa-ción con el monitor de rendimiento, e identificar quéoperaciones se estaban realizando en ese momento con-creto. Esto también es útil para analizar si los ficherosde las bases de datos, están bien distribuidos entre lasunidades físicas disponibles en base a su utilización.

Monitor de Rendimiento

A diferencia de las tablas de sistema de SQLServer, además de dar información más variada, elmonitor de rendimiento muestra información agru-

SELECTDbId, FileId, NumberReads, NumberWrites, BytesRead, BytesWritten, IOStallMS

FROM::fn_virtualfilestats (-1, -1)

DbId FileId NumberReads NumberWrites BytesRead BytesWritten IOStallMS

13 2 10,920 8,312,955 9,139,834 9,149,027 1,410

13 1 2,920,000 2,370,672 769,119,338 22,653,296 24,643,810

11 2 253 103,188 2,287 4,715,976 980

11 1 105,722 48,056 44,306,636 1,335,787 92,830

10 2 53,496 14,858,041 46,658,202 46,606,208 4,630

10 1 26,409,814 41,968,805 1,655,361,953 396,128,034 149,978,670

8 6 334,884,830 671,388,922 18,097,987,420 5,873,122,607 1,653,687,740

8 5 322,170,368 652,868,103 17,325,975,347 5,692,485,468 1,602,974,820

8 4 224,492,637 464,676,725 10,046,688,411 4,096,125,149 1,124,527,130

8 3 87,612,317 123,483,206 4,273,110,048 1,079,296,901 451,535,130

8 2 5,986,448 499,274,591 1,254,556,491 987,907,523 57,440

8 1 137,958,463 198,561,698 6,853,747,916 1,744,879,345 712,501,130

Tabla 2. Resultados de la llamada a ::fn_virtualfilestats

SELECTdatabase_id, file_id,num_of_reads, num_of_bytes_read, io_stall_read_ms, num_of_writes, num_of_bytes_written,io_stall_write_ms, io_stall

FROMsys.dm_io_virtual_file_stats (-1, -1)

Page 43: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

pada por dispositivo; los contadoresmás significativos son:

Contadores para el disco

• PhysicalDisk:Avg. Disk QueueLength: monitoriza la media de peti-ciones de lectura o escritura quedeben esperar a ser procesadas; encaso de querer afinar un poco másse pueden consultar los valores Avg.Disk Read Queue Length y Avg. DiskWrite Queue Length. Este valor debeestar como norma general por deba-jo de 2 (en caso de tener una confi-guración RAID, el valor debería servalor/número de discos).

• PhysicalDisk:Disk Reads/sec, yPhysicalDisk:Disk Writes/sec: núme-ro de operaciones por segundo (lec-turas y escrituras). Los vendedores dehardware proporcionan informaciónsobre la cantidad de accesos que pue-de soportar el dispositivo (general-mente en milisegundos); sumandoestos dos contadores nos dará infor-mación para conocer hasta dónde pue-de llegar el uso del dispositivo en tér-minos de accesos por segundo.

Contadores de SQL Server

En primer lugar, buscamos datosglobales de conexiones, transacciones,y usuarios que están accediendo al ser-vidor. Para ello auditamos los siguien-tes contadores:• SQLServer:GeneralStatistics:User

Connections: número de conexionesde usuario que recibe el servidor; sedeberá tener en cuenta que si lasaplicaciones cliente tienen habilita-do connection pooling, el númerode “usuarios que acceden” al siste-ma será mayor; por ello, analizare-mos también contadores que infor-men del número de operacionesrecibidas por segundo.

• SQLServer:SQL Statistics:BatchRequests/sec (BR): número de bat-ches ejecutados por segundo.

• SQLServer:SQL Statistics:SQLCompilations/sec (BC): número decompilaciones por segundo que se rea-liza de consultas que llegan al servidor.

• SQLServer:SQL Statistics:SQL Re-Compilations/sec (BRC): número

de recompilaciones por segundo quese realiza de consultas que llegan alservidor.

• Porcentaje de no reutilización deplanes de ejecución (%) (PNR):o PNR = (BR – ( BC + BRC)) / BR

o Un valor alto indicará que sereutilizan muy pocos los planesde ejecución, lo cual implicaráque habrá que usar CPU paragenerar el plan de ejecución, y elproceso completo tardará mástiempo en ser procesado.

• Si BRC/BC es alto, ello indicará quehay muchas recompilaciones. En esecaso, será de utilidad seguir las reco-mendaciones de los siguientes docu-mentos de Knowledge Base para loca-lizar las causas: Q243586 “Troubleshooting stored procedure recom-pilation”, Q308737 “How to Identifythe cause for Recompilation of aStored Procedure”.

Uso de la caché de SQL Server

En la versión 2005, la estructura delos contadores relacionados con el usode la caché cambia ligeramente; para laversión 2000 usamos los siguientes:• SQLServer:Buffer Manager:Buffer

Cache Hit Ratio: porcentaje de pági-nas a las que se ha necesitado acce-der; al estar localizadas en caché, noes necesario acceder a disco para leerel dato.

• SQLServer:BufferManager:Procedure cache pages: número de páginasusadas para almacenar en caché pla-nes de ejecución. Multiplicado por8Kb obtendríamos el tamaño enKBytes usado.

• SQLServer:Buffer Manager:Freepages: número de páginas libres encaché; un valor bajo será síntoma depresión de memoria (falta de memo-ria o uso ineficiente).

• SQLServer:Buffer Manager:Stolenpages: número de páginas que se han“quitado” a la caché para satisfacerrequerimientos de otras aplicacioneso del sistema operativo. Igual que enel contador anterior, si el valor es altodenota presión de memoria.

En SQL Server 2005, la informa-ción del uso de la caché es bastante más

completa, ya que se añade un nuevoobjeto contador llamado SQLServer:Plan Cache que se divide en:• Instancias: Bound Trees, Extended

Stored Procedures, Object Plans, SQLPlans, Temporary Tables & TableVariables, _Total.

• Contadores: Cache hit ratio, Cache objectcount, Cache objects in use, Cache pages.

Por ejemplo, se puede hacer segui-miento del porcentaje de acierto encaché (Cache hit ratio), para consultas ad-hoc, procedimientos almacenados, ytablas temporales; conocer el númerode páginas usadas (Cache pages) por losplanes de ejecución de procedimientosalmacenados, el árbol normalizado devistas, valores predeterminados (defaults)o procedimientos almacenados exten-didos (Extended Stored Procedures).

ConclusionesEn este artículo hemos visto cómo

analizar con el monitor de rendimiento eluso de los recursos más importantes delsistema: memoria, procesador y discos.Además, hemos visto una técnica parapoder dimensionar el reparto de trabajoen cada fichero de base de datos desde laperspectiva de las operaciones E/S. Parafinalizar, hemos visto algunos de los con-tadores de rendimiento más significativosde SQL Server 2000 y 2005.

dotN

etM

anía

<<

43

dnm.servidores.sql<<

Referencias

SQL Server Performance Counters. Página Web deBrad M. McGehee, MVP en SQL Server.h t t p : / / w w w. s q l - s e r v e r- p e r f o r m a n c e . c o m /performance_monitor_counters_sql_server.asp

Technet: Monitoring Server Performance.http://technet2.microsoft.com/WindowsServer/en/Library/8368dfd6-0d42-4fc7-b0ac-d331ee33be431033.mspx

Technet: Windows Server 2003 Performance CountersReference. http://technet2.microsoft.com/WindowsServer/en/Library/c283b699-6124-4c3a-87ef-865443d7ea4b1033.mspx

Batch Compilation, Recompilation, and Plan Caching Issuesin SQL Server 2005. http://www.microsoft.com/technet/prodtechnol/sql/2005/recomp.mspx

Microsoft SQL Server Performance Tuning TechnicalReference. MS-Press. ISBN: 0-7356-1270-6, MarcilinaGarcía y otros.

Page 44: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

Microsoft Virtual Server 2005

Virtualización. Un concepto y tecnología que está dejando atrás su considera-ción de “atracción de feria” para convertirse en una respuesta sensata y lim-pia para los retos de infraestructura actuales. Microsoft, con Virtual Server2005, aporta un argumento de peso más a favor de esta tendencia y respaldael potencial de una tecnología madura aunque desconocida.

<< los profesionales y entusiastas amateursen esto de la informática que no hayan experimentadoo, por lo menos, que no hayan oído hablar de la virtua-lización. De máquinas virtuales. Una tecnología presen-te en el ordenador desde sus comienzos, pero que no haencontrado su sitio al sol hasta un momento tan recien-te como éste, en donde sus partidarios son legión fren-te a sus detractores.

La virtualización de sistemas consiste básicamen-te en particionar un ordenador para que se compor-te como varios, para representar distintas máquinascompletas dentro del mismo hardware. Cada una delas máquinas representadas es completamente inde-pendiente respecto a las otras en cuanto a componen-tes y funcionamiento, teniendo entidad propia, den-tro del anfitrión en el que se aloja, como en el exte-rior, dentro de la red.

Para particionar el ordenador en varios se puederecurrir al hardware. Es el tipo de virtualización másveterano y presente en los sistemas de grandes pro-porciones de los principales fabricantes. La virtuali-zación se realiza mediante un hardware específico ofirmware que divide el sistema en varias unidades, cadauna de ellas capaz de ejecutar una instancia de un sis-tema, para que el mismo equipo actúe y se comportecomo varios. Es esta una virtualización específica decada fabricante y completamente alejada de la arqui-tectura Intel.

Otro tipo de virtualización es la que se consiguemediante software. El particionamiento de un equipofísico se basa en utilizar un programa que divide y aís-la un único sistema en varios procesos independientes,cada uno de ellos capaz de ejecutar una instancia de sis-

tema operativo. A este tipo pertenecen los programasde virtualización más competentes que pueden encon-trarse actualmente en el mercado para la plataformaIntel y que han sido desarrollados por VMWare yMicrosoft. La propuesta de estos programas es propor-cionar en cada instancia de sistema operativo un orde-nador completo, totalmente independiente en dispo-sitivos hardware, ejecución de programas, acceso a lared y, por supuesto, en su operación.

En contra de lo que pueda parecer, no se trata enningún caso de “simulación” de un ordenador. Cadainstancia de sistema operativo cuenta con su propiaBIOS y acceso a sus dispositivos de hardware ficticiosa través de ella. El sistema operativo huésped nuncatiene consciencia de que no se ejecuta sobre el hierrodesnudo de un ordenador.

Juan Blázquez

dnm.servidores

Pocos deben ser ya

Juan Blázqueztiene una amplia experiencia

como instructor certificado delos principales fabricantes y la

colaboración habitual enpublicaciones profesionales del

sector.Cuenta con lascertificaciones MCSE y MCT de

Microsoft,CNE y CNI de Novelly CLP de Lotus.Actualmente

ejerce como Arquitecto deSistemas en Alhambra-Eidos.

Virtualizar aplicaciones

La virtualización no solo se aplica pararepresentar equipos completos. Variosfabricantes tienen en el mercado progra-mas que permiten virtualizar aplicaciones.Con estos programas, es posible ejecutarsobre un ordenador programas que noestán instalados sobre él. El programa vir-tualiza carpetas, entradas en el registro yresto de elementos que pueda necesitar elprograma para su ejecución

][

Page 45: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

Microsoft lleva poco en esto de la virtualización.Desde 2003, año en el que adquiere la empresaConnectix, el único desarrollador que con “VirtualPC”, virtualizador orientado a equipos de escritorio,desktop y portátiles, intentaba hacer sombra a los pro-ductos, experiencia y predominio de VMWare en estecampo. Desde entonces hasta aquí, Microsoft no sóloha apoyado el desarrollo del virtualizador deConnectix, si no que, además, lo ha enriquecido conla versión orientada a servidor: Microsoft VirtualServer 2005.

Arquitectura de Virtual Server 2005La arquitectura de Virtual Server 2005 se apoya

en la plataforma que le brinda Windows Server 2003para proporcionar a los sistemas operativos huéspedla capa de virtualización y gestionar la emulación dela infraestructura hardware que pueden requerir todasy cada una de las máquinas virtuales que se ejecutansobre el equipo anfitrión. Es decir, Virtual Server 2005no es en sí mismo un sistema operativo. Se instalasobre Windows Server 2003 y es el encargado de pro-porcionar el hardware a las máquinas virtuales. Lossistemas operativos huésped en ningún momento acce-den al hardware físico del ordenador. Virtual Server2005 es quien se encarga de gestionar ese acceso y ser-vir como intermediario entre la máquina virtual y elsistema operativo anfitrión.

Para conseguir que cada máquina virtual se ejecutede manera independiente y totalmente aislada respectoa otras, este virtualizador está construido como aplica-ción multihebra que se ejecuta sobre el ordenador comoun servicio de sistema. Cada máquina virtual se ejecutasobre hebras diferentes y cada operación de entrada/sali-da ocurre sobre hebras dependientes del procesador asig-nado y que se generan según las necesidades de cada

momento. Virtual Server se encarga de derivar dos fun-ciones básicas del núcleo de sistema operativo anfitriónhacia las máquinas virtuales. Por una parte, el schedulerde recursos de CPU. Por otra, los controladores de dis-positivos físicos que puedan estar montados en el siste-ma operativo sobre el que se ejecuta. Así, cuando un sis-tema operativo huésped se ejecuta sobre una máquinavirtual, la capa de virtualización de Virtual Server tomael control de las operaciones de CPU y hardware de esesistema operativo para generar un entorno de ejecucióncompletamente aislado y se encarga de gestionar todaslas instancias que pueda producir, interactuando con elsistema operativo anfitrión cuando es requerido accesoa los dispositivos simulados.

Este hardware ficticio que entrega Virtual Server alos sistemas operativos huésped es siempre el mismopara todos ellos, no se pueden simular componentesespecíficos. Para las máquinas virtuales se emula unprocesador basado en la arquitectura X86, con hasta3,6 GB de memoria RAM y una tarjeta gráfica S3 Trio64con 4 MB de VRAM, todo montado sobre una placamadre Intel 440 BX con PIIX4. A estos elementos bási-cos se pueden añadir discos, tanto IDE como SCSI, endonde se emula una tarjeta controladora Adaptec 2940,CD-ROM, disquetera, tarjeta de red, Intel 21140 yotros. No existe, por el momento, soporte para tarjetade sonido, cosa que no se echa en falta teniendo encuenta que es un software orientado a virtualizar equi-pos con desempeño de servidor. Sí se notará, por el con-trario, el soporte para 64 bits que Microsoft ha inclui-do en su virtualizador para el anfitrión que aloja lasmáquinas virtuales, y se espera que este soporte seextienda a las máquinas virtuales sin mucha demora,junto con el soporte para multiprocesador.

¿Virtualizar qué?La idea de un ordenador físico que contenga varios

ordenadores lógicos es una idea que se encuentra pre-sente en los sistemas operativos desde el comienzo de lainformática. La evolución del software de virtualizaciónno ha seguido la misma pauta que los sistemas operati-vos y resto de software, seguramente por la dinámica dela industria en la que la adquisición de equipamiento

Figura 1: Esquema de la arquitectura de Virtual Server 2005

dotN

etM

anía

<<

45

dnm.servidores<<

El particionamiento de un equipo físico se basa en utilizar un programa que divide y aísla un único sistemaen varios procesos independientes, cada uno de elloscapaz de ejecutar una instancia de sistema operativo

Page 46: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

hardware no se veía problemático sino, todo lo contra-rio, una práctica necesaria y recomendada. Ha sido aho-ra, un momento en el que las inversiones se miran conlupa y la dispersión de servicios sobre distintas máqui-nas plantea serios problemas de soporte y mantenimien-to, cuando la virtualización ha tomado predicamentoentre los responsables de IT, como una herramientapotente, versátil y flexible para solucionar eficazmentela consolidación de sus plataformas. Una tecnología quese encuentra madura y que está perfectamente capacita-da para asumir la virtualización de todo tipo de equipos,sea cual sea su desempeño.

Tradicionalmente se argumenta que una platafor-ma de máquina virtual es conveniente para unos casosmuy concretos, siempre alejados del entorno de pro-ducción. Laboratorio y formación son los ambientesen los que la virtualización tiene sobradamente gana-do su sitio. Si embargo, reducir el empleo de máqui-nas virtuales a estos escenarios es desperdiciar el enor-me potencial que la virtualización puede aportar atodo tipo de organizaciones, independientemente desu objetivo de negocio, y, por qué no, a usuarios pro-fesionales e incluso a cualquier otra persona que sóloquiere utilizar el ordenador más modestamente, comole ocurre al usuario doméstico. Las ventajas innega-bles de utilizar como plataforma de producción ser-vidores virtuales, está calando con paso lento perodecidido entre los responsables de IT, cuyo conven-cimiento y satisfacción están en proporción directa altamaño de sus sistemas. Además del ahorro económi-co y de esfuerzo de gestión, la virtualización posibi-lita que la consolidación de plataformas heterogéne-as se consiga realmente de forma sencilla y eficaz. Elaprovisionamiento de nuevos servidores queda redu-cido a un proceso que se completa en minutos y sinnecesidad de un gran equipamiento ni complejos pro-cedimientos, los tiempos de parada programada para

mantenimiento se eliminan totalmente, mientras lasoportunidades de tener alta disponibilidad se dispa-ran sin necesidad de retar a duelo al responsable eco-nómico que autoriza la adquisición de equipamiento.Como también se elimina el drama de las migracio-nes al simplificar estos procesos para convertirlos enpuro trámite.

Pero todo tiene su precio. El coste de utilizarmáquinas virtuales hay que cuantificarlo en rendi-miento. El principal inconveniente que presenta porel momento Virtual Server 2005 es su imposibilidadde asignar más de un procesador a las máquinas vir-tuales que ejecuta. Es decir, virtualizar aplicacionesdiseñadas para utilizar multiproceso simétrico (SMP)no es una práctica recomendable, puesto que esta ven-taja se diluye en la capa de virtualización. Aunque elhardware sobre el que se ejecuta Virtual Server ten-ga más de un procesador, cualquiera de las máquinasvirtuales que se definan, solo podrán tener asignadouno. De todas formas, no hay que llamarse a engaño.Virtual Server utilizará todos los procesadores quemonte el ordenador sobre el que corre, de hecho pue-de soportar hasta 32 procesadores físicos. Son lasmáquinas virtuales las que emulan un equipo con unúnico procesador. Es decir, con Virtual Server si hay2 procesadores, los dos procesadores trabajan, no estánociosos; son las máquinas virtuales las que se compor-tan como si solo tuvieran un único procesador.

También es importante tener en cuenta que vir-tualizar cualquier equipo significa añadir una capamás de software a las aplicaciones que se ejecutan demanera virtualizada. Esto acarrea una lógica pérdi-da de rendimiento al haber más actores implicadosen la ejecución de programas, servicios y accesos alhardware. Para ser realistas, hay que indicar que unservidor virtual, dependiendo de uso, configuracióny aplicaciones en ejecución, puede entregar hasta un80% de rendimiento respecto a lo que puede obte-nerse en un equipo físico de las mismas característi-cas. Ahora bien, esta pérdida de rendimiento no debe

dotN

etM

anía

<<

46

dnm.servidores<<

VSMT

Virtual Server Migration ToolKit es unaherramienta que permite convertir máqui-nas físicas en virtuales. Con esta utilidad,convertir una máquina física ya en funcio-namiento en una máquina virtual es unproceso rápido y limpio, puesto que evi-ta tener que reinstalar nuevamente todoel software que tuviera esa máquina, apli-car configuraciones y hacer el correspon-diente tuning

][Figura 2:Asignación de puerto y seguridad al sitio

Web desde donde se podrá gestionar Virtual Server 2005 R2

Page 47: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dotN

etM

anía

<<

47

dnm.servidores<<

ser una consideración que haga rechazar a VirtualServer 2005 de plano. Hay que plantearse esta pena-lización de rendimiento como impedimiento paravirtualizar según los casos. Como regla de caráctergeneral, aquellas aplicaciones críticas en donde elrendimiento es decisivo, lo conveniente es mantenerlos servicios sobre equipos convencionales, dimen-sionados adecuadamente, eso sí, y dejarse de añadircapas que incrementan trabajo y tiempo de máqui-na. Para el resto de situaciones, hay que sopesar demanera fría si la pérdida de un 20% del rendimien-to es importante para renunciar a las ventajas que seobtienen con Virtual Server 2005. Sólo a los admi-nistradores recalcitrantes y fundamentalistas del “per-fomance” se les escapa que los modernos servidoressólo son aprovechados, en el mejor de los casos, enun 20% de sus capacidades reales. Es decir, la inmen-sa mayoría de servidores actualmente en producción,según casos, tienen una perspectiva de aprovecha-miento similar si se ejecutan como máquina virtualque sobre máquina física.

Meterse en harina

Como el movimiento se demuestra andando, nadamejor para despejar dudas y convencer a los másescépticos que instalar y ver en acción a este virtua-lizador. Y para empezar a probar este software no hayque andar mucho. En http://www.microsoft.com/vir-tualserver, se puede descargar una versión trial de esteprograma, por el módico precio de rellenar un for-mulario de registro, que ya se sabe como son los chi-cos de marketing. Desde este sitio se puede descar-gar la versión standard. Virtual Server 2005 está dis-ponible en dos ediciones: standard y enterprise. Lasdos ofrecen las mismas funcionalidades y sólo se dife-rencian en el hardware que son capaces de gestionary que marcan los requerimientos de hardware nece-sarios y, por descontado, la carga de trabajo que sesupone deben asumir.

La instalación del programa sigue la misma pauta desencillez que ya es norma para la instalación de cualquiersoftware de Microsoft. Un asistente se encarga de ir soli-citando al operador los cuatro datos que se necesitan paradejar Virtual Server 2005 R2 operativo en el ordenador,sin ninguna complicación. Los requerimientos de hard-ware recomendados para que el programa se desenvuel-va bien son asequibles a la mayoría de los ordenadoresde sobremesa de tipo medio. Resulta interesante mon-tar al menos dos tarjetas de red: una dedicada a máqui-nas virtuales y la segunda reservada para operaciones degestión sobre el ordenador anfitrión. De esta forma sepuede separar el tráfico y no se penalizan rendimientoscuando se hacen operaciones pesadas sobre el anfitriónbase, como puede ser el traspaso de una máquina virtual.

Con Virtual Server 2005 instalado en el ordenador,comenzar a trabajar con máquinas virtuales es inmedia-to; basta con “adquirir” el hardware e instalar el sistemaoperativo. Como se hace siempre. La “adquisición” delhardware se realiza mediante un asistente que guía en ladefinición de los componentes hardware que tendrá lamáquina virtual. Una operación desprovista de compli-cación, en la que se establece la memoria, disco y otroscomponentes virtuales que tendrá el ordenador. Estadefinición no tiene por qué ser definitiva y en cualquiermomento se puede añadir o quitar hardware con sóloparar el ordenador virtual y entrar en su configuración.

Con el hardware “adquirido”, lo siguiente es insta-lar el sistema operativo, como se hace siempre. Esta acciónse realiza exactamente igual a como se realiza sobre unamáquina física. Para instalar un sistema operativo sobreun ordenador virtual, se hacen las mismas acciones quese realizan cuando esa instalación se efectúa sobre unordenador convencional. Una buena forma de empezara abordar el trabajo con máquinas virtuales es “olvidar”

Figura 3:Detalle de la pantalla para crear máquinasvirtuales con Virtual Server 2005.

Tradicionalmente se argumenta que unaplataforma de máquina virtual es conve-niente para unos casos muy concretos.

Sin embargo, reducir el empleo de máqui-nas virtuales a estos escenarios es

desperdiciar el enorme potencial que la virtualización puede aportar

Page 48: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

que el ordenador es virtual y afrontar su manejo comosi se tratara de un equipo físico convencional. Seguir lamisma operación que se realiza sobre un equipo físico yhacer las mismas consideraciones de uso, permiten tra-bajar y avanzar mejor en el conocimiento de este tipo desoftware. Hacer cábalas y suposiciones sobre cómo inte-ractúan los componentes de la máquina virtual con losde la máquina física sólo da lugar a confusiones y dudasque se traducen en fallos de configuración y, en conse-cuencia, de funcionamiento.

Gestión de máquinas virtualesUna vez que las máquinas virtuales se encuentran

definidas, instaladas y en funcionamiento, la siguientepreocupación que surge es cómo poder gestionar el anfi-trión y los sistemas operativos huéspedes que ejecuta. Eneste sentido, el valor añadido que proporciona el hechode que este virtualizador haya sido desarrollado porMicrosoft es la facilidad para integrar la administraciónde las máquinas virtuales en las herramientas de gestiónconvencionales que se encuentran en su plataforma.

Para interactuar con las máquinas virtuales, existeuna herramienta específica del virtualizador a la que seaccede y maneja mediante un interfaz Web. Es decir,Virtual Server 2005 R2, en su instalación, implementa

un sitio Web a nivel de anfitrión, al que es posible conec-tarse para manejar cada sistema operativo huésped indi-vidualmente, como si de una consola remota se tratara,así como para realizar otras tareas de mantenimiento quetienen que ver con la máquina como tal: apagado, reini-cio, redefinición de hardware y otras operaciones simi-lares. Esta Web de gestión simplifica mucho la adminis-tración de la infraestructura virtual de Microsoft, debi-do a que cualquier equipo que disponga de un navega-dor Web puede convertirse en una consola de gestión,desde la que es posible tener acceso a todas las máqui-nas virtuales que están disponibles en un equipo pararealizar cualquier operación sobre ellas. No obstante,reseñar que esta consola de administración no propor-ciona una emulación de terminal propiamente dicha,como sucede con Terminal Server, por lo que su filoso-fía de utilización y rendimiento está fuera de lugar paraoperaciones y uso distinto al estrictamente relacionadocon la gestión de las máquinas virtuales.

De cara a esta gestión, como máquinas hechas y dere-chas que son los ordenadores virtuales, su administra-ción puede y debe integrarse dentro de la estrategia degestión que pueda estar implantada en el sistema en elque se incorporan. Todas las herramientas de adminis-tración que se utilizan para gestionar máquinas conven-cionales, siguen manteniendo su vigencia cuando se tra-ta de equipos virtuales, como pueden ser aplicación dedirectivas, consolas de gestión MMC o las herramien-tas de copia de seguridad. Sin embargo, por el momen-to, debido a lo reciente de este software, el máximo gra-do de integración hay que buscarlo en el propio entor-no de Microsoft y descartar herramientas de terceros,como son los conocidos programas que incorporan losprincipales fabricantes de hardware. Las máquinas vir-tuales tienen una integración completa con MicrosoftMOM 2005 y con el Directorio Activo.

En definitiva, los responsables de IT preocupadospor la consolidación de servidores y por la reducciónde los costes de propiedad implícitos a su departa-mento tienen en la virtualización una baza interesan-te que jugar. Dentro de la plataforma Microsoft estaopción se materializa en Virtual Server 2005, que pro-porciona una tecnología madura y perfectamente inte-grada con el universo de productos del fabricante, loque avala la consecución de los mejores resultados sindetrimento de funcionalidad.

dotN

etM

anía

<<

48

dnm.servidores<<

Todas las herramientas de administración que se utilizan para gestionar máquinas convencionales, siguen manteniendo su vigencia cuando se trata de equipos

virtuales, como pueden ser aplicación de directivas, consolas de gestión MMC o las herramientas de copia de seguridad

Figura 4:Configuración del sitio web de gestión de Virtual Server 2005

Page 49: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dotN

etM

anía

<<

49

la autenticación forms ASP.NET 2.0 esprácticamente idéntica a la que existía en ASP.NET1.x y la mayor parte de los trucos y técnicas aprendi-das para las anteriores permanecen útiles y válidas.El cambio más notable es la introducción del API depertenencia. Esto plantea un serio problema para miaplicación. He desarrollado un sistema de pertenen-cia personalizado para gestionar cuentas de usuariopara la versión ASP.NET 1.x. Ahora que estamosconsiderando y planificando una migración, la cues-tión no puede ser demorada más. ¿Habría que empe-zar desde cero y meterse con las increíbles API deASP.NET 2.0? ¿O sería preferible mantener mi códi-go y renunciar a la extensibilidad, los controles parala seguridad y todo lo demás?

Interesante pregunta. El API de pertenencia es lapunta de un inmenso iceberg, cuya mayor parte per-manece bajo el agua. El iceberg es el modelo de pro-veedores, que es una API basada en el patrón stra-tegy. Este modelo permite aislar la lógica detrás deun cierto servicio y lo expone mediante componen-

tes enlazados ad hoc. A la vista de esto, se puedencrear nuestras propias implantaciones de un servicio.

Hasta cierto punto, el sistema de pertenencia estápresente en ASP.NET 1.1, si bien de forma embrio-naria. ¿Le suena familiar el fragmento de código delfuente 1?

Creo que cualquier desarrollador serio deASP.NET sonreiría al verlo, independientemente dela profesionalidad y capacidad del presentador quelo mostrase. Yo también. Hoy, sin embargo, reconoz-co en este código un patrón que, si bien no es útil, síque lo hace inspirador y sensible.

El fichero Web.config no es más que un almace-namiento de datos para usuarios. Usar una base dedatos para este tipo de almacenamiento está fuera deduda: un fichero de texto como Web.config, puedecontener texto en claro, ningún índice, ningún envol-

El API de pertenencia es la punta deun inmenso iceberg, cuya mayor partepermanece bajo el agua. El iceberg esel modelo de proveedores, que es una

API basada en el patrón strategy

Trucos para ASP.NET

Dino Esposito

dnm.todotnet.qa

<< Después de todo,

Dino Esposito es mentor de Solid Quality

Learning y autor de “ProgrammingMicrosoft ASP.NET 2.0 CoreReference” y “Programming

ASP.NET 2.0 Applications AdvancedTopics”, ambos de Microsoft

Press.Afincado en Italia,Dino esun ponente habitual en los

eventos de la industria a nivelmundial.Visite su blog en:

http://weblogs.asp.net/despos.Puede enviarle sus consultas [email protected]

Este mes respondemos a tres preguntas que cubren diferentes aspectos de ASP.NET2.0, con una especie de hilo conductor oscilando alrededor de cookies y proveedo-res. En general las preguntas abordan cuestiones sobre herramientas y mecanismosespecíficos para facilitar y simplificar características comunes de la codificación queeran particularmente tediosas en ASP.NET 1.1.

<authentication mode="Forms"><forms loginUrl="login.aspx" protection="All">

<credentials passwordFormat="SHA1"><user name="Joe" password="07B7F3EE06F278D" /><user name="Bob" password="B966BE960E7CBBD" />

</credentials></forms>

</authentication>

Fuente 1

Page 50: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dotN

etM

anía

<<

50

dnm.laboratorio.net<<

torio que lo proteja, una pobre escalabilidad y muchasmás cosas.

Sin embargo, proporciona el método FormsAuthentication.Authenticate, con un punto fijo don-de acudir para obtener información de credencialesde usuario.

El método FormsAuthentication.Authenticate per-mite autenticar a un usuario, siempre que el marco detrabajo le proporcione los mecanismos (informaciónde Web.config) para hacerlo.

En una aplicación bien diseñada, se presupone unmétodo similar que suministra una lógica de autenti-cación específica, y que es parte de tu propio código.Se trata de un código del tipo “todo o nada”. Lo pue-des incluir en tu aplicación solamente si la modelasde acuerdo con esos principios.

FormsAuthentication.Authenticate suministra unAPI común y compartida, pero no es extensible parasoportar “cualquier” lógica de autenticación. El mode-lo de pertenencia en ASP.NET 2.0 es el paso siguien-te al método Authenticate de ASP.NET 1.1. Disponede un API de alto nivel, pero añade un modelo deextensibilidad para permitir que cada aplicación per-sonalice el proceso de autenticación.

El API de pertenencia suministra un conjuntode clases que permiten manejar usuarios y roles.Junto con la clase FormsAuthentication, las nuevasclases Membership y Roles constituyen un kit de segu-ridad completo para los desarrolladores deASP.NET. La clase Membership suministra métodospara gestionar cuentas de usuario, añadir y borrarnuevos usuarios, o editar cualquier información aso-ciada con ellos, tal como la dirección de correo olas contraseñas; la clase Roles crea y gestiona aso-ciaciones entre usuarios y roles.

La clase Membership es la contrapartida de FormsAuthentication.Authenticate, excepto que en lugarde leer la información del fichero Web.config, lo hacemediante un proveedor registrado. Los proveedoresde ASP.NET extienden la funcionalidad de la claseMembership permitiéndole acceder a información deusuarios almacenada –virtualmente– en cualquier con-tenedor.

Así que, ¿qué puedes hacer?, ¿mantenerte en tu códi-go antiguo personalizado o escribirlo todo nuevo?

No tienes necesidad de escribirlo todo de nue-vo. El modelo de proveedor te permite conectar tu

aplicación al nuevo modelo y sus características aso-ciadas, como los controles de seguridad y la herra-mienta de administración de ASP.NET. Escribiendoy registrando un proveedor de pertenencia perso-nalizado. El nuevo componente se encargará deexponer la antigua API a través de la nueva inter-faz de pertenencia.

Para construirlo, heredas de MembershipProvidery sobrescribes los miembros virtuales que tengan unsignificado en tu aplicación. Si tu sistema carece deuna característica soportada por el proveedor, puedes,simplemente, saltártela. El modelo de proveedor per-mite adaptar el sistema actual de pertenencia a la nue-va interfaz. La reusabilidad es completa, y no tienesque escoger entre dos opciones; seleccionas la quemejor se adapte.

El estado de la sesión no es parte de HTTP, sinouna capa de abstracción creada del lado del servidor,ya sea ASP clásico, ASP.NET o cualquier otro. Desdeel comienzo, se basó en cookies. Ahora, ASP.NETsoporta sesiones sin cookies, que estarían fenomenal si

El tener una información crítica y esencial, tal como elestado de sesión del usuariodependiendo de las cookies,es limitador en cierta forma

“”

FormsAuthentication.Authenticatesuministra un API común y

compartida, pero no es extensiblepara soportar “cualquier” lógica de

autenticación. El modelo de pertenencia en ASP.NET 2.0 es el

paso siguiente al método Authenticate de ASP.NET 1.1

if (FormsAuthentication.Authenticate(user, pswd))FormsAuthentication.RedirectFromLoginPage(user, false)

elseerrorMsg.Text = "Sorry, that’s not it.";

Fuente 2

Page 51: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dotN

etM

anía

<<

51

dnm.laboratorio.net<<

no fuera por que incluye información de la cookie enla propia URL. ¿Cómo puedo escribir hipervínculoso apuntar a una URL absoluta?

Las cookies, cabeceras inocentes e inocuas, que algu-na gente (y la mayoría de los usuarios) creen que sonel mal del software de la Web. El contenido de estascabeceras se guarda a veces en la máquina local delusuario dentro de un directorio aislado y se vincula afuturas peticiones.

Personalmente, no puedo imaginarme en quéforma esto puede ser dañino. Sin embargo, el hechoes que las cookies pueden ser deshabilitadas en algu-nos navegadores o no soportadas en absoluto. Eltener una información crítica y esencial, tal comoel estado de sesión del usuario dependiendo de lascookies, es limitador en cierta forma. ASP.NETsoporta sesiones sin cookies y en la versión 2.0 tam-bién la autenticación y la identificación anónimapueden hacerse de esta forma.

¿Por qué las cookies? Porque son quizá el únicomecanismo disponible hoy para identificar de formaúnica una máquina cliente a través de una informa-ción específica. Y las cookies funcionan. Si tienes quehacerlo sin ellas, no es la misma cosa, y no puedesesperar mantener todo el control.

Las sesiones sin cookies funcionan igualmente, perocon algunas diferencias, y se echan de menos ciertascaracterísticas. Cuando se habilitan sesiones sin coo-kies, la URL de la página se modifica para incorporareste ID de sesión.

URL absolutas en enlaces, dentro de este contex-to, simplemente no funcionan. La razón es que cuan-do escribes la página, no conoces a priori el ID desesión que será utilizado en la llamada. El ID de sesióncambia por usuario y por sesión. Hay dos posibilida-des, y la primera es bastante obvia: no utilices víncu-los absolutos. Hay que notar, además, que las distin-tas llamadas (postbacks) no se ven afectadas por sesio-nes sin cookies, ya que se producen sobre URL relati-vas. Una URL absoluta incluye un protocolo e infor-mación completa sobre la aplicación. Si no se puedehacer sin URL absolutas (en la misma aplicación, porsupuesto), tienes que recurrir al siguiente truco:

Se completa la definición del hipervínculo por pro-grama y se establece la URL con la cadena pasada porel método ApplyAppPathModifier del objeto Response.El método añade un ID de sesión a la ruta virtual espe-cificado y devuelve el resultado. También puedes uti-lizar ApplyAppPathModifier directamente en el códi-go fuente ASPX. En ese caso, sin embargo, se reco-

mienda definir los hiperenlaces utilizando un controlHTML literal y no controles ASP.NET. De hecho,puedes usar bloques de código <%...%> conApplyAppPathModifier dentro, para establecer propie-dades de los controles en ASP.NET. Sin embargo,funciona con etiquetas literales tipo <a>.

¿Qué es la identificación anónima? ¿Esta relacio-nada con la cuenta utilizada para identificar a cual-quier usuario anónimo al nivel de IIS?

La identificación anónima en ASP.NET 2.0 es unacaracterística que está totalmente (repito, totalmen-te) desvinculada de cualquier mecanismo de seguri-dad tanto en ASP.NET como en IIS. Simplemente,se trata de un marco que suministra una forma deimplementar una característica común de la mayoríade los sitios Web comerciales. En estas situaciones,normalmente, todos los usuarios están identificados;algunos con sus credenciales reales (mediante un pro-ceso de login), y otros usando un identificador ficticio(mayormente un GUID). De esta forma, ambos esce-narios conducen a un único flujo de ejecución.

En ASP.NET 2.0, la identificación anónima debeser explícitamente habilitada a través del ficheroWeb.config (ver fuente 4).

Basado en un módulo HTTP, la identificación anó-nima crea y gestiona identificadores para usuarios anó-nimos de una aplicación ASP.NET. De hecho estemecanismo sólo se utiliza por una característica: perfi-les de usuario. El perfil de usuario asigna un objeto per-fil a cada usuario, incluyendo aquellos no registrados.El ID anónimo es vinculado a la petición a través deuna cookie o una cadena en la URL. De esta forma, losusuarios anónimos pueden recuperar sus propias con-figuraciones, mientras la cookie siga siendo válida. Pordefecto, el ID anónimo es un GUID. Sin embargo, elmodelo HTTP de soporte expone un evento Creating,para permitir que se establezca a un usuario anónimoun valor personalizado.

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

Traducción por Marino Posadas

La identificación anónima enASP.NET 2.0 es una característicaque está totalmente desvinculada

de cualquier mecanismo de seguri-dad tanto en ASP.NET como en IIS

“”

string url = Response.ApplyAppPathModifier(pageName);link.NavigateUrl = url;

Fuente 3

<anonymousIdentification enabled="true" />

Fuente 4

Page 52: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

Mantener un portal entre los primeros puestosde Internet requiere tener contenidos actualizadoscomo ejemplos, artículos, manuales, etc. De nadasirven estos contenidos si no consiguen llegar a unnúmero de usuarios aceptable, que sepan que éstosexisten. Por ello son necesarias herramientas quehagan accesibles estos contenidos desde otros por-tales o plataformas, con el fin de darles más visibi-lidad y por lo tanto más visitas.

Hace tiempo se creó un estándar que pretendíacrear una estructura común en formato XML paracontener un resumen de los contenidos de los por-tales junto con una URL que fuera a la página delcontenido completo. Este estándar se llamó RSS.

RSSMASTER es una de estas herramientas queos permitirá generar este tipo de catálogos. Su uti-lidad es sencilla, permite crear un XML y mante-nerlo actualizado con los contenidos de un portalen formato RSS.

Ventajas de tener la información en formatoRSS:

• Fácil acceso a los artículos, ejemplos, manua-les de vuestros sitios.

• Compartir la información con otros portalesy buscadores.

• Fácil indexación por los buscadores.• Al ser XML, fácil lectura por cualquier tipo

de plataforma.

A continuaciónse expone un ejemplo de cómoimplementar el código en una aplicación ASP.NETpara generar un RSS con RSSMASTER:

Lorenzo Ponte

Lorenzo Ponte es redactor dedotNetManía. Es Arquitecto de

Sistemas y Aplicaciones .NET.Experto en Datawarehousing yBusiness Intelligence,Marketing

Intelligence,CRM analítico.Actualmente es consultor de la

empresa Matchmind yWebmaster de clikear.com

La competencia entre portales de Internet es cada vez más grande y el manejo dela información se ha convertido en el elemento diferenciador entre los buenos ylos malos portales. En el laboratorio de esta semana os proponemos dos compo-nentes que os ayudarán tanto a divulgar como a recoger información. Se trata deun generador de RSS y un detector de cookies.

<< RSSMASTER

<%@ Page language="c#" %> <%@ Assembly Name="RSSMaster" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb" %> <%@ Import Namespace="Softtool.RssMaster" %>

<%string DBPath = Server.MapPath("News.mdb"); string SqlGetNews = "SELECT * FROM Noticias"; string ConnectionString =

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DBPath;

// Obtener la noticias de la base de datosOleDbDataAdapter daNews = new

OleDbDataAdapter(SqlGetNews, ConnectionString); DataTable dtNews = new DataTable(); daNews.Fill(dtNews);

// Inicializar el componente RSS RssGenerator rssGen = new RssGenerator(); rssGen.Version = RssVersion.v20; rssGen.Title = "miSitioWeb.com's Noticias"; rssGen.Link = new Uri("http://www.mywebsite.com"); rssGen.Description = "miSitioWeb.com"; rssGen.Language = "es-ES"; rssGen.DataSource = dtNews; rssGen.ItemTitleField = "Headline"; rssGen.ItemDescriptionField = "Story"; rssGen.ItemLinkField = "ID"; rssGen.ItemLinkFormat =

"http://www.miSitioWeb.com/noticias.aspx?id={0}";

// Generar el XMLResponse.Clear();Response.ContentType = "text/xml"; rssGen.Generate().Save(Response.Output);

%>

Page 53: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

Las cookies se han convertido en un elemento clavepara guardar la información de los usuarios que visitanuna página Web. Mediante un pequeño fichero de tex-to alojado en el ordenador del usuarios podemos ir alma-cenando sus preferencias a la hora de navegar por nues-tro sitio y utilizar esa información para ofrecerle máscontenidos de su interés.

No todos los usuarios tienen habilitada esta opción;incluso todavía hay usuarios con versiones antiguas denavegadores que tampoco la soportan.

Cookie Detect es un componente que nos propor-ciona información de si el usuario que está visitandonuestro portal tiene la posibilidad de recibir cookies.Mediante unas pocas líneas de código nos proporcio-nará información acerca de si podemos utilizar el recur-so de las cookies para guardar información, o por el con-trario deberemos utilizar otros recursos no tan efecti-vos como variables de sesión.

A continuación se ofrece un ejemplo de cómoutilizar este componente:

Ficha técnicaNombre RSSMASTERVersión 1.0Fabricante SofttoolWeb http://www.softtool.info/rssmasterCategoría UtilidadesPrecio GratisValoración

Cookie Detect<<

dotN

etM

anía

<<

53

dnm.laboratorio.net

Ficha técnicaNombre Cookie DetectVersión 1.0Fabricante joel.netWeb http://joel.net/code/cookie_detect.aspxCategoría UtilidadesPrecio GratisValoración

<%@ Register TagPrefix="cc1" Namespace="Joel.Net"Assembly="Joel.Net.CookieDetect" %>

<SCRIPT runat="server"> private void Page_Load(object sender,

System.EventArgs e) { lblEnabled.Text =

CookieDetect1.IsEnabled.ToString();lblVersion.Text = CookieDetect1.version;

}</SCRIPT>

<?xml version="1.0" encoding="utf-8" ?> - <rss version="2.0"> - <channel> <title>Clikear.com Noticias</title> <link>http://www.clikear.com/</link><description>Portal de desarrolladores especializado en la plataforma .NET</description> <generator>RSSMaster 1.0 (http://www.softtool.info/rssmaster)</generator> <language>es-ES</language>- <item> <title>Generador de RSS</title> <description>Componente creado en .NET que te ayudará a publicar tus contenidos en RSS. Este componente se basa ...</description><link>http://www.clikear.com/rss</link></item>- <item> <title>Detectar cookies</title> <description>Componente que detecta si un navegados tiene ...</description> <link>http://www.clikear.com/cookies</link></item></channel></rss>

Y a continuación se ofrece el resultado, en formatoRSS/XML

Page 54: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dotN

etM

anía

<<

54

<<

Improving .NET application performance and scalabilityJ.D.Maier et. al.

Editorial: MicrosoftISBN: 0-7356-1851-8Páginas: 1.097Publicado: Primera edición 2004Idioma: Inglés

Esta es una obra atípica. Un extenso grupo de de programadores de Microsoft ha atendi-do la petición de muchos usuarios respecto a las buenas prácticas desde el punto de vistadel rendimiento y la escalabilidad de las aplicaciones .NET, y no sólo en la forma de opti-mizar código, sino en la manera de diseñar esa optimización. Ese es el valor fundamentalde este libro que viene directamente de la “casa madre”, y que puede conseguirse tambiénen formato digital. Prácticamente, no hay un aspecto del desarrollo que no se aborde conel ideal de su título: ADO.NET, SQL Server, ASP.NET, remoting, servicios Web, etc. Esmucho más una obra de consulta que de lectura. Pero, seguro que si lo tiene a mano, leserá de ayuda más de una vez. La prueba es que se publicó en 2004 y sigue estando total-mente vigente.

Microsoft Visual C# step by stepJohn Sharp

Editorial: Microsoft PressISBN: 0735619093Páginas: 560Publicado: Primera edición 2006Idioma: Inglés

El autor recorre, en esta tercera revisión de su obra (ya fue autor de dos anteriores delmismo título, sobre las versiones 1.0 y 1.1), todas las novedades que aporta el lenguajeC# en su versión 2.0, sin dejar ningún aspecto crítico sin ilustrar. En la primera parte,todo lo relativo a construcciones del lenguaje: estructuras, generics, colecciones, etc. Enla segunda, profundiza en la construcción de aplicaciones Windows y Web a la luz dedichas novedades aportando nuevas soluciones en la intefaz de usuario Windows, el tra-tamiento de datos y los servicios Web. Un CD con todos los ejemplos del libro estáincluido y complementa este trabajo de manera adecuada.

dnm.biblioteca.net<<

dnm.biblioteca.net

Page 55: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >>>[ ]

Page 56: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >>>[ ]

Page 57: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >

Page 58: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de

¡Se implanta un microchipen la mano para encender elcoche! Esta y otras noticiastecnológicas son servidaspor un sitio hermano deChannel9 (http://on10.net),construido enteramente en

ASP.NET 2.0. Si el lector está interesado en las carac-terísticas del desarrollo de sitio en cuestión, la página“Learn how 10 was made” (http://channel9.msdn.com/ShowPost.aspx?PostID=171265#171265) incluye un vídeoexplicativo. El sitio es, además, de cierto interés.

Windows Vista Build 5365 Beta 2 Preview

Una nueva compilación del pró-ximo sistema operativo ya está lista,aunque sólo para betatesters y parasocios del programa TAP (TechnologyAdoption Program). Según PaulThurrott (en Windows IT Pro) el

22 de mayo es la fecha prevista para el lanzamiento dela beta 2 (posiblemente, build 5372) en el WinHEC deSeattle. Más información en http://www.longhornblogs.comy en http://www.winsupersite.com.

Microsoft Experimentation Platform

En otro orden de cosas, la compañía ha publicado yaun sitio Web (http://exp-platform.com) llamado Microsoft

Experimentation Platform, para animar a los desarro-lladores de todo el mundo a que utilicen las tecnologíascon antelación y emitan sus juicios de valor, y puedan rea-lizar experimentos basados en la evaluación estadística deaceptación y otros parámetros.

.NET Compact Framework 2.0 SP1 Beta 1

Desde el blog del equipo de desarrollo de .NETCompact Framework (http://blogs.msdn.com/netcfteam)anuncian la disponibilidad de la beta 1 del SP1 de .NETCompact Framework 2.0 que, entre otras cosas, per-mitirá que el GAC se instale en la tarjeta de memoria,depuración del .NET Framework SDK vía MDBG,incluirá un visor del log de red y un monitor remotode rendimiento, añade el atributo [Serializable], etc.Búsquelo en: http://www.microsoft.com/downloads.

dotN

etM

anía

<<

58

dnm.desvan<<

Marino Posadas

Web Monkey. El sitio Web Monkey(http://www.webmonkey.com/06/16/index3a.html) publicauna atractiva entrevista al experto Jason McQueen sobrelas técnicas de búsqueda Web, recomendando a los web-masters y diseñadores estrategias de posicionamiento decara a los mismos.

Documentos en la Red

Sitio del mes

no

tici

as.

no

tici

as

Marco Bellinaso, compañero de FrancescoBalena en dotNetToTheMax, ha puesto adisposición del público el código fuente com-pleto de su última obra (“ASP.NET 2.0Website Programming”), que está disponi-ble en http://www.dotnet2themax.com/BooksMarco.aspx.

Utilidades del mes

Beta 2 de Windows Defender. Ya seencuentra disponible una de las herra-

mientas de seguridad de Microsoft, especializada en spy-ware, detección de intrusos y otro conjunto de utilidadesconfigurables sobre seguridad. Se puede descargar de for-ma gratuita de http://www.microsoft.com/athome/security/spywa-re/software.

AuditISX 2006. Unainteresante herramientade auditoría que permi-te hacer un seguimientode la actividad que suce-de, tanto en el equipolocal, como en la reddonde se encuentreconectado. Gratuita.

Puede descargarse de la dirección: http://www.krolrules.com.

¡Que viene el Jefe! (WinBoss). Muycurioso programita para ocultarventanas de golpe ante una situa-ción de alerta. Totalmente configu-rable y gratuita. Accesible desdehttp://www.bobyte.com.

Page 59: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de
Page 60: dotNetManía - sergiogonzalezc.files.wordpress.com · WebParts en ASP.NET 2.0 (I) • Macros en Visual Studio 2005 • Lo que nos traerá Orcas: LINQ en acción • Detección de