dotnetmanía - sergiogonzalezc.files.wordpress.com · nº 54 diciembre 2008 6,50 € visual basic...

60
dedicada a los profesionales de la plataforma .NET www.dotnetmania.com entrevista Josh Holmes RIA Architect Evangelist Microsoft Corp. nº 54 diciembre 2008 6,50 Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework dotNetManía Poniendo rumbo a Oslo… Sin perder el norte en nuestros desarrollos • LINQ to Access • Novedades de seguridad en SQL Server 2008 • Extensibilidad en TFS. Modelo de objetos de work items Componente de acceso a la tarjeta SIM evento Tech-Ed 2008 Europe

Upload: vudung

Post on 08-Oct-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

dedicada a los profesionales de la plataforma .NET

www.

dotne

tman

ia.co

m

entrevistaJosh HolmesRIA Architect EvangelistMicrosoft Corp.

nº 54 diciembre 2008 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • AJAX • Silverlight • .NET Framework

dotNetManía

Poniendo rumbo a Oslo… Sin perder el norte en nuestros desarrollos • LINQ to Access • Novedades de seguridad en SQLServer 2008 • Extensibilidad en TFS. Modelo de objetos de work items

Componente de acceso a la tarjeta SIM

eventoTech-Ed 2008Europe

Bienvenido al número 54, de diciem-bre de 2008, de dotNetManía.

Después del aluvión de anunciosde tecnologías y productos presenta-dos por Microsoft en la PDC de LosÁngeles, llegaba a Europa el Tech-EdEMEA (Europa, Oriente Medio yÁfrica) 2008 con cierto aire descafei-nado. Sin embargo, los que no tuvie-ron ocasión de asistir al principal even-to mundial del año pudieron escucharallí de primera mano —y de prestigio-sos ponentes, igualmente— algunas delas conferencias sobre los temas másrelevantes como Windows Azure,Windows 7, Oslo, etc. Puede leer laexcelente crónica de Magda Teruelpara más detalles.

Recomiendo a los interesados enSilverlight 2.0 la entrevista que Mari-no Posadas, autor del libro que rega-lamos el mes pasado, “Programaciónen Silverlight 2.0”, realizó a Josh Hol-mes, RIA Architect Evangelist deMicrosoft Corporation, quien dicehaberse apostado el cuello a que Sil-verlight supondrá un antes y un des-pués en el modo en el que desarrolla-mos aplicaciones Web... Veremos :-).

En este ejemplar ponemos ya rum-bo a Oslo de la mano de Miguel Llo-pis, quien nos envía su contribucióndesde Vancouver, donde realiza sulabor como Software Development

Engineer in Test (SDET) en el equi-po de Oslo en Microsoft Corporation.Miguel cede generosamente sus ingre-sos a “Nuevo Futuro”, una organiza-ción sin ánimo de lucro cuyo loableobjetivo es la creación de hogares deacogida de ambiente familiar para losniños y jóvenes que carecen de él. Unode los mayores problemas de este tipode niños que se crían en institucionesgubernamentales es la carencia delafecto y los cuidados que les propor-cionaría un entorno familiar. Si con-sidera —como Miguel— que ésta esuna causa merecedora de su apoyo,puede ayudar u obtener más informa-ción desde www.nuevofuturo.org. Tam-bién puede colaborar con un simpleSMS al 4004 con la palabra NUEVO-FUTURO, y en tal caso estará donan-do 1,04€.

Javier Garrido, colaborador invi-tado de este mes, es el encargado delartículo central “Componente de acce-so a la tarjeta SIM en Windows Mobi-le”, en el que desarrolla un componen-te para el acceso a la informaciónalmacenada en la tarjeta SIM, que sir-ve como ejemplo perfecto para ilus-trar cómo realizar llamadas a códigonativo mediante PInvoke.

Pero esto no es todo, dentro haybastante más. Espero que nuestro tra-bajo sea de su agrado.

Después de PDC... Tech-Ed EMEA

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 54 • Diciembre 2008Precio: 6,50 €

EditorPaco Marín ([email protected])

Redactor jefeMarino Posadas([email protected])

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

Empresas colaboradoras

Alhambra-Eidos

Krasis

Plain Concepts

Raona

Solid Quality Mentors

Además colaboran en este númeroAlejandro Barreiro, Antonio Soto, JavierGarrido, José Luis Latorre (en nombre deBcnDev), Magda Teruel y Miguel Llopis.

IlustracionesPortada: Javier Roldán

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

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528522 - Rivas Vaciamadrid (Madrid)

www.dotnetmania.com

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

ImprimeGráficas MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

dotNetManíadotNetManía

Paco Marín

sumario 54Eventos 07-09

Tech-Ed Europe 2008

Entrevista a Josh Holmes 10-13Poco antes de la publicación de la versión definitiva de Silverlight 2.0, Josh Holmes, uno de losprincipales divulgadores de esta tecnología, pasó por Madrid con motivo de una gira que hacía portoda Europa para hablar de las características del producto y de las buenas prácticas recomendadasen el ciclo de desarrollo de aplicaciones Silverlight. Tuvimos ocasión de entrevistarlo en MicrosoftIbérica, y nos acompañaban César de la Torre y David Salgado.

Poniendo rumbo a Oslo… Sin perder el norte en nuestros desarrollos 14-17El anuncio oficial de Oslo y de sus primeras versiones públicas fue uno de los acontecimientos másdestacados de la recien temente celebrada PDC de Microsoft. Oslo es el nombre en clave para laprimera oleada de tecnologías de Microsoft orientadas a revolucionar el ciclo de vida de nuestrasaplicaciones en los próximos años mediante la adopción de un paradigma basado en modelos. En esteartículo podrá encontrar una primera aproximación al paradigma basado en modelos, así como unadescripción de alto nivel sobre cada uno de los elementos clave que componen esta nueva tecnología.

LINQ to Access 18-24Este artículo describe el desarrollo de una herramienta que permita generar de forma automáticaun mapeo a nivel de objetos de una base de datos relacional, en este caso MS Access, sobre el que sepodrá posteriormente aplicar consultas LINQ.

Componente de acceso a la tarjeta SIM en Windows Mobile 26-40El acceso a la tarjeta SIM en Windows Mobile es poco habitual sobre todo porque cuando seintroduce una SIM en la PDA, Windows Mobile automáticamente agrega el contenido de lamisma a Pocket Outlook. Pero pensemos que queremos hacer lo contrario y además desde C#: copiaren una SIM limpia, los contactos, mensajes, administrarla y capturar a través de Callbacks losmensajes que nos envía el sistema.

Novedades de seguridad en SQL Server 2008 42-45Siguiendo los pasos de versiones anteriores, fundamentalmente de SQL Server 2005, al que despuésde tres años en el mercado todavía no se le ha encontrado ningún agujero de seguridad, Microsoftha puesto mucho interés en seguir mejorando las prestaciones de su motor de base de datos en lo querespecta a las características de seguridad. SQL Server 2008 incluye novedades muy interesantes ydeseadas, y demandadas desde hace años por los administradores de bases de datos, que analizaremosen el presente artículo.

Extensibilidad en TFS. Modelo de objetos de work items 46-49Team Foundation Server (TFS) es una herramienta altamente extensible y personalizable, que nospermite adaptarla a nuestras necesidades de proceso; recordemos que no existen balas de plata, y enlas herramientas tampoco. Uno de los puntos principales de extensibilidad es el modelo de objetos delos work items, permitiéndonos automatizar tareas como su creación, edición, validación y consultas.

dnm.todotnet.qa 50-52Silverlight en acciónEste mes exploramos algunos aspectos relacionados con el desarrollo en Silverlight. Tocaremos aspectosrelacionados con la seguridad en el acceso a datos, la compatibilidad binaria y los cambios futuros en laplataforma.

dnm.comunidad.net 54-55

dnm.biblioteca 57Aprenda C# 3.0 desde 0.0 Microsoft SQL Server Compact 2008 SP 1: referencia completa

dnm.desvan 58

dotN

etM

anía

<<

6

noticiasnoticias

noticias

noticias

noticias

Esta plataforma de software permite tanto a los desarrolladores profesionales como aficionados simplificar lacreación de aplicaciones robóticas que se ejecuten en una amplia variedad de hardware.

El pasado día 17, en la conferencia “Robo-Development Conference & Expo” en San-ta Clara, California, Microsoft anunció la dis-ponibilidad de Microsoft Robotics Deve-loper Studio 2008 (Microsoft RDS), la másreciente versión de su plataforma de desa-rrollo para aplicaciones robóticas. MicrosoftRDS incluye un modelo de programaciónsencillo para dar soporte al desarrollo de apli-caciones asíncronas, un conjunto de herra-mientas visuales de creación de contenidos ysimulación visual para ayudar al desarrollo deeste tipo de aplicaciones, todo ello acom-pañado de tutoriales y código de ejemplo paraayudar a la iniciación con la plataforma.

Esta tercera versión de Microsoft RDS,que se apoya en las anteriores, ha recibidouna calurosa acogida por parte de la comu-nidad, desde estudiantes hasta investigadoresy desarrolladores comerciales. Ha habido másde 250.000 descargas de Microsoft RDS, ymás de 60 empresas de hardware y softwarehan anunciado el soporte o utilización de laplataforma como parte de sus productos.

Microsoft Robotics Developer Studio2008 incluye mejoras en las siguientes áreas:

• Mejoras sensibles en el rendimiento.El paso de mensajes entre servicios haaumentado su rendimiento entre 1,5 y 3veces, y los servicios se cargan ahora eldoble de rápido. Los programadores pue-den ahora también definir completa-mente los protocolos de comunicaciónentre servicios, para optimizar el rendi-miento.

• Mejoras en la herramienta VPL(Visual Programming Language). Estaherramienta de programación visual aho-ra incluye una manera sencilla de definiry configurar aplicaciones distribuidas,simplificándose así la creación de aplica-ciones que se ejecutan en dispositivosconectados en red.

• Mejoras en la herramienta VSE(Visual Simulation Environment).VSE ahora incluye la posibilidad degrabar y reproducir simulaciones, unnuevo editor de planos y tres nuevosentornos predefinidos de simulaciónpara facilitar las pruebas de las aplica-ciones robóticas. Además, se ha aña-dido soporte para la importación de

modelos creados con DS SolidWorksy Microsoft trueSpace.

• Mayor flexibilidad para el desarrolla-dor. Microsoft RDS 2008 introducesoporte para Visual Studio 2005 y VisualStudio 2008, así como soporte mejoradopara la ejecución en plataformas Win-dows de 64 bits, lo que la hace accesiblea una audiencia más amplia de desarro-lladores.

Esquema de licencias y precios

Esta nueva versión ofrece una mejora sustan-cial en el esquema de licencias, con tres edi-ciones: una edición Estándar para desarrolla-dores profesionales, una edición Académicapara estudiantes y profesores, y una ediciónExpress de uso gratuito para aficionados yusuarios ocasionales. Cada licencia de las edi-ciones Estándar y Académica permitirá la dis-tribución ilimitada de copias de los subsiste-mas CCR (Concurrency & Coordination Runti-me) y DSS (Decentralized Software Services).

Para más información sobre MicrosoftRobotics Developer Studio 2008, visitehttp://www.microsoft.com/robotics.

Microsoft presenta Robotics Developer Studio 2008

Bajo este lema, Microsoft Ibérica lanzauna campaña de promoción a las certi-ficaciones para sacar el MCTS, MCITP,MCPD, MCDST, MCBMS, MCSA yMCSE. Se sortearán móviles HTCS730 y un impresionante Saab 9-3Sport Sedan Biopower.

Si lo necesita, puede realizar loscursos oficiales en cualquiera de los 30centros CPLS (Certified Partners forLearning Solutions) de España. dot-NetManía participa junto con Alham-bra-Eidos como centro CPLS y comocentro examinador, y puede obtenermás información en http://www.for-maciontic.com.

Para información general y de otroscentros, visite: http://www.micro-soft.com/spain/certificaciones.

Papiroflexia con mi CV, ¡NO!

Microsoft anuncia nuevos servicios online.

El pasado día 17 de noviembre, StephenElop, presidente de la división de negociode Microsoft, anunció la disponibilidad deMicrosoft Exchange Online y MicrosoftSharePoint Online para negocios de todoslos tamaños en los Estados Unidos. Estosservicios de suscripción ofrecen a los nego-

cios una nueva vía para adquirir, desplegary gestionar las soluciones líderes del merca-do de correo electrónico, calendario, porta-les y colaboración. “Los clientes están abra-zando nuestra estrategia de Software + Ser-vices masivamente debido a la flexibilidadque ésta les ofrece”, dijo Elop.

Las empresas pueden probar o comprarlos nuevos servicios en http://www.micro-soft.com/online. Como parte de la fami-lia Microsoft Online Services, ExchangeOnline y SharePoint Online pueden adqui-rirse por separado o como una suite, con-juntamente con Office Live Meeting paraconferencia, y Microsoft Exchange Hos-ted Services y Microsoft Office Com-munications Online para la mensajería ins-tantánea y control de presencia.

Disponibles Exchange Online y SharePoint Online

Stephen Elop presentando MicrosoftExchange Online y Microsoft SharePoint

Online a clientes y partners

Por quinto año consecutivo, Microsoft eligió la ciu-dad de Barcelona para la celebración de Tech-EdEMEA Developers 2008, sin duda el evento tec-nológico más importante de la compañía en laregión EMEA (Europa, Oriente Medio y África).Durante cinco días, del 10 al 14 de noviembre, másde 3.000 desarrolladores se dieron cita aquí paraconocer de primera mano las novedades en las tec-nologías Microsoft, con las intenciones centradasen mejorar la experiencia del desarrollador: cons-

truir mejores aplicaciones, más rápidamente. Conese objetivo central, se llevaron a cabo unas 240breakout sessions y 80 sesiones interactivas; además,a lo largo de toda la semana funcionaron 30 estandspara preguntar a expertos y más de 40 mostrado-res de patrocinadores.

Un año cargado de novedadesLlegando este año el Tech-Ed con la resaca de la PDCde Los Ángeles (sobre la que informó el mes pasadoa los lectores dotNetManía), las expectativas noshacían presagiar que éste no iba a ser un evento congrandes primicias. Y así nos lo confirmó Matt Car-ter, Group Product Manager de la División de Desa-rrollo de Microsoft, que nos hizo un avance de lasnoticias y nos explicó lo qué está haciendo Microsoftpara hacer más fácil la vida del desarrollador, en unasesión previa a la keynote capitaneada por Jason Zan-der, General Manager del equipo de Visual Studio,también de la División de Desarrollo.

Una buena parte de las sesiones fueron réplicas (oal menos un eco) de las muchas novedades que se hananunciado a lo largo de este año. De todas ellas, JasonZander resaltó cómo Microsoft está simplificandoradicalmente el día a día del desarrollo, con entregas

Tech-Ed EMEA 2008

eventos

<<

event

os

Jason Zander durante la keynote que inauguró Tech-Ed 2008

Magda Teruel

Magda TeruelesTeam Leader de

Raona. Magda Terueles MCPD Windows

Developer.http://www.magda.es

dotN

etM

anía

<<

8

dnm.directo.eventos<<

como el Service Pack 1 (SP1) de VisualStudio 2008 y el SP1 de .NET Frame-work 3.5, así como la próxima publicaciónde Visual Studio 2010 y .NET Frame-work 4.0. También anunció, refiriéndosea VSTS 2010, nuevas aplicaciones y herra-mientas modeladas bajo Security Deve-lopment Lifecycle (SDL) que permitirána los desarrolladores de software crear apli-caciones más seguras y fiables.

Innovación Muchas fueron las tecnologías y nove-dades que tuvieron un papel importan-te durante esta edición del Tech-Ed2008.

Novedades en Visual Studio

Una pieza clave durante la semanafue sin duda VSTS 2010, diseñado (enpalabras de Zander) “para simplificar ymejorar la experiencia diaria de millo-nes de desarrolladores”. Para ello seincorporará a esta próxima versión:

• Soporte para Windows 7, facili-tando la integración de tecnologíastan sofisticadas como las interfacesde usuario multi-touch.

• Soporte para Microsoft OfficeBusiness Applications, incluyendoSharePoint.

• Editor basado en WPF, que llegaráa un nivel de insight hasta ahora des-conocido.

• Inversión en C++, para dar sopor-te a nuevas tendencias como la com-putación paralela, cloud computing olos servicios Web.

Novedad sin duda destacable y desta-cada de este nuevo IDE son los llamados“Lab Management”, que gracias a unamejor colaboración entre los equipos dedesarrollo y de pruebas permitirán a los

grupos de trabajo, a través de un procesode aseguramiento de la calidad, incre-mentar la eficiencia, entregar aplicacio-nes de mayor calidad y reducir costes.

Numerosas fueron las sesiones des-tinadas a evaluar y presentar éstas y otrascaracterísticas. Especialmente intere-sante estuvo la ofrecida por Brian Harrysobre Team Foundation Server, “TFS:How we use it at Microsoft”, donde nosreveló la utilización que hace el propioequipo de desarrollo de Visual Studiode este entorno. A Brian Harry tuvimosla ocasión de entrevistarlo para dotNe-Manía, y nos explicó lo entusiasmadoque está todo su grupo con esta nuevaversión de la herramienta.

Seguridad hoy, seguridad mañana

Otra de las novedades importantesanunciadas en el Tech-Ed que merecenuestra atención son las mejoras en lasherramientas que se están creando paraque los desarrolladores puedan crear

aplicaciones mucho más seguras. Parallegar a ello, Microsoft está extendien-do sus propias prácticas de SDL a clien-tes y partners, con la publicación de tresnuevas herramientas:

• SDL Optimization Model, una des-carga gratuita que facilita la implan-tación de SDL en empresas de desa-rrollo fuera de Microsoft, de formaconsistente y con bajo coste.

• SDL Pro Network, una red de nue-ve consultoras especializadas enseguridad de aplicaciones, que guíay da soporte a organizaciones a lahora de implementar SDL en susentornos.

• Microsoft SDL Threat ModelingTools (beta), una herramienta gra-tuita que permite a los desarrolla-dores identificar y mitigar rápida-mente problemas potenciales deseguridad, con una metodologíaque cualquier arquitecto de soft-ware puede llevar a cabo de formaefectiva.

Michael Howard, Principal SecurityProgram Manager, Security Engineering& Communications Group en Microsoft,a quien también entrevistamos para dot-NeManía1 , presentó alguna de estasherramientas en su sesión “How I Lear-ned To Stop Worrying And Love Thre-at Modeling”.

1 Estas entrevistas irán apareciendo en la revista en próximos números.

Pierre Liautaud, vicepresidente de Microsoft Western Europe Actuación de DJs antes de la primera keynote

dotN

etM

anía

<<

9

dnm.directo.eventos<<

Silverlight 2.0

Otra constante en todo el evento fue la graninversión de Microsoft en el área de la experienciade usuario (UX), y en concreto su gran apuesta parael mercado de desarrollo de aplicaciones online:Silverlight 2.0. Podemos destacar aquí el soportemultiplataforma (compatibilidad para Mac OS X,Windows y Linux, así como los navegadores Fire-fox, Safari e Internet Explorer). En esta versión,además, han mejorado la escalabilidad del servidor,el soporte extendido a anunciantes y el soporte paracomunidades de código abierto.

Desbancar la hegemonía de Adobe Flash no esfácil, pero son muchas las ventajas que ofrece Silver-light frente a la competencia. Ejemplo de ello fue lasesión impartida por Miguel Jiménez, “ImprovingSilverlight UX without out-of-the-box controls”, enla que hizo una demostración de las capacidades queofrece Silverlight, combinado con herramientas inno-vadoras como Expression Blend, con vistas a alcanzaruno de los objetivo del Diseño Centrado en el Usua-rio, el Diseño Emocional.

Windows 7

En esta edición del Tech-Ed hemos podido com-partir con Microsoft una versión pre-beta de Windows7, el nuevo sistema operativo en el que trabaja la com-pañía y que extiende las inversiones de los desarrollado-res en Windows Vista, alentándoles a la creación de nue-vas aplicaciones para la plataforma Windows.

Según lo presentado estos días, cuando se lance almercado, Windows 7 hará posible:

• Trabajar de la manera que quieras, con un ren-dimiento idóneo y las características de fiabilidady seguridad que espera el usuario; Windows 7 hasido diseñado para ser compatible con el mismohardware, aplicaciones y dispositivos que utilizaWindows Vista.

• Hacer las tareas diarias más rápidas y senci-llas, racionalizando y simplificando las tareas quelos usuarios llevan a cabo más a menudo. Win-dows 7 permitirá una capacidad de navegaciónmejorada, con una nueva barra de tareas y unainterfaz más racional. Y conjuntamente con Win-dows Live, ayudará a los usuarios a estar conecta-dos con otros usuarios.

• Hacer posibles nuevas cosas, a través de máscapacidades de interacción de los usuarios con susordenadores a través de herramientas táctiles, yobteniendo más de los dispositivos que se usan amenudo en combinación con los PC, como cáma-ras, teléfonos e impresoras.

Desarrollo en la nube

La plataforma de servicios Windows Azure, queMicrosoft ha anunciado recientemente, también estu-vo presente en esta edición del Tech-Ed. Supone unaapuesta líder de Microsoft para ayudar a los desarro-lladores a construir la siguiente generación de aplica-ciones, que viajarán desde la nube a los centros dedatos empresariales y ofrecerán nuevas y convincen-tes experiencias a través del PC, la Web o el teléfono.

Gran lección la impartida sobre este tema por elmaestro David Chappel, “An Overview of the AzureServices Platform”, que sin duda hubiera lucido másen el auditorio. En ella nos presentó a cloud computingcomo “el mayor cambio que va a golpear la industriaen muchos años”. Es de destacar como aspecto impor-tante de este cambio la proliferación de plataformasque permitan a los desarrolladores crear aplicacionespara la nube. Para ello, los distintos IDE de Microsoft,y especialmente VSTS, se están preparando para habi-litar la creación de proyectos de este tipo.

Adiós Barcelona, hola BerlínComo resumen, debo decir que, a pesar de las pri-meras expectativas, fue una semana cargada de nove-dades, de material, de noticias, de estands y de profe-sionales, lo que nos permite bautizar este Tech-Edcomo el evento más importante a nivel europeo paradesarrolladores de software de tecnologías Microsoft,que no ha dejado insatisfecho a nadie.

Al finalizar el evento, se anunció que la próximaedición del Tech-Ed EMEA se traslada a Berlín, Ale-mania, y sin duda alguna será la próxima gran citaeuropea. Allí nos veremos, con el permiso de la PDC,el primo segundo americano que amenaza con pre-sentarse también el año próximo.

“VSTS 2010 ha sido diseñado parasimplificar y mejorar la experiencia

diaria de millones de desarrolladores”Jason Zander

Marino Posadas

Marino Posadas esredactor jefe de ddot-NetMania y software

arquitect de Alhambra-Eidos. Es MCP, MCSD,MCAD, MCT y MVP

en Visual C#.Puede consultar su

página Web enwww.elavefenix.net

entrevista

entrevista a Josh HolmesPoco antes de la publicación de la versión definitiva de Silverlight 2.0,Josh Holmes, uno de los principales divulgadores de esta tecnología,pasó por Madrid con motivo de una gira que hacía por toda Europa parahablar de las características del producto y de las buenas prácticasrecomendadas en el ciclo de desarrollo de aplicaciones Silverlight.Tuvimos ocasión de entrevistarlo en Microsoft Ibérica, y nosacompañaban César de la Torre y David Salgado.

Josh, ¿puedes, siguiendo el ritualhabitual de estas entrevistas, pre-sentarte a ti mismo y comentarnoscuál es tu labor actual y futura en loconcerniente a Silverlight?

Por supuesto. Mi nombre es JoshHolmes y soy arquitecto especializadoen experiencia de usuario, radicado enMichigan, y trabajo para Microsoft comoevangelista. Mis responsabilidades abar-can 18 estados, y hago consultoría acer-ca de esas tecnologías: WPF, Silverlight,etc. Desde un punto de vista arqui-tectónico suelo hablar de cómo integrarmás eficientemente los back-ends de for-ma que los elementos de la interfaz deusuario tengan un rendimiento óptimo.Igualmente es importante comprenderel contexto del usuario, que no es el mis-mo si éste utiliza un ordenador de sobre-mesa que un portátil, una PDA, etc., ynecesita un nivel de detalle distintodependiendo de esas circunstancias.Creo que este es un mensaje importan-te para todos, porque todos somos tam-bién usuarios y tenemos que tener cla-ros estos conceptos, tanto en el diseñocomo en el desarrollo. Esa es la idea deesta gira. Es la primera vez que estoy enEspaña, pero no en Europa, ya que hetenido antes la oportunidad de hablarante audiencias muy interesantes en Ale-mania, Suiza, Suecia y también en Lati-noamérica.

¿Crees que los programadores tie-nen las mismas necesidades aquí queen EE.UU. u otros lugares donderealizas tu labor?

Lo que creo es que tienen queafrontar los mismos retos en todas par-tes. Y para mostrar la solución a esosproblemas, llevo conmigo un conjuntode demos muy variadas: desde juegoshasta un simulador de efectos físicos(physics engine). Pero es solo una parte,porque eso no resuelve los problemasde negocio. Y eso es lo que la audien-cia solicita. Así que, después de todo,las preguntas son idénticas a las que mehace la gente en EE.UU.: ¿Cómo apli-co todas estas características a la cons-trucción de una aplicación real? ¿Y cuá-les son las diferencias que tengo que

tener en cuenta con respecto a las apli-caciones WPF o Windows Forms, oASP.NET? Eso es lo fundamental.¿Tú esperas que Silverlight supon-ga un antes y un después en la for-ma en que hacemos aplicacionespara la Web?

Bueno, me he apostado el cuello eneso… así que la respuesta es sí. Real-mente, va a revolucionar el cómo pen-samos las aplicaciones. Y no solo en lotocante a la riqueza visual. No se tratade cómo lleno este formulario y quépasa en el proceso, sino de todo un nue-vo lenguaje visual que ofrezco al usua-rio. Cualquier entrada de datos cam-biará radicalmente, porque hay esce-narios en los que el lenguaje visual tie-ne tremendas ventajas. Imagina la des-cripción de un accidente. Con Silver-light puedes usar una aplicación quetenga los elementos necesarios (gráfi-cos de la carretera, vehículos, etc.) ydibujar literalmente el escenario, recre-ando la situación del accidente con másclaridad que la que podrían tener 1000palabras, ya sabes.Respecto al abordaje de la arquitec-tura, ¿es tan importante tener elescenario bien definido en Silver-light como lo es para resto de apli-caciones ASP.NET o WindowsForms? Entiendo que sí…

Es fundamental que las aplicacio-nes Web tengan claramente estableci-do el papel que juegan los elementos deservidor, igual que los de cliente. Y Sil-verlight es otro tipo de aplicación Web.

dotN

etM

anía

<<

11

dnm.directo.entrevistas<<

Josh Holmes y Marino Posadas en un momento de la entrevista

Creo que Silverlight va a revolucionar el cómopensamos las aplicaciones. Y no solo en lo

tocante a la riqueza visual

Y tratar de evitar el “spaghetti code” enla parte del cliente es muy importante,por supuesto.

Por otro lado, las personas que seacercan a Silverlight pueden venir deambos lados: de construir aplicacionesWeb o aplicaciones de escritorio, y enambos casos hay un montón de cosas quecambian y/o deben de tenerse en cuen-ta, a veces triviales, como la presencia deun botón “Refrescar” y las implicacio-nes de permitir su uso, o más profundascomo los mecanismos de almacena-miento y recuperación del estado de lasaplicaciones. Puede ser del lado del clien-te o del servidor, pero podrían darsesituaciones híbridas de ambas situacio-nes en la misma aplicación.

Incluso aspectos como el acceso yla gestión de recursos de la aplicaciónpueden cambiar notablemente respec-to a la forma en que se hacen en apli-caciones ASP.NET. Otros factores fun-damentales tienen que ver con las cone-xiones con servidores de datos y la for-ma en que estos datos son pasados alcliente, o con el hecho de que una apli-cación puede tener (igual que las apli-caciones de escritorio) un tamaño de

varios megabytes y no quiero que elusuario tenga que esperar todo esetiempo de descarga hasta tener una pre-sentación inicial. Hablamos de aplica-ciones reales, por tanto estas conside-raciones son críticas, fundamentales.En este caso, habrá que aplicar lo quellamamos “partición de las aplicacio-nes”. Y eso supone diseñar la aplicaciónde forma que solo maneje los bits estric-tamente necesarios.Y los modelos de visualización…

Exactamente, si vas a usar el mode-lo Vista-Controlador o el Vista-Pre-sentación, que incluso pueden convivirperfectamente, el primero más centra-do en el lado del servidor y el segundo,más apropiado para el lado del cliente.Y esto puede ser especialmente impor-tante en ciertos escenarios, como lainformática móvil. Ahora que hablas de eso, ¿vamos adisponer de una versión de Silver-light que funcione en dispositivosmóviles?

La idea es que sea así, y de hecho,en el pasado PDC, Nokia anunciabaalgo al respecto, si bien van a rehacer-lo, por que el anuncio iba sobre sopor-

te para Silverlight 1.0 y sus propiosclientes les dijeron que eso no les inte-resaba. El problema es que la interpre-tación de JavaScript en el teléfono con-sume muchos recursos de memoria yCPU. Y además, nadie quiere progra-mar en JavaScript teniendo C# o VisualBasic .NET, o lenguajes dinámicoscomo IronPython, que a mí me gustamucho.Sin embargo el soporte de Symbianes oficial, junto al de WindowsMobile, claro.

Y se dice que en general de cual-quier sistema operativo capaz de sopor-tar el CoreCLR, aunque habrá que vercómo paulatinamente los fabricantesdan soporte a esto en sus nuevas ver-siones. Esto son decisiones de los fabri-cantes, porque –por ejemplo- iPhoneno soporta Flash Lite.¿Y qué puedes decirme sobre el temadel soporte de accesibilidad, queparece que está muy mejorado?

Es que, realmente, no había ningúnsoporte en la versión 1.0. Aquí las cosasson totalmente distintas. Ahora haysoporte completo de teclado, cada ele-mento XAML dispondrá de elementosrelacionados con accesibilidad, la pro-gramabilidad de los controles, soportede lectores de pantalla, automation, plug-ins de UIE (User Interface Engineering)y varias cosas más. Y hay varias pro-puestas para seguir añadiendo nuevasfacilidades para la accesibilidad en elfuturo.En la actualidad, el acceso a datoscon Silverlight debe abordarsemediante servicios y existen 4 opcio-nes posibles: servicios Web SOAPtradicionales, servicios WCF, servi-cios REST y ADO.NET Data Ser-vices. ¿Puedes darnos tus recomen-daciones al respecto?

Yo añadiría también la posibilidadde acceso a ficheros locales, en los queel usuario, a través de la caja de diálo-go de selección de ficheros escoge unfichero local, y el stream con el conte-nido va directamente a la aplicación Sil-verlight, sin pasar por el servidor. Des-

dotN

etM

anía

<<

12

dnm.directo.entrevistas<<

dotN

etM

anía

<<

13

dnm.directo.entrevistas<<

de el punto de vista de los servicios, soyun gran partidario de REST, aunqueesto depende realmente de tu organi-zación. Astoria (ADO.NET Data Ser-vices) también ofrece una capa muy ele-gante para acceso a datos con un sopor-te genial, y que se programa de una for-ma muy fácil. SOAP puede tener sen-tido cuando hablamos de largas corpo-raciones donde hay transacciones yen-do de un lado a otro, y WCF es per-fecto para otros tipos de escenarios don-de el contrato es fundamental, etc.

Al final, depende exactamente delescenario donde vayas a implantar. Enmi caso, siempre me planteo: ¿puedohacer esto con REST? Si la respuestaes no, entonces busco otra de las alter-nativas.Otro de los problemas sobre los quese pregunta la gente tiene que vercon la pérdida de visibilidad para losrobots buscadores de informaciónen la Web. ¿Cómo se va a resolvereso?

Lo primero que debemos tener encuenta es que ahora estamos hablandono tanto de sitios Web, como de apli-caciones. Y éstas no necesitan ser inde-xadas en modo alguno. No es necesa-rio. Solo tiene sentido en los sitios Webenriquecidos con elementos Silverlight,pero éstos se pueden indexar de igualforma, porque la información necesa-ria va a estar en los metadatos. El vídeoo la imagen no los puedes indexar. Real-mente, una Web bien diseñada podráser indexada correctamente. Y además,el fichero XAML es el único que con-tiene información ordenable y está entexto plano, después de todo. ¿Hay alguna consideración desde elpunto de vista de la seguridad quequieras resaltar de cara al desarrolla-dor y/o analista, en comparación lasaplicaciones ASP.NET, por ejemplo?

Desde el punto de vista de la ejecu-ción en cliente, Silverlight es muchomás seguro que ASP.NET, ya que sebasa en la ejecución en una sandbox, yeso es terreno ganado. La aplicación nopodrá tocar el registro, ni acceder al sis-

tema de ficheros más allá del canalexclusivo del Almacenamiento Aislado,y eso es una garantía de tranquilidad.Pero sí habrá servicios que se expondránen el servidor, y ése es el lado de la segu-ridad donde habría que hacer más hin-capié. Aunque incluso si existen datosen la aplicación que deban viajar enmodo seguro, tenemos las opciones decanales seguros que ofrece WCF. Esta pregunta va dirigida a César dela Torre, que nos acompaña. Túestás relacionado con los programasde adopción temprana por parte de

las empresas. ¿Qué va a suponer estoen la práctica?

Tenemos varios tipos de programasde adopción temprana. Hay uno nuevo,llamado “Metro”, que el año pasado erasolamente para ISV, pero que este añoestá abierto igualmente a clientes, y ya sehan hecho algunos proyectos piloto.Cualquiera que esté implicado en un pro-yecto que utilice una de estas tecnologíaspuede acceder a las ventajas del progra-ma, que incluyen soporte oficial y acce-so a formación sobre el producto, entreotras ventajas.

Arquitectura y desarrollo de aplicaciones RIA con Silverlight 2.0

Josh Holmes, RIAArchitect Evangelist deMicrosoft, participócomo ponente princi-pal en el evento “Arqui-tectura y desarrollo deaplicaciones RIA conSilverlight 2.0” organi-zado por MicrosoftIbérica el pasado mesde octubre en Madrid,una escala más de unagira a nivel europeo.

En su ponencia “Developing RIAs with Silverlight 2.0” —de cerca detres horas de duración— Josh explicó en qué consisten estas nuevasaplicaciones, así como las características de la nueva versión de Sil-verlight y las buenas prácticas recomendadas en este tipo de aplica-ciones. La reunión terminó con un laboratorio coordinado por per-sonal de Microsoft Ibérica (César de la Torre, Isabel Gómez yDavid Salgado).

Josh es ponente habitual tanto en USA como en el resto delmundo en eventos como VSLive, Software Development Expo, BAS-TA! y Rich Web Experience, centrándose siempre en tecnologíasemergentes, diseño de software y desarrollo, haciendo especial hin-capié en RIA y movilidad. Centra su trabajo en el desarrollo y for-mación de clientes y partners relacionados con las aplicaciones RIA.

Josh Holmes en momento de su exposición en el evento “Arquitecutra y desarrollo de aplicaciones

RIA con Silverlight 2.0”.

Durante la recién finalizada Professional Developers Conference(PDC), Microsoft desveló bastantes detalles acerca de algunas delas tecnologías más relevantes que la empresa lanzará durante lospróximos meses y años. Algunas de estas novedades van dirigidasal gran público, como por ejemplo Windows 7 y Office 14, mien-tras que varias otras tienen como público objetivo a los profesio-nales de la industria del software. En este segundo grupo podemosencontrar, entre otras, una nueva versión del lenguaje C# (C# 4.0),así como de .NET Framework (.NET 4.0) y del entorno de desa-rrollo Visual Studio (Visual Studio 2010). Al margen de estas nue-vas versiones de “viejos conocidos” para los lectores de dotNet-Manía, nos encontramos con otras tecnologías completamentenovedosas en el panorama del desarrollo sobre plataforma Micro-soft, como son Windows Azure, un sistema operativo basado enservicios en la nube, y Oslo, la nueva visión de Microsoft para arqui-tecturas orientadas a servicios (SOA). Precisamente a presentar losfundamentos de esta última tecnología está dedicado este artículo.

Oslo y el desarrollo basado en modelos (MDD)Oslo es el nombre en clave para la primera oleada de tecnologíasque constituirán la nueva plataforma de modelado de Microsoft, la

Poniendo rumbo a Oslo… Sin perder el norte en nuestros desarrollos

Miguel Llopis es Softwa-re Development Engi-neer in Test (SDET) enel equipo de Oslo en

Microsoft Corporation.Puede encontrar más

información o contactarcon él a través de algu-

no de sus blogs:http://www.geeks.ms

/blogs/mllopis(en español) o

http://blogs.msdn.com/mllopis

(en inglés)

El anuncio oficial de Oslo yde sus primeras versionespúblicas fue uno de losacontecimientos másdestacados de la recien -temente celebrada PDC deMicrosoft. Oslo es elnombre en clave para laprimera oleada detecnologías de Microsoftorientadas a revolucionar elciclo de vida de nuestrasaplicaciones en lospróximos años mediante laadopción de un paradigmabasado en modelos. En esteartículo podrá encontraruna primera aproximaciónal paradigma basado enmodelos, así como unadescripción de alto nivelsobre cada uno de loselementos clave quecomponen esta nuevatecnología.

firma

Miguel donará los ingresos generados por este artículo a laasociación Nuevo Futuro, cuya labor consiste en la creaciónde hogares de acogida de ambiente familiar para niños y jóve-nes carentes de un núcleo afectivo. Actualmente, disponen demás de 90 hogares de acogida distribuidos por varias ciuda-des españolas, así como en otros países. Para más información:www.nuevofuturo.org.

Firma solidaria

Miguel Llopis

cual permitirá la adopción de un para-digma dirigido por modelos en nuestrosdesarrollos. ¿Qué ganaremos adoptandoMDD (Model Driven Development) ennuestros desarrollos? Pensemos en nues-tro trabajo diario y en la elevada com-plejidad de tareas como el análisis de pro-cesos, su abstracción y la creación de apli-caciones que den soporte a los mismos.Se trata de tareas complejas, puesto queinvolucran a diferentes roles dentro de laempresa (analista de procesos, arquitec-to de software, desarrolladores, etc.), rolesque además “hablan distintos idiomas”en la mayoría de los casos. Y sobre estasituación un tanto caótica, consideremostambién tareas como la monitorizaciónde nuestras aplicaciones una vez desa-rrolladas, la creación de planes de migra-ción o de ampliación (escalado), las cua-les involucrarían a otro rol fundamentalen nuestra empresa: los “IT Pro”.

Hasta el momento, hemos tratado demitigar este problema mediante el uso demodelos o abstracciones de la realidad:diagramas de casos de uso, secuencia,colaboración, representaciones de laarquitectura de nuestras aplicaciones, dia-gramas UML… tan solo por citar algu-nos ejemplos. Sin embargo, todos estosmodelos no han dejado de ser una meraabstracción estática: un gráfico dibujadosobre el papel o almacenado en algúnrecóndito lugar de nuestro disco duro,mientras que la complejidad de nuestrosdesarrollos crecía de forma directamen-te proporcional al número de modelosque empleábamos para representarlos, ytoda esa información resultante del mode-lado permanecía aparcada, olvidada, cuan-do nos adentrábamos en la fase de desa-rrollo de nuestros proyectos.

Un enfoque que permitiría simplifi-car el proceso y aprovechar mejor esasingentes cantidades de información repre-sentada en modelos sería disponer de unespacio común donde almacenar toda esainformación relativa a nuestros proyec-tos, ser capaces de modelar dicha infor-mación haciendo uso de un nivel de abs-tracción que estuviera un escalón porencima del nivel actual, de modo quetodos los roles técnicos y no técnicosimplicados en el proceso fueran capacesde comprender estos modelos, y ademásproporcionar una gran cantidad de herra-mientas intuitivas y adaptadas para cadauno de estos roles, de forma que todos

ellos pudieran interac-tuar (consultar, modi-ficar) esta informacióny, en definitiva, comu-nicar de forma unívocauna misma verdad através de diferentes idio-mas. Oslo hace posibleeste enfoque.

Los tres factoresclave en los que gana-remos considerable-mente adoptandoMDD son:

• Transparencia: alcentrarnos en el usode modelos que reflejen qué queremosconseguir, dejando un tanto de ladocómo conseguirlo (abstrayendo dichatarea y dejándola en manos de capasinferiores), conseguiremos una mayorclaridad a la hora de entender las apli-caciones que estamos construyendo.

• Flexibilidad: gracias al uso de herra-mientas visuales, cualquier personapodrá modificar en cuestión de segun-dos la lógica de nuestra aplicación, ydichos cambios serán automáticamen-te visibles para el resto de roles impli-cados en el proceso. De esta forma esta-remos dotando de mayor flexibilidady agilidad a nuestros desarrollos, unode los objetivos clave perseguidos enlas arquitecturas orientadas a servicios.

• Productividad: seremos capaces dealcanzar los mismos resultados de unaforma más simple y rápida. “Más esen-cia y menos ceremonia”.

La adopción de un nuevo paradig-ma basado en modelos podría “asustar”a más de uno; no obstante, no se tratade una ruptura con los mecanismos queactualmente empleamos, sino más bienuna evolución natural de todos ellos. Alo largo de los últimos años, hemospodido observar una evolución en laplataforma Microsoft hacia contenidosde tipo declarativo, una tendencia quese inició ya en tiempos de COM y elconcepto de transacciones, y se ha vis-to confirmada en plataforma .NET demuy diversas formas, desde el uso dearchivos de configuración hasta el usode XAML (un lenguaje de tipo decla-rativo) en WPF, pasando por la crea-ción de contratos de servicios, etc. En

la figura 1 podemos apreciar la evolu-ción temporal hacia una creciente pre-sencia de contenido declarativo ennuestros desarrollos.

Adicionalmente, nos encontramosen la plataforma Microsoft con algunastecnologías que ya hacen uso de unaarquitectura similar a la de Oslo (DSLtextual, diseñador visual y definición dela aplicación almacenada en base dedatos). Tal es el caso de MOSS 2007,el cual hace uso de CAML como DSLtextual, de SharePoint Designer comoherramienta de diseño visual, y deDynamics, con su lenguaje X++ y sudiseñador MorphX.

Arquitectura de OsloLos elementos que componen la arqui-tectura de Oslo son fundamentalmentetres: un nuevo lenguaje para la creaciónde modelos (M), una herramienta visualde modelado “para todos los públicos”(Quadrant) y un repositorio de tipo rela-cional donde podremos almacenar mode-los (SQL Server).

La figura 2 muestra la manera enque estos tres componentes básicos serelacionan entre sí, junto con losentornos de ejecución actualmentesoportados por Oslo (Dublin,WCF/WF, ASP.NET, etc.). Cabedestacar que la comunicación entrecomponentes de Oslo y entornos deejecución se realiza mediante el inter-cambio de información estructuradaen XML, de modo que otros entornosde ejecución desarrollados por partede terceros puedan ser fácilmentesoportados en el futuro. do

tNet

Man

ía<<

15

dnm.firma<<

Figura 1

dotN

etM

anía

<<

16

dnm.firma<<

El lenguaje M

M es el nuevo lenguaje de modela-do incluido en Oslo; el lenguaje emple-ado para la descripción de los modelosalmacenados en el repositorio. Se tratade un lenguaje de tipo declarativo quenos aporta la posibilidad de crear mode-los y lenguajes específicos de dominio(DSL) de forma textual.

Los modelos expresados en M per-miten definir esquemas y también rea-lizar consultas sobre dominios dedatos estructurados. A pesar de que elpropósito de este artículo no es haceruna presentación exhaustiva del len-guaje M, es necesario puntualizar quela forma en que M se comunica con elrepositorio es compilando estos mode-los a T-SQL. No obstante, no debe-remos confundir el propósito de M,más allá de ser un lenguaje de mode-lado. M no es una tecnología de acce-so a datos como tal, ni mucho menosun reemplazo para T-SQL, sino quese vale de T-SQL como tecnologíasubyacente para el acceso al reposi-torio. Por otra parte, tampoco M esun lenguaje orientado a objetos, care-ce de polimorfismo, métodos virtua-les y otras características propias delos lenguajes OO.

El lenguaje M está en sí mismoimplementado como DSL y, para serestrictos, diremos que M no es tan soloun lenguaje de modelado, sino la base

conceptual de una familia de lenguajesde modelado. Como “dialectos” fun-damentales de M encontramosMSchema (que permite la definiciónde modelos de datos específicos de undominio), MGrammar (que permitela creación de gramáticas para nuevoslenguajes) y MGraph (modelo abs-tracto de datos incluido en M).

Esta familia de lenguajes, como cual-quier otra familia hoy en día, está pre-destinada a crecer en número, de modo

que para cada uno de los entornos deejecución previamente mencionadostendremos un dialecto de M específico,así como una variante de Quadrant parael entorno visual. La figura 3 recogealgunas de estas correspondencias.

Además de ofrecer esta familia delenguajes, Oslo proporciona un entor-no textual de desarrollo, llamado Inte-

llipad. Este entorno contiene una seriede extensiones que permiten un sopor-te completo para M y todos sus dia-lectos. Otra de las características deIntellipad es la posibilidad de traduciren tiempo real de un dialecto de M aotro. La figura 4 muestra el aspecto deIntellipad con tres marcos, cada uno deellos mostrando la definición de unmodelo en uno de los dialectos previa-mente mencionados.

El diseñador QuadrantA pesar de la potencia del lengua-

je M, consideramos necesaria la exis-tencia de un entorno visual desde elque construir modelos. Un entornofácil de utilizar y disponible para cual-quiera de los roles implicados en el pro-ceso, tanto técnicos como no técnicos.

Los modelos dibujados en Qua-drant son automáticamente traducidosa lenguaje M y almacenados en el repo-sitorio. Otra de las características fun-damentales de Quadrant es la elevadacapacidad de personalización en las vis-tas sobre un modelo, que oscilan des-de vistas genéricas hasta vistas perso-nalizadas para cada rol, así como laposibilidad de crear “la vista ideal parala forma en que a Miguel le gusta inte-ractuar con sus modelos”. Esta configu-ración personal constituye en sí mismaun modelo y, como tal, se almacena enel repositorio de modelos. Oslo semodela a sí mismo.

La figura 5 muestra una captura deQuadrant en el modo de edición de unmodelo de revisión de un proceso deRRHH para la contratación de un nue-vo empleado.

El repositorio relacional de modelos

El repositorio de modelos pro-porciona un espacio estable y común atodos los roles para almacenar mode-los. Como comentábamos previamen-te, este repositorio está implementadosobre una base de datos SQL Server2008, beneficiándose de algunas de suscaracterísticas (seguridad, clustering,replicación, informes, etc.) y exten-diendo algunas de ellas en escenariosconcretos, con el fin de proporcionar

Figura 2

Figura 3

dotN

etM

anía

<<

17

dnm.firma<<

un acceso seguro a los modelos perotambién una alta flexibilidad.

Adicionalmente, el repositorioincorpora una serie de modelos de refe-rencia, los cuales representan algunosprocesos de negocio habituales, asícomo escenarios de uso basados en tec-nologías de Microsoft comunes. Estosmodelos son extensibles por parte delos usuarios, quienes también podráncrear y almacenar sus propios modelosdesde cero. El repositorio es capaz de

almacenar esquemas representandomodelos y también instancias de dichosesquemas, representando aplicaciones.

Oslo SDK: primera CTP ya disponibleTras el anuncio oficial de Oslo en laPDC, la primera CTP del SDK deOslo fue hecha pública y está disponi-ble para descarga en el MSDN OsloDeveloper Center [2]. Dicha CTP

incluye todos los elementos descritosen este artículo, con la excepción deldiseñador Quadrant. A lo largo de lospróximos meses, se irán haciendopúblicas nuevas versiones de este SDK,y también dispondremos de una ver-sión preliminar de Quadrant.

En posteriores artículos de dot-NetManía profundizaremos en el usode esta CTP, así como en la presenta-ción de cada uno de los componentesfundamentales de Oslo, mostrandotambién algunos escenarios de uso deOslo sobre los entornos de ejecucióncitados previamente en este artículo.

Adaptando gradualmentenuestros desarrollos a OsloEl objetivo fundamental de Oslo es con-vertir los modelos en un elemento pro-tagonista a la hora de crear, desplegar yadministrar aplicaciones. En este con-texto, entenderemos “modelo” como larepresentación abstracta de un procesode negocio, de una aplicación o, incluso,de un flujo de trabajo.

Como hemos comentado al co -mienzo de este artículo, existe una ten-dencia natural en plataforma Micro-soft hacia la adopción de modelos ytambién un incremento de los conte-nidos de tipo declarativo en nuestrosdesarrollos. Es por ello que un paso enla dirección correcta hacia una adapta-ción gradual para la futura adopcióndel paradigma basado en modelos queOslo propone sería la adopción de tec-nologías como WF, WCF, Dublin, etc.

Tan pronto como hagamos un buenuso de estas tecnologías y comprenda-mos las importantes ventajas que el usode modelos y contenidos declarativosnos proporcionan en términos de pro-ductividad, transparencia y flexibilidad,la integración de Oslo en el ciclo devida de nuestras aplicaciones será tanlógica y natural que sentiremos nohaber podido aprovecharlos muchoantes.

Figura 4

Figura 5

BibliografíaLangworthy D., Lovering B., Box D. “The Oslo Modeling Language”, Addison-Wesley, octubre de 2008.

MSDN Oslo Developer Center: http://msdn.com/oslo.

Microsoft Models Remixed: http://www.modelsremixed.com.

[1][2]

[3]

Alejandro BarreiroMiguel Katrib

A estas alturas, los lectores de dotNetManía debenconocer LINQ (Language INtegrated Query);aquellos que se acercan por primera vez, puedenleer sobre LINQ en [1] y [2]. LINQ provee unmarco de trabajo uniforme lo mismo para traba-jar sobre colecciones de objetos en memoria quecon datos de diversos proveedores de fuentes exter-nas, como es el caso de las bases de datos de MSSQL (mediante LINQ to SQL) y los archivosXML (mediante LINQ to XML). Incluso la for-ma abierta de la arquitectura de LINQ facilita laimplementación de otros proveedores (como yaestán en desarrollo para MySQL, Oracle y Post-gres [4]).

Específicamente, LINQ to SQL es una imple-mentación de un ORM (Object Relational Map-per) que viene integrada de forma fácil de usar enVS 2008 y que crea automáticamente una capaintermediaria de clases, conocidas como clasesde entidad, que hacen el mapeo para trabajar conuna base de datos relacional (para más informa-ción sobre el tema, ver [3]). LINQ to SQL seencarga de manera transparente de transformarlas consultas que se escriben en notación decla-rativa y usando objetos del código (escritas enalgún lenguaje .NET como C# o VB) a consul-tas1 en Transact-SQL (T-SQL), que serán las quese apliquen a la base de datos.

Sin embargo, por ahora VS 2008 solo incluyela capacidad de generar automáticamente estas cla-ses para bases de datos de MS SQL. El objetivo de

este trabajo es mostrar cómo habilitar un provee-dor de datos para usar LINQ con bases de datos deMicrosoft Access y cómo integrar esta capacidad alpropio VS 2008, lo que beneficiaría a un sinfín deaplicaciones cuyas bases de datos más modestas estánen MS Access. Éstas ahora podrán aprovechar lacapacidad que aporta LINQ para integrarse con lalógica de negocio de cada aplicación.

Cómo desarrollar un proveedor LINQpara MS AccessEn las primeras versiones de LINQ, que se ofre-cieron en forma de extensiones a VS 2005, noexistía siquiera un proveedor para interactuar conuna base de datos de Access. Esto se puede veri-ficar definitivamente si se hace reflexión del códi-

LINQ to Access

plataforma.net

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

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

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

cado a la orientación aobjetos y la programaciónen la Web. Es redactor de

dotNetManía.Alejandro Barreiro es estu-

diante de la carrera deCiencia de la Computa-

ción de la Universidad dela Habana y desarrollador

del Grupo WEBOO.

Este artículo describe el desarrollo de una herramienta que permitagenerar de forma automática un mapeo a nivel de objetos de una basede datos relacional (DBML), en este caso MS Access, sobre el que sepodrá posteriormente aplicar consultas LINQ.

public DataContext(IDbConnection con) { if (con == null){throw new A rgumentNullException();

}if (!(con is SqlConnection)) {throw new A rgumentException();

}this.provider = new SqlContext(this,

(SqlConnection) con);this.Init();

}

Listado 1

1 Cuando se dice consulta se está hablando en términos genéricos; es decir, esto involucra también inserciones, borradosy actualizaciones.

dotN

etM

anía

<<

19

dnm.plataforma.net<<

go del constructor de la clase DataContext (listado 1).Note que este código no contempla otro tipo de cone-xión que no sea SqlConnection (que es la clase de cone-xión a MS SQL Server).

Sin embargo, puesto que MS Access permite quese le puedan hacer consultas en T-SQL, se podríaentonces consultar una base de datos en Access si, aligual que como ocurre con LINQ to SQL, se dis-pusiera de un código de mapeo que transformase lasconsultas LINQ a T-SQL, y se aplicara entonceseste T-SQL a la base de datos en MS Access. Perolamentablemente VS 2008 no incluye la capacidadde añadir a un proyecto una conexión a una base dedatos Access, y generar automáticamente a partir desus tablas el código de mapeo, como sí lo hace paraMS SQL.

Una solución para usar LINQ con Access podríaser entonces escribir manualmente las clases de enti-dad del código de mapeo siguiendo un patrón simi-lar al que aplica LINQ to SQL. Sin embargo, es evi-dente que no es práctico hacer manualmente este tra-bajo, sobre todo cuando se trate de una base de datosde relativa complejidad.

A continuación, veremos cuáles son los enfoquesy recursos que se podrían usar para tratar de integrarLINQ con Access.

Convertir una base de datos MS Access a una basede datos MS SQL

Una alternativa obvia de solución podría serconvertir previamente la base de datos de MSAccess a una base de datos MS SQL (para ello sedispone de Microsoft Upsizing Wizard [5], herra-mienta incluida dentro de Microsoft Access). Y porsupuesto, una vez que se tiene la base de datos enMS SQL se puede entonces usar directamenteLINQ to SQL sobre la base de datos transforma-da a MS SQL.

Este enfoque podría ser válido si se quiere traba-jar en LINQ con una base de datos Access estática,es decir, que va a ser consultada pero no va a ser másactualizada, o al menos no a través del propio Access.Es decir, que la migración de Access a MS SQL sehaga una sola vez. Serían entonces las aplicacionesdesarrolladas con LINQ las que se encargarían dehacer futuras actualizaciones en la BD, pero ya enMS SQL.

Adicionalmente a la limitación anterior, esta alter-nativa tiene los inconvenientes propios de la migra-ción, como pueden ser:

• En MS SQL las fechas pueden estar entre el 1de enero de 1753 y el 31 de diciembre de 9999,mientras que en Access las fechas pueden serdesde el año 100 [6].

• No se pueden convertir tablas cuyo nombretenga al menos un apóstrofe [7].

Por otro lado, el asistente Upsizing Wizard noconvierte tablas con grandes volúmenes de informa-ción, debido a que el tiempo de ejecución de la con-sulta de conversión a través de ODBC, utilizada porMS Access para exportar los datos, puede superar eltiempo de espera [8].

Aunque ya existen herramientas como SSW Upsi-zing PRO [9] que verifican la base de datos en bus-ca de estos problemas y ofrecen un informe detalla-do sobre ellos y sugerencias para corregirlos, la apli-cación requeriría de un aburrido trabajo manual parahacer las correcciones; de todos modos, este enfoqueno es aplicable en aquellos casos en los que se quie-re seguir trabajando directamente con Access.

Crear un código de mapeo para acceder directa-mente a la base de datos MS Access mediante T-SQL

Otro enfoque podría ser crear, a partir de una basede datos en MS Access, nuestras propias clases deentidad (como lo hace LINQ to SQL para MS SQL)que sirvan de soporte para transformar las consultasLINQ en T-SQL que se pueda aplicar directamen-te al motor de Access. Para ello, veamos previamen-te cómo trabaja LINQ to SQL:

1. Cuando se añade un objeto de tipo LINQ toSQL a un proyecto VS, extrae la informacióndel esquema de la base de datos, que quedarepresentado en un archivo XML. Este archi-

Es evidente que no es práctico crear manualmente las clases deentidad, sobre todo cuando se trate de una base de datos de

relativa complejidad

dotN

etM

anía

<<

20

dnm.plataforma.net<<

vo XML es conocido comoDBML (DataBase Markup Lan-guage), y cumple con un esque-ma definido mediante un archi-vo XSD [10].

2. Luego se valida si el XML cum-ple con el XSD de un DBML2. Apartir de este DBML se generael código de mapeo en un len-guaje de programación quesoporte el patrón LINQ (comoes el caso de C#). Eso es lo quehace la herramienta de LINQconocida como SQLMetal.

SQLMetal es un utilitario que pue-de usarse desde línea de comandos. Enlas primeras versiones de LINQ, elpropio SQLMetal encapsulaba las dosetapas anteriores. Con la salida de VS2008, este proceso se separó parahacerlo más modular y reutilizable.Ahora hay una herramienta (Extrac-tor DBML) dedicada a extraer la infor-mación de la base de datos, crear unarchivo XML y validarlo. Este archi-vo validado es lo que sirve de entra-da al generador de código (que noes más que una nueva versión deSQLMetal solo para este propósito).

Creando un DBML a partir de una base de datosen MS Access

Lamentablemente, no se ofrece unextractor de DBML a partir de unabase de datos MS Access. El enfoqueque se propone entonces con este tra-bajo es desarrollar una herramienta queinspeccione la base de datos en MSAccess y cree a partir de ahí un DBML,para luego poder darle éste comoentrada a SQLMetal y aprovechar quesea esta herramienta la que genere elcódigo de las clases de entidad parahacer el mapeo.

La primera parte de este trabajo con-siste en representar a nivel de objetos elesquema que cumplen los archivosDBML, o sea su XSD; para ello se utili-za la herramienta XSD Utility que vie-ne con VS 2008 y que genera automáti-camente un fichero .cs con una jerarquíade clases que caracterizan a la base dedatos. La segunda consistirá en recorrerdicha jerarquía e ir creando un objeto detipo Database (tipo base de la jerarquía),que luego será serializado como archivoDBML.

Con el ejecutable xsd.exe se generanentonces los esquemas o archivos de cla-ses. Una de las funcionalidades provistaspor xsd.exe es la posibilidad de, dado unesquema de documento descrito en XML(archivo .xsd), obtener un modelo deobjetos que posibilite la gestión de los

datos a manipular. El diseño seguido enel modelo de objetos generado de estamanera resulta intuitivo, dada su corres-pondencia con la estructura del docu-mento, definida por el esquema. El tipoprincipal será asociado al elemento raíz,similar también en nombre. De estemodo se obtiene la clase Database, comouna representación de la informacióncontenida en un DBML, junto a todo unconjunto de clases representativas de esteesquema.

La figura 1 muestra una representa-ción del esquema de este XSD, dondeexiste un elemento Database, que sería laetiqueta principal del XML, después unasecuencia de elementos Connection, Tabley Function con sus respectivos elementosgenerados por XSD Utility, como semuestra en el listado 23.

2 Realmente esta etapa de validación es innecesaria cuando es LINQ to SQL quien hace la extracción del DBML, pero disponer de esto comomódulo por separado nos es de utilidad para cuando se implemente un extractor personalizado para otra fuente de datos relacional (distinta deMS SQL), como será en nuestro caso para aplicarlo a MS Access.

3 En el listado 2, por razones de espacio, solo se muestran los principales elementos generados.

Figura 1: Representación del esquema de los DBML (XSD)

dotN

etM

anía

<<

21

dnm.plataforma.net<<

Este modelo de objetos es unaestructura arbórea en la que cada ele-mento complejo tiene asociado un tipocuyos atributos y elementos internosse implementan como propiedades.

DBML VisitorPara poder adaptar a otras fuentes dedatos4 el enfoque que aplicamos aquí,se propone un modelo “extensible” deextractor DBML. Este es el objetivode la clase DbmlVisitor que se muestraen el listado 3.

Las diferentes versiones del métodoVisit definen el recorrido sobre el objetoDatabasegenerado a partir del XSD. Cadamétodo verifica que la entrada no sea unvalor null, y si es una secuencia de ele-mentos o etiquetas (tags) opcionales en elXML, se visita a su vez a cada uno de esoselementos. Si uno de ellos es a su vez unarray de elementos, como en el caso delas tablas (que se representan mediante unarray de elementos tabla), se hace lo mis-mo con cada elemento del array.

Como puede verse en el listado 3,primero se visita un objeto de tipo Data-base, y luego sus conexiones, funcionesy tablas. Después, para cada tabla sevisita su Type (que es donde se descri-ben las columnas), sus funciones, y asísucesivamente hasta recorrer toda laestructura del XML. Por tanto, paraextraer la información basta con defi-nir una clase por cada motor de basede datos de la que se quiera hacer unproveedor. Esta clase heredará de Dbml-Visitor y deberá redefinir aquellosmétodos que tengan que añadir unafuncionalidad propia según el sistemade base de datos (MS Access u otros).

DBML ExtractorLa clase DbmlExtractor (listado 4) here-da de DbmlVisitor. Con esta clase seestablece la conexión a una base dedatos Access y se extrae la información.

4 Es decir, realmente toda fuente de datos para la que se pueda establecer una conexión ADO.NET.

public partial class Database {private Connection connectionField;private Table[] tableField;private Function[] functionField;public Connection Connection {get {return this.connectionField;}set {this.connectionField = value;}

}[System.Xml.Serialization.XmlElementA ttribute(“Table”)]public Table[] Table {get {return this.tableField;}set {this.tableField = value;}

}[System.Xml.Serialization.XmlElementA ttribute(“Function”)]public Function[] Function {get {return this.functionField;}set {this.functionField = value;}

}[System.Xml.Serialization.XmlA ttributeA ttribute()]public string Name {get {return this.nameField;}set {this.nameField = value; }

}

Listado 2

public class DbmlVisitor {public virtual void Visit(Database database) {if (database != null) {this.Visit(database.Connection);this.Visit(database.Function);this.Visit(database.Table);

}}public virtual void Visit(Connection data) {}public virtual void Visit(Table[] data) {if (data != null) {foreach (Table t in data)Visit(t);

}}public virtual void Visit(Table data) {if (data != null) {this.Visit(data.Type);this.VisitInsertFunction(data.InsertFunction);this.VisitUpdateFunction(data.UpdateFunction);this.VisitDeleteFunction(data.DeleteFunction);

}}

Listado 3

dotN

etM

anía

<<dnm.plataforma.net<<

En esta clase es donde verdadera-mente ocurre la inspección de la base

de datos que se quiere modelar. Encada uno de sus métodos se extrae

información y se va creando el mode-lo de objetos que la representa.

En nuestro caso, para inspeccionaruna base de datos MS Access se usará eltipo dao.Database.

Como se observa en el listado 4, laclase DbmlExtractor hereda de DbmlVisi-tor y contiene un método Extract querecibe como parámetro la ruta a la basede datos Access. En este método sealmacena una referencia a la estructu-ra de la base de datos a inspeccionar(dao.Database) y se inicializa el objetoque contendrá la información extraída(Database db).

Con la redefinición de los métodosVisit se extrae la información de la basede datos y se van creando los objetosasociados. Así, por ejemplo, en el méto-do void Visit(Database database) se asig-na al objeto Database el nombre de labase de datos; luego se crean los obje-tos de tipo Table a partir de las defini-ciones de las tablas y así se sigue elrecorrido definido por la clase DbmlVi-sitor y se crean todos los objetos aso-ciados a la base de datos.

Creación del DBMLPor último, en la definición de la

clase Database creada por XSD Utilityse incluye un método public virtual

public class DbmlExtractor : DbmlVisitor {dao.Database dao_db;public virtual string GetValidMemberNameFrom(string s) {return s.Replace(‘ ‘, ‘_’);

}public virtual string GetValidDatabaseNameFrom(string s) {if (s == null)return null;

try {return this.GetValidMemberNameFrom(Path.GetFileNameWithoutExtension(s));}catch (Exception) {return s;}

}public Database Extract(string path) {A pplicationClass ac = new A pplicationClass();Database db = null;count = 0;try {ac.OpenCurrentDatabase(path, false, null);dao_db = ac.CurrentDb();db = new Database();Visit(db);

}finally {if (ac != null)ac.CloseCurrentDatabase();

}return db;

}public override void Visit(Database database) {string name = this.GetValidDatabaseNameFrom(dao_db.Name);database.Name = name;database.Class = name;dao.TableDefs tdf = dao_db.TableDefs;Table[] tables = new Table[tdf.Count];for (int i = 0; i < tables.Length; i++) {tables[i] = new Table();tables[i].Type = new Type();

}database.Table = tables;base.Visit(database);

}}

public virtual void Serialize(string path) {XmlSerializer ser =

new XmlSerializer(typeof(Database));StreamWriter writer =

new StreamWriter(path);try {

ser.Serialize(writer, this);}

finally {if (writer != null)

writer.Close();}

}

Listado 4

Listado 5

22

dotN

etM

anía

<<

23

dnm.plataforma.net<<

void Serialize(string path), que semuestra en el listado 5, de modo queuna vez que se tenga el Database creadocon todas sus definiciones se puedaserializar y guardar como archivo .dbml.

Mediante el uso de GuidanceAutomation Toolkit (GAT) [11], esposible crear un paquete y registrar-lo en Visual Studio de modo que sepueda usar esta herramienta como unaopción más de añadir un elemento alproyecto, de la misma forma en quese hace con LINQ to SQL (esto seilustra en las figuras 2-5). El primerpaso es instalar el paquete DBMLToolkit5, para lo cual se cuenta con un

instalador. Luego es necesario habili-tar este paquete en el proyecto; paraello, se hace clic en “Guidance Pac-kage Manager” dentro del menú deherramientas en Visual Studio y sehabilita el paquete, como se muestraen la figura 2.

Una vez instalado el paquete,cuando se seleccione agregar un nue-vo elemento, en la sección de cate-gorías aparecerá la opción “DBML

5 DBML Toolkit podría convertirse en una herramienta que contenga a diferentes extractores como LINQ to Oracle, LINQ to Postgres, etc. Sufuncionamiento sería similar al de LINQ to SQL (una vez instalado) y permitiría agrupar a diferentes extractores en un mismo paquete.

Figura 2: Habilitando el paquete “DBML Toolkit” después de instalado

Figura 4: Asistente para la extracción de datos.

Figura 3: Agregando un elemento del tipo LINQ to Access a VS

Mediante Guidance Automation Toolkit es

posible crear un paqueteque se encargue de lageneración automática

del mapeo

dotN

etM

anía

<<

24

dnm.plataforma.net<<

Toolkit”, dentro de la cual se encontrará un ele-mento del tipo LINQ to Access. Ahí se indica elnombre que se desea para el DBML y se abreautomáticamente un asistente en el que se especi-fica el nombre de la clase que representará a la basede datos y la ruta hacia ella (figuras 3 y 4). Automá-ticamente, se procede a la generación del DBMLy se obtiene la representación de la base de datos,como se muestra en la figura 5.

Conclusiones

De forma general, para crear un genera-dor DBML que represente una base dedatos cualquiera es necesario:1. Usar XSD Utility de Visual Studio

para generar las clases representativasdel esquema definido para los archi-vos DBML.

2. Definir una clase que herede de la claseDbmlVisitor propuesta y redefinir cadauno de sus métodos. En ella se extrae lainformación de la base de datos y se vacreando el objeto de tipo Database.

3. Incluir un método void Serialize(string path) dentro de la definiciónde la clase Database y serializar la clasecon extensión DBML.

4. Finalmente, se añade el archivo DBMLa Visual Studio y se tiene la representa-ción de esta base de datos.

El objetivo de este artículo ha sido ilustrar cómose puede crear una herramienta para generar de for-ma automática el mapeo a nivel de objetos de unabase de datos relacional, en este caso MS Access. Enlas clases de entidad generadas hasta ahora aún no sehan tenido en cuenta las relaciones entre tablas; estoserá abordado en un futuro artículo.

Figura 5: Representación de un archivo DBML

BibliografíaMiguel Katrib y otros, Visual Studio 2008: Desafía todos los retos, Cuaderno Técnico dotNetManía No. 8, Neta-lia 2008, ISBN 978-84-934895-7-1.

Octavio Hernández, C# 3.0 y LINQ, Krasis Press 2007.

Miguel Katrib, Clases de Entidad en LINQ to SQL. dotNetManía No. 48, mayo de 2008.

Jiri George Moudry, DbLinq Project: Linq Provider for MySql, Oracle and PostgreSQL, ([email protected],http://code2code.net/DB_Linq).

How to use Access 2000 Upsizing Wizard ID: 325017 Microsoft Help and Support.

Susan Harkins, Upsizing an existing Microsoft Access database (http://articles.techrepublic.com.com/5100-10878_11-5035130.html).

ACC2002: Tables Not Upsized When Query or Table Name Contains Apostrophe (Microsoft Help and Support) (ID294398) (http://support.microsoft.com/kb/294398/EN-US).

Asistente para convertir a SQL Server falla en datos de tablas grandes que convierte (Microsoft Help and Support)(ID 295231) (http://support.microsoft.com/kb/295231/es).

SSW UpsizingPRO (http://www.ssw.com.au/ssw/UpsizingPRO).

Los usuarios de Visual Studio también encontrarán este archivo XSD en el cuadro de diálogo de Esquemas XML como“DbmlSchema.xsd”. Para utilizar correctamente el archivo XSD para validar un archivo DBML, ver (http://msdn.micro-soft.com/es-es/library/bb882675.aspx).

Octavio Hernández, Guidance Application Toolkit. dotNetManía No. 39, julio-agosto de 2007

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

En este artículo vamos a desarrollar un compo-nente que nos permita acceder a toda la informa-ción de la tarjeta SIM desde una aplicación Win-dows Mobile1.Tristemente, y por desgracia paramuchos, .NET Compact Framework 2.0 ó 3.5 notiene una librería administrada que lo haga. Sinembargo, Windows Mobile posee una API llama-da SIM Manager, que a través de llamadas a códi-go nativo mediante PInvoke, y traduciendo lostipos de datos a enviar y recibir por esas llamadas,nos va permitir realizar las operaciones.

Para ello, vamos a necesitar Visual Studio 2008,C#, el SDK de Windows Mobile 5 ó 6 para cono-cer a fondo el funcionamiento de SIM Manager, yver los ficheros de cabecera de las funciones que con-tiene la API, en MSDN. Para realizar las pruebas,hemos utilizado una PDA HTC P3300 con Win-dows Mobile 5.

PinvokandoPara todos aquellos a los que le suene raro esto dePInvoke, no es más que realizar llamadas desde unensamblado .NET a funciones contenidas en unaDLL que no ha sido desarrollada para .NET (si fue-ra un ensamblado de .NET, bastaría con agregarlocomo referencia en nuestro proyecto). En muchossitios, lo vamos a encontrar como “hacer llamadasdesde código administrado a código no administra-

do”. Esa DLL, en la mayoría de los casos, habrá sidodesarrollada en C++.

Cuando se realizan llamadas a código nativo, elCLR localiza la DLL, la carga en memoria, calculaautomáticamente las referencias a los argumentos ypasa el control a la función no administrada.

Sin irnos tan lejos, cuando nosotros necesitemoshacer llamadas a código nativo a través de PInvoke,lo primero que necesitaremos es conocer el nombrede la DLL, así como la lista de funciones y los pará-metros de las mismas. Posteriormente, deberemoscrear prototipos de funciones administradas querepresentarán a las funciones no administradas, yentonces ya podremos llamar a las funciones comosi se tratara de funciones administradas corrientes.Resumámoslo en una lista de pasos, para que quedemás claro:1. Conocer el nombre de la DLL que contiene la

función nativa que deseamos llamar.2. Conocer el nombre de la función contenida en la

DLL que vamos a llamar desde código adminis-trado, así como sus parámetros.

3. Crear el prototipo de función administrada corres-pondiente.

4. Llamar a la función como si de una función admi-nistrada se tratara.

Los dos primeros pasos, así como el último, sonevidentes. No lo es tanto el punto 3. Cuando se crea

Componente de acceso a la tarjeta SIM en Windows Mobile

plataforma.net

Javier Garrido es Ingeniero Técnico

en Informática deGestión y MicrosoftCertified Professio-nal. Actualmente esprofesor de la Uni-

versidad EuropeaMiguel de Cervantes

de Valladolid.

El acceso a la tarjeta SIM en Windows Mobile es poco habitual, principal-mente porque cuando se introduce en la PDA, Windows Mobile agregaautomáticamente el contenido de la misma a Pocket Outlook. Pero pense-mos que queremos hacer lo contrario, y además desde C#: copiar en unaSIM limpia los contactos y mensajes, administrarla, y capturar a través de call-backs los mensajes que nos envía el sistema.

Javier Garrido

1 Tendremos en cuenta que ya se ha introducido el PIN en la SIM por motivos de espacio, pues aunque existe una funciónde SIM Manager, nos extenderíamos innecesariamente.

dnm.plataforma.net<<

un prototipo de función administrada, nosestamos refiriendo a mapear la funcióncontenida en la DLL externa en una decla-ración de código manejado. Para ello,debemos declarar un método con ciertosmodificadores y asociarle el atributo DllIm-port. En el caso de la API SIM Manager,tenemos una función llamada SimInitia-lize (ver tabla 1). La definición de mapeode esta función sería:

El atributo DllImport aplicado sobre lafunción nos permite aportar la informa-ción necesaria para llamar a una funciónlocalizada en un archivo DLL no admi-nistrado. Como mínimo, debemos sumi-nistrar el nombre de la DLL. En nuestrocaso, las funciones de SIM Manager seencuentran en cellcore.dll. Se puedenestablecer otros parámetros en el cons-tructor de la clase DllImportA ttribute,como por ejemplo el punto de entrada dela DLL (EntryPoint), que nos permite indi-car un nombre diferente para funciónadministrada, y que ésta “apunte” al nom-bre real de la función contenida en laDLL, o por ejemplo el parámetro SetLas-tError, que nos permite establecer que laAPI llamará al método SetLastError. Paraque nos entendamos: si se produce algúnerror interno durante la ejecución de lafunción, podremos recuperar el códigogenerado a través de otra llamada nativaa GetLastError.

Respecto a los modificadores asocia-dos al prototipo de la función, destaca-mos el modificador internal, que hace queeste prototipo sea visible a todo el ensam-blado en el que se encapsula nuestro com-ponente; el modificador extern, que indi-ca que el método se implementa exter-namente; y por último, el modificador

static: definir un método estático cuan-do se utilizan implementaciones externases una restricción. Las funciones exter-nas se mapean como métodos de clase yno de instancia.

SIM ManagerSi nos dirigimos directamente al conteni-do de MSDN, podremos encontrar todala información sobre esta API, incluyen-do las funciones, notificaciones, estructu-ras y constantes de error que nos propor-ciona. En la tabla 1 hemos detallado unadescripción de algunas funciones. Ennuestro caso, estas funciones son las quevamos a necesitar para “pinvokar” al códi-go nativo y de esta forma acceder a la tar-jeta SIM.

Respecto a las estructuras de datos,códigos de error y notificaciones, las ire-

mos viendo poco a poco según vayamosdesarrollando el artículo.

Creando el componenteComo nuestra idea principal es crearun componente de tal forma quepodamos arrastrarlo a nuestros for-mularios de Windows Mobile, vamosa crear una clase en Visual Studio queherede directamente de Component. Amayores, se crearán las enumeracio-nes, delegados y estructuras de datosque se necesiten para la consecucióndel componente.

Para los que nunca hayan creado uncomponente en Visual Studio 2008 para.NET Compact Framework, vamos adetallar los pasos iniciales.

Lo primero, abrir Visual Studio, ylo siguiente elegir el tipo de proyecto,tal y como se muestra en la figura 1.

dotN

etM

anía

<<

27

[DllImport(“cellcore.dll”, SetLastError = true)]

internal static extern int SimInitialize(

uint dwFlags,IntPtr lpfnCallBack,uint dwParam,out IntPtr lphSim);

Función Descripción

SIMCA LLBA CK Prototipo de función de callback que SIM Manager utiliza paraenviar notificaciones. En otras palabras: un delegado para cap-turar los mensajes que envía el sistema.

SimDeinitialize Deinicializa la SIM, o lo que es lo mismo, libera el maneja-dor asociado a la misma.

SimDeleteMessage Función para eliminar un SMS almacenado en la SIM.

SimDeletePhonebookEntry Función para eliminar un registro de la agenda de la SIM.

SimGetDevCaps Función para recuperar las capacidades de la SIM.

SimGetPhonebookStatus Función para recuperar el estado de la agenda de la SIM (posi-ciones utilizadas, total de posiciones…).

SimGetPhoneLockedState Función para saber si la SIM está esperando algún PIN oPUK.

SimGetRecordInfo Función para recuperar la información de un registro parti-cular de la SIM.

SimInitialize Función para inicializar la API. Como en muchas otras API,es necesario primero llamar a esta función para poder utilizarel resto de funciones.

SimReadMessage Función para leer un SMS desde una posición en concreto dela SIM.

SimReadPhonebookEntry Función para leer una entrada de contacto de la SIM.

SimWriteMessage Función para escribir un SMS en la SIM.

SimWritePhonebookEntry Función para escribir un contacto en la SIM.

Tabla 1. Funciones de SIM Manager

Listado 1

Ponemos un nombre a nuestro pro-yecto, en este caso ComponenteSIM, y pulsa-mos el botón “OK”. A continuación,debemos elegir el tipo de proyecto quequeremos desarrollar (.NET CompactFramework Forms, Class Library…). Ennuestro caso, crearemos un proyecto de

tipo Class Library, tal y como se muestraen la figura 2.

Una vez que tengamos iniciado nues-tro proyecto, comenzaremos a introdu-cir el código necesario para crear nues-tro componente de acceso a SIM.

Como norma ge neral, en mi caso,cuando necesito desa-rrollar algo que acce-de a código nativo,siempre creo una cla-se que va a contenertodas las especifica-ciones de llamada a lasfunciones no admi-nistradas. El inconve-niente puede aparecerahora. ¿Cómo crea-mos esas funcionesque acceden a códigono administrado ycómo conocemos lafirma de cada una delas funciones? Pues larespuesta es relativa-mente sencilla. En elSDK de WindowsMobile tenemostodos los ficheros de

cabecera de las funciones. En el caso dela SIM, debemos buscar un fichero lla-mado simmgr.h, que encontraremos en eldirectorio donde tengamos instalado elSDK. Si editamos ese fichero, podemosver los tipos de datos que reciben las fun-ciones, lo que devuelven, las constantescon las que trabaja la API y, por supues-to, los nombres de las funciones. El pro-blema es que esos tipos de datos son tiposusados por la API Win32, tal y como apa-rece en el listado 2 referente a la funciónSimInitialize, cuya descripción se puedever en la tabla 1. Y ésa va a ser una denuestras labores: traducir esos tipos dedatos de la API Win32 a los tipos de.NET Compact Framework.

La traducción sería tal y como apa-rece en el listado 3.

Seguro que muchos de ustedesestarán pensando ¿de dónde ha salido eso?¿Por qué, si la función SimInitializenece-

dnm.plataforma.net<<

dotN

etM

anía

<<

28

Figura 1. Iniciar proyecto Visual Studio

Figura 2. Seleccionar proyecto Class Library

HRESULT SimInitialize(DWORD dwFlags, SIMCA LLBA CK lpfnCallBack, DWORD dwParam, LPHSIM lphSim

);

Listado 2

using System;using System.Linq;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;

namespace ComponenteSIM{internal class FuncionesNativas{[DllImport(“cellcore.dll”,

SetLastError = true)]internal static extern int

SimInitialize(uint dwFlags,IntPtr lpfnCallBack,uint dwParam, out IntPtr lphSim);

}}

Listado 3

dnm.plataforma.net<<

dotN

etM

anía

<<

29

sita un parámetro DWORD, en C# es un uint?Pues de MSDN, así de fácil. En la tabla2 puede ver una referencia a los tipos máscomunes usados en la API SIM Managery su equivalente en .NET, que nos ser-virá de ayuda para entender más a fondoel desarrollo. Según vayamos desarro-llando el artículo, iremos viendo otrasequivalencias.

En realidad, no es tan sencillo, no lesvoy a engañar. No es solo utilizar la equi-valencia de tipos de datos, sino sabercómo tenemos que llamar a esa función.Me explico: es muy común que en las lla-madas a código nativo, lo que se necesi-te sea un puntero a un tipo de dato especí-fico o recuperar un puntero a void (void*),o lo que es lo mismo: un puntero a cual-quier cosa. En función de lo que se nece-site, debemos escribir la definición delmétodo. Volvamos a la definición de SimI-nitialize. Si nos vamos a MSDN o alfichero de cabecera, y estudiamos la fir-ma de la función, vemos que el primerparámetro de la función se utiliza paraestablecer los tipos de notificaciones queva a recibir nuestra clase, y que el segun-do parámetro es un prototipo de funciónSIMCA LLBA CK. Este parámetro es un punte-ro a una función, que será el que utilizaráel sistema operativo para enviarnos lasnotificaciones. Y un puntero a una fun-ción no es más que un delegado con unadefinición concreta. Esa definición no esmás que otra traducción de los tipos dedatos de la API Win32 a .NET. Estasnotificaciones —algunas de ellas se pue-

den ver en la tabla 3— son mensajes queva a enviar el sistema operativo a nues-tra clase.

El componente encapsuladorde SIM ManagerInicialización

Una vez “traducida” la definición de SimI-nitialize tal y como hemos mostrado enel listado 3, lo que tenemos que hacer escrear un prototipo de método que encap-sule la llamada a la función y deposite elmanejador obtenido en un campo priva-do, para que esté disponible para el res-to de los métodos de la clase. El métodoInicializar resultante se presenta en ellistado 4.

La figura 3 muestra el diagrama declase correspondiente al componente quevamos a desarrollar. A continuación, deta-llaremos la implementación de algunosde los demás métodos de la clase. El lec-tor interesado puede descargar todo el

Figura 3. Diseño inicial del componente

public void Inicializar(){try{handleSIM = IntPtr.Zero;int hresult = 0;hresult = FuncionesNativas.SimInitialize(

SIM_INIT_NOTIFICA TIONS.NONE, IntPtr.Zero, 0, out handleSIM);

if (hresult != 0)throw new Exception(“No se ha podido inicializar la SIM”);

}catch (Exception ex){throw ex;

}}

Listado 4

Tipo Nativo Clase Administrada

HA NDLE System.IntPtr

BYTE System.Byte

WORD System.UInt16

LONG System.Int32

DWORD System.UInt32

LPSTR o LPCSTR o LPWSTR o LPCWSTR System.String

FLOA T System.Single

DOUBLE System.Double

Tabla 2. Algunas equivalencias de tipos

Valor Notificación Descripción

SIM_NOTIFY_CA RD_REMOVED La SIM se ha quitado del dispositivo.

SIM_NOTIFY_FILE_REFRESH Los ficheros de la SIM han sido actualizados.

SIM_NOTIFY_MSG_STORED Se ha almacenado un mensaje en la SIM.

SIM_NOTIFY_MSG_DELETED Se ha eliminado un mensaje de la SIM.

SIM_NOTIFY_PBE_STORED Un nuevo registro de contacto se ha agregado en laSIM.

SIM_NOTIFY_PBE_DELETED Un registro de contacto se ha eliminado de la SIM.

Tabla 3. Algunos tipos de notificación enviados por Windows Mobile a SIM Manager

dnm.plataforma.net<<

dotN

etM

anía

<<

30

código fuente del componente del sitioWeb de la revista, www.dotnetmania.com.

Con relación a los parámetros de lafunción, el primero de ellos se utiliza eneste caso para determinar si la clase cap-turará mensajes enviados por el sistemaoperativo. Deberemos pasar el valor 1para que se capturen, y 0 para indicar locontrario. Para que quede más estructu-rado y más claro, he creado una enume-ración con dos valores, como se muestraen el listado 5.

El segundo parámetro de SimInitia-lize se utiliza para especificar el métodoal que se deberá llamar cuando el sistemaoperativo envíe alguna notificación. Si enel primer parámetro hemos pasado un 0,este parámetro debe ser nulo. En casocontrario, deberá ser una instancia dedelegado que apunte a un método. Demomento, vamos a fijar que no nos envíeninguna notificación, pasando IntPtr.Zero.Más adelante haremos los cambios nece-sarios para recibir las llamadas.

El tercer parámetro nos permite espe-cificar un valor que se va a pasar en cadallamada de notificación. Aquí no lo utili-zaremos, y por tanto hemos indicado un0 en la llamada. Y por último, a través delcuarto parámetro nos llegará (observe elmodificador out) el handle o manejadorque identificará a la tarjeta SIM ante elsistema y que necesitaremos en las lla-madas siguientes que hagamos.

Cabe destacar además que normal-mente, todas las funciones de la APIWin32 nos devuelven un valor de retor-no que indica si la llamada ha sido satis-factoria. Como casi siempre, en el casode SIM Manager, si la llamada a la fun-ción ha sido satisfactoria, se nos devuel-ve un valor 0. En caso contrario, lo quese nos devuelve es un código de error; losposibles valores están disponibles tam-bién en MSDN.

Deinicialización

Como es lógico, cuando finalicemos la uti-lización de la SIM, deberemos liberar losrecursos utilizados por el sistema. Para ellodisponemos de la función SimDeinitialize.La definición de esta función se presentaen el listado 6, y nuestro prototipo de fun-ción administrada en el listado 7.

Cuando se necesite deinicializar laSIM, llamaremos a esta función desdeotra que encapsule el código correspon-diente, como se muestra en el listado 8.

Recuperar las capacidades dela tarjeta SIMPara saber cuántos números puede alma-cenar nuestra SIM, o la longitud máximade caracteres para un nombre de un regis-tro en la SIM, disponemos de la funciónSimGetDevCaps. Veamos su definición en elfichero simmgr.h.

HRESULT SimGetDevCaps(HSIM hSim,DWORD dwCapsType,LPSIMCAPS lpSimCaps

);

El primer parámetro a enviar a la fun-ción es el manejador asociado a nuestraSIM, mientras que el segundo paráme-tro se utiliza para decirle a la función quétipo de capacidades queremos obtener.Sus posibles valores los encontramos enMSDN. Como en el resto de los casos,los he encapsulado en una enumeración,como se muestra en el listado 9.

El último parámetro es un puntero auna estructura donde SIM Manager noscolocará la información que le estamospidiendo. En este caso, podemos enviarun valor de tipo IntPtr que apunte a don-de se encuentra la estructura en memo-ria, o enviar la referencia de la estructu-ra. La definición original de dicha estruc-tura, sacada del fichero de cabecera, semuestra en el listado 10.

El último campo de esta estructura esun array de otra estructura llamada SIM-LOCKINGPWDLENGTH, que contiene las longi-tudes mínimas de contraseñas (listado 11).

Su definición administrada sería comose muestra en el listado 12.

internal enum SIM_INIT_NOTIFICA TIONS : int{NONE = 0,SIM_INIT_SIMCA RD_NOTIFICA TIONS = 0x00000001,

}

Listado 5

HRESULT SimDeinitialize(HSIM hSim

);

Listado 6

[DllImport(“CellCore.dll”, SetLastError = true)]internal static extern int

SimDeinitialize(IntPtr hSim);

Listado 7

public void DeInicializar(){try{if (handleSIM != IntPtr.Zero){int hresult = FuncionesNativas.

SimDeinitialize(handleSIM);if (hresult != 0)throw new Exception(

“No se ha podido Deinicializar SIM”);}else{throw new Exception(

“La SIM no está inicializada”);}

}catch (Exception ex){throw ex;

}}

Listado 8

public enum CapsType{

SIM_CA PSTYPE_PBENTRYLENGTH = (0x00000001),SIM_CA PSTYPE_PBSTORELOCA TIONS = (0x00000002),SIM_CA PSTYPE_LOCKFA CILITIES = (0x00000004),SIM_CA PSTYPE_PBINDEXRA NGE = (0x00000008),SIM_CA PSTYPE_LOCKINGPWDLENGTHS = (0x00000010),SIM_CA PSTYPE_MSGMEMORYLOCA TIONS = (0x00000020),SIM_CA PSTYPE_A LL = (0x0000003F),

}

Listado 9

dnm.plataforma.net<<

dotN

etM

anía

<<

3232

Finalmente, en el listado 13 vemos ladefinición de la estructura SimCaps encódigo administrado.

Como el último parámetro es unarray de estructuras, utilizamos el atri-buto MarshalA s, que nos permite indicaral CLR cómo calcular las referencias detipos. En el listado 13 estamos indicandoque se nos guarde la información en unarray de 10 posiciones.

En el listado 14, vemos ahora el pro-totipo de la función SimGetDevCaps.

Y el listado 15 muestra el cuerpocorrespondiente a la función que encap-sula la funcionalidad para recuperar lascapacidades de la SIM.

Algo que no he comentado anterior-mente, y que es también bastante comúnen las llamadas a la API de Windows: alpasar la estructura de datos donde se va a

almacenar la información de la SIM, esnecesario previamente asignar el tamañoen bytes de la estructura en el campo cbSi-ze. Este tamaño se obtiene mediante lallamada Marshal.SizeOf(typeof(SimCaps)).

Agregar un contacto a la SIMSIM Manager nos ofrece la función SimW-ritePhoneBookEntry para agregar contac-tos a la SIM. La definición en simmgr.h lapodemos ver en el listado 16.

typedef struct simcaps_tag {DWORD cbSize; DWORD dwParamsDWORD dwPBStorages;DWORD dwMinPBIndexDWORD dwMaxPBIndex;DWORD dwMaxPBEA ddressLength;DWORD dwMaxPBETextLength;DWORD dwLockFacilities;DWORD dwReadMsgStorages;DWORD dwWriteMsgStorages;DWORD dwNumLockingPwdLengths;SIMLOCKINGPWDLENGTH

rgLockingPwdLengths[SIM_NUMLOCKFA CILITIES];

} SIMCA PS, FA R *LPSIMCA PS;

Listado 10

typedef struct simlockingpwdlength{

DWORD dwFacility;DWORD dwPasswordLength;

}

Listado 11

/// <summary>/// Estructura para almacenar los /// valores mínimos de longitud/// de password /// </summary>struct SIMLOCKINGPWDLENGTH{public uint dwFacility;public uint dwPasswordLength;

}

Listado 12

struct SimCaps{public int cbSize;public int dwParams;public int dwPBStorages;public int dwMinPBIndex;public int dwMaxPBIndex;public int dwMaxPBEA ddressLength;public int dwMaxPBETextLength;public int dwLockFacilities;public int dwReadMsgStorages;public int dwWriteMsgStorages;[MarshalA s(UnmanagedType.ByValA rray,

SizeConst = 10)]public SIMLOCKINGPWDLENGTH

rgLockingPwdLengths;}

Listado 13

[DllImport(“CellCore.dll”, SetLastError = true)]internal static extern int SimGetDevCaps(IntPtr hSim,CapsType dwCapsType,ref SimCaps lpSimCaps);

Listado 14

HRESULT SimWritePhonebookEntry(HSIM hSim, DWORD dwLocation, DWORD dwIndex, LPSIMPHONEBOOKENTRY

lpPhonebookEntry );

Listado 16

public SimCaps getCapacidadesSIM(){SimCaps objcaps;try{if (handleSIM != IntPtr.Zero){ objcaps = new SimCaps();objcaps.cbSize = Marshal.SizeOf(typeof(SimCaps));int hresult = FuncionesNativas.SimGetDevCaps(handleSIM,CapsType.SIM_CA PSTYPE_A LL, ref objcaps);if (hresult != 0){throw new Exception(“No se ha podido recuperar las capacidades de la SIM”);

}}else{throw new Exception(“La SIM no está inicializada.”);

}}catch (Exception ex){throw ex;

}return objcaps;

}

Listado 15

dnm.plataforma.net<<

dotN

etM

anía

<<

33

El primer parámetro que necesita esta función es elmismo manejador que hemos venido usando hasta aho-ra. Con el segundo parámetro determinamos en quélugar se debe almacenar el contacto. Como siempre, heencapsulado todos los posibles valores en la enumera-ción que se presenta en el listado 17.

Con el tercer parámetro indicamos la posición (índi-ce) donde queremos almacenar el contacto. Si quere-mos guardarlo en la primera posición disponible, debe-mos enviar como valor 0xffffffff. Y el último paráme-tro es un puntero a una estructura SimPhoneBookEntry,cuya definición en simmgr.h vemos en el listado 18.

El campo cbSize indica el tamaño de la estructu-ra, y habrá que asignarlo antes de enviar la estructu-ra a la función. dwParams indica cuál de los campos dela estructura contiene datos válidos. Se correspondecon una serie de valores constantes, como se puedeapreciar en el listado 19.

dwA ddressType y dwNumPlan pueden ser una serie devalores constantes. Definen el tipo de teléfono que seva a agregar y el esquema de numeración (conjunto de

reglas usadas para generar números) respectivamente.En los listados 20 y 21 se pueden ver los posibles valo-res de estas constantes, encapsulados en enumeraciones.Y en los listados 22, 23 y 24 se muestran la estructuraadministrada, el prototipo de la función SimWritePhone-BookEntry y el código del método del componente queencapsula la operación.

public enum NumPlan{SIM_NUMPLA N_UNKNOWN = (0x00000000),SIM_NUMPLA N_TELEPHONE = (0x00000001),SIM_NUMPLA N_DA TA = (0x00000002),SIM_NUMPLA N_TELEX = (0x00000003),SIM_NUMPLA N_NA TIONA L = (0x00000004),SIM_NUMPLA N_PRIVA TE = (0x00000005),SIM_NUMPLA N_ERMES = (0x00000006),

}

Listado 21

public enum SIM_PBSTORA GE{SIM_PBSTORA GE_EMERGENCY = (0x00000001),SIM_PBSTORA GE_FIXEDDIA LING = (0x00000002),SIM_PBSTORA GE_LA STDIA LING = (0x00000004),SIM_PBSTORA GE_OWNNUMBERS = (0x00000008),SIM_PBSTORA GE_SIM = (0x00000010)

}

Listado 17

typedef struct simphonebookentry_tag {DWORD cbSize;DWORD dwParams;TCHA R lpszA ddress[MA X_LENGTH_A DDRESS];DWORD dwA ddressType;DWORD dwNumPlan;TCHA R lpszText[MA X_LENGTH_PHONEBOOKENTRYTEXT];

} SIMPHONEBOOKENTRY, *LPSIMPHONEBOOKENTRY;

Listado 18

public enum SimParamPBE{SIM_PA RA M_PBE_A DDRESS = (0x00000001),SIM_PA RA M_PBE_A DDRESS_TYPE = (0x00000002),SIM_PA RA M_PBE_NUMPLA N = (0x00000004),SIM_PA RA M_PBE_TEXT = (0x00000008),SIM_PA RA M_PBE_A LL = (0x0000000f),

}

Listado 19

public enum A ddressType{SIM_A DDRTYPE_UNKNOWN = (0x00000000),SIM_A DDRTYPE_INTERNA TIONA L = (0x00000001),SIM_A DDRTYPE_NA TIONA L = (0x00000002),SIM_A DDRTYPE_NETWKSPECIFIC = (0x00000003),SIM_A DDRTYPE_SUBSCRIBER = (0x00000004),SIM_A DDRTYPE_A LPHA NUM = (0x00000005),SIM_A DDRTYPE_A BBREV = (0x00000006),

}

Listado 20

public struct SimPhoneBookEntry{public uint cbSize;public uint dwParams;[MarshalA s(UnmanagedType.ByValTStr,SizeConst = 256)]public string lpszA ddress;public A ddressType dwA ddressType;public NumPlan dwNumPlan;[MarshalA s(UnmanagedType.ByValTStr, SizeConst = 256)]public string lpszText;

}

Listado 22

[DllImport(“Cellcore.dll”, SetLastError = true)]internal static extern int SimWritePhonebookEntry(IntPtr hSim,SIM_PBSTORA GE dwLocation,uint dwIndex,ref SimPhoneBookEntry lpPhonebookEntry);

Listado 23

dnm.plataforma.net<<

dotN

etM

anía

<<

34

Leer un contactoAl igual que en el apartado anterior, SIMManager nos ofrece la función SimReadP-honebookEntry para acceder a los contac-tos almacenados en la SIM. En el listado25 vemos su definición en simmgr.h.

Esta función es muy similar a SimW-ritePhonebookEntry. El primer paráme-tro es el manejador asociado a la SIM.Con el segundo determinamos de dón-de queremos leer: de la SIM, números

propios, etc. Para ser exactos, son losvalores constantes que ya tenemosdefinidos en SIM_PBSTORA GE. El tercerparámetro define la posición del con-tacto que queremos obtener, y el últi-mo de todos es un puntero a la estruc-tura SimPhonebookEntry que SIM Mana-ger nos rellenará con la informacióndel contacto.

En el listado 26 vemos el prototipoadministrado de la función, y en el lista-do 27, la llamada desde el componente.

Eliminar un contactoPara eliminar un contacto utilizaremos lafunción SimDeletePhonebookEntry. Su firmase muestra en el listado 28.

public void agregarContactoSIM(string nombre, string telefono){try{if (handleSIM != IntPtr.Zero){SimPhoneBookEntry entrada ;entrada = new SimPhoneBookEntry();entrada.cbSize = (uint)Marshal.SizeOf(typeof(SimPhoneBookEntry));entrada.dwA ddressType = A ddressType.SIM_A DDRTYPE_UNKNOWN;entrada.dwNumPlan = NumPlan.SIM_NUMPLA N_TELEPHONE;entrada.lpszA ddress = telefono;entrada.lpszText = nombre;entrada.dwParams = SimParamPBE.SIM_PA RA M_PBE_A LL;int hresult = FuncionesNativas.SimWritePhonebookEntry(handleSIM,SIM_PBSTORA GE.SIM_PBSTORA GE_SIM, 0xffffffff, ref entrada);

if (hresult != 0){throw new Exception(“Se ha producido un error al agregar el contacto.”);

}}else{throw new Exception(“La SIM no está inicializada.”);

}}catch (Exception ex){throw ex;

}}

Listado 24

HRESULT SimReadPhonebookEntry(HSIM hSim,DWORD dwLocation,DWORD dwIndex,LPSIMPHONEBOOKENTRY lpPhonebookEntry

);

Listado 25[DllImport(“CellCore.dll”,SetLastError = true)]

internal static extern int SimReadPhonebookEntry(IntPtr hSim,SIM_PBSTORA GE dwLocation,uint dwIndex,ref SimPhoneBookEntry lpPhonebookEntry);

Listado 26

public SimPhoneBookEntry getInformacionContactoSIM(uint pos){SimPhoneBookEntry infoContacto;try{if (handleSIM != IntPtr.Zero){infoContacto = new SimPhoneBookEntry();int hresult = FuncionesNativas.SimReadPhonebookEntry(handleSIM,SIM_PBSTORA GE.SIM_PBSTORA GE_SIM,pos,ref infoContacto);

if (hresult != 0){throw new Exception(“Se ha producido un error al recuperar el contacto.”);

}}else{throw new Exception(“La SIM no está inicializada.”);

}}catch (Exception ex){throw ex;

}return infoContacto;

}

Listado 27

HRESULT SimDeletePhonebookEntry(HSIM hSim,DWORD dwLocation,DWORD dwIndex

);

Listado 28

dnm.plataforma.net<<

dotN

etM

anía

<<

36

Para que la función realice su acción correctamen-te, basta con enviarle el manejador, el lugar de dondequeremos eliminar el contacto (que puede ser del con-tenedor de números propios o de todos los existentesen la SIM), y la posición a eliminar. En los listados 29 y30 se presentan el prototipo administrado de la funcióny el método del componente que encapsula la opera-ción, respectivamente.

Escribir un SMS en la tarjeta SIMPara esta funcionalidad, SIM Manager ofrece lafunción SimWriteMessage. La firma de la función sepuede ver en el listado 31, y su prototipo adminis-trado en el listado 32. Como antes, los tres prime-ros parámetros ya nos son conocidos; no así el últi-mo de ellos, que es nuevo para nosotros. Es un pun-tero a una estructura llamada SimMessage que esnecesario rellenar con la información del mensajea escribir en la SIM. En el listado 33 podemos verla definición de la misma.

De todos los campos de la estructura, nos intere-sa lpszA ddress, que almacenará en un array el núme-ro de teléfono del que procede el SMS, lpszMessage,el contenido del mensaje, y dwParams, que se utilizapara indicar qué campos son válidos en la estructura.En el listado 34 se presenta la versión administradade la estructura.

[DllImport(“CellCore.dll”,SetLastError=true)]internal static extern int

SimDeletePhonebookEntry(IntPtr hSim,SIM_PBSTORA GE dwLocation,uint dwIndex);

Listado 29

HRESULT SimWriteMessage(HSIM hSim,DWORD dwStorage, LPDWORD lpdwIndex, LPSIMMESSA GE lpSimMessage

);

Listado 31

typedef struct simmessage_tag {DWORD cbSize; DWORD dwParams; TCHA R lpszA ddress[MA X_LENGTH_A DDRESS]; DWORD dwA ddressType;DWORD dwNumPlan; SYSTEMTIME stReceiveTime;DWORD cbHdrLength; BYTE rgbHeader[MA X_LENGTH_HEA DER];TCHA R lpszMessage[MA X_LENGTH_MESSA GE];

} SIMMESSA GE, FA R *LPSIMMESSA GE;

Listado 33

public struct SimMessage{public uint cbSize;public Sim_Param_Msg dwParams; [MarshalA s(UnmanagedType.ByValTStr, SizeConst = 256)]public string lpszA ddress;public Sim_A ddrType dwA ddressType;public NumPlan dwNumPlan;public SYSTEMTIME stReceiveTime;public uint cbHdrLength;[MarshalA s(UnmanagedType.ByValA rray,SizeConst = 256)]public byte[] rgbHeader;[MarshalA s(UnmanagedType.ByValTStr,SizeConst = 256)]public string lpszMessage;

}

Listado 34

public void eliminarContactoSIM(uint pos){try{if (handleSIM != IntPtr.Zero){int hresult =

FuncionesNativas.SimDeletePhonebookEntry(handleSIM,SIM_PBSTORA GE.SIM_PBSTORA GE_SIM, pos);

if (hresult != 0)throw new Exception(

“No se ha podido eliminar el contacto.”);}else{throw new Exception(“La SIM no está inicializada.”);}}catch (Exception ex){throw ex;}}

Listado 30

[DllImport( “CellCore.dll”, SetLastError = true)]internal static extern int SimWriteMessage(

IntPtr hSim,SIM_SMSSTORA GE dwStorage,out uint lpdwIndex,ref SimMessage lpSimMessage );

Listado 32

dnm.plataforma.net<<

dotN

etM

anía

<<

37

Es importante comentar que esta función siemprealmacena el SMS en la primera posición libre queencuentre. El parámetro lpdwIndex es un puntero a laposición en la que se ha agregado el mensaje. El pará-metro lpSimMessage es un puntero a la estructura SimMes-sage que contiene la información del SMS a agregar a laSIM. En el listado 35 vemos el cuerpo del método delcomponente que encapsula la funcionalidad descrita.Observe también que en el listado 34 hay una estructu-ra llamada SYSTEMTIME, que se utiliza para representarfechas y horas mediante elementos individuales. Su ver-sión administrada se presenta en el listado 37, y en ellahemos redefinido el método ToString (como no podíaser de otra forma) para ofrecer una representación decadena de la estructura.

Leer un SMS de la tarjeta SIMLa función para leer un SMS (SimReadMessage) es simi-

lar a la de escribir. En el listado 38 podéis ver el proto-

[DllImport(“CellCore.dll”,SetLastError = true)]internal static extern int SimReadMessage(IntPtr hSim,SIM_SMSSTORA GE dwStorage,uint dwIndex,ref SimMessage lpSimMessage);

Listado 38

public SimMessage getMensajeSIM(uint pos){SimMessage sms;try{if (handleSIM != IntPtr.Zero){sms = new SimMessage();sms.cbSize = (uint)Marshal.SizeOf(typeof(SimMessage));int hresult = FuncionesNativas.SimReadMessage(handleSIM,

SIM_SMSSTORA GE.SIM_SMSSTORA GE_SIM, pos, ref sms);if (hresult != 0){throw new Exception(“No se ha podido leer el mensaje”);

}}else{throw new Exception(“La SIM no está inicializada.”);

}}catch (Exception ex){throw ex;

}return sms;

}

Listado 39

HRESULT SimWriteMessage(HSIM hSim, DWORD dwStorage, LPDWORD lpdwIndex, LPSIMMESSA GE lpSimMessage

);

Listado 36

public void escribirMensajeSIM(String telefono, String msg){try{if (handleSIM != IntPtr.Zero){SimMessage sms = new SimMessage();sms.cbSize = (uint)Marshal.SizeOf(typeof(SimMessage));sms.dwA ddressType = Sim_A ddrType.SIM_A DDRTYPE_UNKNOWN;sms.dwNumPlan = NumPlan.SIM_NUMPLA N_UNKNOWN;sms.lpszA ddress = telefono;sms.lpszMessage = msg;sms.dwParams = Sim_Param_Msg.SIM_PA RA M_MSG_A LL;SYSTEMTIME s = new SYSTEMTIME();s.day = 14; s.month = 4; s.year = 2008;s.hour = 22; s.minute = 30; s.second = 0;sms.stReceiveTime = s;uint pos;int hresult = FuncionesNativas.SimWriteMessage(

handleSIM,SIM_SMSSTORA GE.SIM_SMSSTORA GE_SIM, out pos, ref sms);

if (hresult != 0){throw new Exception(“No se ha podido agregar el SMS”);

}}

}catch (Exception ex){throw ex;

}}

Listado 35

public struct SYSTEMTIME{public short year;public short month;public short dayOfWeek;public short day;public short hour;public short minute;public short second;public short millisecond;public override string ToString(){DateTime d =

new DateTime(year, month, day, hour, minute, second);return d.ToString();

}}

Listado 37

dnm.plataforma.net<<

dotN

etM

anía

<<

38

tipo de la función administrada, y en el listado 39, el códi-go correspondiente a la función del componente.

Eliminar un SMSPara eliminar un SMS de la SIM, solo necesitamos indi-

carle a SIM Manager el manejador, el lugar de donde debeeliminar el mensaje y la posición. En los listados 40 y 41 sepresentan el prototipo de la función administrada y el encap-sulado del método que implementa la funcionalidad, res-pectivamente.

Recuperar la infomación del almacén deSMS

Nos puede ser de utilidad conocer la capacidad de nues-tra tarjeta SIM, las posiciones ocupadas y libres que tiene,etc. Para ello disponemos de la función SimGetSmsStorageS-tatus, que nos rellena en dos parámetros de salida la infor-mación solicitada. En el listado 42 se presenta el mapeo dela función a un método administrado. En el parámetro lpd-wUsed recibiremos el número de posiciones ocupadas, y enlpdwTotal el número de posiciones totales de la SIM.

Obtener los mensajes del Sistema Operativo

Desde el principio del artículo, hemos comentado queSIM Manager es capaz de capturar y notificarnos los cam-bios que se producen en la SIM. Para ello, debemos sumi-nistrar un método de respuesta en la función SimCallbackcuando se inicializa la SIM. El listado 43 muestra el tipo deldelegado que se debe registrar para capturar las notifica-ciones. En el listado 44 se presenta el esqueleto de un méto-do privado que utilizaremos como destino de las notifica-ciones, y en el listado 45, la instanciación del delegado yasignación al campo de la clase en el que se almacenará.Finalmente, en el listado 46 se ofrece una nueva definiciónpara la función SimInitialize y se muestra su llamada desdeel método del componente.

Las posibles notificaciones que podemos capturar sonlas que se presentan en el listado 47. Sus nombres son auto-explicativos y no requieren traducción.

[DllImport( “CellCore.dll”, SetLastError = true)]internal static extern int SimDeleteMessage( IntPtr hSim,

SIM_SMSSTORA GE dwStorage,uint dwIndex);

Listado 40

[DllImport(“CellCore.dll”, SetLastError = true)]internal static extern int SimGetSmsStorageStatus(IntPtr hSim,SIM_SMSSTORA GE dwStorage,out uint lpdwUsed,out uint lpdwTotal);

Listado 42

//Delegado que se registrará para capturar //las llamadas del sistemainternal delegate void SIMCallBackDelegate (

uint dwNotifyCode,IntPtr pData,int dwDataSize,int dwParam);

private void SimCallback(uint dwNotifyCode,IntPtr pData, int dwDataSize, int dwParam)

{// Gestión de las notificaciones

}

Listado 44

public SIM(){InitializeComponent();d = new SIMCallBackDelegate(SimCallback);

}

Listado 45

Listado 43

public void eliminarSMS(uint pos){try{if (handleSIM != IntPtr.Zero){int hresult = FuncionesNativas.SimDeleteMessage(handleSIM,SIM_SMSSTORA GE.SIM_SMSSTORA GE_SIM,pos);

if (hresult != 0){throw new Exception(“No se ha podido eliminar el SMS.”);

}}else{throw new Exception(“La SIM no está inicializada.”);

}}catch (Exception ex){throw ex;

}}

Listado 41

dnm.plataforma.net<<

Es importante observar que unode los parámetros del delegado Sim-CallBackDelegate es de tipo IntPtr. Estolo hemos hecho así porque en el pro-

totipo de la función nativa SimCallback(listado 48) es un puntero a void; paraque nos entendamos, un puntero acualquier cosa. En dependencia del

tipo de notificación de que se trate,en pData recibiremos una estructura

public enum Sim_Notify{SIM_NOTIFY_CA RD_REMOVED = (0x100),SIM_NOTIFY_FILE_REFRESH = (0x101),SIM_NOTIFY_MSG_STORED = (0x102),SIM_NOTIFY_MSG_DELETED = (0x103),SIM_NOTIFY_PBE_STORED = (0x104),SIM_NOTIFY_PBE_DELETED = (0x105),SIM_NOTIFY_MSG_RECEIVED = (0x106),SIM_NOTIFY_RA DIOOFF = (0x107),SIM_NOTIFY_RA DIOON = (0x108),SIM_NOTIFY_RA DIOPRESENT = (0x109),SIM_NOTIFY_RA DIOREMOVED = (0x10A ),

}

Listado 47

//Cambiamos el prototipo [DllImport(“CellCore.dll”, SetLastError = true)]internal static extern int SimInitialize( SIM_INIT_NOTIFICA TIONS dwFlags,

SIMCallBackDelegate lpfnCallBack, uint dwParam,out IntPtr lphSim);

public void Inicializar(){try{handleSIM = IntPtr.Zero;int hresult = 0;hresult = FuncionesNativas.SimInitialize(SIM_INIT_NOTIFICA TIONS.SIM_INIT_SIMCA RD_NOTIFICA TIONS,

d, 0, out handleSIM);if (hresult != 0)

throw new Exception(“No se ha podido inicializar la SIM”);}catch (Exception ex){

throw ex;}

}

Listado 46

typedef void (*SIMCA LLBA CK)(DWORD dwNotifyCode, const void* pData, DWORD dwDataSize,DWORD dwParam);

Listado 48

dnm.plataforma.net<<

dotN

etM

anía

<<

40

de un tipo u otro. Por ejemplo, si serecibe una notificación de tipoSIM_NOTIFY_PBE_DELETED, pData apun-tará a una estructura de tipo SIMPBE-CHA NGE. En el listado 49 se presenta elequivalente manejado de esta estruc-tura, y en el listado 50, un ejemplo decómo tratar las notificaciones de esetipo. La gestión del resto de las posi-bles notificaciones es similar y se ledeja al lector como propuesta.

El resultado final del proyecto ente-ro se presenta en la figura 4.

Posibles mejoras al componente

Como todas las cosas, el componen-te que hemos presentado aquí podría sersusceptible de mejoras y ampliaciones.Algunas ideas que me vienen a la menteson agregarle propiedades de tiempo dediseño al componente, dotarlo de un con-junto completo de eventos o permitir elacceso indexado al contenido de la SIMa partir de nombres de contactos ademásde posiciones. Desde el punto de vista dela funcionalidad, validar o cambiar el PIN,asociar al componente un icono de labarra de herramientas o controlar todoslos posibles errores podrían ser extensio-nes potenciales. Todo ello se deja comoejercicio práctico al lector.Figura 4. Diagrama final del componente

private void SimCallback(Sim_Notify dwNotifyCode, IntPtr pData, int dwDataSize, int dwParam){switch (dwNotifyCode){case Sim_Notify.SIM_NOTIFY_CA RD_REMOVED:break;

case Sim_Notify.SIM_NOTIFY_FILE_REFRESH:break;

case Sim_Notify.SIM_NOTIFY_MSG_STORED:break;

case Sim_Notify.SIM_NOTIFY_MSG_DELETED:break;

case Sim_Notify.SIM_NOTIFY_PBE_STORED:break;

case Sim_Notify.SIM_NOTIFY_PBE_DELETED:{//Recuperar una estructura desde el PunteroSimPBEChange aux;aux = (SimPBEChange)Marshal.PtrToStructure(pData, typeof(SimPBEChange));//Lanzaremos un eventoif (EntradaCambiadaEvent != null)EntradaCambiadaEvent(aux.dwEntry, aux.dwStorage);

}break;

case Sim_Notify.SIM_NOTIFY_MSG_RECEIVED:break;

case Sim_Notify.SIM_NOTIFY_RA DIOOFF:break;

case Sim_Notify.SIM_NOTIFY_RA DIOON:break;

case Sim_Notify.SIM_NOTIFY_RA DIOPRESENT:break;

case Sim_Notify.SIM_NOTIFY_RA DIOREMOVED:break;

default:break;

}}

Listado 50

internal struct SimPBEChange{/// <summary>/// A qui veremos el índice de /// la entrada /// añadida o eliminada/// </summary>public uint dwEntry;/// <summary>/// Nos indica donde se ha agregado /// o eliminado/// la entrada /// </summary>public SIM_PBSTORA GE dwStorage;

}

Listado 49

dnm.servidores.sql

Quizás el aspecto más importante, por el controlque nos permite tener sobre nuestros servidoresSQL Server, es el nuevo marco de trabajo de ges-tión declarativo, que nos permite definir políticasque deben cumplirse en instancias, bases de datos uobjetos, pero esta novedad se analiza en el artículoSQL Server 2008 Declarative Management Fra-mework, por lo que no entraremos a fondo en suestudio, pero que debemos de mencionar al menos.

Transparent Data EncryptionOtra de las novedades interesantes es la posibilidadde cifrar, de forma transparente a usuarios y apli-caciones, nuestras bases de datos. En SQL Server2005 se introdujo una arquitectura de cifrado quenos permitía utilizar funciones para cifrar, utili-zando certificados o claves, los datos almacenadosen las bases de datos SQL Server 2005. Sin embar-go, eso nos exigía establecer procesos que realiza-sen las operaciones de cifrado y descifrado de datos,y además, con algunas restricciones que funda-mentalmente afectaban al rendimiento. En SQLServer 2008, a través de la característica denomi-nada Transparent Data Encryption (TDE), se sol-ventan esas limitaciones, del modo más rápido yeficiente posible: se cifra la base de datos comple-ta. El cifrado de datos con TDE se realiza a nivel

de entrada/salida, a través del Buffer Pool. Estoquiere decir, que cuando se habilita una base dedatos para TDE, se cifran todos los ficheros dedicha base de datos, tanto de datos como de log detransacciones, y el cifrado y descifrado se realizarádurante las operaciones de lectura y escritura endisco. La gran ventaja de esta aproximación, comohemos comentado, es que se realiza de modo cienpor cien transparente a las aplicaciones; sin embar-go, el problema es que los datos en memoria no seencuentran cifrados, y determinadas operaciones,como paginación de sistema operativo, o un dumpde memoria, pueden llevar a disco los datos sincifrar. Sin embargo, lo que sí se tiene en cuenta esque cuando habilitamos TDE en una base de datos,automáticamente se configura tempdb con TDEtambién, para que todos los objetos temporales quesea necesario crear, sean también cifrados. Del mis-mo modo, tanto las instantáneas, como las copiasde seguridad, pueden sacar provecho de esta carac-terística y también se cifrarán. Especial menciónrequiere la copia de seguridad. Como ocurre siem-pre en estos casos, deberemos disponer de copiasde seguridad de los objetos (certificados o claves)que utilicemos con TDE, para que en caso de quenecesitemos realizar una restauración, seamos capa-ces de poder leer los datos. Si no disponemos deesos objetos, no seremos capaces de restaurar unacopia de seguridad cifrada con TDE.

Novedades de seguridad en SQL Server 2008

SQL Server

Siguiendo los pasos de versiones anteriores, fundamentalmente de SQL Ser-ver 2005, al que después de tres años en el mercado todavía no se le ha encon-trado ningún agujero de seguridad, Microsoft ha puesto mucho interés en seguirmejorando las prestaciones de su motor de base de datos en lo que respectaa las características de seguridad. SQL Server 2008 incluye novedades muy inte-resantes y deseadas, y demandadas desde hace años por los administradoresde bases de datos, que analizaremos en el presente artículo.

Antonio Soto

Antonio Soto esDirector de Opera-

ciones de SSolid Qua-lity Mentors en

España y Portugal.Con más de 12 añosde experiencia en elmundo de las bases

de datos relacionalessobre SQL Server, enlos últimos años se ha

especializado en lastecnologías de bús-queda e indexación,

tanto en SQL Server,como en SharePoint

y Search Server.Antonio es MCSE,

MCDBA, MCTS,MCITP y MCT

dotN

etM

anía

<<

43

dnm.servidores.sql<<

Nuevos roles de bases de datosExisten algunos cambios, que aunqueno son excesivamente relevantes, símerecen mencionarse, en los roles dela base de datos msdb. En primer lugar,los roles para la gestión de seguridad deSQL Server Integration Services cam-bian de nombre y pasan de llamarsedb_dtsadmin, db_dtsltduser y db_dtsopera-tor a llamarse respectivamente sdb_ssi-sadmin, db_ssisltduser y db_ssisoperator.En el caso de que estemos realizandouna actualización desde SQL Server2005, los roles antiguos se mantendrány se añadirán como miembros de estosnuevos roles para mantener la compa-tibilidad.

Además de estos cambios denomen clatura, aparecen nuevos rolesde base de datos, para dar soporte aalgunas de las nuevas funcionalidades,especialmente para las nuevas carac-terísticas de gestión. Dispondremos enla base de datos msdb de los siguientesnuevos roles:

• ServerGroupA dministratorRole y Server-GroupReaderRole, que nos permitengestionar los grupos de servidorespara administración centralizada.

• PolicyA dministratorRole, que nos per-mite definir los usuarios administra-dores de la gestión basada en políticas.

• dc_admin, dc_operator y dc_proxy, queutilizaremos con el componente DataCollector.

Control de cambiosEs bastante común que determinadasaplicaciones tengan como requisito lle-var un seguimiento de qué datos son losque cambian entre determinados perio-dos de tiempo. Un claro ejemplo de esterequisito son las técnicas de seguimientode cambios que es necesario implemen-tar para mantener actualizados los siste-mas datawarehouse de forma incremental.Para dar solución a estos requisitos, SQLServer 2008 proporciona dos nuevascaracterísticas: Change Data Capture yChange Tracking.

Change Data Capture

Change Data Capture nos permitecapturar los cambios realizados sobredeterminadas tablas de nuestra basede datos, y nos permite acceder a ellosen un formato relacional, que facili-ta su explotación. Una vez hayamosactivado Change Data Tracking anivel de base de datos, y hayamosseleccionado las tablas que deseamosmonitorizar, el proceso de capturaextrae del log de transacciones loscambios (inserciones, actualizacionesy borrados) sobre esas tablas y losinserta en las tablas asociadas, quedespués podremos consultar a travésde determinadas funciones que seencargan de proporcionar unos datosformateados. A continuación veremosqué pasos debemos seguir para acti-var esta característica y cómo utili-zarla.

En primer lugar, debemos de acti-var Change Data Capture en la base dedatos:

Al habilitar una base de datos paraChange Data Tracking, se crea en esabase de datos un esquema denomina-do cdc y un usuario con el mismonombre, así como las tablas de meta-datos necesarias para el funciona-miento. A continuación, y tras habercomprobado que el servicio SQL Ser-ver Agent está iniciado, habilitaremoslas tablas que deseamos comprobar.En el siguiente ejemplo se habilita elseguimiento para la tabla HumanResour-ces.Department:

El mensaje que nos devuelve la eje-cución de este comando es muy explica-tivo de cómo funciona internamente estacaracterística. El mensaje dirá algo como:

Job 'cdc.AdventureWorks2008_capture' started successfully.

Job 'cdc.AdventureWorks2008_cleanup' started successfully.

Como se desprende de estos mensa-jes, el procedimiento almacenado crearádos trabajos del Agente de SQL Server.El primero de ellos, que se encargará cap-turar los cambios, mientras que el segun-do se encarga de realizar tareas de lim-pieza. Obviamente, estos trabajos se cre-an únicamente para la primera de lastablas activadas. Posteriormente, el tra-bajo se encarga de leer los metadatos paraconocer cuáles son las tablas que debencontrolarse. Para obtener informaciónacerca de los cambios registrados, debe-mos realizar varias operaciones.

En primer lugar, Change DataCapture almacena información acercadel instante en el que se produce uncambio, capturando los LSN del regis-tro de transacciones. Obviamente,nuestras aplicaciones no explotarán losdatos utilizando un número de secuen-cia, sino usando fechas. Para ello, dis-ponemos de una función, denominadasys.fn_cdc_map_time_to_lsn, que nos per-mite obtener un LSN de cambio a par-tir de la fecha.

Una vez obtenidos los LSN que mar-quen el intervalo de tiempo del que que-remos obtener los cambios, ya podemosutilizar las funciones creadas para la con-sulta de datos. En el momento en el queactivamos el Change Data Capture en unatabla, se crea una función para cada unade ellas, denominada –en nuestro caso–cdc.fn_cdc_get_all_changes_HumanResources_Department, que pasándole como pará-metro los LSN inicial y final, nos devol-verá los cambios realizados sobre estatabla en ese intervalo.

USE A dventureWorks2008

GO

EXEC sys.sp_cdc_enable_db

GO

EXEC sys.sp_cdc_enable_table @source_Schema=’HumanResources’,

@source_name=’Department’,

@role_name=’rolCDC’

dotN

etM

anía

<<

44

dnm.servidores.sql<<

Change Tracking

Otra característica que nos permitirá llevar un con-trol sobre las operaciones realizadas en una determi-nada tabla es Change Tracking. A diferencia de loque ocurre con Change Data Capture, con esta carac-terística podemos obtener información sobre los cam-bios realizados y a qué registros afectaron (a través dela clave primaria de la tabla), pero no almacena losdatos modificados, por lo que a lo largo del tiempo,iremos perdiendo esos valores, después de varios cam-bios sobre los mismos datos. Además, el manteni-miento de esa información se realiza de forma sín-crona en el momento en el que se realiza el cambio,y se almacenan los metadatos en las tablas internasutilizadas por Change Tracking. Debido a este com-portamiento, Change Tracking puede sernos útil enescenarios de sincronización, en los que el dato impor-tante es el último, pero no el histórico de cada uno delos cambios realizados.

Para utilizar Change Tracking, debemos activar-lo de modo similar a Change Data Capture, primeroa nivel de base de datos y después, seleccionando latabla, como muestra el siguiente código.

Comparativa entre Change Data Capture y Change Tracking

Como resumen, a modo de comparativa entre las dostecnologías, podemos comentar las siguientes dife-rencias:

• Desde el punto de vista del mecanismo utiliza-do para realizar seguimiento de los cambios,Change Data Capture utiliza un trabajo delAgente para leer de forma asíncrona los cam-bios desde el registro de transacciones de la basede datos, mientras que Change Tracking reali-za un seguimiento de cambios síncrono.

• Por lo que respecta a los datos obtenidos, Chan-ge Tracking tan solo realiza seguimiento de lasoperaciones realizadas, manteniendo el valor de

la clave primaria del registro modificado comoenlace entre las tablas de metadatos y la tablaauditada, por lo que no podemos obtener la infor-mación completa, mientras que Change DataCapture sí nos proporciona esa información.

AuditoríaEstablecer un sistema de auditoría para una aplica-ción es uno de los aspectos cada vez más solicitados,debido fundamentalmente a requisitos legales , y has-ta ahora un verdadero quebradero de cabeza para los

administradores de bases de datos. Para un sistemaSQL Server disponemos de varias opciones para esta-blecer sistemas de auditoría:

• SQL Trace. Utilizando trazas, bien sea travésde procedimientos almacenados o a través deSQL Profiler, podemos registrar diferentes even-tos que se producen en la instancia SQL Server.

A LTER DA TA BA SE A dventureWorks2008

SET CHA NGE_TRA CKING = ON

(CHA NGE_RETENTION = 2 DA YS, A UTO_CLEA NUP = ON)

GO

A LTER TA BLE HumanResources.Department

ENA BLE CHA NGE_TRA CKING

WITH (TRA CK_COLUMNS_UPDA TED = ON)

Figura 1

Establecer un sistema de auditoría para una aplicación es

uno de los aspectos más solicitados, y hasta ahora unverdadero quebradero de

cabeza para los administradoresde bases de datos

dotN

etM

anía

<<

45

dnm.servidores.sql<<

• Triggers. Otra opción sería imple-mentar un sistema basado en trig-gers. En SQL Server 2005 se aña-dió la posibilidad de crear triggerspara sentencias DDL, por lo queel rango de eventos que podemoscontrolar es mayor.

• En SQL Server 2008 disponemosde un nuevo sistema de auditoría,implementado a través del objetoSQL Server Audit. Este objetonos permite definir auditoría anivel de instancia o a nivel de basede datos, y almacenar los resulta-dos de la auditoría bien en fiche-ros o bien en el Visor de sucesosdel sistema operativo, ya sea en elregistro de Aplicación o en el regis-tro de Seguridad, y que será el queanalizaremos en este apartado.

El primer objeto que debemos cre-ar es un objeto SQL Server Audit, que

definimos a nivel de la instancia de SQLServer, y en el que lo que configuramoses el destino de la auditoría. Comohemos comentado con anterioridad, eldestino de la auditoría pueden ser: fiche-ro, registro de Seguridad y registro deAplicación.

Una vez hemos creado el objetoSQL Server Audit (podemos crearvarios) debemos especificar cuáles sonlos eventos que deseamos auditar. Estoseventos podemos especificarlos utili-

zando los denominados Audit Groups,que no son más que grupos de acciones,a dos niveles:

• A nivel de instancia, a través de Ser-ver Audit Specification. Nos permiteauditar eventos que ocurren a nivel deinstancia de SQL Server, tales comoinicios de sesión, copias de seguridad,ejecución de comandos DBCC oeventos de sesiones de Service Broker.

• A nivel de base de datos, a través deDatabase Audit Specification. Paraaquellos eventos que deseemos audi-tar a nivel de objetos u operacionesde las bases de datos, debemos utili-zar los Audit Groups a nivel de basede datos, que nos permiten auditareventos tales como los de creación,borrado o eliminación de objetos, ocambios en la membresía de roles deusuarios.

En el listado 1 vemos un ejemplo decómo se puede crear una auditoría queregistre los inicios de sesión fallidos. Siquisiéramos crear una auditoría a nivel debase de datos que, por ejemplo, auditaselas sentencias SELECT ejecutadas en unadeterminada tabla, podríamos hacerlo taly como vemos en el listado 2.

De este modo, podemos crear siste-mas de auditoría muy completos y a lavez no intrusivos, por lo que el impac-to en el rendimiento es menor que enlos casos de otras aproximaciones.

Hemos analizado en este artículo lasnovedades desde el punto de vista deseguridad, que experimenta una nota-ble mejora con respecto a versionesanteriores, sobre todo en cuanto a lascapacidades de auditoría y seguimientode cambios, tan demandadas en versio-nes anteriores.

--Creamos el objeto de auditoría que define la ubicaciónCREA TE SERVER A UDIT A uditTestTO FILE( FILEPA TH = N’C:\temp\’

,MA XSIZE = 0 MB,MA X_ROLLOVER_FILES = 2147483647,RESERVE_DISK_SPA CE = OFF

)WITH( QUEUE_DELA Y = 1000

,ON_FA ILURE = CONTINUE

)GO--Comprobamos que se ha creado correctamenteselect * from sys.server_audits GO--Inspeccionamos cuáles son las acciones que podemos auditarSelect * from sys.dm_audit_A ctionsGO--Creamos una especificación a nivel de instancia para registrar --los inicios de sesión fallidosCREA TE SERVER A UDIT SPECIFICA TION A uditServerSpecificationFOR SERVER A UDIT A uditTestA DD (FA ILED_LOGIN_GROUP)GO--Comprobamos que se ha creado correctamenteselect * from sys.server_audit_specificationsselect * from sys.server_audit_specification_details GO--A ctivamos el objeto de auditoríaA LTER SERVER A UDIT A uditTest WITH(STA TE= ON)GO--A ctivamos la especificaciónA LTER SERVER A UDIT SPECIFICA TION A uditServerSpecification WITH(STA TE= ON)--Leemos los datos del fichero de auditoríaselect * from fn_get_audit_file(‘C:\Temp\*’,DEFA ULT, default)

USE A dventureWorks2008GOCREA TE DA TA BA SE A UDIT SPECIFICA TION A uditSelectFOR SERVER A UDIT [A uditTest]A DD(SELECT ON HumanResources.EmployeePayHistory BY dbo)WITH (STA TE = ON)GO

Listado 1

Listado 2

dotN

etM

anía

<<

46

El modelo de objetos completo de TFS nos per-mite acceder a muchas de sus partes internas.Recordad que por detrás todo son servicios Web,pero siempre usaremos su modelo de objetos parapersonalizarlo. Partes de esta personalizaciónincluyen el sistema de builds, que nos permite tan-to agregar nuevas tareas a nuestras builds comoacceder desde el modelo de objetos a builds exis-tentes, el repositorio de código fuente, el propiosistema de proyectos, y lo que veremos en esteartículo, el modelo de objetos de los Work Items.

Para empezar a familiarizarnos con el uso delmodelo de objetos de TFS, vamos escoger unejemplo sencillo que nos permita conocer un pocomás como usarlo. Este ejemplo será la creación deun work item en un team project, y la validación desus campos antes de grabarlo.

Requerimientos inicialesPara poder facilitar las pruebas en primer lugar, usa-remos la máquina virtual de Visual Studio 2008 conTeam Foundation Server que nos proporcionaMicrosoft, y que tiene ya creado el team project deejemplo que usaremos. Esta máquina la podéis des-cargar de aquí: http://tinyurl.com/TFS-VPC.

Como base de todo, vamos a usar un proyec-to nuevo de Windows Forms en C#, al que agre-

garemos una referencia a los siguientes ensam-blados de .NET (ver figura 1).

• Microsoft.TeamFoundation.Client, versión9.0.0.0 (para TFS 2008).

• Microsoft.TeamFoundation.WorkItemTracking, ver-sión 9.0.0.0 (para TFS 2008).

Además, tenemos que agregar una referencia aMicrosoft.TeamFoundation.WorkItemTracking.Control(también versión 9.0.0.0), pero en este caso, y sitenemos instalado el SDK de Visual Studio 2008,no debemos agregar la referencia desde la pantalla

Extensibilidad en TFSModelo de objetos de work items

ALManía

Luis Fraile es MVP deTeam System y cola-bora activamente en

MAD.NUG (grupo deusuarios de .NET de

Madrid). Actualmentees director técnico

en Multidomo Networks, dondedesarrollan un pro-ducto de softwarepara la gestión de

dispositivos domóti-cos y cámaras de

vigilancia a través deInternet mediante

interfaces Web, telé-fonos móviles, Media

Center, etc. Puedecon sul tar su blog en

www.lfraile.net.

Team Foundation Server (TFS) es una herramienta altamente extensi-ble y personalizable, que nos permite adaptarla a nuestras necesidadesde proceso; recordemos que no existen balas de plata, y en las herra-mientas tampoco. Uno de los puntos principales de extensibilidad es elmodelo de objetos de los work items, permitiéndonos automatizar tare-as como su creación, edición, validación y consultas.

Figura 1

Luis Fraile

dotN

etM

anía

<<

47

dnm.ALManía<<

de la figura 1, ya que existe un errorreportado al respecto; debido a un errorcon la DLL del SDK, debemos agregarmanualmente una referencia a la DLLcon el mismo nombre situada en el direc-torio C:\Program Files\Microsoft VisualStudio 9.0\Common7\IDE\PrivateA ssemblies.

Asimismo, agregaremos los siguien-tes using al principio del fichero dondevayamos a utilizar estas librerías:

using Microsoft.TeamFoundation.Client;

using Microsoft.TeamFoundation.

WorkItemTracking.Client;

using Microsoft.TeamFoundation.

WorkItemTracking.Controls;

Preparando el formularioprincipalVamos a preparar primero nuestro for-mulario principal. Lo único que nece-sitaremos es crear una tabla de tres filas;para que ocupe todo el formulario,asignaremos a su propiedad Dock elvalor Fill.

La tabla tendrá tres filas y una úni-ca columna. La primera fila, de mayoraltura, ocupará casi todo el formulario,y en ella agregaremos un nuevo panel,con nombre WiPanel, poniendo igual-mente la propiedad Dock de éste al valorFill. En la segunda fila, simplementeagregaremos un botón que será en elque nos valga para grabar el work itemque crearemos. Y en la tercera fila, otrobotón para crear un nuevo work item sinusar la interfaz usual de éstos.

El formulario debe quedarnos conel aspecto que se muestra en la figura 2.

Autenticándonos contra TFSPor sencillez para el código de ejem-plo, situaremos todo el código, por aho-ra, en el método Load del formularioprincipal de nuestra aplicación Win-dows Forms.

Lo primero que debemos hacer esautenticarnos, por código, contra nues-tro servidor TFS, y obtener una referen-cia a él. Para ello, usaremos la clase está-tica Microsoft.TeamFoundation. Client.TeamFoundationServerFactory y su método Get-Server. Este método recibe como primerparámetro el nombre del servidor, quesiempre pasaremos usando la sintaxiscompleta. Por ejemplo: http://<servi-dor>:8080. Como segundo parámetro(opcional), hemos de pasar un objeto quecumpla con la interfaz Microsoft.Team-Foundation.Client.ICredentialsProvider;esta interfaz no es otra cosa que el pro-veedor de credenciales que se usará encaso de que no estemos ya autenticadoscontra el servidor TFS.

Podemos crear nuestros propiosproveedores, que puedan ser usados encualquier tipo de aplicación. Para esteejemplo, usaremos uno que nos da elpropio modelo de objetos, Microsoft.TeamFoundation.Client.UICredentialsProvi-der, que mostrará la ventana de autenti-cación típica de TFS al intentar autenti-carse. Es muy importante recordar queeste proveedor es únicamente válido para

aplicaciones que estánbasadas en formula-rios Windows, nosiendo válido su usopara servicios Win-dows o aplicacionesWeb.

El siguiente paso,una vez obtenida lareferencia, y antes decontinuar, es asegu-rarnos que estamosautenticados, lla-mando al métodoEnsureA uthenticateddel objeto tfs obteni-

do de la llamada a GetServer. Con esto,nuestro código quedaría como se mues-tra en el listado 1.

Obteniendo la referencia al servicio de TFS que vamosa usarAhora que ya tenemos la referencia anuestro servidor, vamos a obtener unareferencia al servicio que vamos a usaren este ejemplo, que es Microsoft.Team-Foundation.WorkItemTracking.Client.WorkI-temStore. Hay multitud de servicios dife-rentes suministrados por un servidorTFS; todos ellos se obtienen siemprellamando al método GetService de nues-tro objeto tfs. Este método recibe unparámetro con el tipo de servicio quequeremos obtener. Podemos consultarvarios ejemplos de distintos servicios enla documentación de MSDN en elTeam Foundation Server SDK, queofrece una referencia completa de todoslos modelos de objetos.

En nuestro caso, el código paraobtener la referencia al servicio dealmacén de work items quedaría comose muestra en el listado 2.

Obteniendo la referencia al proyecto

Una vez que tenemos la referencia alservicio de work items, debemos espe-cificar contra qué proyecto queremostrabajar, ya que cada proyecto tendrá,en potencia, una colección diferenteFigura 2

TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer(

“HTTP://TFSRTM08:8080”, new UICredentialsProvider()

);tfs.EnsureA uthenticated();

Listado 1

WorkItemStore store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore));

Listado 2

dotN

etM

anía

<<

48

dnm.ALManía<<

de work items. Para ello, usaremos lacolección Projects del objeto storeobtenido en el paso anterior. Estacolección contiene el listado de todoslos proyectos en el almacén de workitems, que recordemos pertenece a unservidor concreto. Como clave paraacceder a esta colección usaremos elnombre del proyecto. En nuestroejemplo, basado en la máquina virtualque nos proporciona Microsoft para elaprendizaje, utilizaremos el proyectoTicTacToe, que ya está creado de ante-mano en dicha máquina virtual. Nues-tro código quedaría según se muestraen el listado 3.

Esto nos devolverá un objeto deltipo Microsoft.TeamFoundation.WorkItem-Tracking.Client.Project.

Referenciando el tipo de work itemEl siguiente paso es obtener el tipo dework item que queremos crear o editar,para a partir de esa definición crear el nue-vo work item. Para ello, usaremos la colec-ción WorkItemTypes del objeto ticTacToe-Project obtenido anteriormente, indi-cando el tipo de work item que nos inte-resa, en este caso de tipo tarea (“Task”).Obtendremos un objeto del tipo WorkI-temTypesMicrosoft.TeamFoundation.WorkI-temTracking.Client.WorkItemType.

Una vez obtenido el tipo de workitem, usaremos su método NewWorkItempara crear una referencia a un nuevowork item vacío, tal y como mostramosen el listado 4.

En este caso estamos almacenandola referencia al work item en una varia-ble miembro de la clase, ya que necesi-taremos esta referencia en otro méto-do más adelante para grabarla.

Si lo que necesitamos es editar unwork item ya existente, podemos obte-nerlo a través de su identificador, usan-do el objeto ticTacToeProject de estemodo:

Con esto obtendríamos el work itemcon identificador 100 de ese team pro-ject, y podríamos usarlo igual que unode nueva creación, con la diferencia deque al mostrar su formulario con elcódigo que presentaremos a continua-ción, ya se nos mostrarían los camposrellenos.

Usando el layout del work itemen nuestros formularios Win-dowsAhora vamos a mostrar el formularionormal de edición de un work item en

nuestro propio formulario. Para estousaremos la clase Microsoft.TeamFounda-tion.WorkItemTracking.Controls.WorkItem-FormControl, que representa un formu-lario de edición de un work item paraun formulario Windows (para la Webaún no hay nada similar). Vemos su usoen el listado 6.

Si en este momento ejecutamos laaplicación, ya obtendremos un formu-lario que nos muestra la edición delnuevo work item de tipo tarea. Este for-mulario será exactamente igual que elque nos mostraría Team Explorer alcrear un nuevo work item de tipo Task(figura 3).

Lo único que nos resta es, en elevento OnClick del botón “Grabar” queañadimos al principio, agregar el códi-go para guardar el work item que esta-mos rellenando; eso lo haremos llaman-do al método Save del objeto _newWi:

Si la extensibilidad la queremosimplementar sobre nuestra propia apli-cación de formularios Windows, conesto ya tenemos por dónde empezar;sin embargo, no siempre vamos a usarun formulario para rellenar o editar loswork items en nuestras aplicaciones. Vea-mos cómo podríamos crearlos manual-mente.

Creación manual de un workitemMostraremos cómo rellenar manual-mente los campos del modelo de obje-

Project ticTacToeProject = store.Projects[“TicTacToe”];

Listado 3

WorkItemType taskWIType = ticTacToeProject.WorkItemTypes[“Task”];

_newWi = taskWIType.NewWorkItem();

Listado 4

WorkItemFormControl fc = new WorkItemFormControl();

fc.Dock = DockStyle.Fill;fc.BackColor =

System.Drawing.SystemColors.Window;fc.Item = _newWi;fc.ReadOnly = false;

WiPanel.Controls.A dd(fc);fc.Show();

Listado 6

_newWi.Save();

Listado 7

WorkItem existingWi = ticTacToeProject. Store.GetWorkItem(100);

Listado 5

Un servidor TFS ofrecemúltiples servicios

diferentes, que se obtienensiempre llamando al

método GetService deTeamFoundationServer

dotN

etM

anía

<<

49

dnm.ALManía<<

tos usando el objeto _newWi que hemos obtenido ante-riormente. Este nuevo código lo agre garemos al even-to OnClick del segundo botón de nuestro formulario.

Existen dos mo dos de rellenar los campos. Loscampos de sistema, que son fijos en cualquier tipo dework item, los tenemos en la enumeración CoreField;otros están disponibles directamente como propie-dades del objeto work item, como por ejemplo el títu-lo y la descripción. Sin embargo, un work item puedetener muchas propiedades propias que damos de altaal crear su definición, que están representadas por unnombre único en su definición. A estas propiedadespersonalizadas accederemos mediante la colecciónFields del objeto de work item.

Para no interferir con el código anterior, partire-mos de un nuevo work item “limpio”, y el código semuestra en el listado 8.

Validación de campos

Cuando creamos el work item mediante su formulario,en mismo momento se ejecutan las reglas de validaciónde los valores introducido para los campos del work item,según un flujo predefinido. Pero cuando creamos el workitem mediante código, ese trabajo debemos hacerlo noso-tros, comprobando antes de grabar si existe algún cam-po del work item que tenga un valor incorrecto. Esto lohacemos comprobando la propiedad IsValid de cadacampo de la colección Fields del objeto.

Para mayor rapidez, y mediante una consultaLINQ, vamos a obtener una colección con todos loscampos con valor incorrecto antes de grabar, comose muestra en el listado 9.

Una vez que todos los campos del work item queestamos creando tengan un valor correcto, ya podría-mos llamar al método Save del work item para grabar-lo, al igual que hemos hecho anteriormente.

ConclusionesSi bien la extensibilidad de TFS es compleja en térmi-nos generales, aquí hemos presentado una de las posi-bilidades que tenemos para integrar el flujo de trabajode TFS en nuestros sistemas, para por ejemplo crearautomáticamente work items en caso de una determina-da actividad de nuestro equipo de desarrollo, como sali-da de nuestras aplicaciones, o simplemente para crearnuestras propias aplicaciones comerciales que extiendanlas capacidades de un servidor TFS.

Todo el modelo de objetos lo tenemos detallado, connumerosos ejemplos, en el Team Foundation ServerSDK, disponible en MSDN: http://tinyurl.com/TFS-SDK

Ahora solo me queda animaros a que reviséis estosejemplos y las ideas que en ellos se proponen; pero siem-pre id con cuidado, recordad que el código de vuestrosproyectos, las tareas, etc. están almacenados en vuestroTFS, y cualquier error puede ser fatal.

Figura 3

// Reiniciamos el Work Item_newWi = _newWi.Type.NewWorkItem(); // Propiedad directa de las principales_newWi.Title = “Nuevo título”;

// Propiedad directa de estado inicial // del Work Item_newWi.State = “A ctive”;

// Propiedad accedida a través de Fields // y la enumeración CoreField // (aunque también es de las// propiedades directas)_newWi.Fields[CoreField.Description].Value =

“Descripción”;

// Propiedad accedida a través de Fields // y su nombre completo_newWi.Fields[“Microsoft.VSTS.Common.Rank”].

Value = “Rank”;

var invalidFields = from f in _newWi.Fields.Cast<Field>()where !f.IsValidselect f;

StringBuilder invalidFieldsMessage = new StringBuilder();

foreach (var field in invalidFields){

invalidFieldsMessage.A ppendFormat(“El campo {0} tiene un valor incorrecto.”,

field.Name);}

Listado 8

Listado 9

Durante años, las aplicaciones Web se han ejecuta-do a través de un tipo especial de aplicación: el nave-gador del cliente. Esto sigue siendo así todavía hoy,y lo será en el futuro previsible. El navegador mane-ja el código HTML y JavaScript, y cualquier acciónque desde éste se ordene se ejecuta en una sandbox,lo que garantiza que no hay posibles daños para elordenador del usuario. JavaScript es un lenguajeinterpretado, y su naturaleza, junto a la barrera cre-ada dentro del navegador, hacen muy difícil (aun-que no imposible) que un usuario malintencionadoejecute acciones peligrosas.

Silverlight es un motor mucho más poderosoconectado al navegador. Aunque Silverlight habilitaun cierto número de escenarios posibles para las apli-caciones, también plantea consideraciones de segu-ridad, tanto para los usuarios como para los respon-sables de TI. Independientemente del entorno de eje-cución, siempre que se instala una extensión binariaen un navegador se plantea, voluntariamente o no,una cuestión de seguridad. El código se descarga deInternet, se instala en la máquina cliente y —quizá deforma no segura— se ejecuta. Por lo tanto, para queun complemento de navegador tenga éxito, debe plan-tearse seriamente la seguridad del código.

El código de Silverlight es administrado poruna versión fundamental y reducida del CLR de.NET. Esta versión comprimida se conoce como

CoreCLR. En CoreCLR, la seguridad del códigoalojado se maneja utilizando un modelo distinto alque utiliza el CLR tradicional: el modelo de trans-parencia (Transparency Model). Para ser exhaustivos,diremos que este modelo no es totalmente nuevo,ya que fue introducido en .NET Framework 2.0 conel propósito de simplificar la construcción de libreríasque exponen servicios a código de confianza parcial.

La idea básica del modelo de transparencia es quecada aplicación se ejecute en un dominio de aplica-ción configurado como una sandbox de confianzaparcial. El conjunto exacto de permisos de esa sand-box se define para cada aplicación. Opcionalmente,la aplicación puede suministrar una lista de funcio-nes administradas o nativas cuya seguridad en las lla-madas se garantiza, que estarán disponibles para elcódigo. Este modelo, algo simplificado mediante unpar de condiciones previas, es lo que garantiza laseguridad del código en las aplicaciones Silverlight.

Por tanto, toda aplicación ejecutada por elCoreCLR debe atenerse a lo establecido en esa sand-box predeterminada. En otras palabras, todas lasaplicaciones Silverlight tienen las mismas restric-ciones, y esas restricciones no son modificablesmediante configuración, sino que están embebidasen el entorno de ejecución. Silverlight está cerradorespecto a los cambios en la seguridad. No hay per-misos individuales para las aplicaciones, y –en total-

Silverlight en acción

Dino Esposito

Arquitecto en IDesign,Dino Esposito es una delas autoridades mundia-les reconocidas en tec-nologías Web y arqui-

tectura de software. Suslibros más recientes son"Programming ASP.NET3.5-Core Reference" e"Introducing Microsoft

ASP.NET AJAX" (Micro-soft Press). Es ponente

regular en eventos de laindustria de ámbito

mundial, como TechEd oDevConnections, y

europeos, como Dev-Week y Basta.

Tengo una pregunta muy sencilla y me gustaría una respuesta similar, casi binaria. ¿Es Sil-verlight seguro? ¿Y cuánto? ¿Por qué utiliza un modelo de seguridad totalmente distin-to al de las aplicaciones .NET?

todonet@qa

Este mes exploramos algunos aspectos relacionados con el desarrollo en Silverlight.Tocaremos aspectos relacionados con la seguridad en el acceso a datos, la compatibi-lidad binaria y los cambios futuros en la plataforma.

tod

otN

et.q

a@

dot

netm

ania

.com

solo hay dos conjuntos de permisos: con-fianza total (full trust) y los permisos deejecución en la sandbox. Como conse-cuencia de esto, las aplicaciones Silver-light son de confianza parcial, y comoresultado no pueden elevar sus privile-gios más allá de lo establecido por la sand-box de ejecución.

Todo el mundo estará de acuerdo enque no hay más certezas absolutas que lasde la muerte y los impuestos. Pero, eneste caso, hay una tercera: ningún códi-go malicioso podrá colarse en su máqui-na a través de una aplicación Silverlighto código vinculado con ella. Pero, vea-mos algunos detalles. Ante todo, ¿cuál esla relación entre el modelo CAS (CodeAccess Security) y este Modelo de Trans-parencia?

Cuando CAS está habilitado, cualquiermétodo de una clase de .NET Frame-work puede ejecutar cualquier acción, ano ser que el ensamblado al que perte-nece carezca de los permisos adecuados.Pero en el CoreCLR, el CAS ha sidoreemplazado por el Modelo de Transpa-rencia. Cualquier código que vaya a travésdel CoreCLR se considera de confianzaparcial y no puede llamar a métodos querequieran privilegios superiores.

En términos prácticos, la seguridaddel CoreCLR se mueve en torno a unospocos atributos, tal y como se muestraen la tabla 1.

Una diferencia fundamental entreambos modelos es que, en Silverlight,al ser todo el código considerado comotransparente, no se puede acceder y/oejecutar operaciones consideradas comocríticas (a través del atributo Security-Critical).

¿Cuál es, entonces, el papel del códi-go SecuritySafeCritical? Pues el lectorpuede imaginarse la situación en base a loque cada tipo tiene permitido. El servir depuente entre los dos mundos, el de códi-go transparente y el SecurityCritical.Esto es debido a que hay situaciones legí-timas donde el código de usuario puedenecesitar la ejecución de código crítico.Un buen número de características inte-resantes del sistema se consideran de códi-go crítico, tales como la entrada/salida deficheros. El código SecuritySafeCriticales una capa intermedia que se sitúa entreambos mundos y habilita la verificación yvalidación de parámetros, garantizandoque las llamadas a código crítico son segu-ras y apropiadas. Pero, ¿cómo de seguroes el código crítico? En otras palabras, ¿esposible que un programador inyecte supropio código SecurityCritical en unaaplicación Silverlight? Este es un puntoclave para probar si el entorno de Silver-light es seguro o no.

Una aplicación Silverlight constade dos tipos de código: el de la apli-

cación y el de la plataforma. El pri-mero es el que creamos nosotros comodesarrolladores y se descargan losusuarios a sus máquinas. El segundoes el que permite que las aplicacionesSilverlight se ejecuten, y es –esencial-mente- el conjunto de ensambladosde sistema que el usuario tiene quereferenciar. Bien, pues el código detipo SecurityCritical o SecuritySa-feCritical solo puede formar partedel CoreCLR. Ningún método o cla-se de usuario puede ser marcado comoSecuritySafeCritical. El runtime deSilverlight, además, trata como per-tenecientes a la plataforma solamen-te aquellos ensamblados firmados digi-talmente por Microsoft y cargadosdesde el directorio de instalación deSilverlight. Ningún código descarga-do dinámicamente puede ser conside-rado como código de la plataforma.

En resumen, Silverlight es seguropor defecto, y es un entorno cerrado enel que la seguridad está embebida den-tro del CoreCLR.

dotN

etM

anía

<<

51

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

dnm.todonet@qa<<

Atributo Descripción

SecurityTransparent Predeterminado para cualquier código Silverlight. El código se ejecutaen confianza parcial y no se permite ejecutar ninguna llamada quepudiera suponer una elevación de privilegios.

SecuritySafeCritical Cualquier clase o método marcado con este atributo se ejecuta comofully trusted (confianza total). Tales clases o métodos pueden ser lla-mados por código transparente.

SecurityCritical Cualquier clase o método marcado con este atributo se ejecuta comofully trusted (confianza total). Tales clases o métodos, sin embargo, no pue-den ser llamados por código transparente. Solo el código marcado comoSecuritySafeCritical puede invocar directamente este tipo de código.

Tabla 1

La cuestión clave aquí es por qué no pue-des utilizar determinados contenedores DIen Silverlight. La razón es que los ensam-blados Silverlight y los de .NET no soncompatibles a nivel binario. Y esto es pordiseño, en lo que concierne a Silverlight

2.0. Esta incompatibilidad binaria desapa-recerá en el futuro, pero no de momento.Eso significa que, por ahora, no puedesreutilizar cualquier ensamblado .NET enSilverlight sin recompilarlo primero. Ycuando vayas a recompilar un ensamblado

.NET para Silverlight, tendrás que consi-derar las diferencias en las clases base de laplataforma (BCL).

Hay posibilidades de que con la apari-ción de .NET Framework 4.0 (a finales de2009), Microsoft divida la funcionalidad

Mi aplicación utiliza gran cantidad de Dependency Injection (DI) a través del marco de trabajo contenedorCastle Windsor. En particular, se utiliza extensamente en la interfaz de usuario Windows Forms. Ahoraestoy considerando migrar la interfaz de usuario a la Web y a Silverlight en particular. ¿Cómo puedomanejar Dependency Injection en Silverlight?

Silverlight no incluye la API de ADO.NETpara acceder a datos, sean éstos locales ono. Creo que esto fue una decisión razo-nable del diseño de la plataforma, paramantener el tamaño general del comple-mento lo más pequeño posible. Sin embar-go, los controles Silverlight soportan enla-ce a datos (data binding) y capacidades deconsulta de colecciones y objetos median-te LINQ to Objects.

La cuestión es ¿cómo descargar datos uti-lizables por un cliente Silverlight? La res-puesta está en la propia formulación de la pre-gunta: descargar. Conectando tu aplicaciónSilverlight a un servicio remoto, se puede des-cargar cualquier cantidad de datos a la inter-faz de usuario que los necesite.

Si optamos por utilizar servicios WCF depropósito general, podremos fácilmente reu-tilizar buena parte del código de servidor. Elservicio se convierte en una fachada que daacceso a una infraestructura existente. La API de redesy algunas facilidades incluidas en Visual Studio 2008hacen que sea fácil añadir una referencia a un servicioWCF, y crear un proxy de acceso para la aplicación clien-te. Una vez que los datos se han descargado en el clien-te, el enlace a datos es trivial.

No obstante, con la versión 2.0 de Silverlight dispo-nes de otra opción adicional. Puedes utilizar un serviciode ADO.NET Data Services, que a su vez se basa enun modelo de datos de ADO.NET Entity Framework.Desde la perspectiva de Silverlight, no hay mucha dife-rencia. Se sigue trabajando con proxies, que son añadi-dos mediante la funcionalidad tradicional de referenciade servicios, tal y como se muestra en la figura 1.

La aproximación basada en WCF permite reuti-lizar la mayor parte de la capa de acceso a datos deque puedas disponer. La otra opción requiere la cre-ación previa del modelo de Entity Framework. Unasegunda diferencia entre ambos modos es que no esposible configurar los ficheros de políticas cross-domain(acceso entre dominios de aplicación distintos) paraADO.NET Data Services desde Silverlight. Cualquierconfiguración que funcione para otros servicios no esválida para ADO.NET Data Services. Esta es unalimitación conocida de estos servicios, y la única for-ma de abordarla que me viene a la mente, es –nueva-mente- usar un envoltorio WCF para el servicio dedatos.

hoy situada en la librería mscorlib en dos ensamblados meno-res, uno de ellos conteniendo simplemente el CoreCLR yel otro con el resto del código. De esa forma, el ensambla-do del CoreCLR podría enlazarse a Silverlight, sin romperla compatibilidad binaria entre Silverlight y .NET.

Así pues, ¿qué puede hacerse en relación con lainyección de dependencias? En realidad, lo que nece-

sitas es una librería DI compatible con Silverlight. Unode los marcos de trabajo que conozco que ofrecen esacompatibilidad es NInject. Se puede descargar dehttp://www.ninject.com. El sitio Web ofrece el códi-go fuente de la librería y versiones precompiladas para.NET, Silverlight 2 e incluso .NET Compact Frame-work. Esa es la única forma, hoy por hoy.

dotN

etM

anía

<<

52

dnm.todonet@qa<<T

odot

Net.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

Traducido al castellano por Marino Posadas

Silverlight ofrece un buen número de capacidades de todas clases: sistema de archivos, acceso a redes,XML, etc. Pero no ofrece ningún soporte de bases de datos, ni siquiera en los escenarios donde puedeasumirse la existencia de una instancia de SQL Server Express. ¿Cómo se puede trabajar con datos rela-cionales desde un cliente Silverlight?

Figura 1

Con una organización impecable, el evento comenzócon una exposición por parte del director de Plataformay Desarrollo de Microsoft Ibérica, Enrique Fernán-dez-Laguilhoat (en la foto superior), sobre las nove-dades que se avecinan y que fueron presentadas en lapasada PDC 2008 en Los Ángeles, en la que recalcó laimportancia del nuevo sistema operativo en "la nube",Windows Azure, así como de lo que significará Oslo ysus herramientas asociadas dentro del ciclo de vida,haciendo a la vez un repaso inicial de las posibilidadesque la amplísima oferta presentada en el evento van asuponer para el mundo del desarrollo.

El track de desarrolladoresEn el programa común de conferen-

cias, Pablo Gorriti habló de “Diseño deinteracción para desarrolladores”, dondeexplicó lo que él llama el “ciclo Investiga-ción-Análisis-Prototipado”, y presentómuchas otras recomendaciones para lasfases iniciales de los proyectos que redun-dan en la usabilidad de las aplicaciones. Acontinuación, en “Depurando hasta lasaciedad”, Pablo Álvarez Doval nosmostró algunas de las cosas que se pue-

den hacer con WinDBG sin necesidad de ser un expertoen el tema, y, además, dejó los materiales de demostra-ción en su blog (http://geeks.ms/blogs/palvarez, que desdeaquí recomendamos). David Carmona nos recordó alos que presentamos con frecuencia muchas de las cosasque ya sabemos y olvidamos y unas cuantas que no sabía-mos, en su charla " Presentaciones y demos con buenanota". Interesante, como siempre.

En la sesión de la tarde, Octavio Hernández nosanticipó algunas de las características más interesantesde la nueva versión de C# 4.0 que acompañará a .NET4.0 y Visual Studio 2010, donde se esperan muchas nove-dades, incluso en la propia interfaz, que estará hechatotalmente en WPF. El resto de las ponencias de desa-rrollo se las “comió” ese monstruo que es David Sal-gado, quien –aprovechando que es de Bilbao- nos hablóy demostró muchas de las características de Windows7, Windows Azure, Parallel Programming, Mesh yun montón de cosas más.

El track de profesoresEl track de profesores despertó una interesante polé-

mica a partir de una propuesta del Dr. Miguel Katrib,quien nos planteó la conveniencia de utilizar el lenguajeC# como vehículo para la enseñanza de la programación

dotN

etM

anía

<<

54

{dev_camp} Reunión de desarrolladores, profesores y estudiantes

comunidad.net

{dev_camp} es un evento de dos días,cuyo objetivo es mantener vivo elcontacto con la comunidad de desa-rrollo (desarrolladores, profesores deuniversidad y estudiantes), incluyendotanto sesiones técnicas comomomentos de ocio.

desde los primeros cursos en las titulacio-nes de Informática. A partir de su exitosaexperiencia personal utilizando C# en laenseñanza, desde el mismo momentode su aparición en 2001, el ponente nosargumentó, e ilustró con ejemplos, cómoenfocar mejor aspectos conceptualesimportantes en la programación, demanera que se propicien las buenas prác-ticas no solo en lo relativo al paradigma dela orientación a objetos, sino también aluso de otros recursos de C# para hacer unaprogramación más declarativa, funcionaly simple. También se discutió sobre las

bondades de C# y .NET para servir decolumna vertebral de un plan de estudios,facilitando la introducción de otros len-guajes y paradigmas a lo largo del mismo.

La siguiente charla versó sobre lasbondades de las herramientas ALMincorporadas en Visual Studio Team Sys-tem y la conveniencia de introducir estastecnologías en los planes de formación eninformática, algo muy necesario para laproducción de software en la empresaespañola actual, que aqueja el déficit deformación y habilidades de los tituladosen estos temas. Como colofón de la charla

Luis Fraile, Jesús Jiménez y RodrigoCorral conformaron un panel con el queestableció un interesante diálogo de pre-guntas y respuestas.

Por último, Elisa García (Microsoft)explicó el universo de facilidades (libros,documentación, software, entre otras) queMicrosoft ofrece para apoyar el trabajodocente de aquellos profesores y asigna-turas que utilicen las tecnologías de laempresa. De igual modo, se recabó elapoyo de los profesores y de las universi-dades a los grupos de estudiantes intere-sados en la tecnología .NET.

dnm.comunidad.net<<

Conquistando el mundo con LEGO® Mindstorms y Robotics Studio

El pasado viernes 9 de noviembre, último díadel Tech-Ed Developers, celebramos una muyinteresante sesión sobre cómo programarrobots LEGO Mindstorms con la última ver-sión de Microsoft Robotics Studio, teniendocomo ponente a Bruno Capuano, ponenteexperimentado en el arte de la robótica y laprogramación de autómatas.

En esta sesión ofrecimos una introduc-ción a los fundamentos robóticos, y a los dis-tintos modos de programar el sistema LEGOMindstorms NXT con Microsoft RoboticsStudio. En esta sesión vimos ejemplos decomplejidad creciente que nos mostraroncómo ejecutar dife rentes acciones y asignarcomportamientos a nuestro alter ego robótico,todo de una forma muy visual e intuitiva.

Como detalle, hay que destacar y agrade-cer el patrocinio de LEGO al evento. Ademásde aportar unos fenomenales posters, graciasa su apoyo pudimos regalar un fenomenalLEGO Mindstorms NXT a uno de los pre-sentes, como puede verse en la fotografía queacompaña a este resumen. En cualquier caso,fue una excusa estupenda para despertar el

interés los asistentes, y esperamos poder seguiraportando valor y contar con la confianza deempresas de la importancia de LEGO paraeste tipo de eventos. Infinitas gracias a StevenCanvin, director de Marketing de LEGO y aBelén Ballesteros, Senior Advisor de LEGODirect por su excelente gestión y apoyo a lacomunidad de desarrolladores.

En otro orden de cosas, no nos funcionóla conexión a Internet, por lo que no pudi-mos transmitir en evento online, tal y comoteníamos planificado. En cualquier caso, laspresentaciones y el material de referenciaestán colgados de la página Web del grupode usuarios que organizó el evento, BcnDev:http://www.bcndev.net.

Enhorabuena a Daniel Córdoba, el afor-tunado ganador del LEGO Mindstorms NXT,y al resto de los asistentes, pues animarles a asis -tir nuevamente a la próxima sesión, queintentaremos sea tan interesante como ésta, parade esa manera aportar valor a la comunidad.

¡Hasta la próxima!

El equipo de BcnDev

eventos.eventos.eventos.eventos.eventos.eventos

❑ Deseo suscribirme a dotNetManía por un año (11 números) por un precio de 65,00€ IVA incluido.❑ Deseo que me envíen los números atrasados marcados según el precio de portada. Otros:

(Solo para residentes en España)

FORMA DE PAGO❑ Talón nominativo a nombre NETALIA, S.L.❑ Transferencia bancaria a nombre de NETALIA, S.L. a:

La Caixa - Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia)

❑ Domiciliación Bancaria (con renovación automática, previo aviso)Indique su número de cuenta:

❑ Tarjeta de crédito❑ VISA ❑ MASTERCARDNúmero de su tarjeta: Fecha de caducidad: / (imprescindible)

Firma y/o sello

a de de 2008

DATOS DE ENVÍO

CIF/NIF. . . . . . . . . . . . . . . . . . . . Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

DATOS DE FACTURACIÓN (sólo si son distintos a los datos de envío)

CIF/NIF. . . . . . . . . . . . . . . . . . . . Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Usted autoriza a la mecanizaciónde estos datos. El responsable ydestinatario de éstos es Netalia,S.L. Usted tiene derecho a acce-der a sus datos, modificarlos ycancelarlos cuando lo desee. Susdatos no serán cedidos en ningu-na de las formas posibles a terce-ras partes y no se utilizarán másque para el buen funcionamien-to de su suscripción a la revistadotNetManía y para informar-le de las actividades comercialesque realice la editorial Netalia,S.L. Si no desea recibir informa-ción comercial de dotNetManíamarque la casilla siguiente ❑

Enviar los datos por:

Fax: 914991364 Teléfono: 916667477Email: [email protected]

Netalia, S.L. · C/ Robledal, 135 · 28522- Rivas Vaciamadrid (Madrid)

Oferta válida hasta el 31 de diciembre de 2008 o hasta agotar existencias

❑ Nº40 (6,50€) ❑ Nº41 (6,50€) ❑ Nº42 (6,50€) ❑ Nº43 (6,50€) ❑ Nº44 (6,50€) ❑ Nº45 (6,50€) ❑ Nº46 (6,50€)

❑ Nº47 (6,50€) ❑ Nº48 (6,50€) ❑ Nº49 (6,50€) ❑ Nº50 (6,50€) ❑ Nº51 (6,50€) ❑ Nº52 (6,50€) ❑ Nº53 (6,50€)

Aprenda C# 3.0 desde 0.0Guillermo “Guille” SomEditorial: Solid Quality PressPáginas: 208Publicado: noviembre de 2008ISBN: 978-8493641740Idioma: castellano

Vamos —en este número— a romper una lanza a favor de la edición digital, aprove-chando la publicación de la última obra del popular webmaster Guillermo Som, sobre C#3.0. A los que identifiquen al autor ineludiblemente con el lenguaje VB.NET, les man-damos un mensaje de tranquilidad: no es que haya cambiado de chaqueta (quiero decir,de lenguaje); es que nos demuestra aquí cómo puede hablarse de lenguajes “oscuros” conun verbo claro.

Fiel a su estilo, recorre todas las características importantes de esta versión, ilustran-do con ejemplos (de los que funcionan) todo lo que dice y demostrando que siempre haysitio para la aproximación sencilla a un problema complejo. El libro está disponible enformato digital en el sitio de Solid Quality Press (http://www.solidq.com/ce/Press.aspx).

Hasta el 31 de diciembre, los lectores de dotNetManía tienen un 40% de descuentousando el cupón .NetManiaC#3 en : http://www.solidq.com/ib/eBookDetail.aspx?Id=2.

Microsoft SQL Server Compact 2008 SP 1: Referencia completaJosé Miguel TorresEditorial: Krasis PressPáginas: 402Publicado: 2008ISBN: 978-8493548964Idioma: castellano

En un mundo como el de la programación para dispositivos móviles y –en especial-el desarrollo de aplicaciones de gestión para ellos, no abundan las obras exhaustivas comola que abordamos aquí. Por ello es doblemente interesante la publicación de la segundaobra de este MVP y webmaster, especializado en este tipo de desarrollos y con una yalarga experiencia en arquitectura de aplicaciones. No se trata de una obra ilustrativa de"qué puedo hacer con", sino de un compendio completo de posibilidades, que el autorilustra de forma magnífica con ejemplos y código de manera que el lector pueda seguirpuntualmente los caminos apuntados o probar directamente los casos expuestos.

Incluso para que la referencia que apunta el título sea más completa, se abordan pro-blemas diarios de mantenimiento y administración de este tipo de aplicaciones que nosuelen estar presentes en obras exclusivas de desarrollo. En suma, una obra altamenterecomendable si queremos abordar cualquier aplicación de esta naturaleza.

biblioteca.net

nove

dad

es MCTS Self-Paced Training Kit (Exam 70-502): Microsoft .NET Frame-

work 3.5: Windows Presentation FoundationMatthew Stoecker. Editorial: Microsoft Press. Páginas: 560. ISBN: 978-0735625662. Fecha

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

Microsoft .NET: Architecting Applications for the EnterpriseDino Esposito y Andrea Saltarello. Editorial: Microsoft Press. Páginas: 464. ISBN: 978-

0735626096. Fecha de publicación: principios de 2009. Idioma: inglés.

TEXTO: MARINO POSADAS

dotN

etM

anía

<<

58

desvánMarino Posadas

Vector Math for 3D Computer Graphics. Se trata de untutorial online sobre todo lo que hay quesaber para comenzar a diseñar imágenesen 3 dimensiones. Lo más interesante essu enorme carácter didáctico, ya queempieza desde 0 (presentando el con-cepto de punto), y va avanzando pro-gresivamente a lo largo de 16 capítulos.Es una iniciativa de la Central Con-

necticut State University. Accesible en el enlace: http://chor-tle.ccsu.edu/VectorLessons/vectorIndex.html.

Section 508: Uncle Sam's Guide To Web Accessibility es unartículo firmado por Rob Ballou, enSitepoint, donde analiza los puntosmás importantes que se deben teneren cuenta para hacer una Web acce-

sible, utilizando como ejemplo la página principal de la Agen-cia Central de Inteligencia (CIA) norteamericana. Curioso:http://www.sitepoint.com/article/section-508-web-accessibility.

Silverlight SDK. Sitio dedicado a la programación en Silverlight,que aborda múltiples problemas del día a díadel desarrollo, y tiene una buena frecuenciade actualización.

Most useful Visual Studio Add-ins es una página compendioperteneciente al sitio antes mencionado, en la que se ana-lizan uno a uno algunos de los más interesantes comple-mentos disponibles para Visual Studio. No está muy actua-lizada, pero contiene una interesante lista de comple-mentos (http://www.plentyofcode.com/2007/07/most-useful-top-15-visual-studio-add.html)

documentos en la red

utilidades del mes

sitios del mes

El uso de YouTube, explicado mediante un modelo matemático

¿Por qué algunos vídeos se ven millones de veces mientrasel 90% solo alcanzan unos pocos visitantes? La respuestano es sencilla, aunque sí parece tener una explicación cientí-fica según los profesores Riley Crane, de la Universidad deCalifornia, y Didier Sornette, del Departamento de Ges-tión, Tecnología y Economía del ETH Zurich, que han ela-borado un modelo matemático explicativo del funciona-miento de YouTube, publicado por Science Daily.

Según este estu-dio, realizado a lo lar-go de un período dedos años sobre 2 millo-nes de vídeos que aca-pararon durante algúntiempo más 100 visitasdiarias, existen 3 clases

principales de vídeos: los que llaman la atención de formainicial (ya sea por su título, su imagen inicial o una combi-nación de ambos), pero cuyo interés es ínfimo y decaen muyrápidamente; los que se transmiten en forma casi "viral", demanera similar a una epidemia (a través de recomendacio-nes, correos, blogs y enlaces de Internet), y los vídeos "decalidad", cuya difusión inicial muestra una súbita elevación,para ir posteriormente decayendo de forma gradual y pau-latina.

Los vídeos de las dos últimas clases tienen una curva dedesarrollo muy similar, que es sorprendentemente pareci-da a la curva de evolución de ciertos fenómenos naturales,como por ejemplo los terremotos. Si el comportamiento delos usuarios hacia un cierto vídeo sigue uno de estos dospatrones, puede predecirse con cierto nivel de precisión queéste será un éxito y cuánta gente lo visualizará. De hecho,Crane manifestaba que “encuentro fascinante que el com-portamiento de una masa social en un contexto concreto yrespecto a un elemento dado pueda expresarse matemática-mente de un modo similar a fenómenos del mundo físico”.

De acuerdo con estos investigadores, esto permitiría elreconocimiento temprano de éxitos potenciales, y el mode-lo podría ser implantado en otros contextos como el de laventa de libros, para lo cual están llegando a un acuerdo conlos responsables de Amazon.com. Los autores anticipan unanueva disciplina que denominan "Sociofísica", encargadadel estudio de estos fenómenos, que podría tener un amplí-simo campo de aplicación, no solo en estudios estadísticos,sino también en aplicaciones de carácter publicitario y deinvestigación de ventas y apertura de mercados. El artícu-lo completo está disponible en el sitio http://www.science-daily.com/releases/2008/11/081129173718.htm.

noticias.noticias.noticias

Nullsoft Install System (NSIS) 2.41 es unaherramienta para la creación de ins-taladores para Windows. Es pequeñay flexible, y muy adecuada para dis-tribución por Internet. Está basada enscripts y permite crear la lógica paramanejar casi cualquier situación posible en un entorno deinstalación. Disponible en http://www.freewarefiles.com/Null-soft-Install-System-NSIS_program_14289.html.

PlentyOfCode. El sitio www.plentyofcode.com es un compendiode recursos para el desarrollo. Los recursos se agrupan porcategorías, y se ofrecen enlaces relacionados con cada cate-goría, sirviendo de vademécum para cada concepto relacio-nado en la lista. Como muestra, visite: http://www.plentyofco-de.com/2007/07/what-is-microsoft-silverlight.html.