60
dedicada a los profesionales de la plataforma .NET eventos Un desarrollador en el 3GSM Laboratorio Microsoft .NET Micro Framework 2.0 TodotNet@QA Cuando las cosas van mal Comunidad.net Artalde.net. Grupo de usuarios de .NET del País Vasco dotNetManía www.dotnetmania.com entrevista Mark Jewett Product manager del equipo de desarrollo de Microsoft SQL Server en Redmond dotNetManía Bluetooth en .NET nº 35 marzo 2007 6,50 Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows System La evolución del contexto transaccional • Microsoft Dynamics CRM 3.0 SDK. Qué es y cómo usarlo en nuestras aplicaciones • Cómo definir nuestros propios paneles personalizados en WPF • Criptografía práctica

dotNetManía - sergiogonzalezc.files.wordpress.com · puede ir más allá y personalizar un panel para conseguir recursos no incluidos de ... con el que conversamos sobre la visión

Embed Size (px)

Citation preview

dedicada a los profesionales de la plataforma .NET

eventosUn desarrollador en

el 3GSM

LaboratorioMicrosoft .NET Micro Framework 2.0

TodotNet@QACuando las cosas van mal

Comunidad.netArtalde.net.Grupo de usuarios de .NET del País Vasco

dotNetManíawww.

dotne

tman

ia.co

m

entrevistaMark Jewett

Product manager del equipo de desarrollo de Microsoft SQL Server en Redmond

dotNetManíaBluetooth en .NET

nº 35 marzo 2007 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows System

La evolución del contexto transaccional •Microsoft Dynamics CRM 3.0 SDK. Qué es ycómo usarlo en nuestras aplicaciones • Cómodefinir nuestros propios paneles personalizadosen WPF • Criptografía práctica

Bienvenido al número 35, de marzo de2007, de dotNetManía.

Windows Vista viene presentándosedesde principios de noviembre del añopasado, según las ediciones y el público alque va dirigido. Una vez terminadas laspresentaciones, ahora toca la actualizaciónde todos los productos de software parahacerlos compatibles con él, ¡incluidos losde Microsoft! Este mes les ha tocado aSQL Server 2005, con el service pack 2, ya Virtual PC con la versión 2007, que seponen al día para funcionar correctamen-te bajo el nuevo sistema operativo. Estono ha hecho sino empezar; se están fra-guando los cimientos de los cambios enlas tecnologías de la información de lospróximos años con nuevas oportunidadesy retos para los desarrolladores.

En cuanto al futuro de la telefoníamóvil, Eduard Tomás explica breve-mente, en “Un desarrollador en el3GSM”, lo que más puede interesarledel 3GSM World Congress celebradorecientemente en Barcelona, dondeMicrosoft aprovechó para presentar laevolución de Windows Mobile 6, quepor cierto no traerá novedades signifi-cativas para los desarrolladores.

Microsoft ha desarrollado su herra-mienta CRM –Microsoft DynamicsCRM 3.0– pensando también en losdesarrolladores, con grandes posibilida-des de extensión y adaptación gracias asu SDK. Marco Amoedo nos lo expli-ca detalladamente en “Microsoft Dyna-mics CRM 3.0 SDK. Qué es y cómousarlo en nuestras aplicaciones”.

Desde finales del siglo pasado,Bluetooth se ha convertido un están-dar en las comunicaciones inalámbri-cas entre dispositivos, gracias al con-senso entre los principales fabricantes

de software y hardware. Este mes lededicamos nuestro artículo de porta-da “Bluetooth en .NET”, donde JoséMiguel Torres presenta una aproxi-mación al modelo de desarrollo segui-do durante la implementación de suslibrerías .NET para Windows Mobi-le y Windows XP, que tiene disponi-bles en desarrollomobile.net.

Como el monumental trabajo deWPF no puede ser desvelado de un plu-mazo, dotNetManía pretende ir publi-cando una serie de artículos que nos ilus-tren algunas de las capacidades menosdivulgadas de WPF. En este número,Miguel Katrib, Iskander Sierra, Mariodel Valle y Yamil Hernández del gru-po WEBOO de la Universidad de LaHabana, nos ilustran cómo con WPF sepuede ir más allá y personalizar un panelpara conseguir recursos no incluidos debase en WPF.

Este mes entrevistamos a MarkJewett, product manager de SQL Serveren Microsoft Corporation, con el queconversamos sobre la visión de Micro-soft sobre este producto.

Finalmente, quiero destacar, entre losinvitados de este mes, a Lluís Franco,MVP en la categoría de Visual Developer,que a nuestra propuesta de participar enla firma solidaria nos respondió: “¿Algosolidario?, ¿relacionado con .NET?,¡caramba!, ¿y qué hay más solidario queuna transacción?”. Titulamos su artículo:“La evolución del contexto transaccional”.Lluís, que aparte de tener gracia e inge-nio tiene espíritu solidario, dona la canti-dad correspondiente a sus derechos deautor a la ONG Ayuda en Acción. Gra-cias, Lluís.

Espero que lo presentado y lo que lequeda por leer sea de su agrado.

dotN

etM

anía

<<

3

Compatibles con Vista

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 35 • Marzo 2007Precio: 6,50€

EditorPaco Marín ([email protected])

Redactor jefeMarino Posadas([email protected])

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

RedacciónAntonio Quirós, Dino Esposito, Guillermo'Guille' Som, José Manuel Alarcón, LorenzoPonte y Miguel Katrib (Grupo Weboo)

Corresponsal para América LatinaPablo Tilotta

Colaboradores habitualesBraulio Díez, Carlos Quintero, Eladio Rincón,Jorge Serrano, José Miguel Torres, LuisMiguel Blanco, Pepe Hevia, Salvador Ramos ySergio Vázquez

Empresas ColaboradorasAlhambra-EidosPlain ConceptsRaonaSolid Quality Learning

Además colaboran en este númeroEduard Tomás, Iskander Sierra, Lluís Franco,Marco Amoedo, Mario del Valle, RafaelOntivero y Yamil Hernández

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

IlustracionesYamil Hernández

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

www.dotnetmania.com

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

ImprimeGráficas MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

dotNetManíadotNetManía

Paco Marín

sumario 35Un desarrollador en el 3GSM 6-7

Otra vez más, desde el 12 hasta el 15 de febrero, ambos inclusive, Barcelona ha sido el centromundial de las telecomunicaciones: se celebraba una nueva edición del 3GSM World Congress,la que seguramente sea la feria más importante del mundo sobre telefonía móvil.

Entrevista a Mark Jewett 10-12En el pasado Tech-Ed 2006 de Barcelona pudimos entrevistar entre otros a Mark Jewett,product manager del equipo de SQL Server en Redmond, a quien aprovechamos parapreguntarle la visión de Microsoft (actual y futura) sobre SQL Server. Además, aprovechandoque Mark se unía a la sección Ask The Experts, tuvimos ocasión de verle “en acción” al díasiguiente de la entrevista.

La evolución del contexto transaccional 14-17¿Algo solidario?, ¿relacionado con .NET?, ¡caramba! ¿y qué hay más solidario que unatransacción? Básicamente, una transacción en el contexto del desarrollo significa un conjunto deoperaciones que deben validarse todas como una sola. O todas o ninguna. ¡Ya lo tengo!

Microsoft Dynamics CRM 3.0 SDK. Qué es y cómo usarlo en nuestras aplicaciones 18-25Microsoft Dynamics CRM 3.0 es una de las soluciones CRM con más éxito en el mercadogracias a su flexibilidad y facilidad de uso. En este artículo veremos qué posibilidades deextensión y personalización nos ofrece el SDK de Microsoft Dynamics CRM 3.0 desde laplataforma .NET.

Bluetooth en .NET 26-35Hace tiempo me planteé desarrollar una aplicación Bluetooth para mi Smartphone. Las pocasalternativas libres de pago que existían y la búsqueda de cómo funciona realmente Bluetoothme llevaron a plantearme la creación de una librería .NET para Windows Mobile, queposteriormente pasé también a Windows XP.

Cómo definir nuestros propios paneles personalizados en WPF 36-41A través de dotNetManía, los autores se proponen desvelarnos algunos secretos de WPF. Coneste artículo nos ilustran cómo se puede ir más allá y personalizar recursos visuales paraconseguir efectos no incluidos de base en WPF. En este caso nos desarrollan un novedoso panelque distribuye sus elementos de manera circular.

Criptografía práctica 42-47La criptografía nos permite proteger los datos de forma tal, que la visualización o modificaciónde los mismos solo sea posible para aquellos que conozcan la forma en que han sido encriptados.Esto es aplicable no solo a la comunicación entre dos puntos, sino también al contenido denuestros ficheros. Además de proteger la información, también podemos utilizar la criptografíapara garantizar que los datos no han sido alterados y que provienen de una fuente fiable.

dnm.todotnet.qa 48-51Cuando las cosas van mal

dnm.biblioteca.net 51Programming Windows Presentation Foundation Essential .NET

dnm.laboratorio.net 52-55Microsoft .NET Micro Framework 2.0

dnm.comunidad.net 56-57Artalde.net. Grupo de usuarios de .NET del País Vasco

dnm.desvan 58

de 65.000 visitantes y más de1.100 empresas expositoras se han dado encuentroen la ciudad condal, donde se han podido ver losúltimos avances en todos los ámbitos de telefoníamóvil: desde la presentación de Windows Mobile6 por parte de Microsoft, hasta los modelos másavanzados de terminales.

El 3GSM se compone a partes iguales de la zonade exposiciones, donde todos los fabricantes mues-tran sus últimas novedades, y de las distintas confe-rencias, que este año estaban divididas en tres tracks(o series) principales: Mobile Entertainment Summit(donde se discutían las posibilidades de la telefoníamóvil como centro de entretenimiento), CEO Stra-tegies for Growth (donde se comentaban futuras estra-tegias de negocio) y Technology Symposium (and brea-kouts) (donde se mostraban los últimos avances tec-nológicos). El primer día (lunes) tenía un programaespecial, con una serie de conferencias integradas den-tro del Mobile Innovation Forum donde se presentabandistintas novedades (de cualquier tipo), entre las quedestacaron pantallas enrollables y las primeras redessociales basadas en móviles.

Windows Mobile 6Microsoft aprovechó la importancia del 3GSM

para presentar a nivel mundial la evolución de susistema operativo destinado a PDA y smartphones:Windows Mobile 6.

En su stand (situado en el hall 1) Microsoftrealizaba presentaciones donde se mostraban susnovedades más importantes. Windows Mobile 6viene cargado de novedades para el usuario final,ya que la intención de Microsoft es que el siste-ma operativo sea mucho más fácil de usar y más

productivo. Así se entienden novedades como laintegración con Exchange (se pueden consultarcorreos, citas y contactos del servidor Exchangede la empresa) o la integración con los serviciosde Internet Windows Live (por ejemplo, ahora lainformación de un contacto nos mostrará tambiénla información de Windows Live y podremos cha-tear con él o consultar nuestro correo Live). Tam-bién Outook ha mejorado con soporte para emailsen HTML, al igual que Pocket Word, que tienesoporte para tablas y con la posibilidad de des-cargarse documentos de un servidor Sharepointpara su revisión (aunque no podremos colgar lasmodificaciones). Todas estas novedades vienensazonadas con un nuevo look del sistema operati-vo, más tirando a Windows Vista e intentando quela mayoría de tareas comunes estén a un solo clicde distancia. Además, según Microsoft los reque-rimientos de hardware de WM6 son los mismosque los de su predecesor.

Desde el punto de vista de los desarrolladores,no hay novedades significativas: una nueva API desonido (con soporte MP3) y el hecho de que Poc-ket Explorer tiene soporte para aplicaciones AJAXserían las dos más destacadas, junto con un aumen-to significativo del rendimiento en aplicaciones decódigo manejado (Compact Framework 2.0 SP1),según Microsoft.

De HSPA a WiMAXEl segundo día se celebró la keynote principal de

la feria en la que intervinieron, entre otros, ArunSarin (CEO de Vodafone) y Sanjiv Ahuja (CEOde Orange), así como Rob Conway (CEO de laasociación GSM).

Un desarrollador en el 3GSM

eventos

Otra vez más, desde el 12 hasta el 15 de febrero, ambos inclusive, Barcelona hasido el centro mundial de las telecomunicaciones: se celebraba una nuevaedición del 3GSM World Congress, la que seguramente sea la feria másimportante del mundo sobre telefonía móvil.

<< Este año más

Eduard Tomás

EEdduuaarrdd TToommááss tienemás de 8 años de

experiencia en análisisy desarrollo de

aplicaciones.Actualmente trabaja

como director deproyectos y arquitectode software en rraaoonnaa.

Es MCSD.NET ytechnology specialist en

clientes Web con .NET2.0, además de

certificado en UML ySCWCD en Java

Se comentó el programa 3G for All,promovido por la asociación GSM, des-tinado a incrementar la penetración deteléfonos móviles 3G en el mercado. Elobjetivo era conseguir un terminal 3Gpotente y barato y el ganador fue LG, conun aparato basado en el chipset Qual-comm, y un 30-40% más barato que unmóvil 3G estándar.

También se comentó la tecnologíaHSPA (High Speed Packet Access), unamodificación por software de las actualesredes 3G que permite una mayor trans-ferencia de datos (hasta 7.2 Mbits/s debajada y 1.4 Mbits/s de subida). El hechode que HSPA sea una evolución de lasactuales redes, hace que sea mucho másbarata que las tecnologías rivales, entrelas que destaca WiMAX. Actualmenteexisten más de 100 terminales y más de140 redes en todo el mundo con soporteHSPA.

De todos modos, Arun Sarin destacóel peligro que puede suponer WiMAX,tanto por su mayor velocidad respecto aHSPA (hasta 124 Mbits/s) como por elhecho de que WiMAX es una tecnologíadual, red inalámbrica–telefonía móvil, ypidió que la industria se moviese másrápido. Textualmente el CEO de Voda-fone dijo que “no nos podemos permi-tir que 3G LTE siga en fase de defini-ción cuando WiMAX esté comercial-mente disponible”.

Conclusión finalEn resumen, el 3GSM mostró bási-

camente que estamos ante las puertas deun cambio: las nuevas tecnologías (las yacasi inmediatas redes HSPA y las futurasWiMAX o 3G LTE) traerán la alta velo-cidad a la telefonía móvil (a velocidadesiguales o superiores a las actuales ADSLde telefonía fija), lo que hará posible latelevisión a la carta mediante streaming.Se abre un nuevo mundo de posibilida-des, y todas las empresas, a todos los nive-les (operadoras, generadoras de conteni-dos, agregadoras de contenidos, fabri-cantes de terminales y desarrolladoras)deberán estar preparadas. No en vano yase conoce al móvil como la cuarta panta-lla (detrás del cine, la televisión y el orde-nador): Hollywood y Bollywood yaempiezan a rodar cortos específicamen-te diseñados para móviles. Si con las redesy los terminales actuales el mundo delentretenimiento (no sólo películas y músi-ca, sino también videojuegos) ya muevecifras millonarias, el futuro pinta espe-ranzador (se prevee que en el 2015 haya5 mil millones de usuarios de telefoníamóvil, muchos de ellos provenientes delos llamados mercados emergentes).

No es de extrañar, pues, que la fra-se más repetida, con diferencia, en todaslas conferencias de este 3GSM fuera“new business models”.

dotN

etM

anía

<<

7

Las novedades deWindows Mobile 6para losdesarrolladores

• Compatibilidad total conaplicaciones ya existentes.

• Rendimiento mejoradoen aplicaciones de códigomanejado.

• Compact Framework 2.0y SQL Server 2005 Com-pact Edition en ROM.

• Emulador de Visual Studio2005 mejorado,con posi-bilidad de emular GPS.

• Nuevas herramientas dedepuración y análisis derendimiento en VS2005.

• Nueva API de sonido consoporte MP3.

• Soporte para aplicacionesAJAX.

dnm.directo.eventos<<

dotN

etM

anía

<<

8

El 19 de febrero pasado, Microsoft liberóel Microsoft® SQL Server™ 2005 SP2,una actualización que podrá correr sinproblemas en Windows Vista. Además,Microsoft ha anunciado que amplía losderechos de uso en entornos virtualespara permitir instancias ilimitadas en ser-vidores que estén licenciados para la edi-ción SQL Server 2005 Enterprise.

Las mejoras a SQL Server SP2 inclu-yen las siguientes: • Data Mining Add-ins para 2007 Micro-

soft Office System, que permite quelas funcionalidades de data mining deSQL Server Analysis Services (SSAS)sean usadas directamente desde Excel®

2007 y Visio® 2007.• Compatibilidad de SQL Server Repor-

ting Services (SSRS) con Microsoft Offi-ce SharePoint® Server 2007, que pro-vee integración con el Report Centeren Sharepoint, permitiendo la consu-mición y la gestión perfecta dentro delos informes de SSRS.

• Mejoras de SQL Server Analysis Servi-ces para Excel 2007 y Excel Services rela-cionadas con el rendimiento y la fun-cionalidad.

• La comprensión de datos (varDecimal)es una importante característica paraescenarios data warehousing, querequiere menos almacenamiento endisco para los datos decimales e incre-menta el rendimiento general.

• Incremento de la manejabilidad, a par-tir del feedback de los clientes, pro-vee capacidades de manejo para los

administradores de la base de datostales como mejoras en los planes demantenimiento de las bases dedatos, mejoras en el manejo deinformes y un nuevo asistente paracopiar bases de datos.

• Nuevos informes de gestión añadidos aSQL Server Express Edition, que ayu-dan a los clientes a mejorar el rendi-miento de sus bases de datos en las edi-ciones Express y Compact de SQL.

• Mejoras de Interoperabilidad, incluyen-do soporte Oracle en la característi-ca Report Builder, que permite a losclientes usar esta funcionalidad sobrelas fuentes de datos de Oracle. Losclientes también pueden acceder a losSQL Server Reporting Services paraconstruir informes en base a cubosEssbase de Hyperion.

Más información y descargas en:http://www.microsoft.com/sql/sp2.mspx.

SQL Server 2005 Best PracticesAnalyzer (CTP de febrero)

Relacionado con esto, Microsoft haliberado la versión CTP de febrero delSQL Server 2005 Best Practices Analy-zer (BPA), una herramienta más de lafamilia “Best Practices Analyzer...”, querecoge datos de la configuración de Micro-soft Windows y SQL Server y usa una lis-ta predefinida de recomendaciones y bue-nas prácticas de SQL Server 2005 paradeterminar si hay problemas potencialesen el entorno de la base de datos.

SP2 de SQL Server 2005

noticias

eevveennttooss

eevveennttooss

eevveennttooss

eevveennttooss

eevveennttooss

eevveennttooss

n no ot ti ic ci ia as s

n no ot ti ic ci ia as s

n no ot ti ic ci ia as s

n no ot ti ic ci ia as s

Developer Day 2007 “Presente yfuturo del desarrollo Windowscon .NET”

El 29 de marzo se celebrará enMadrid, en las Salas Kinepolis, elDeveloper Day, el evento técnicoanual más importante para desa-rrolladores sobre las iniciativas deMicrosoft en tecnología.

Este año veremos cómo VisualStudio Team System ofrece herra-mientas de ciclo de vida estrecha-mente integradas y extensiblespara incrementar la previsibilidaddel proceso de desarrollo de soft-ware. También tendremos laoportunidad de echar un vistazoal futuro próximo y anticiparnosa Microsoft Visual Studio codename Orcas. Veremos las noveda-des de los lenguajes C# y VisualBasic, y, cómo no, LINQ, del quetanto venimos escribiendo endotNetManía.

Eventos de grupos de usuarios

.NUGG: Algunas técnicas de hackingen aplicaciones Web • 2 de marzo •Universidad de La Coruña.

Nuberos: ¿Qué trae .NET 3.0? • 12de marzo • Centro de Promoción eInnovación Tecnológica (Cantabria).

BCN .Dev: WinFX: Ahora .NETFramework 3.0 • 22 de marzo • UPCde Barcelona.

GuseNet: Data Integration Day (evo-lución del DTS) • 23 de marzo • Par-que Industrial de Torrellano (Elche).

Esta actualización es totalmente compatible conWindows Vista y con 2007 Microsoft Office System.

Visual Studio 2005 Team Foundation Server Power ToolVisual Studio 2005 Team Foundation Server Power Tooles un conjunto de mejoras, herramientas y utilidades de líneade comandos que mejoran la experiencia de Team Founda-tion Server. Incluye dos nuevas herramientas de línea decomandos y tres que no son de línea de comandos: un con-junto de custom check-in policies, un constructor de tareas detesteo y un editor de plantillas de proceso. Esta versión (1.2)incluye la corrección de algunos bugs y añade las funcionali-

dades de: Workspace Command, Treeclean Command, Team Sys-tem Process Editor, Check-in Policy Pack y Build Test Tools Task.

Virtual PC 2007Microsoft ha anunciado la disponibilidad de VirtualPC2007, su solución de virtualización compatible conWindows Vista (tanto como host como cliente). Puededescargarse gratuitamente desde: www.microsoft.com/win-dows/products/winfamily/virtualpc.B

RE

VE

S

en nuestras entrevistas, nues-tra primera pregunta es –simplemente– una introduc-ción del entrevistado a nuestros lectores…

Por supuesto. Mi nombre es Mark Jewett, y soy productmanager del equipo de SQL Server en Redmond, lo que, enmi caso, supone pasar la mayor parte del tiempo pensandoen bases de datos. Pero en cualquier escenario donde lasbases de datos puedan estar presentes. Eso también signifi-ca tener la oportunidad de hablar con las dos partes impli-cadas en los productos: los que lo desarrollan y los usuariosfinales, para captar sus necesidades.

¿Tú te ocupas de todas las ediciones de SQL Server?Bueno, como sabes tenemos varias ediciones del pro-

ducto. Y mi labor tiene que ver con todas, pero nos organi-zamos el trabajo, claro. Ahora estoy más volcado con SQLServer Express que, aunque nació con el objetivo de ser usa-do principalmente en aprendizaje y por pequeños usuarios,también puede ser usado en portátiles y en equipos de sobre-mesa, cuando la cantidad de información a almacenar y losservicios requeridos no exigen un servidor tradicional. Y aquíMicrosoft ha hecho un gran esfuerzo desarrollando una apli-cación que tiene un excelente comportamiento y no solopuede servir para pequeños negocios o usuarios individua-

entrevista a Mark Jewett

En el pasado Tech-Ed 2006 deBarcelona pudimos entrevistarentre otros a Mark Jewett,product manager del equipo deSQL Server en Redmond, aquien aprovechamos parapreguntarle la visión deMicrosoft (actual y futura) sobreSQL Server.

Además, aprovechando queMark se unía a la sección AskThe Experts, tuvimos ocasión deverle “en acción” al día siguientede la entrevista.

<<Como es habitual

Marino Posadas

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

rrollo para Españay Portugal de SSoolliidd

QQuuaalliittyy LLeeaarrnniinngg.Puedes leer su blog

en hhttttpp::////wwwwww..eellaavveeffeenniixx..nneett.

entrevista

dotN

etM

anía

<<

11

dnm.directo.entrevista<<

les, sino, como ya he dicho, como herramienta de apren-dizaje.

Lo que dices plantea un problema de elección deescenarios sobre los que los usuarios que desean migraraplicaciones se preguntan a menudo. ¿Qué puedesdecirnos al respecto?

En términos de costes del producto, lo primeroque quiero decir es que SQL Server Express es gra-tuito. Y aquí podría ser interesante esclarecer las dife-rencias entre las versiones Express y Compact. Dehecho, ambas son gratuitas, y ambas comparten unaserie de cosas en común, como un buen subconjuntode la sintaxis de T-SQL y el modelo de programaciónde ADO.NET. Pero también existen algunas dife-rencias notables. SQL Server Express, con sus limi-taciones, no deja de ser un servidor. Eso significa quees un excelente producto para los escenarios simplesque hemos mencionado antes.

Respecto a las capacidades de SQL Server CompactEdition, lo más notable es que es muy pequeño, sola-mente un par de megabytes, y por tanto, muy maneja-ble. Y con una serie de facilidades de cara a la sincroni-zación con un servidor que facilitan mucho las tareas dia-rias. Está diseñado para ser un origen de datos local, y,de hecho, se ejecuta en el mismo proceso que la aplica-ción, por lo que el usuario no necesitasaber que nada de eso está operando“entre bambalinas”, por así decirlo.

¿Y qué hay de las transferencias (yde la seguridad vinculada con ellas)?

Los mecanismos de transferenciapermiten una experiencia mucho másrica ahora que antes, sin ninguna duda.Incluso la posibilidad de tener expe-riencias offline mejoradas, que muchosclientes habían demandado para unbuen número de escenarios distintos.

La seguridad es otro punto crucial.En este tipo de escenarios, los profe-sionales de IT tiene miedo entre otrascosas a la pérdida del dispositivo con los datos den-tro (léase laptop o PDA que nos lo dejamos en un taxi,o se pierde). Y a propósito de esto hay algunas cosasincluidas en la edición CE que son interesantes, comoel soporte de cifrado para los contenidos de las basesde datos. Otro punto a favor es que toda la informa-ción se almacena en un solo fichero, que está sujetoa las restricciones de seguridad y permisos estableci-dos en Windows.

Cambiando un poco el tema, a la hora de prepa-rar esta entrevista contigo, he podido ver que colabo-

ras con Dan Fernandez, el lead product manager deVisual Studio Express. ¿Trabajáis juntos?

Pues sí. Trabajamos juntos. De hecho él está enel equipo de desarrollo de Visual Studio Express.Como ya sabrás existen otras 3 versiones gratuitasde Visual Studio, para desarrolladores Web, paraprogramadores de VB.NET y para C#. Así que ellosse centran principalmente en la gente que estáaprendiendo programación, y la forma de hacer esomás sencillo y accesible para todos. Incluso en tér-minos de espacio son versiones que ocupan muchomenos que sus contrapartidas “serias”.

Otra pregunta inevitable es hablar del futuro inme-diato. ¿Puedes anticiparnos algo de la próxima ver-sión de SQL Server (en nombre clave Katmai)?

Bueno, lo primero que hay que decir es que segúnel feedback de nuestros clientes, se espera que tenga-mos cada nuevo producto listo con una frecuenciainferior a 5 años, y no como ha sucedido ahora. Cla-ro que, en este caso, hemos tenido muchas razonespara los retrasos: integración del CLR, garantías deseguridad, desarrollo paralelo –en ciertos aspectos–con el equipo de Windows Vista, etc.

Microsoft ha hecho un gran esfuerzo desarrollando una aplicación gratuita que tiene un excelente comportamiento y no solo puede servir para pequeños negocios o usuarios individuales, sino, comoya he dicho, como herramienta de aprendizaje

dotN

etM

anía

<<

12

dnm.directo.entrevista<<

Eso tiene también sus partes positivas, especial-mente en cuanto a la solidez del producto, que lo hacemucho menos sujeto a actualizaciones y que desde elmismo momento en que ve la luz es un productoincreíblemente terminado y probado.

Pero volviendo a tu pregunta sobre Katmai, espe-ramos lanzar una CTP (Community Technology Pre-view) para mediados del 2007.

¿Puedes comentar alguna de las nuevas carac-terísticas del producto?

No. Lo siento, pero no estamos autorizados acomentar características del producto, porquepodría crear expectativas en los usuarios potencia-les y defraudarles, si una de esas característicastuviese que ser eliminada del producto final porcualquier motivo.

Lo comprendo. Al principio del desarrollo de Vis-ta se habló extensamente sobre WinFS (Windows Futu-re Storage). Y se decía que parte de sus bondadesestarían vinculadas a un motor de base de datos. ¿Exis-te algo relacionado con motores de datos en el siste-ma de búsqueda en Vista?

Realmente no te puedo responder a esa preguntaen profundidad. Sí que es cierto que hubo colabo-ración e interdependencia en un principio, pero,cuando se modificó el motor de búsqueda perdí lapista de cómo estaba eso hecho exactamente. Sí quesé que SQL Server instala componentes en el sis-tema operativo, por ejemplo relacionados con Win-dows Media Player, de forma que sí que hay partesdel sistema que dependen de componentes de SQLServer. Aunque no sé si existe una integración fuer-te con el sistema de búsqueda.

Para ir concluyendo, una pregunta de moda: ¿Cuáles la importancia que ves en todo este movimientoalrededor de BI (Business Intelligence)?

La gestiónde bases dedatos y Busi-ness Intelligen-ce están ínti-mamente rela-cionados. Dehecho, pensa-mos que BI esel complemen-to que necesi-taban las em-presas y usuarios para poder realizar una gestiónauténticamente inteligente de la información queprocesan.

¿Crees que las características que ofrecen lasaplicaciones de BI hoy en día son suficientementeconocidas (como primer paso para poder ser soli-citadas e implantadas por parte de los usuarios)?

Creo que la visión que las empresas tienen desu propio negocio está cambiando como conse-cuencia de las nuevas posibilidades ofrecidas por

estos nuevos productos. Eneso, los productores tenemosuna gran responsabilidad conel público. Es una cuestión,sobre todo, de la calidad deinformación que obtienen, yno solo de la cantidad o esca-labilidad o fiabilidad. Se tra-ta de que la información ayu-de en la toma de decisiones,en los análisis, etc.

Pensamos que inclusoediciones como SQL ServerCE tienen mucho que deciral respecto, porque si tienes

tu información o parte de ella almacenada en telé-fonos móviles, PDA o dispositivos similares, cuan-do estás en un departamento de soporte, necesitasrecuperar la información de esos dispositivos, peroesa información es, a menudo, parte de un flujo dedatos comprometido en un proceso de negocio. Deforma que la manera en que esa información searecuperada, su fiabilidad y demás, es importanteen el flujo de trabajo, y por lo tanto, en los obje-tivos de una aplicación de BI.

Bien, Mark, pues muchas gracias por tus res-puestas, y disfruta de tu estancia en Barcelona.

Desde luego, ya lo estoy haciendo. Muchas gra-cias a vosotros por vuestro interés.

Creo que la visión que las empresas tienen de su propio negocio está cambiando como consecuencia de las nuevas posibilidades ofrecidas por estos nuevosproductos. En eso, los productores tenemos una gran responsabilidad con el público

dotN

etM

anía

<<

14

Desde los antiguos Sistemas Ges-tores de Bases de Datos (SGBD) queempezaron a soportar transaccioneshasta el nuevo espacio de nombres de.NET Framework 2.0 System.Transac-tions han pasado muchos años. Sinembargo, cuando pensamos en unatransacción siempre la asociamos a unmedio capaz de persistir los datos, comouna base de datos. Y es que la posibili-dad de efectuar transacciones viene asolucionar el viejo problema que se pro-duce cuando tenemos que asegurar quetodo un conjunto de operaciones debenvalidarse o rechazarse de plano.

Para comenzar una transacción hayque marcar el momento de inicio(BEGIN), a partir del cual todas las ope-raciones efectuadas no serán definitivas

hasta que se decida terminar con ella,ya sea aprobando (COMMIT) o rechazan-do la transacción (ROLLBACK).

Existen distintos tipos de transaccio-nes, desde las transacciones implícitas más

sencillas, que son proporcionadas de for-ma transparente por la gran mayoría deSGBD, hasta transacciones más comple-jas que pueden llegar a estar distribuidasen varios recursos de una red.

AAyyuuddaa eenn aacccciióónnLluís Franco ha cedido losderechos de autor de esteartículo a la ONG Ayudaen acción, organización que tiene como una de susactividades al apadrinamiento. El apadrinamiento en zonaspobres favorece un vínculo solidario con un niño o niña,lo que permite participar en el desarrollo local al mejorarlas condiciones y la calidad de vida de toda la comunidad.

<< El concepto

Lluís Francofirma solidaria

La evolución delcontexto transaccional

¿Algo solidario?, ¿relacionado con .NET?, ¡caramba!, ¿y qué hay más solidario que una tran-sacción? Básicamente, una transacción en el contexto del desarrollo significa un conjuntode operaciones que deben validarse todas como una sola. O todas o ninguna. ¡Ya lo tengo!

BEGIN TRANSACTIONUPDATE Orders SET Freight = Freight * 2 WHERE OrderDate = ‘20061225’UPDATE Customers SET Country = ‘France’ WHERE Country = ‘Francia’DELETE Customers WHERE Country = ‘Canada’COMMIT TRANSACTION

Lluís Franco es MVP en la categoríade Visual Developer desde 2003,

Microsoft MCP Developer y SoftwareDevelopment Engineer en Fimarge

Societat Gestora de Patrimonis, situadaen Andorra.También es tutor de

campusMVP y webmaster dewww.uyssoft.com . Puede visitar su blogtécnico en www.geeks.ms/blogs/lfranco.

La concurrencia

Hablar de transacciones es hablarde concurrencia, ya que hoy en día escasi imposible imaginar que seamos laúnica persona que accede a los datos enun momento dado. Como concurren-cia se entiende la posibilidad de tenervarios usuarios accediendo a la base dedatos, consultando y escribiendo datosal mismo tiempo, manteniendo una vis-ta consistente de los datos gracias al usointeligente de bloqueos sobre filas o detransacciones.

Dicho de otro modo, ¿qué sucedesi un usuario comienza una transacción,modifica un dato sin terminarla, y acontinuación otro usuario quiere recu-perar el valor de este dato? ¿El segun-do usuario podrá acceder al dato? Encaso afirmativo, ¿qué valor recuperará,el antiguo o el nuevo?

El aislamientoLa respuesta a estas preguntas la tie-

ne el llamado nivel de aislamiento. Enfunción del nivel de aislamiento de laconexión, los datos modificados podránser o no visibles para otros procesos, ypodrán mostrar los cambios realizadossobre los datos o no. Por ejemplo, sidesde un proceso (A) iniciamos unatransacción y modificamos el valor deuna fila de una tabla:

Desde un segundo proceso (B) notendremos acceso a este registro has-ta que el primer proceso (A) terminela transacción mediante COMMIT oROLLBACK, o hasta que termine el tiem-po de espera.

Sin embargo, algunos SGBD comoSQL Server admiten especificar suge-rencias de bloqueo, que permitansuplantar el nivel de aislamiento y deeste modo acceder al registro. En elsiguiente ejemplo se utiliza NOLOCK comosugerencia de tabla para permitir acce-der a los datos modificados que todavíano se han confirmado:

Esto no siempre es lomejor, ya que en algunoscasos como el anterior sepodría dar lo que se lla-ma una lectura no con-firmada o dato sucio, yaque si la transacción delprimer proceso terminasiendo abortada, habre-mos obtenido comoresultado un valor quejamás ha existido.

El diseñoDebemos ser cons-

cientes de este compor-tamiento cuando diseñe-mos una aplicación, ya quenuestros objetos de negocio

existirán dentro de este contexto tran-saccional, y una transacción habi-tualmente implicará a varios de estosobjetos de negocio. Esto plantea elproblema de diseño de que un obje-to de negocio no puede iniciar por sí

solo una transacción, ya que tal vez seencuentre implicado en una en estemomento o esté a la espera de quefinalice un proceso otro componen-te. El hecho es que, como el objetodesconoce su contexto, no puede serautosuficiente y de este modo no pue-de iniciar una transacción por sí solo.Ver figura 1.

En estos casos, debemos tener encuenta que hay que crear el contextotransaccional “a mano”, es decir com-partiendo la transacción entre todos losobjetos implicados, por ejemplo, demodo que cada uno de ellos expongauna propiedad de tipo SqlTransaction oreciba un argumento con un objeto Sql-Transaction en aquellos métodos querealizan acciones sobre los datos (unabuena forma de realizar esto puede serdeclarando una interfaz ITransactiona-ble y haciendo que todos nuestros obje-tos la implementen). De este modo, latransacción se inicia antes de llamar aningún objeto (por ejemplo en una cla-se manager encargada de dirigir la ope-

dotN

etM

anía

<<

15

dnm.firma.solidaria<<

SELECT Freight FROM Orders WHERE OrderID = 10248

SELECT Freight FROM Orders WITH (NOLOCK) WHERE OrderID = 10248

Figura 1. Contexto transaccional

SET TRANSACTION ISOLATION LEVEL REPEATABLE READBEGIN TRANSACTIONUPDATE Orders SET Freight = 50 WHERE OrderID = 10248

dotN

etM

anía

<<

16

dnm.firma.solidaria<<

ración), y a continuación se realizantodas las llamadas a los objetos impli-cados informando el valor de la propie-dad Transaction de cada uno de ellos,esto es propagando la transacción. Paraterminar, se confirma o se aborta la tran-sacción desde el mismo objeto managerque la ha iniciado:

El nuevo vecino (System.Transactions)

Una de las novedades más impor-tantes a mi juicio de .NET Framework2.0 es la incorporación de un nuevoespacio de nombres que simplificaenormemente el diseño de las aplica-ciones, ya que el nuevo objeto Tran-sactionScope permite definir el con-texto transaccional dentro del ámbitode su bloque using, de modo que todoacceso a los datos que se realice den-tro de ese ámbito se considera de for-ma implícita dentro de una transac-ción. Además, para aprobar la tran-sacción basta con invocar el métodoComplete() que esta clase proporcio-na, antes de llegar al final del bloqueusing. En caso contrario, al llegar alfinal del bloque se invocará automá-ticamente al método Dispose(), anu-lando la transacción.

Esto hace innecesario definirningún contexto transaccional, demodo que no es necesario incluir máscódigo en nuestras clases para crearexplícitamente este contexto. Bastacon usar el contexto transaccionalimplícito que proporciona un objeto

TransactionScope cuando sea necesa-ria una transacción. Obviamente, tam-poco es necesario crear una conexiónen el objeto manager, ya que cada obje-to ahora sí es autosuficiente y va a cre-ar su propia conexión para guardar losdatos, y ésta será asociada implícita-mente al contexto transaccional.

¡Fantástico! Y todavía hay más: porsi fuera poco, TransactionScope ademáses capaz de promocionar de forma trans-parente una transacción ligera a unatransacción distribuida.

Transacciones distribuidas

Cuando se crea una transacción, pordefecto se intenta crear una transacciónligera que será controlada por el LTM(Lightweight Transaction Coordinator). Sinembargo, en determinados escenarios estono es suficiente y debemos recurrir al usode transacciones distribuidas. Algunosescenarios que pueden activar la promo-ción de una transacción son:

• Cuando se está usando un con-trolador de recursos que noimplementa la interfaz IPromota-bleSinglePhaseNotification, comopor ejemplo SQL Server 2000.

• Cuando dos controladores derecursos se enlistan dentro de lamisma transacción, como por ejem-plo abrir dos conexiones distintasdentro del ámbito de la transacción.

• Cuando la transacción intervieneen varios dominios de aplicación.

Las transacciones distribuidas songestionadas mediante COM+ a travésdel DTC (Coordinador de Transacciones

//inicia la transacciónSqlTransaction transaction = con.BeginTransaction();...//crea e inserta en la BD n objetos “order”order o = new order(...)//propaga la transaccióno.transaction = transaction;o.Save();...//completa o aborta la transaccióntransaction.Commit();

//inicia el contexto transaccionalTransactionScope ts = new TransactionScope();using (ts){order o = new order(...)o.Save();//completa o aborta la transacciónts.Complete();

}

Mediante el uso de TransactionScope se hace posiblepromocionar de forma transparente una transacción

ligera a una transacción distribuida

dnm.firma.solidaria<<

Distribuidas - Distributed TransactionCoordinator) y su uso hasta ahora no erauna tarea trivial, ya que para crear nues-tras clases debíamos heredar de la claseServicedComponent, como se muestra enel siguiente fragmento de código:

Ahora esta promoción también seproduce ahora de forma totalmentetransparente. En el tercer punto delproyecto de ejemplo que acompaña a

este artículo se muestra cómo pode-mos depurar el código de nuestra apli-cación para ver el momento en el quela transacción se produce, inclusocómo mostrar el DTC para verla enacción (figura 2).

Creo que las ventajas del uso de tran-sacciones distribuidas están bastante cla-ras; sin embargo, el hecho de que pordebajo utilicen interoperabilidad con

COM+ puede resultar un aspecto nega-tivo. Bien, para aquellos que al igual queyo se han planteado esta cuestión, los ani-mo a dar un vistazo al cuarto punto delproyecto de ejemplo, donde se comparael rendimiento en milisegundos, creando100 objetos en ambos tipos de contextostransaccionales.

using System.EnterpriseServices;[Transaction]public class Class1:ServicedComponent{

[AutoComplete]public void DoSomething{

//Hacer algo...}

}

Figura 2.El DTC mostrando una transacción distribuida

Las siglas CRM están muy de moda últimamente enel mundo empresarial, junto con otras muy conoci-das como ERP o SCM. Su significado viene a ser“gestión de las relaciones con los clientes” (en inglésCustomer Relationship Management). Y están tan demoda porque esta tecnología constituye una de lasestrategias empresariales que en los últimos años hademostrado ser de las más rentables para los bene-ficios empresariales.

El objetivo de la estrategia CRM es dejar a unlado antiguos sistemas centrados en el producto ycentrarse en los clientes, tomarlos como referenciaen las decisiones y operaciones empresariales, y asípoder conseguir establecer unas relaciones prove-chosas y duraderas entre una organización y sus clien-tes. Esto puede parecer fácil de decir, pero en reali-dad tiene unas implicaciones muy grandes para elmundo empresarial, aunque ese es otro tema distin-to al que nos ocupa.

Nuestro interés más bien será pensar en cómodar soporte a una nueva forma de organizar la empre-sa. Cómo integrar en un mismo sistema toda la infor-mación de nuestros clientes, pedidos, facturas, ser-vicios, quejas y soluciones, gustos, preferencias y unsinfín de información necesaria para desarrollar estanueva estrategia. Aquí es donde entran en juego lasherramientas CRM y la informática. Hasta ahora,debido sobre todo a la complejidad y coste de estasherramientas, las únicas empresas que se podían per-

mitir automatizar de verdad su estrategia CRM eranlas de tamaño medio-grande; las aplicaciones deCRM quedaban fuera de alcance para las demás orga-nizaciones. Pero con la aparición de la última hor-nada de herramientas de este tipo, el acceso a ellasse ha generalizado. Precisamente dentro de la últi-ma generación podemos encontrar a MicrosoftDynamics CRM.

Hace ya unos cuantos meses que MicrosoftDynamics, antes conocida como Microsoft BusinessSolutions, publicó la versión 3.0 de su soluciónMicrosoft Dynamics CRM. Una herramienta denueva generación, totalmente construida sobre .NETFramework y novedosa en muchos aspectos. De nue-va generación porque se basa en las últimas tecno-logías para abaratar costes, facilitar su implantacióny hacer asequible una completísima herramientaCRM a empresas no tan grandes. Y novedosa sobretodo porque se basa en la utilización de serviciosWeb, porque tiene una interfaz de usuario muy cui-dada, que facilita su aceptación por parte de losempleados, y porque está totalmente integrada conotros productos de Microsoft: tanto con toda la fami-lia Office, para permitir que los usuarios trabajen dela forma en la que se sientan más cómodos (menciónespecial aquí para Microsoft Outlook, que puedeactuar como cliente de Dynamics CRM), como conMicrosoft SQL Reporting Services, para obtenervaliosa información de análisis del negocio, como

Microsoft Dynamics CRM 3.0 SDKQué es y cómo usarlo en nuestras aplicaciones

CRM

MMaarrccoo AAmmooeeddooes Ingeniero Informá-tico y MVP de Micro-soft Dynamics CRM.

Trabaja como consul-tor especializado en

tecnologías Microsoften PPllaaiinn CCoonncceeppttss, y

mantiene un blogsobre Microsoft

Dynamics CRM engeeks.ms

(wwwwww..ggeeeekkss..mmss//bbllooggss//mmaarrccoo).

Microsoft Dynamics CRM 3.0 es una de las soluciones CRM conmás éxito en el mercado gracias a su flexibilidad y facilidad de uso.En este artículo veremos qué posibilidades de extensión ypersonalización nos ofrece el SDK de Microsoft Dynamics CRM 3.0desde la plataforma .NET.

Marco Amoedo

con Microsoft SharePoint, para com-partir información. Todo ello, junto conalgunas herramientas más, dota a estasolución de una grandísima flexibilidad.

Microsoft Dynamics CRM 3.0 es unaherramienta tan flexible que puede adap-tarse para cualquier entorno y funciona-lidad requerida, y si no que se lo pregun-ten al equipo de desarrollo de DynamicsCRM, que la utiliza hasta para gestionarsu blog (http://blogs.msdn.com/crm). Estacapacidad le viene dada, principalmente,por dos bloques de posibles personaliza-ciones que se pueden llevar a cabo sobrela herramienta. En primer lugar, un blo-que de personalizaciones que se realizandesde la propia herramienta y sobre algu-nos ficheros de configuración. Que per-miten desde crear nuevas entidades en elsistema hasta modificar el aspecto de losmenús y formularios de la aplicación,pasando por integrar aplicaciones Webdentro de la interfaz de usuario. Y luegoun segundo bloque, centrado en .NETFramework, que nos permite desdecomunicar aplicaciones existentes en laempresa con Dynamics CRM hastaextender la lógica de negocio de la apli-cación añadiéndole nuevos módulos defuncionalidad. Precisamente será estesegundo bloque del que vamos a hablarhoy.

Lo primero que vamos a necesitarpara introducirnos en el desarrollo yextensión de Dynamics CRM con.NET es conseguir el Software Deve-lopment Kit (SDK) de la herramienta,que puede localizarse buscando “Micro-soft CRM 3.0 SDK” en el centro dedescargas de Microsoft. Este kit es uncompleto conjunto de documentacióny ejemplos sobre cómo personalizar yextender la herramienta; en definitiva,de cómo podemos verticalizar la solu-ción. Al descomprimirlo, encontrare-mos un fichero de ayuda con la docu-mentación, un instalador de la ayudapara Visual Studio y los ficheros deejemplos en C# (aunque también hayalgo en VB.NET). Las principales sec-ciones que encontraremos en la docu-mentación son:

• Guía de programación del ser-vidor. Una guía para desarrolla-dores de código de lado servidor,

de lógica de negocio personaliza-da, de módulos para integración,de ensamblados de workflow y máscosas. Incluye una visión de laarquitectura de Microsoft Dyna-mics CRM, del modelo de entida-des, de los servicios Web, delmodelo de seguridad, así como ungran conjunto de ejemplos de códi-go y clases de ayuda.

• Guía de programación del clien-te. Una guía para desarrolladoresque tienen que personalizar elcliente de Outlook o el clienteWeb de Dynamics CRM. Incluyetemas sobre scripting, integraciónde páginas Web personalizadas yalgo de código de ejemplo.

• Guía de programación ISV. Unaguía para que las empresas desa-rrolladoras de software puedancrear nuevos add-ins para Dyna-mics CRM.

• Guía para diseñar informes. Unaguía para saber más sobre cómodesarrollar o personalizar infor-mes de Dynamics CRM utilizan-do SQL Reporting Services.

De estas cuatro partes, nos vamos acentrar en la programación de lado ser-

vidor, que es la que más relación guar-da con .NET Framework, y por lo tan-to la que más nos interesa investigar.Pero antes de nada, vea en la figura 1la arquitectura de Dynamics CRM y alos puntos de extensión de la misma.

Como se ve en esta figura, a laarquitectura subyace el servidor típicode una aplicación en capas, que se asien-ta sobre ADO.NET para el acceso adatos en SQL Server. Por encima deella se construye una capa de metada-tos, que permite abstraer las entidadesde negocio de los detalles de imple-mentación, dándole la capacidad aDynamics CRM para poder crear nue-vas entidades según sea necesario. Másarriba aparece la lógica de negocio, quetrabaja con las entidades de la capa infe-rior, y puede ser extendida mediantecallouts. Y finalmente, como interfaz delservidor tanto para los clientes comopara otras aplicaciones, aparecen los ser-vicios Web que nos permitirán inte-ractuar con el servidor como si nuestraaplicación fuese un cliente más. Adi-cionalmente, hay otros servicios verti-cales que se usan a lo largo del servi-dor: servicios de integración, serviciosde metadatos y servicios de workflow.Estos últimos pueden ser personaliza-

dotN

etM

anía

<<

19

dnm.dynamics.crm<<

Figura 1. Arquitectura de Dynamics CRM y puntos de extensión

dotN

etM

anía

<<

20

dnm.dynamics.crm<<

dos mediante el desarrollo de nuevos ensamblados deworkflow.

Por lo tanto, los tres principales puntos de exten-sión de la funcionalidad del servidor con .NET Fra-mework serán: los servicios Web (aunque pueden uti-lizarse desde cualquier plataforma, no tiene por quéser .NET), los callouts y los ensamblados de workflow.Vamos a ver entonces cómo podemos utilizar estostres mecanismos para añadir funcionalidad a Micro-soft Dynamics CRM.

Servicios WebLos servicios Web en particular y SOAP en gene-

ral se han convertido en el estándar más importantepara intercambiar información entre sistemas hete-rogéneos y distribuidos. Y Microsoft ha tenido el acier-to de diseñar su nueva hornada de aplicaciones empre-sariales, entre las que se incluye esta versión de Dyna-mics CRM, utilizando los servicios Web como piezacentral de las mismas.

Como podréis descubrir en el SDK, son dos losservicios Web que pueden ser utilizados desde fuerade Microsoft Dynamics CRM. Aunque en realidadinternamente éstos se apoyan en un sinfín de servi-cios más. Estos dos servicios accesibles desde nuestrocódigo son:

• CrmService: Básicamente, proporciona acce-so fuertemente tipado a todas las entidades deMicrosoft CRM, incluidas las personalizadas.Y permite la ejecución de todas las operacionessoportadas en el CRM.

• MetadataService: Este servicio proporcionamétodos para acceder a los metadatos del CRM,y al igual que el anterior, mediante un accesofuertemente tipado.

El acceso fuertemente tipado es una gran innova-ción con respecto a la versión anterior. Ahora podemosutilizar clases del CRM en nuestro propio código, inclu-so las clases personalizadas que añadamos, gracias a lageneración dinámica del WSDL del servicio Web. Antesteníamos que utilizar XML, técnica más engorrosa yque puede dejar errores ocultos, algo que seguimosteniendo que hacer en los callouts, como veremos másadelante. Solo comentar, para aquellos que estén pen-sando que el acceso fuertemente tipado no es siemprebueno, que también existe la posibilidad de usar unaentidad especial llamada DynamicEntity, con la que sepuede mapear cualquier entidad de Dynamics CRM yque permitirá desacoplar nuestro código de las pecu-liaridades de una implementación particular.

Vamos a centrarnos en el servicio Web CrmServi-ce, ya que es el que nos puede aclarar más las posibi-lidades de integración. Aunque realmente el servicio

MetadataService es de gran utilidad. En cualquier caso,en el SDK tenemos disponible muchísima informa-ción sobre los métodos y los objetos asociados. El ser-vicio CrmService, como ya hemos dicho, nos permiteacceder a las entidades del CRM y ejecutar operacio-nes del sistema. Está formado por una serie de 5 méto-dos comunes a todas las entidades de negocio delCRM, y por 2 métodos adicionales de consulta y eje-cución de operaciones. Los métodos comunes son:

• Create: Crea una instancia de una entidad. • Delete: Elimina una instancia de una entidad. • Update: Actualiza una instancia de una entidad. • Retrieve: Recupera una instancia de una entidad. • RetrieveMultiple: Obtiene una colección de ins-

tancias según unas condiciones específicas.

Los otros 2 métodos son:• Fetch: Permite hacer consultas en el lenguaje

FetchXML sobre múltiples entidades, devol-viendo los resultados en XML.

• Execute: Permite, mediante distintos tipos decomandos/mensajes, ejecutar prácticamente cual-quier operación en el CRM, incluyendo las delos métodos comunes.

Pensemos un caso práctico. Imaginad que en elsitio Web de nuestra empresa tenemos un formularioASP.NET de contacto que permite a un visitante dejarsus datos para solicitar más información sobre nues-tros productos o servicios. Ya que disponemos de Dyna-mics CRM, estaría bien que los datos de este visitan-te pasasen directamente al CRM como los de un clien-te potencial, para que nuestro equipo de ventas sepusiese en contacto con él. Pues vamos a hacerlo.

Lo primero será crear una nueva página ASP.NETque incluya varios cuadros de texto para el nombre,teléfono y comentarios, y un botón para enviar lainformación (figura 2).

Luego crearemos un nuevo proyecto de libreríade clases en nuestra solución y le añadiremos una refe-

Figura 2.Formulario ASP.NET de solicitud de más información

dotN

etM

anía

<<

21

dnm.dynamics.crm<<

rencia Web al servicio CrmService, quenormalmente se encontrará en http://servidor_crm:5555/MSCRMServices/2006/

crmservice.asmx. Con esto, Visual Stu-dio generará los proxies del servicio Weby todas las entidades de negocio dispo-nibles en el CRM, además de otras cla-ses necesarias, como los mensajes depetición/respuesta para el método Exe-cute. Ahora para que tengamos dispo-nibles estas clases en la aplicación Webañadiremos una referencia al proyectode librería de clases, de forma que alcompilar se copie el ensamblado corres-pondiente a nuestra aplicación Web.

Sólo nos resta añadir el código queutilice el CrmService para crear el nuevocliente potencial al pulsar el botón de lapágina Web (fuente 1). En este códigose instancia el proxy del servicio Web,indicándole la URL del mismo, y fiján-dole las credenciales de un usuario deDynamics CRM con los permisos ade-cuados para que se pueda crear la enti-dad. A continuación se crea una instan-cia de la entidad lead (cliente potencial)y se le asignan los valores obtenidos dela Web. Finalmente, se hace una llama-da al servicio Web para crear el nuevocliente potencial dentro de DynamicsCRM.

Antes de que os lancéis a crear apli-caciones que llamen a los servicios Webde Dynamics CRM, hay que tener encuenta un par de cosas. Este código esun ejemplo funcional pero simplifica-do; no hemos tenido en cuenta ningu-na buena práctica de seguridad tantopara los datos de la página Web, comoen la captura de posibles excepcionesSOAP del servicio Web. Además,deberíamos haber usado archivos deconfiguración, desde los que leer losparámetros necesarios, en vez de escri-bir en el código cosas como la URL delservicio o las credenciales de usuario(figura 3).

El ejemplo proporciona una idea depara qué sirven los servicios Web deMicrosoft Dynamics CRM. Pero estono es ni siquiera la punta del iceberg.Con los servicios Web podemos crearaplicaciones de integración que carguenu obtengan datos de Dynamics CRMde forma periódica. Podemos desarro-

llar algún cliente específico que necesi-temos; recordad que gracias a métodos

como Execute podemosacceder a toda la funciona-lidad del CRM, por ejem-plo a enviar correos electró-nicos, programar activida-des de servicio, etc. Engeneral, podemos utilizarnuestra aplicación CRMdesde cualquier plataformaque soporte la utilización deservicios Web.

Quien quiera profundi-zar en esto, que no dude en uti-lizar los ejemplos y la docu-mentación del SDK. Ahí dis-ponemos de información sobre

otros temas como la descripción de lasentidades, la descripción de los mensa-

[C#]…using ClassLibraryCRM.DynamicsCRM;using System.Net;…

protected void Button1_Click(object sender, EventArgs e){CrmService crmService = new CrmService();

//Parámetros del CRMcrmService.Url =

@”http://crm:5555/MSCRMServices/2006/crmservice.asmx”;

crmService.Credentials = newNetworkCredential(“marco”,”Pa$$w0rd”,”dominio”);

//Instanciamos la entidad cliente potenciallead cliente = new lead();

cliente.firstname = this.TextBox1.Text;cliente.telephone1 = this.TextBox2.Text; cliente.subject = this.TextBox3.Text;

//Creamos la entidad en el CRMcrmService.Create(cliente);

Button1.Enabled = false;Label1.Text = “Información Recibida”;//Creamos la entidad en el CRMcrmService.Create(cliente);

Button1.Enabled = false;Label1.Text = "Información Recibida";

}

Fuente 1. Código para crear el cliente potencial

Figura 3. El nuevo cliente potencial creado en Dynamics CRM

dotN

etM

anía

<<

22

dnm.dynamics.crm<<

jes disponibles, la construcción de consultas sobreentidades, la utilización de los metadatos, etc.

CalloutsUn callout es una lógica de negocio personalizada

que podemos añadir para modificar o aumentar elcomportamiento estándar de Microsoft DynamicsCRM. Podemos verlos como puntos de extensión dela funcionalidad del sistema. La idea básica es quepodemos realizar una suscripción a una serie de even-tos públicos del sistema, para que cuando se lancenesos eventos nuestro código sea ejecutado. Como par-te de la suscripción, deberemos indicar un manejadordel evento que cumpla con la interfaz especificada porlos callouts. Como muestra la figura 4, existen tantopre-callouts (que se ejecutan previamente a la ejecu-ción de la operación sobre una entidad en el sistema),como post-calllouts (que se ejecutan a posteriori).

Conviene destacar que el código del manejadorse ejecuta de forma síncrona con el código del servi-dor, por lo que no debemos hacer procesos dema-siado lentos porque ralentizaríamos la interfaz deusuario; cuando tengamos callouts lentos deberemoslanzar otros procesos asíncronos desde el manejadorque realicen esa tarea. Otra cosa importante a teneren cuenta es que los callouts deben crearse utilizandola versión 1.1 de .NET Framework, ya que la versión2.0 no está soportada. Esto se debe a que DynamicsCRM ha sido construido sobre .NET Framework1.1 (en el momento de su desarrollo no estaba dis-ponible la versión 2.0 del Framework).

Los eventos sobre los que pueden registrarse loscallouts para las entidades del sistema son: Pre y Post-Create, Pre y PostDelete, Pre y PostUpdate, Pre y Pos-tAssign, PreSend, entre otros. Hay un buen montónde ellos, como podéis consultar en la documentacióndel SDK. Además, también hay que tener en cuentaque no todas las entidades del CRM soportan todoslos tipos de callouts; de nuevo debemos consultar elSDK para saber cuäles están soportados. Y tambiénconviene recordar que no tenemos límite en el núme-

ro de manejadores registrados para un determinadoevento de callout en una entidad. Es decir, que es total-mente posible registrar nuestro código para más deun evento, y que puede que para un evento dado ten-gamos registrado más de un manejador. Vamos, exac-tamente como los delegados en .NET Framework.

Para desarrollar ensamblados de .NET 1.1 que seejecuten con los eventos de callout, lo primero quedebemos hacer es incluir en el proyecto una referen-cia a Microsoft.Crm.Platform.Callout.Base.dll, archi-vo que se encuentra disponible en el CD de instala-ción de Microsoft Dynamics CRM. Luego es conve-niente importar el espacio de nombresMicrosoft.CRM.Callout en nuestro código. Y necesa-riamente, la clase que implemente los manejadores deeventos de callout debe heredar de la clase CrmCa-lloutBase. Así ya tendremos disponibles, entre otrascosas, los métodos que sirven de manejadores. Ahorapara definir nuestro propio manejador no tenemosmás que redefinir el método adecuado. Vamos a ver-lo con un ejemplo.

Una de las cosas que muchas veces se echa en faltaen Dynamics CRM es que no se haya incluido ningúntipo de comprobación de registros duplicados; por ejem-plo, que no se permita crear dos cuentas con el mismonombre. Pero en realidad, gracias a los callouts, lo quetenemos es flexibilidad para crear nuestras propias com-probaciones. Así que vamos a crear un ensamblado queincluya un manejador para el evento PreCreate en laentidad del CRM account. Y hacer que el manejadordel evento compruebe si ya existe un registro de ese tipocon ese nombre, mediante una consulta a los serviciosWeb, y en caso de que exista no la cree, avisando al usua-rio de esta situación. Para las llamadas al servicio Web,nos apoyaremos en la librería creada en el ejemplo ante-rior de utilización del CrmService.

La firma para un manejador de PreCreate sería:

Donde, como vemos, se le pasan los parámetrosnecesarios para conocer el contexto del usuario y la enti-dad sobre que ejecuta la operación, los datos de la enti-dad en formato XML que podemos modificar, y unacadena en la que guardar un mensaje para el usuario encaso de error. Además, en el valor de retorno del méto-do podemos indicar si la operación debe continuar oabortarse, mostrando el mensaje de error al usuario.

Figura 4. Arquitectura de los callouts

public virtual PreCalloutReturnValue PreCreate(CalloutUserContext userContext,CalloutEntityContext entityContext,ref string entityXml,ref string errorMessage

);

dotN

etM

anía

<<

23

dnm.dynamics.crm<<

Si seguimos los pasos descritos ante-riormente para crear un callout y rede-finimos el evento PreCreate, obtendre-mos un código como el del fuente 2,donde además podéis ver como realiza-mos una llamada a los servicios Web,utilizando las credenciales por defectodel sistema. Y como, mediante una cla-se de ayuda que podemos encontrar enel SDK, obtenemos el valor de la pro-piedad name del XML de la entidad.Nombre que utilizamos para construirun objeto QueryByAttribute para reali-zar una consulta a través del servicioWeb, que nos indique si existen másentidades de tipo “cuenta” con ese nom-bre. Si mediante la consulta determina-mos que existen más registros con esenombre, abortamos la ejecución delevento Create de la cuenta e informa-mos al usuario de lo ocurrido.

Una vez compilado el ensambladocon nuestro manejador, debemoscopiar la DLL resultante al directorio<installDir>\Program Files\Microsoft

CRM\server\bin\assembly\. Y no osolvidéis de copiar también el ensambla-do de nuestra librería con los proxies delservicio Web. Además, en ese directo-rio debemos crear o editar el archivocallout.config.xml, para que contengaun elemento callout como que se pre-senta en el fuente 3, donde, como sepuede ver, estamos indicando el eventopara el que nos queremos registrar, elensamblado y la clase que contienen elmanejador. En la documentación sobrecallouts del SDK hay multitud de infor-mación sobre este fichero de configu-ración.

Ahora solo nos falta reiniciar Inter-net Information Services, el WorkflowService y el Bulk E-Mail Service paraque Dynamics CRM vuelva a cargarla configuración de callouts y nuestranueva funcionalidad esté disponible.En caso de que hubiese un problemacon el fichero de configuración, en elregistro de eventos del sistema se mos-traría un aviso. Si ahora un usuario deDynamics CRM intenta crear unacuenta con un nombre ya existente, sele mostrará un mensaje de aviso comoel de la figura 5 y no se realizará laoperación.

[C#]…using ClassLibraryCRM.DynamicsCRM;…public class PreCreateCallOut : CrmCalloutBase{public override PreCalloutReturnValue PreCreate(

CalloutUserContext userContext, CalloutEntityContext entityContext, ref string entityXml, ref string errorMessage)

{CrmService.CrmService WebService = null;BusinessEntityCollection resultado = null;

string nombre =CalloutHelper.getProperty(“name”,entityXml);

try{

WebService = new CrmService.CrmService();WebService.Url=

@”http://crm:5555/mscrmservices/2006/crmservice.asmx”;WebService.Credentials =

System.Net.CredentialCache.DefaultCredentials;

QueryByAttribute query = new QueryByAttribute();query.EntityName = EntityName.account.ToString();query.ColumnSet = new AllColumns();query.Attributes = new string[] {“name”};query.Values = new string[] {nombre};

resultado =WebService.RetrieveMultiple(query);

}catch(System.Web.Services.Protocols.SoapException e){

errorMessage = “Error SOAP”;return PreCalloutReturnValue.Abort;

}

if(resultado.BusinessEntities.Length > 0){

errorMessage = “Entidad Duplicada”;return PreCalloutReturnValue.Abort;

}else

return PreCalloutReturnValue.Continue;

<callout entity="account" event="PreCreate"><subscription assembly="CallOut.dll"

class="PreCreateCallOut"></subscription>

</callout>

Fuente 3. Configuración del callout

Fuente 2. Código de nuestro manejador del evento PreCreate

dotN

etM

anía

<<

24

dnm.dynamics.crm<<

Bueno, con esto ya podemosempezar a imaginarnos las posibilida-des de los callouts. De nuevo, esto essolo el comienzo; en el SDK haymuchísima más información paraseguir avanzando. Entre las grandesposibilidades que no ofrecen loscallouts están, además de añadir nuevalógica de negocio como en el ejemplo,sincronizar otros sistemas con even-tos del CRM, llevar a cabo auditoríassobre las operaciones en los datos delsistema, etc. Imaginad que tenemosun ERP y queremos que cada vez queun comercial introduzca un nuevopedido en el CRM se inicie el proce-so de fabricación, envío y facturación.Esto es algo totalmente posible concallouts; las posibilidades son casi infi-nitas.

Ensamblados de workflowMicrosoft Dynamics CRM inclu-

ye un potente motor de workflow quenos permite desarrollar reglas de flu-jo para automatizar los procesos denegocio en el CRM. Este motor inclu-ye una serie de acciones y condicio-

nes que podemos ir combinando paracrear reglas de workflow. Por ejemplo,notificar a un responsable de serviciocuando una incidencia no es solucio-nada a tiempo, generar una serie deactividades para la obtención de másinformación sobre un cliente poten-cial, realizar un control y seguimien-to de las actividades que se han de lle-var a cabo desde la creación de unanueva oportunidad hasta el cierre deuna venta, etc. Lo mejor de todo es

que podemos extender enormementelas posibilidades del workflow graciasa que podemos añadir nuevas accio-nes que llamen a cualquier ensambla-do de .NET Framework.

A diferencia de los callouts, losensamblados de workflow no tienen quecumplir ningún requisito especial ni

heredar ninguna clase. No son más queensamblados de .NET que contienenclases con métodos estáticos, que pode-mos utilizar en los procesos de workflowde Dynamics CRM. Eso sí, al igual queocurre con los callouts, debemos utilizar.NET Framework 1.1.

Vamos a crear, por ejemplo, unensamblado de workflow para ayudar-nos a hacer el reparto de los casos desoporte en nuestra organización deuna forma eficiente y equilibrada. Este

ensamblado intentaría averiguar quiénes el técnico con menos casos asigna-dos para hacer que se encargue de unnuevo caso. Para hacer esto podría-mos utilizar las vistas SQL filtradas,que son un nuevo mecanismo parapoder consultar la base de datos deDynamics CRM de forma segura ysencilla, o los servicios Web. Aunqueen nuestro caso, como el objetivo esver cómo crear un ensamblado deworkflow, vamos a obviar la imple-mentación del método para determi-nar el técnico con menos casos. Comose suele decir, queda como ejerciciopara el lector.

Como se puede ver en el fuente 4,el código es una sencilla clase con unmétodo GetLessBusyEmployee(), al quepodremos llamar desde los procesos deworkflow, y que se apoyaría en un méto-do FindLessBusyEmployee(), el que enrealidad encontraría al empleado menosocupado. Adicionalmente, este método

Figura 5. Mensaje de aviso de entidad duplicada

Figura 6. Los ensamblados de workflow

Microsoft Dynamics CRM incluye un potentemotor de workflow que nos permite desarrollar

reglas de flujo para automatizar los procesos de negocio en el CRM

dotN

etM

anía

<<

25

dnm.dynamics.crm<<

recibe como parámetro una variable tipo string queno utilizaremos, pero que servirá para ver cómo seespecifican los parámetros del método en el ficherode configuración.

Una vez compilado el código, tenemos que seguirun proceso similar al de los callouts: copiar la DLL a<installDir>\Program Files\Microsoft CRM\server\bin\

assembly\ y editar el fichero de configuración XMLworkflow.config. Antes de poder editar el fichero,tenemos que parar el servicio Workflow; si no, nopodremos modificarlo. Dentro del fichero de confi-guración tenemos que localizar la sección methods yahí añadirle un nuevo elemento como el que se mues-tra en el fuente 5.

El fichero de configuración es bastante descrip-tivo y presenta alguna similitud con el de los callouts.Como veis, no hay más que especificar el ensambla-

do, la clase y el método, además de los tipos de datosde los parámetros y valores de retorno. Y de nuevo,y no me cansaré de repetirlo, en el SDK está toda lainformación necesaria.

Bueno, pues ahora sólo tenemos que iniciar denuevo el servicio de workflow, y reiniciar InternetInformation Services para que nuestra nueva acciónesté disponible para los usuarios en el editor de work-flows de Dynamics CRM.

Sobra decir que éste es de nuevo un sencilloejemplo de las posibilidades de este método deextensión y personalización de Microsoft Dyna-mics CRM, y que gracias a él se nos abre un sinfínde posibilidades a la hora de extender el motor deworkflow para adaptarlo a nuestras necesidades. Dehecho, se nos abren todas las posibilidades que sea-mos capaces de codificar en .NET Framework, queno son pocas.

ConclusionesComo hemos visto a lo largo del artículo, Micro-

soft Dynamics CRM 3.0 es una herramienta CRMnovedosa y muy potente, construida sobre .NET Fra-mework. Tenemos multitud de posibilidades de adap-tarla, personalizarla o extenderla de acuerdo a nues-tras necesidades de una forma sencilla y asequible;no tenemos más que desarrollar lo que necesitemosen cualquier lenguaje compatible con .NET Frame-work. Desde un punto de vista empresarial, esto esuna gran ventaja, porque podemos encontrar multi-tud de profesionales cualificados en desarrollo sobre.NET Framework.

Además, Microsoft Dynamics ha tenido muy encuenta a los desarrolladores y ha creado un SDK com-pletísimo y muy cuidado, con multitud de docu-mentación y ejemplos. Pensad que sólo hemos ras-pado la superficie de la parte de programación delservidor, pero es que también están las demás guíasque comentamos. Y en todas ellas encontraremostoda la documentación necesaria y unos ejemplosmuy trabajados que nos ayudarán a explorar todas lasposibilidades de Dynamics CRM.

En resumen, Microsoft Dynamics CRM 3.0 esel estandarte de la nueva generación de aplicacio-nes empresariales de Microsoft, que ofrece unasgrandes posibilidades de extensión y adaptación alas necesidades de una organización de cualquiertamaño y tipología. Facilitando además la labor alpersonal de IT, ya que éstos podrán adaptar y exten-der la aplicación con las tecnologías que ya cono-cen, y con toda la información de consulta accesi-ble fácilmente gracias al magnífico CRM 3.0 Soft-ware Development Kit.

[C#]…using ClassLibraryCRM.DynamicsCRM;…namespace TestAssembly {public class Test{public static System.Guid GetLessBusyEmployee(String foo){return FindLessBusyEmployee();

}

private static System.Guid FindLessBusyEmployee(){//sin implementar

}}

}

Fuente 4 . Código para la nueva acción de workflow

Fuente 5. Configuración de ensamblado de workflow

<method name="Get less busy employee"assembly="TestAssembly.dll" typename="TestAssembly.Test" methodname="GetLessBusyEmployee"group="Custom Functions"><parameter name="Foo" datatype="string"/><result datatype="lookup" entityname="systemuser"/>

</method>

Este artículo presenta una aproximación al modelode desarrollo seguido durante la implementación deesas librerías.

Orígenes y necesidades de Bluetooth

Bluetooth surgió en la multinacional suecaEricsson, en 1994, a partir de un estudio inicial-mente orientado a la búsqueda de alternativas a lascomunicaciones de dispositivos con el teléfono móvilen un contexto inalámbrico.

La utilización de Bluetooth como tecnologíade comunicación entre dispositivos tuvo una bue-na acogida entre la comunidad tecnológica, y tan-to es así que en 1998 se creó un SIG (Special Inte-rest Group), compuesto por las multinacionalesIBM, Intel, Nokia, Toshiba y Ericsson, para eldesarrollo conjunto y expansión de dicha tecno-logía. Unos meses más tarde se anunció tambiénla entrada de Microsoft, Agere Systems (despuésLucent), 3Com y Motorola, sentándose así lasbases para la generalización del uso de Bluetoothen un futuro no muy lejano, como efectivamenteha ocurrido.

Especificación

Bluetooth es una tecnología de radio de cortoalcance. Su finalidad es la comunicación entre dis-positivos, sean teléfonos móviles, agendas electró-nicas, ordenadores, portátiles, manos libres, GPS yotros, utilizando la frecuencia libre de licencia 2,4Ghz ISM (Industries, Scientific and Medical). Su desa-rrollo se orientó hacia el bajo precio, el bajo consu-mo y el uso de la tecnología de radio. No necesitala proximidad que requiere IrDA, por ejemplo, conlo que su alcance puede incluso “atravesar” obstá-culos como paredes (según tipo y profundidad).Soporta tanto la conexión punto a punto como mul-tipunto, lo cual puede dar lugar a redes PAN (Per-sonal Area Network), también conocidas como Blue-tooth Piconet. El precio de Bluetooth como módu-lo independiente era en el año 2000 de 20$, y habajado en la actualidad hasta los 5$ (datos orienta-tivos). Su consumo es mínimo, unos 0.3 mA en modoespera y 30 mA durante su funcionamiento, otrarazón por la que una gran cantidad de teléfonosmóviles utilizan hoy en día Bluetooth.

Su tasa de transferencia no es muy alta, y comoen cualquier tipo de comunicación inalámbrica,depende del medio. Ésta no supera 1 Mbps (la velo-cidad óptima de rendimiento es de 721 Kbps), y aun-que baja, supera la velocidad soportada por los actua-

en .NETBluetooth

Hace tiempo me planteé desarrollar una aplicación Bluetooth parami Smartphone. Las pocas alternativas libres de pago que existíany la búsqueda de cómo funciona realmente Bluetooth me llevarona plantearme la creación de una librería .NET para Windows Mobi-le, que posteriormente pasé también a Windows XP.

José Miguel Torres

JJoosséé MMiigguueell TToorrrreesscolabora habitualmente

con ddoottNNeettMMaannííaa. Estécnico superior en

desarrollo de aplicacio-nes informáticas y

MCTS en SQL Server2005.Trabaja como

arquitecto de softwareen el departamento detecnologías de la infor-

mación de MRW.

les puertos serie (hasta ocho veces más rápido) y para-lelo (el triple de rápido).

Bluetooth utiliza el espectro de frecuencia 2,4 Ghz,como otros aparatos tan cotidianos como los teléfo-nos inalámbricos o routers WiFi LAN (IEEE 802.11),y otros que no lo son tanto y se utilizan en medicinao en laboratorios. Si está usted pensando en si tantodispositivo no podría interferir en las comunicacio-nes Bluetooth (dado que la lista de productos coti-dianos es grande; podríamos incluir el microondas, oel mando a distancia de un garaje...), le diré que Blue-tooth transmite paquetes muy pequeños a una velo-cidad tan rápida (hasta 1600 paquetes por segundo)que prácticamente hace imposible la interferenciaentre ellos. Sin embargo, existen algunas connota-ciones en el caso de interferencia con las redes WiFi.A la pregunta si pueden coexistir, la respuesta es sí, yel porqué lo explicaré de manera muy ligera: Blueto-oth utiliza una modulación de señal de espectroexpandido por salto de frecuencia (FHSS) y el están-dar WLAN IEEE 802.11b. WiFi, además de la men-cionada, también utiliza una modulación de señal deespectro expandido por secuencia directa (DSSS), ypuede utilizar ambas modulaciones, no dando lugara interferencias. La técnica de modulación FHSS con-forma en sí una parte importante de la seguridad deconexión entre dispositivos Bluetooth debido a su fun-cionamiento. Este tema, aunque interesante, es algocomplejo. Su comprensión puede ayudar a entendermejor tanto la comunicación entre dispositivos comola seguridad entre ellos. Podrá saber más acerca deeste tema en los enlaces recomendados al final de esteartículo.

El rango de alcance de Bluetooth está cataloga-do en 3 clases en función de su potencia. En la cla-se 1 podemos obtener rangos de unos 100 metros auna potencia de antena nominal de 20 dBm. En laclase 2 y la clase 3, los rangos son ambos de unos 10metros, con la diferencia de que en la clase 2 la poten-cia de antena es de 4 dBm, mientras que en la clase3 es de 0 dBm.

Además de la adaptabilidad y flexibilidad, Blueto-oth posee varias capas de seguridad de encriptaciónde hasta 128 bits y de autenticación de usuarios. Blue-tooth utiliza un número de identificación personal(PIN) que junto a su propia dirección se utiliza parala detección y autenticación de otros dispositivos a sualcance. A quien tenga dudas de si Bluetooth es real-mente seguro, le puedo asegurar que sí lo es. Ademásde la encriptación, en este contexto entra en escenala modulación FHSS antes mencionada, que proveeuna técnica de comunicación segura por la que un dis-

positivo sólo aceptará paquetes de una dirección Blue-tooth remota específica. Ver figura 1.

En este mismo contexto, también me gustaríaresaltar lo que en la especificación oficial de Blue-tooth se conoce como Baseband, que describe laespecificación del controlador de enlace de Blueto-

oth (Bluetooth Link Controller) que es quien admi-nistra los protocolos e implementa la capa física deBluetooth, siendo el encargado de las transmisio-nes por canales mediante FHSS. Además, es impor-tante desde el punto de vista programático, ya quees quien especifica las direcciones de los dispositi-vos Bluetooth, como más adelante veremos. Mane-

dnm.comunicaciones<<

dotN

etM

anía

<<

27

Bluetooth posee varias capas de seguridad conencriptación de hasta 128 bits y autenticación

de usuarios.Además, utiliza un número de identificación personal (PIN) que junto a su propia

dirección se utiliza para la detección y autenticaciónde otros dispositivos a su alcance

Figura 1. Especificación Bluetooth

dnm.comunicaciones<<

dotN

etM

anía

<<

28

ja dos tipos de conexiones, SCO(Synchronous Connection-Oriented),conexiones punto a punto síncronas, yACL (Asynchronous Connection-Less),conexiones multipunto asíncronas; deésta última veremos un ejemplo deconexión mediante una función porcódigo. Esta base física es la interfazdel protocolo L2CAP (Logical LinkControl and Adaptation Protocol), que seencarga de “interpretar” y administrarlos paquetes en transmisión.

El protocolo RFCOMM (Serial CableEmulation Protocol) ofrece una emulaciónde un puerto serie (basado en RS232)para la comunicación con L2CAP; des-de Windows CE podremos crear unpuerto virtual que interactúe conRFCOMM. Este punto también es inte-resante, puesto que RFCOMM será enmuchas ocasiones nuestro conducto decomunicación con los perfiles Bluetooth.Digo muchas veces, ya que también sepuede interactuar mediante SDP (Servi-ce Discovery Protocol), el cual ofrece unmecanismo de interconexión a Blueto-oth para el descubrimiento de dispositi-vos a nuestro alcance y sus servicios.

Desarrollo

Como hemos visto hasta ahora,toda la especificación Bluetooth defi-nida desde el SIG hace de esta tecno-logía un estándar de mercado que per-mite utilizarla siguiendo dichas espe-cificaciones; sin embargo, desde elpunto de vista de desarrollo dichaestandarización no es tal. Me explico:las maneras de acceder a Bluetoothdesde nuestras aplicaciones vienendeterminadas por la “pila” que el sis-tema operativo implementa. WindowsMobile (a partir de la versión 4.0), porejemplo, viene con Microsoft Blueto-oth Stack (así como Windows XP SP1y versiones posteriores, incluyendoevidentemente Windows Vista); sinembargo, y como sucede con otrascaracterísticas del sistema operativo,los fabricantes de dispositivos móvi-les, sean smartphones o PDA, tienen laopción de mantener dicha “pila” o sus-tituirla sin que podamos hacer nada,puesto que ésta reside en la memoriaROM del dispositivo. Por esta razón,podemos encontrar dispositivos cuya

“interfaz” o “pila” es la que imple-menta Microsoft, y otros que la susti-tuyen por otras disponibles en el mer-cado, como por ejemplo BROAD-COM/WIDCOMM.

El problema que se plantea es que, enfunción de la interfaz, desarrollaremoscódigo específico o propietario para dichainterfaz, no pudiendo reutilizarla luegoen otros dispositivos con una interfaz dis-tinta. Por poner un par de ejemplos, losPC de bolsillo de Hewlett Packard vie-nen en su totalidad equipados con WID-COMM, no siendo esto así en algunosmodelos del fabricante Qtek. Aún habien-do pilas distintas éstas se comunican per-fectamente entre sí; es decir, que pode-mos crear dos aplicaciones específicas,cada una para cada pila diferente, y a lahora de comunicarse lo harán a la per-fección, ya que no olvidemos que Blue-tooth es un estándar, aunque las libreríasutilizadas serán distintas.

En este artículo nos centraremos enel desarrollo para Microsoft BluetoothStack. No entraré en detalles de quéinterfaz o pila es mejor o peor y por qué.La principal razón para utilizar ésta esque Microsoft Bluetooth Stack estáimplementada no solo en WindowsMobile, sino además en los sistemas ope-rativos Windows XP SP1 y posteriores,para los que muchas de las funciones ylibrerías aquí mencionadas funcionarán(eso sí, con sus particularidades).

El planteamiento y/o alcance de laaplicación nos permite saber qué servi-cio de un dispositivo Bluetooth remotoqueremos utilizar. Por ejemplo, si nues-tra intención es conectarnos con un GPS,este planteamiento será distinto al casoen que queramos conectarnos a un dis-positivo manos libres. Aunque los meca-nismos de descubrimiento y emparejadosean iguales, la forma de comunicarsepuede ser distinta. Lo que debemos tenerbien claro es que Bluetooth es un mediode transmisión, no el fin de nuestra apli-cación, y que en él nos basaremos paracomunicarnos con otro dispositivo.

Por último, en Windows CE, la prin-cipal vía de acceso a Bluetooth es

dnm.comunicaciones<<

dotN

etM

anía

<<

29

mediante sockets que exponen el proto-colo RFCOMM, aunque también pue-de hacerse directamente con las interfa-ces Bluetooth sin pasar por sockets (posi-bilidad ésta algo más compleja). Para elseguimiento de este artículo, el códigoal que se hace referencia está escrito porMicrosoft y puede encontrarse en Win-dows Embedded Source Tools for Blue-tooth Technology [3]. Además de hacerreferencia a dicho código, mostraremosotras funcionalidades que éste no ofre-ce y que están basadas en el criterio dedesarrollo con el que se implementó lalibrería gratuita Bluetooth de desarro-lloMobile.NET.

1. Inicializar la radio Bluetooth

Al activar la radio es un buenmomento para inicializar también lalibrería WS2.dll, encargada de lascomunicaciones por sockets. La fun-ción de inicialización requiere dosparámetros: el primero es de tipo inte indica la versión más alta, mientrasque el segundo es un puntero a laestructura de datos WSDATA que reci-birá los detalles de la implementaciónde Windows Sockets. Como se ve enel fuente 1, esta estructura se imple-menta como una matriz de tipo bytede 512 posiciones. Esta función debedevolver cero para que la inicializa-ción sea satisfactoria. Del mismomodo que en el constructor hemos ini-cializado WS2, en el destructor la des-cargaremos.

2.Obtención de información de la radio local

Pese a que no es un paso estricta-mente necesario, podemos llegar aobtener la clase de dispositivo, la ver-sión e incluso el fabricante de nuestrodispositivo. Esta información la obte-nemos de las funciones BthReadCODpara la clase de dispositivo y BthRead-LocalVersion para la versión y códigodel fabricante (ver fuente 1). Estas fun-

using System;using System.Runtime.InteropServices;

public enum BthEstadosRadio : int{ Desactivado, Activado, Detectable };

public class BTHRadio :IDisposable{

[DllImport(“bthutil.dll”,SetLastError=true)]private static extern int BthGetMode(out BthEstadosRadio mode);[DllImport(“bthutil.dll”,SetLastError=true)]private static extern int BthSetMode(BthEstadosRadio mode);[DllImport(“Btdrt.dll”, SetLastError=true)]private static extern int BthReadLocalVersion(

ref byte phci_version, ref ushort phci_revision,ref byte plmp_version, ref ushort plmp_subversion,ref ushort pmanufacturer, ref byte plmp_features);

[DllImport(“Btdrt.dll”, SetLastError=true)]private static extern int BthReadCOD(ref CategoriaDispositivo pcod);[DllImport(“Ws2.dll”, SetLastError=true)]public static extern int WSACleanup();[DllImport(“Ws2.dll”, SetLastError=true)]public static extern int WSAStartup(ushort version, byte[] wsaData);

//los enumeradores Fabricantes y CategoriaDispositivo son//identificadores únicos (http://www.bluetooth.org)private Fabricantes _fabricante;private short _versionRadio;private CategoriaDispositivo _claseDisp;

//constructorpublic BTHRadio(){ // inicializamos sockets

ushort wsv = ((ushort)(((byte)(2)) | ((ushort)((byte)(2))) << 8));

byte[] _data = new byte[512];WSAStartup(wsv, _data);//obt. versión y fabricantebyte version = 0, lversion = 0, caract = 0;ushort revision = 0, lsubrevision = 0, fab = 0;BthReadLocalVersion(ref version, ref revision,

ref lversion, ref lsubrevision, ref fab, ref caract);this._fabricante = fab;this._versionRadio = (short)lsubrevision;//obtenemos categoría disp.BthReadCOD(ref this._claseDisp);}

//propiedad lectura/escritura del estado de radiopublic BthEstadosRadio EstadoRadio{ get

{ BthEstadosRadio currentMode;BthGetMode(out currentMode);return currentMode; }

set{ BthSetMode(currentMode); }

}

//liberamos WS2.dllpublic void Dispose(){ WSACleanup(); }

}

Fuente 1

dnm.comunicaciones<<

dotN

etM

anía

<<

30

ciones tienen sus análogas para la petición de dichainformación para un dispositivo remoto, BthRea-dRemoteVersion. En la obtención del fabricante yclase de dispositivo se devuelven identificadoresúnicos asignados por la especificación BluetoothSIG.

Hasta aquí y como se muestra en el fuente 1,hemos hecho que la clase BTHRadio englobe tanto lagestión del estado de la radio como la información deldispositivo.

3.Mostrar los dispositivos ya emparejados

Una vez que hemos realizado la inicialización dela radio, se trata de contactar o emparejar con el dis-positivo remoto. Para ello tenemos dos escenariosposibles. El primero parte de que dicho dispositivo yahaya sido emparejado anteriormente, mientras que elsegundo implica empezar una búsqueda de todos losdispositivos que estén en nuestro alcance.

En lo que a los dispositivos ya emparejados se refie-re, esta información se almacena en el Registro (cla-ve HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Blueto-oth\Device), donde se guardan el nombre y la direc-ción del dispositivo remoto.

El recorrido por los valores guardados bajo esa cla-ve para obtener los dispositivos emparejados nos creala necesidad de tener una clase BluetoothDevice. Si seestudia la clase BluetoothRadio del ejemplo de Micro-soft, se verá que realiza una iteración por cada uno delos dispositivos y construye para cada uno un nuevoobjeto BluetoothDevice con dos parámetros: direccióny nombre. La función que devuelve los dispositivosemparejados es miembro de la clase BluetoothRadio ydevuelve una matriz de BluetoothDevice, lo cual da lugara la posibilidad de contemplar una nueva clase Blueto-

othDeviceCollectionque implemente las interfaces IListe ICollection.

Suponiendo que el emparejamiento se haya pro-ducido mediante autenticación por medio de un PIN,que es lo más probable, y ninguno de los dos dispo-sitivos lo haya revocado, no será necesario volvernosa autenticar para comunicarlos entre ellos. Sobre losaspectos relacionados con la seguridad hablaremosmás adelante.

4.Descubrir dispositivos a mi alcance

Cuando lo que queremos es descubrir los dispo-sitivos Bluetooth con estado activado o detectable queestén bajo nuestro radio de acción, según especifica-ciones, la cosa cambia. Hasta ahora en el código quehemos visto había una llamada más o menos simple aalguna API de Bluetooth que nos ayudaba; sin embar-go, en el proceso de búsqueda de dispositivos tene-mos que echar mano de la librería de sockets. Para labúsqueda de dispositivos, debemos inicializar una con-sulta a través de sockets, especificando en una estruc-tura de datos (nativa) que lo que buscamos son dis-positivos Bluetooth. De un modo similar tambiénpodemos buscar las conexiones de red disponibles ennuestro sistema.

La referencia de Bluetooth en MSDN [2] indicaque, a pesar de que las tres funciones claves para estaenumeración son BthNsLookupServiceBegin, BthNsLoo-kupServiceNext y BthNsLookupServiceEnd, para conser-var la compatibilidad con Win32 se recomienda uti-lizar WSALookUpServiceBegin, WSALookUpServiceNext yWSALookUpServiceEnd, respectivamente. Mediante lafunción WSALookUpServiceBegin inicializamos la bús-queda; debemos suministrarle una estructura WSA-QUERYSET con los parámetros deseados para la búsquedade dispositivos o redes disponibles, como dije antes.Recomiendo estudiar los documentos relativos a WSA-QUERYSET (Bluetooth and WSAQUERYSET for DeviceInquiry, Bluetooth and WSAQUERYSET for ServiceInquiry), para así entender mejor la complejidad eimportancia de esta estructura.

¿Cómo indicamos la búsqueda de dispositivosBluetooth? Dentro de la estructura WSAQUERYSET hayotras dos estructuras, CSADDR_INFO y BLOB; ésta últi-ma a su vez apunta a otra estructura, BTH_QUERY_DEVICE (si lo que buscamos son servicios, esta estruc-tura es BTH_QUERY_SERVICE). Es en este punto don-de debemos utilizar los sockets orientados a las pecu-liaridades de Bluetooth. Por ejemplo, cuando des-de nuestro código creemos un objeto del tipo Sys-tem.Net.Sockets.Socket, al constructor deberemos

Para la búsqueda de dispositivos en nuestro radio de acción tenemos que echar mano

de la librería de sockets

dnm.comunicaciones<<

dotN

etM

anía

<<

32

indicarle que la familia de direccioneses Bluetooth (mediante el valor 32 enAddressFamily), que el tipo de socketutilizado es SocketType.Stream, y eltipo de protocolo es RFCOMM (suvalor es 0x0003).

El puntero a CSADDR_INFO es de sali-da, y a través de él la función devolverála información de la dirección “blueto-oth socket” del resultado de la búsquedasegún las especificaciones comentadas.El puntero a BLOB, por su parte, contendráel tamaño del puntero a BTH_QUERY_DEVI-CE y el puntero al mismo, en el que debe-mos especificar a la entrada los paráme-tros de búsqueda que queremos llevar acabo mediante el flag LAP (su valor es0x9e8b33).

Hasta aquí hemos identificado lasestructuras y funciones que intervienen.El funcionamiento es el siguiente:

• Creación de la estructura BLOB yBTH_QUERY_SERVICE

• Creación de la estructura WSA-QUERYSET

• Llamada a WSALookUpServiceBegin• Llamada a WSALookUpServiceNext

mientras se vayan detectando dis-positivos (hay un límite por defec-to de 16 dispositivos).

• Al detectar un dispositivo, crea-mos un objeto de tipo Bluetooth-Device en base a la dirección reci-bida.

• Lo añadimos a nuestra lista Blue-toothDeviceCollection.

• Al finalizar la búsqueda, llamadaa WSALookUpServiceEnd.

Siento no poder profundizar mássobre este tema. La explicación endetalle del mecanismo de descubri-miento requeriría probablemente unartículo íntegro debido a su compleji-dad. La codificación en .NET es com-pleja y requiere de un ejercicio impor-tante de interoperabilidad con las APIy de utilización de los cálculos de refe-rencia en cuanto a asignación dinámi-ca de estructuras de memoria y des-trucción de las mismas. La utilización

de lo que en un marco de código nati-vo conocemos como estructurasdebería ser reemplazada por el uso declases en código manejado. Otraopción es manipularlo todo en una

librería nativa, un entorno más pro-penso para desarrollos a más bajo nivel.Lamentablemente, Microsoft no ofre-ce un ejemplo de código específico,pero en la clase BluetoothService, méto-

using System;

public class BTHDispositivo{

[DllImport(“Btdrt.dll”, SetLastError=true)]private static extern int BthCreateACLConnection(byte[]

remoteBthAdd, ref ushort phandle);

[DllImport(“Btdrt.dll”, SetLastError=true)]private static extern int BthCloseConnection(ushort phandle);[DllImport(“Btdrt.dll”, SetLastError=true)]private static extern int BthAuthenticate(byte[] remoteBthAdd);[DllImport(“btdrt.dll”, SetLastError=true)]private static extern int BthSetPIN(byte[] localBthAdd,

int pinLength, byte[] ppin);

public string _nombre;public byte[] _direccion;

public BTHDispositivo(){}

//pin.Length => 0 y pin.Length <= 16public void EstablecerPIN(string pin){

byte[] pinbytes = System.Text.Encoding.ASCII.GetBytes(pin);int len = pin.Length;BthSetPIN(_direccion, len, pinbytes);

}public bool QuitarPin(){

BthRevokePIN(_direccion);}

public bool Emparejar(string pin){

ushort handle = 0;//conectamosBthCreateACLConnection(_direccion, ref handle);//autenticamosBthAuthenticate(_direccion);//desconectamosBthCloseConnection(handle);

}}

Fuente 2

dnm.comunicaciones<<

dotN

etM

anía

<<

33

do PublishService, encontrará unejemplo de publicación de servicio enel que se tratan estructuras BLOB desde.NET; también puede encontrarlibrerías totalmente funcionales queimplementan el descubrimiento de dis-positivos como 32feet, InTheHand odesarrolloMobile.NET.

5.Emparejar

El proceso de emparejado requieredel conocimiento de la dirección del dis-positivo Bluetooth con el que queremosemparejarnos y consta de un secuenciade pasos. En primer lugar, establecemosnuestro PIN mediante una llamada aBthSetPin. A continuación, creamos unaconexión ACL mediante BthCreateACL-Connection (para una conexión SCO seutiliza BthCreateSCOConnection), de don-de obtendremos el manejador (handle)de la conexión que utilizaremos. Luegodebemos llamar a la función BthAuten-ticate para forzar el emparejamiento.Será en esta llamada donde el disposi-tivo remoto cuya dirección se indicarecibirá el aviso de petición de empare-jamiento. Si el PIN es correcto, el empa-rejamiento se realizará satisfactoria-mente (fuente 2). Por último, podemoscerrar la conexión.

En Windows Mobile 5, la funciónBthPairRequest engloba todas estas lla-madas en una, haciéndose cargo ellamisma del establecimiento del PIN, laconexión ACL, la autenticación y elcierre.

6.Recibir petición de emparejamiento

En el otro extremo, y al hilo delanterior apartado, está el dispositivoque recibe una petición de empareja-miento. Para obtener la dirección deldispositivo que ha realizado una peti-ción se utiliza BthGetPINRequest. Encaso de que queramos rechazar la peti-ción, nuestra función es BthRefuse-PinRequest.

Microsoft Bluetooth Stack incorpo-ra un mecanismo de evento que permi-te mediante una interfaz gráfica mos-trar una petición entrante por pantalla.Se trata de un notificador de tipo glo-bo (balloon) que permite al usuario acep-tar o rechazar la petición. La funciónencargada de esta llamada es BthSetSe-curityUI.

7.Seguridad

En estos últimos apartados hemosvisto diferentes contextos y funcionesque ofrece Bluetooth en cuanto a segu-ridad. Hay dispositivos GPS Bluetoothpor ejemplo, en los que no son necesa-rios PIN para el emparejamiento. Tam-bién cabe la posibilidad de que dos apli-caciones se comuniquen por Bluetoothsin ningún tipo de establecimiento dePIN. Bluetooth es, gracias al modela-do de frecuencia que utiliza, una tec-nología muy segura, que hace muy difí-cil interceptar comunicaciones ajenas.

De todas formas, y más aún en la utili-zación de servicios específicos de losdispositivos, no está de más establecerun número PIN para evitar usos nodeseados.

PerfilesSi la especificación nos muestra

cómo trabaja Bluetooth, los perfiles nosmuestran cómo se utiliza Bluetooth, esdecir, con qué fin (figura 2).

Existe una gran cantidad de perfi-les, en muchos casos dependientesentre sí. Por ejemplo, Obex Push(OBject EXchange) depende del Per-fil de acceso genérico (Generic AccessProfile), del Perfil de puerto serie(Serial Port Profile) y del Perfil gené-rico de intercambio de objetos (Gene-ric Object Exchange Profile). Aún así, adía de hoy siguen apareciendo nuevosperfiles debido al gran impacto queestá teniendo esta tecnología en elmundo y a las nuevas utilidades que sele está dando.

Figura 2. Diagrama estático inicial de la librería desarrolloMobile.NET

dnm.comunicaciones<<

dotN

etM

anía

<<

34

Como se puede ver en la figura 2, podemos encon-trar perfiles de acceso a redes PAN, distribución de audioy vídeo, así como de comunicación con manos libres,auriculares e intercambio de objetos, entre otros.

Desarrollo (perfiles)Hasta ahora tenemos todas las herramientas

para poder detectar y emparejar dispositivos des-de código. Es hora utilizar algún servicio. Peroantes debemos conectarnos. En este punto ambosdispositivos se reconocerán mutuamente y podráncomunicarse entre sí.

Es en este momento donde la utilización deuno u otro servicio marca el alcance de nuestraaplicación. Evidentemente, éste será distinto si loque queremos es obtener información de un GPS,redirigir voz a un manos libres, crear una plata-forma de intercambio de archivos o tarjetas devisita, etcétera.

Aquí presentaremos la conexión simple median-te sockets. En el apartado dedicado a cómo descu-brir dispositivos Bluetooth hablamos de una claseSocket con unos parámetros específicos en el cons-tructor. Una clase Socket necesita de otra clase End-Point (punto terminal), que no es más que la direc-ción remota a la que quiere conectarse. Pero comoes habitual, la clase EndPoint para Bluetooth tienealgunas particularidades. Dichas peculiaridades sondefinidas por la estructura SOCKADDR_BTH:

En la que se indica la familia de direcciones quese utilizará, la dirección remota (BTH_ADDR) del dispo-sitivo a conectar, el servicio a conectar (definido porun valor GUID) y el puerto remoto de conexión. Sise indica cero como puerto remoto, el servicio indi-cado obtendrá el puerto remoto a conectar, por locual aconsejo mantener siempre dicho valor.

Los identificadores de servicio (GUID) están iden-tificados en la especificación Bluetooth del SIG (vea

la clase StandardServices del ejemplo de Microsoft).En cualquier caso, si no queremos utilizar ningún ser-vicio, digamos estándar, podemos crear un GUIDpropio para que dos aplicaciones creadas por noso-tros se comuniquen vía sockets. Un ejemplo típico quepodemos encontrar en el código de Microsoft es unaaplicación para chat.

Una vez que hayamos obtenido la dirección remo-ta, la pasamos mediante el método Connect conjunta-mente con el GUID del servicio deseado en formade BluetoothEndPoint (clase heredada de EndPoint) y,si todo es correcto, la conexión se establecerá. Obser-

vación: si estudia la clase BluetoothEndPoint de Micro-soft, verá dos métodos reemplazados: Serialize y Cre-ate. Como hemos dicho, Bluetooth utiliza la claseEndPoint siguiendo la estructura SOCKADDR_BTH, con loque estos dos métodos contemplan, en un ámbito End-Point, las peculiaridades de Bluetooth.

Ahora lo que tenemos es una conexión por sockets;es decir, que con dos aplicaciones a ambos lados de laconexión, utilizando los métodos Write y Read de unaclase de tipo Stream (System.IO), obtenida de la cone-xión preestablecida, podremos enviar y recibir datos.Incluso si el dispositivo remoto es un GPS, verá que enla lectura se apreciarán fragmentos de información delestándar NMEA (National Marine Electronics Association)remitidos por el GPS. Pese a que esta técnica funciona,en algunos casos nos interesará crear un puerto COMvirtual para bien obtener o bien enviar información aldispositivo (por ejemplo, si éste es un teléfono móvil yqueremos enviar los comandos AT para el envío de unSMS, por ejemplo). En el ejemplo de Microsoft se pue-de ver cómo el método Connect devuelve un NetworkS-tream, en el que nos basaremos para las comunicacio-nes. Además, la clase BluetoothService ofrece las posi-bilidades que brinda la clase Socket en el contexto deBluetooth (figura 3).

typedef struct _SOCKADDR_BTH {USHORT addressFamily;BTH_ADDR btAddr;GUID serviceClassId;ULONG port;

} SOCKADDR_BTH, *PSOCKADDR_BTH;

Bluetooth es, gracias al modelado de frecuenciaque utiliza, una tecnología muy segura, que hacemuy difícil interceptar comunicaciones ajenas

dnm.comunicaciones<<

dotN

etM

anía

<<

35

Conclusión

Este artículo es resultado deldesarrollo de las librerías desa-rrolloMobile.NET para interope-rar con Bluetooth, tanto en la ver-sión para Windows Mobile comopara Windows XP, que podránencontrar en [1]. Espero que ellector haya podido hacerse unaidea aproximada de cómo utilizarBluetooth en sus aplicaciones.Como se habrá podido apreciar,la implementación de Bluetoothen su totalidad es muy extensa yalgo difícil desde .NET, así queel primer paso a dar es determi-nar cómo y con quién queremoscomunicarnos y qué perfil o ser-vicio satisfará mejor esas necesi-dades. Si se decide profundizaren el funcionamiento de Blueto-oth a través de Microsoft Blue-tooth Stack, es aconsejable tenerconocimientos de programacióncon sockets; de todos modos, nodeja de ser muy satisfactorio desa-rrollar una aplicación utilizandoBluetooth y sacar el máximo pro-vecho a éste.

Quisiera agradecer a DavidCarmona de Microsoft Ibérica,a Peter Foot (MVP WindowsMobile) y a Daniel Bouie y espe-cialmente a Mikel Zintel (.NETCompact Framework GroupManager) de Microsoft Corp. porla ayuda e intercambio de impre-siones que seguramente han con-tribuido de forma positiva al desa-rrollo de este artículo.

Figura 3. Diagrama estático inicial de la librería Bluetooth de desarrolloMobile.NET

Referencias

Recursos para el desarrollo de aplicaciones móviles: http://www.desarrollomobile.net/libreria/biblio.aspx

Recursos sobre Bluetooth en MSDN: http://msdn.microsoft.com/embedded/usewinemb/ce/sharedsrccode/west/default.aspx.

Windows Embedded Source Tools for Bluetooth Technology: http://msdn.microsoft.com/embedded/usewinemb/ce/sharedsrccode/west/default.aspx

[1]

[2]

[3]

Lo primero que se aprecia en la interaccióncon la interfaz de una aplicación es la aparien-cia de la misma. Un aspecto relevante de laapariencia es cómo se agrupan y distribuyenvisualmente los elementos que participan enla interfaz de usuario. Esta distribución es loque se conoce como layout. Windows Presen-tation Foundation (WPF) brinda un conjun-to flexible de tipos de objetos denominadospaneles, mediante los que ofrece distintas for-mas de layout. Los distintos tipos de paneles,cada uno con una forma diferente para hacerel layout, pueden ser combinados en busca deformas de visualización más complejas y atrac-tivas, acordes a las necesidades de la interfazvisual de una aplicación. Aunque con ello pue-den cubrirse la mayor parte de los requeri-mientos, puede que no resulte suficiente siusted quiere aportar a su interfaz sus propios efectos.

En este artículo se describe cómo crear tiposde paneles personalizados utilizando las capacida-des de WPF.

Los paneles La función de los paneles es distribuir y mos-

trar visualmente los elementos que se ubiquen den-

tro del mismo. Un panel es un objeto de un tipoderivado de la clase Panel, cuya jerarquía se mues-tra en la figura 1.

Un panel es a su vez un objeto contenedor quetiene un criterio para distribuir visualmente, en elárea que tiene disponible, los elementos de inter-faz (controles, figuras, imágenes, etc.) contenidos

Cómo definir nuestros propios paneles

personalizados en WPF

plataforma.net

MMiigguueell KKaattrriibb es doctor yprofesor jefe de progra-

mación del departamentode Ciencia de la Compu-tación de la Universidadde La Habana. Miguel es

líder del grupo WEBOO,dedicado a la orientacióna objetos y la programa-ción en la Web. Es entu-

siasta de .NET y redactorde dotNetManía.

MMaarriioo ddeell VVaallllee, IIsskkaannddeerrSSiieerrrraa y YYaammiill HHeerrnnáánnddeezzson instructores de pro-gramación en C# de la

cátedra de Programacióne Ingeniería de Software

del departamento deCiencia de la Computa-

ción de la Universidad deLa Habana. Son desarro-

lladores del grupoWEBOO dedicados a la

tecnología .NET.

A través de dotNetManía, los autores se proponen desvelarnosalgunos secretos de WPF. Con este artículo nos ilustran cómo sepuede ir más allá y personalizar recursos visuales para conseguirefectos no incluidos de base en WPF. En este caso nos desarrollan unnovedoso panel que distribuye sus elementos de manera circular.

Miguel Katrib,Mario del Valle,Iskander Sierra,Yamil Hernández

Figura 1. Jerarquía de paneles de WPF

dentro del panel. La forma de poner los elementos enun panel es en general simple. Cuando un programa.NET usa un panel, usted sólo debe garantizar que alobjeto panel se le añadan elementos mediante el méto-do AddChild. Cuando describa el panel declarativa-mente desde el lenguaje de marcas XAML, usted sólotendrá que escribir el XAML de cada elemento den-tro de las etiquetas del panel. El resto será sintonizarla funcionalidad del panel asignándole valores a suspropiedades.

En este artículo suponemos que usted tiene unconocimiento básico de los paneles de WPF1. Elcódigo XAML del fuente 1 nos muestra un panelDockPanel. Este panel contiene a su vez un panelGrid que muestra los números de dotNetManíadisponibles y que ha sido ubicado en la parte infe-rior del DockPanel, gracias a que se ha utilizado lapropiedad adjunta DockPanel.Dock=”Bottom”, queindica en qué zona de panel contenedor ubicarlo.El otro elemento que se ha ubicado en este Dock-Panel es la imagen <Image Source=”DotNetMania/Titu-lo.gif” Height=”100”/>, que de este modo ocupa elespacio que queda disponible después de desplegarel Grid. El resultado de este panel se muestra en lafigura 2.

Implementando un panel personalizadoLa apariencia de la interfaz que se muestra en

la figura 2, aunque un poco más atractiva que la queactualmente tiene la revista en su sitio Web, es bas-tante parecida a las que usted puede encontrar porahí. Para ser sinceros, debiéramos decir que está unpoco “pasmada”. Lo que se visualiza está estático ylimitado al espacio disponible.

Si quisiéramos darle a esta interfaz un sello máspersonal y atractivo, tendríamos que hacer un traba-jo más elaborado. A continuación vamos a ver losrecursos que nos brinda WPF para desarrollar unpanel más personalizado, como el que se muestra enla figura 3. La gracia consiste no solo en lograr des-plegar la interfaz de esa manera, sino en que el traba-

dotN

etM

anía

<<

37

dnm.plataforma.net<<

<Window x:Class=”DotNetMania.Window1”xmlns=”http://schemas.microsoft.com/winfx/2006/

xaml/presentation”xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”Title=”Números de dotNetManía disponibles, en un Grid”Height=”300” Width=”300”><Window.Background><LinearGradientBrush EndPoint=”0,1”><GradientStop Color=”SteelBlue” Offset=”0”/><GradientStop Color=”LightSteelBlue” Offset=”0.6”/><GradientStop Color=”#048” Offset=”1”/></LinearGradientBrush></Window.Background><DockPanel><Grid DockPanel.Dock=”Bottom”><Grid.ColumnDefinitions><ColumnDefinition Width=”Auto”/><ColumnDefinition Width=”Auto”/><ColumnDefinition Width=”Auto”/><ColumnDefinition Width=”Auto”/><ColumnDefinition Width=”Auto”/><ColumnDefinition Width=”Auto”/><ColumnDefinition Width=”Auto”/>

</Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height=”Auto”/><RowDefinition Height=”Auto”/>

</Grid.RowDefinitions><StackPanel Grid.Column=”0” Grid.Row=”0” Margin=”5”><Image Source=”dotNetMania/No20.jpg”

Height=”100”/><CheckBox HorizontalAlignment=”Center”><TextBlock VerticalAlignment=”Center”

FontFamily=”Arial” FontSize=”16”FontWeight=”Bold”>

No. 20</TextBlock>

</CheckBox></StackPanel>...

<StackPanel Grid.Column=”5” Grid.Row=”1” Margin=”5”><Image Source=” dotNetMania/No33” Height=”100”/><CheckBox HorizontalAlignment=”Center”><TextBlock VerticalAlignment=”Center”

FontFamily=”Arial” FontSize=”16”FontWeight=”Bold”>

No. 33</TextBlock>

</CheckBox></StackPanel></Grid><Image Source=”dotNetMania/Titulo.gif” Height=”100”/></DockPanel></Window>

Fuente 1. Números de dotNetManía disponibles, en un Grid

1 Para una información mas introductoria, puede dirigirse al Cuaderno Técnico sobre WPF que próximamente publicarádotNetManía o al curso online sobre WPF que puede encontrar en MSDN.

Figura 2. Números de dotNetManía disponibles, en un Grid

jo desarrollado pueda ser “atrapado” en la definiciónde un nuevo tipo de panel que podamos reutilizar enotras aplicaciones.

El sistema de layout en WPF no está limitado alos paneles predefinidos y sus combinaciones. Afor-tunadamente, el sistema de layout en WPF es exten-sible. Un panel personalizado (custom panel) no esmás que una clase que debe heredar de Panel y rede-finir los métodos MeasureOverride y ArrangeOve-rride. Estos dos métodos son los protagonistas delas dos fases por las que transita un panel en el pro-ceso de aplicar la distribución espacial de su con-tenido. Medir (Measure) es el proceso en el que otropanel, o la ventana o página principal, le preguntaal panel cuánto espacio necesita o desea tener; elpanel entonces a su vez propaga esta misma con-sulta a cada uno de sus hijos (elementos conteni-dos dentro del panel, que como ya se ha dicho pue-den ser a su vez paneles) tratando de cono-cer cuánto espacio necesita cada unoy así calcular el espacio total quenecesita como contenedor.

En la segunda fase (Arrange)es en la que, conociendo real-mente el espacio disponible y elespacio demandado, el panel dis-tribuye el contenido, tratando deaprovechar el espacio de la mejorforma posible.

Todo tipo que hereda de Panelhereda la propiedad Children paraalmacenar su contenido. Esta pro-piedad es de tipo UIElementCollec-tion, y esta colección en sí misma

maneja las llamadas a AddVisualChild, AddLogicalChild,RemoveVisualChild y RemoveLogicalChild para añadir oeliminar hijos a la colección. UIELementCollection pue-de llevar a cabo estas acciones, pues conoce del elemen-to padre (que tiene que ser pasado como parámetro enel constructor del panel). Realmente se pasan un Visual-Parent y un LogicalParent, que usualmente son el mis-mo. Cuando usted define en XAML un panel dentrode otro, el panel contenedor es el que se denominapadre. En este caso, es WPF quien, cuando va a eje-cutar este código XAML, pasa el elemento padrecomo parámetro al constructor del panel.

Un panel circular

Una de las limitaciones del panel Grid de la figu-ra 2 es que si la cantidad de elementos que queremosdistribuir es grande, entonces los elementos se ten-drían que ver muy pequeños para que cupieran todos.Como ejemplo de panel personalizado, vamos a defi-nir un panel que distribuirá los elementos circular-mente, como se muestra en la figura 3.

El fuente 2 muestra parte del código de la imple-mentación del panel CircularPanel.

La propiedad Front nos indica el índice del ele-mento (según el orden que tiene como hijo delpanel) que se muestra al frente. Si el valor no estáen el rango 0 a Children.Count - 1, entonces el panello convierte en un índice de elemento de maneracircular. Es decir, que para el panel un valor deFront igual a n * Children.Count + k es lo mismoque k. Tome nota de que el valor es double. Si Fronttiene un valor entero, entonces el elemento corres-pondiente se mostrará centrado al frente, como semuestra en la figura 3 (donde Front tiene valor 0).Pero si damos a Front un valor fraccionario, porejemplo 3.5, entonces el panel ubicaría al frente alos elementos 3 y 4.

dotN

etM

anía

<<

38

dnm.plataforma.net<<

Figura 3. Números de dotNetManía disponibles, en un CircularPanel

La propiedad AltitudeAngle, quetoma un valor entre -90 y 90, nos indi-ca el ángulo con el que se muestran loselementos que quedarían en la semicir-cunferencia posterior con relación a loselementos que quedan en la semicir-cunferencia al frente. Para el resultado

que se muestra en la figura 3 el valor es15. Un valor -15 produciría la imagende la figura 4a, un valor 90 nos mostra-ría una circunferencia completa (figu-ra 4c) y un valor 0 nos mostraría los ele-mentos al fondo al mismo nivel que losque están al frente, y por tanto solo se

podrían ver a través de los espaciosentre ellos (figura 4b).

La propiedad Perspective nos indicala perspectiva de tamaño con que se mues-tran los elementos de la parte posteriorcon relación a los elementos al frente. Estapropiedad toma valores entre 0 y 1. Un

dotN

etM

anía

<<

39

dnm.plataforma.net<<

using System.Windows;public class CircularPanel : Panel{public double Front { get{…} set{…} }public double AltitudeAngle { get{…} set{…} }public double Perspective { get{…} set{…} }public double Gap { get{…} set{…} }public double BackOpacity { get{…} set{…} }public double FrontOpacity { get{…} set{…} }...

protected override Size MeasureOverride(Size availableSize){Rect r = new Rect(0,0,0,0);foreach (UIElement element in Children) {element.Measure(availableSize);r.Union(new Point(element.DesiredSize.Width,

element.DesiredSize.Height));}return r.Size;

}

protected override Size ArrangeOverride(Size finalSize){if (Children.Count > 0 && finalSize.Width > 0

&& finalSize.Height > 0) {ElemInfo[] infos = GetPositions(finalSize);for (int i = 0; i < Children.Count; i++) {Size desiredSize = Children[i].DesiredSize;Panel.SetZIndex(Children[i], infos[i].ZIndex);Children[i].Opacity = infos[i].Opacity;Children[i].RenderTransformOrigin = new Point(0.0, 0.0);Children[i].RenderTransform =new ScaleTransform(infos[i].Bounds.Width/desiredSize.Width,

infos[i].Bounds.Height/desiredSize.Height);Children[i].Arrange(new Rect(infos[i].Bounds.X, infos[i].Bounds.Y,

desiredSize.Width, desiredSize.Height));}

}return finalSize;

}

struct ElemInfo {public Rect Bounds;public double Opacity;public int ZIndex;

}

Fuente 2. Implementando un panel personalizado

Figura 4a.Altitud -15

Figura 4b.Altitud 0

Figura 4c.Altitud 90

dotN

etM

anía

<<

40

dnm.plataforma.net<<

valor 0 quiere decir que no hay perspectiva (y por tan-to las imágenes al fondo se verán del mismo tamaño quelas del frente), mientras que 1 quiere decir “máxima pers-pectiva”. En la figura 4c se ha utilizado una perspectiva0; por eso las imágenes se ven del mismo tamaño. Parael resto de las figuras se ha utilizado perspectiva 1.

La propiedad Gap indica la separación entre ele-mentos, relativa al ancho de los mismos (en todas lasfiguras se usado un valor de 0.5). Las propiedades Fron-tOpacity y BackOpacity nos indican la opacidad conque se mostrarán los elementos según su posición elcírculo. El panel les da un gradiente que va desde Fron-tOpacity (para los que están más al frente) a BackOpa-city (para los que están mas al fondo); en todas las imá-genes de ejemplo, a estas propiedades se les ha asigna-do 1 y 0, respectivamente.

El panel circular redefine los métodos Measu-reOverride y ArrangeOverride. El método Measure-Override corresponde a la fase de medir cuántoespacio el panel necesita, y para ello realiza la mis-ma consulta a cada uno de sus hijos. Cuando se lepide a un elemento que se mida, el resultado de lamedición se guarda en la propiedad DesiredSize.En este caso, lo que hemos hecho en la implemen-tación de MeasureOverride en el fuente 2 es obte-ner la menor área en la que podría caber cualquie-ra de los elementos, ya que este panel circular debegarantizar que al menos el elemento Front se pue-da visualizar.

El método ArrangeOverride es el que implemen-ta cómo distribuir los elementos en forma circular,según lo indicado por las propiedades explicadas

<Window x:Class=” DotNetMania.Window2”

xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”

xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”

xmlns:p=”WEBOO.WPF”

Title=”Números de dotNetManía disponibles, en un CircularPanel”

Height=”300” Width=”300”>

...

<p:CircularPanel Name=”DNMCircularPanel” Front=”0.7” Gap=”0.5”

AltitudeAngle=”15” Perspective=”1” FrontOpacity=”1” BackOpacity=”0.1” >

<StackPanel>

<Image Source=”DotNetMania/No20.jpg” Height=”200”/>

<CheckBox HorizontalAlignment=”Center”>

<TextBlock VerticalAlignment=”Center”

FontFamily=”Arial” FontSize=”20”

FontWeight=”Bold”>

No. 20

</TextBlock>

</CheckBox>

</StackPanel>

...

<StackPanel>

<Image Source=” DotNetMania/No33.jpg” Height=”200”/>

<CheckBox HorizontalAlignment=”Center”>

<TextBlock VerticalAlignment=”Center”

FontFamily=”Arial” FontSize=”20”

FontWeight=”Bold”>

No. 33

</TextBlock>

</CheckBox>

</StackPanel>

</p:Panel3D>

...

</Window>

Fuente 3. Números de dotNetManía disponibles, en un CircularPanel

dotN

etM

anía

<<

41

dnm.plataforma.net<<

anteriormente. No disponemos deespacio para explicar esta implemen-tación aquí, pero el lector se puededescargar el código fuente de la mis-ma. Solo queremos destacar el con-cepto de ZIndex (“Z-orden”), que esuna propiedad adjunta que le pone unpanel a todos sus elementos conteni-dos. El valor de esta propiedad deter-mina cuál es el orden en que WPFdibujará los elementos contenidos enel panel, siendo el de valor 0 el quedibujará primero. A igual valor deZIndex, WPF los dibujará según elorden en que estén definidos comohijos del panel. Lo que hace el méto-do GetPositions que hemos imple-mentado es determinar el orden enque se deberán dibujar los elementosdel panel según la configuración deéste. Note que después hacemosPanel.SetZIndex(Children[i],

infos[i].ZIndex); y con ello le esta-mos indicando a cada elemento delpanel cuál es su ZIndex. Las siguien-tes instrucciones aplican a cada ele-mento las transformaciones deseadas,para que finalmente el método Arran-ge lo ubique adecuadamente.

El fuente 3 nos muestra cómo usareste tipo de panel para visualizar losnúmeros de dotNetManía disponiblesde la manera que se presenta en la figu-ra 3. Note que cada elemento del paneles a su vez un StackPanel constituido

por una imagen y una casilla de veri-ficación.

Animando el panel circular

Bueno, pero un panel en el que nose puedan ver por igual todos los ele-mentos puede que no tenga muchagracia, pensará usted. Animando lapropiedad Front, podemos hacer rotaren el panel los elementos, para quesea posible verlos todos y seleccionarlos que se desee. El fuente 4 nosmuestra dos animaciones a asociar alpanel: una para mostrar los elemen-tos en el panel circulando hacia laderecha y otra para mostrarlos circu-lando hacia la izquierda. Note cómola animación está asociada a la pro-piedad

Storyboard.TargetProperty=”(p:CircularPanel.Front)”

La animación va cambiando el valorde Front, en un caso incrementándolo(By=”1”) y en el otro caso decrementán-dolo (By=”-1”), lo que provoca que elpanel vaya trayendo al frente al elemen-to correspondiente. Como el valor vavariando de uno en uno, esto produce elefecto de que todos los elementos circu-lan delante de nosotros. Experimente conel código que acompaña a este artículopara que pueda disfrutarlo.

ConclusionesEste ejemplo ha mostrado cómo se

puede definir un nuevo tipo de panelpersonalizado para dotarlo de efectosque no están presentes en los panelespredeterminados que ofrece WPF.

Con esta nueva forma de distribuirlos elementos usando el CircularPa-nel, podemos dotar a nuestra aplica-ción de un sello personal en su apa-riencia. Este panel además nos permi-te lograr un mejor aprovechamientodel espacio disponible en la distribu-ción de los elementos, manteniendo almismo tiempo la sensación de poderverlos todos. Algo que con la formatradicional de un Grid solo podríalograrse reduciendo el tamaño de loselementos o dotando al panel de unabarra de desplazamiento.

Por razones de espacio, no todos losdetalles de la implementación de estepanel se han podido explicar aquí. Invi-tamos al lector a descargar el códigofuente completo del sitio Web de larevista, para que pueda experimentar einteractuar con él.

En cualquier caso, esto no terminaaquí: en una próxima entrega veremoscómo definir un panel similar, perodotado de efectos 3D, para que en lugarde que los elementos circulen frente anosotros, podamos “meternos dentro”y tener la sensación de que miramos anuestro alrededor.

<Window.Resources><Storyboard x:Key=”MoveRight”><DoubleAnimation Storyboard.TargetProperty=”(p:CircularPanel.Front)”

Storyboard.TargetName=”DNMCircularPanel”By=”1” Duration=”0:0:1” RepeatBehavior=”Forever”

IsCumulative=”True”/></Storyboard>

<Storyboard x:Key=”MoveLeft”><DoubleAnimation Storyboard.TargetProperty=”(p:CircularPanel.Front)”

Storyboard.TargetName=”DNMCircularPanel”By=”-1” Duration=”0:0:1” RepeatBehavior=”Forever”

IsCumulative=”True”/></Storyboard>

</Window.Resources>

Fuente 4.Animando CircularPanel.Front

Para realizar las tareas criptográficas, .NET Frame-work nos ofrece una serie de clases en las que se imple-mentan algoritmos criptográficos estandarizados; eneste artículo veremos algunos de esos algoritmos y cómousarlos desde C# (en el ZIP que acompaña al artículose incluye también el código para Visual Basic).

Cifrar y descifrar datos

Podemos realizar el cifrado de datos de dos formasdistintas, según sea grande o pequeño el tamaño de losmismos. En el primer caso, podemos usar el cifradosimétrico, en el cual intervienen secuencias (streams),

en particular una de tipoCryptoStream, que será laque pasemos a las clasesque utilizan este tipo decifrado. La segunda for-ma de cifrado normal-mente lo aplicaremos acantidades pequeñas dedatos, los cuales estaránalmacenados habitual-mente en un array debytes.

Pero para poder rea-lizar el cifrado (y poste-riormente el descifrado)necesitamos crear lasclaves para cifrar y des-cifrar esos datos. En elcaso de los algoritmossimétricos, además deuna clave también hayque generar un vectorde inicialización (IV -Initialization Vector);

Criptografía prácticaEl encriptador que lo encripte... debe guardar las clavesEl desencriptador que lo desencripte... debe conocer las claves

fundamentos

Guillermo “Guille”Som

Es Microsoft MVP deVisual Basic desde 1997.Es redactor de ddoottNNeett--MMaannííaa, mentor de SSoolliiddQQuuaalliittyy IIbbeerrooaammeerriiccaannaa,

tutor de ccaammppuussMMVVPP,miembro de Ineta Spea-kers Bureau Latin Ame-rica, y autor de los libros“Manual Imprescindiblede Visual Basic .NET” y

“Visual Basic 2005”.hhttttpp::////wwwwww..eellgguuiillllee..iinnffoo

La criptografía nos permite proteger los datos de forma tal, que la visualizacióno modificación de los mismos solo sea posible para aquellos que conozcan laforma en que han sido encriptados. Esto es aplicable no solo a la comunicaciónentre dos puntos, sino también al contenido de nuestros ficheros.Además deproteger la información, también podemos utilizar la criptografía para garantizarque los datos no han sido alterados y que provienen de una fuente fiable.

Guillermo «Guille» Som

Primitivas criptografías

Existen diferentes formas de encriptación, conocidas como primitivas criptográ-ficas. A continuación enumeramos esas primitivas y el uso que podemos darle.

• Cifrado de clave secreta (criptografía simétrica)Realiza la transformación de los datos, impidiendo que terceros los lean. Estetipo de cifrado utiliza una clave secreta compartida para cifrar y descifrar losdatos.

• Cifrado de clave pública (criptografía asimétrica)Realiza la transformación de los datos, impidiendo que terceros los lean. Estetipo de cifrado utiliza un par de claves pública y privada para cifrar y desci-frar los datos.

• Firmas criptográficasAyudan a comprobar que los datos se originan en una parte específica median-te la creación de una firma digital única para esa parte. En este proceso tam-bién se usan funciones hash.

• Valores hash criptográficosAsigna datos de cualquier longitud a una secuencia de bytes de longitud fija.Los valores hash son únicos estadísticamente; el valor hash de una secuenciade bytes distinta no será el mismo.

ambos hay que mantenerlos en secreto y solo debenconocerlos las dos partes interesadas. Las clases uti-lizadas en este tipo de algoritmos incluyen métodospara generar esas claves, en particular los métodosGenerateKey() y GenerateIV(), aunque también pode-mos generarlas de forma manual, por ejemplo basán-donos en una cadena; en cualquier caso, al instanciarla clase, se generan tanto la clave como el IV de for-ma automática.

En el código del fuente 1 podemos ver las dos for-mas de generar esas claves para usar con la claseDESCryptoServiceProvider. Si usamos una cadena a par-tir de la que generar tanto la clave como el vector deinicialización, debemos asegurarnos de que tiene losbytes necesarios; ese valor lo obtenemos por mediode la propiedad KeySize, que devuelve el número debits necesarios (1 byte = 8 bits).

Por otra parte, los algoritmos asimétricos debencrear una clave pública y otra privada; la clave públi-ca es la que se usará para cifrar el contenido y laprivada la usaremos para descifrarlo. Si no indica-mos lo contrario en el constructor de las clases queutilizan este tipo de algoritmos, se generaránautomáticamente claves con una longitud de 1024bits, (128 bytes); el rango puede ser de 512 a 1024en incrementos de 64 bits. Por supuesto, solo debe-mos exponer la clave pública, que será la usada paracifrar el mensaje, mientras que la clave privada lausaremos para descifrarlo.

Estas clases implementan métodos para expor-tar e importar las claves públicas y/o privadas. Porejemplo, si queremos generar una cadena en for-mato XML con la clave pública podemos usar elmétodo ToXmlString() pasándole un valor falso

dotN

etM

anía

<<

43

dnm.inicio.fundamentos<<

static void generarAuto(){

// Crear claves simétricas automáticamenteDESCryptoServiceProvider des = new DESCryptoServiceProvider();// Estas llamadas no son necesarias // ya que al crear la instancia se generan las clavesdes.GenerateIV();des.GenerateKey();// Guardar las claves generadasbyte[] bIV = des.IV;byte[] bKey = des.Key;Console.WriteLine(“La longitud de la clave (KeySize) es de {0} bits”, des.KeySize);Console.WriteLine(“La longitud de la clave es de {0} bytes”, bKey.Length);

}

static void generarManual(string clave){

// Crear la clave manualmente a partir de una cadena de textoDESCryptoServiceProvider des = new DESCryptoServiceProvider();// Averiguar la longitud de las clavesint bits = des.KeySize;// Establecer la clave secreta// La longitud de la cadena debe ser de al menos (bits/8) bytesint cant = bits / 8;if (clave.Length < cant){

clave += new string(‘F’, cant - clave.Length);}// Convertir la cadena en un array de bytesdes.Key = Encoding.Default.GetBytes(clave.Substring(0, cant));des.IV = Encoding.Default.GetBytes(clave.Substring(0, cant));// Guardar las claves generadasbyte[] bIV = des.IV;byte[] bKey = des.Key;Console.WriteLine(“La longitud de la clave (KeySize) es de {0} bits”, des.KeySize);Console.WriteLine(“La longitud de la clave es de {0} bytes”, bKey.Length);

}

Fuente 1. Generación de claves

dotN

etM

anía

<<

44

dnm.inicio.fundamentos<<

como parámetro; si queremos expor-tar las dos claves, tendremos que usarun valor verdadero como parámetrode esa llamada.

En el código del fuente 2 vemoscómo usar el método ToXmlString()para guardar las claves usadas al crearla instancia de la clase DSACryptoServi-ceProvider.

Cifrado y descifrado asimétrico

Podemos usar la clase RSACrypto-ServiceProvider para cifrar y descifrartextos de forma fácil ya que, a diferen-cia de la clase DSACryptoServiceProvi-der, expone métodos para realizar esastareas. Para cifrar un texto (en realidadun array de bytes), usaremos el méto-do Encrypt(), que devolverá un arraycon el texto cifrado. Para descifrar untexto previamente cifrado, usaremos elmétodo Decrypt(). En ambos casosdebemos usar las claves públicas y pri-vadas. Si lo que queremos es cifrar losdatos, solo necesitamos la clave públi-ca; pero para descifrar esos datos, nece-sitaremos también la clave privada.

En el código del fuente 3 vemoscómo podemos usar esta clase para cifrary descifrar un texto.

Comprobar firma digitalUna de las características de las

clases que utilizan cifrado asimétrico

es permitirnos generar un valor hash,por ejemplo del tipo SHA1, con elcontenido del texto a cifrar. Median-te ese valor hash podemos comprobarsi el mensaje (o texto) ha sido modifi-cado. De esta forma, el mensaje real-mente no se cifra, sino solo los valo-res de comprobación, ya que una delas funcionalidades de este tipo dealgoritmos es obtener firmas digitalesde mensajes, de forma que podamoscomprobar la autenticidad del mismo.Si quisiéramos cifrar el mensaje,podremos usar cualquiera de las cla-ses de cifrado simétrico o bien usar los

// La longitud de la clave puede ser de 512 a 1024 bits// en incrementos de 64 bitsDSACryptoServiceProvider dsa = new DSACryptoServiceProvider(640);Console.WriteLine(“La longitud de la clave es de {0} bits”, dsa.KeySize);

// Exportar las claves generadas como cadena XMLstring clavePublica = dsa.ToXmlString(false);Console.WriteLine(“Clave pública:\n{0}”, clavePublica);Console.WriteLine();// Las claves pública y privadastring clavePrivada = dsa.ToXmlString(true);Console.WriteLine(“Clave pública y privada:\n{0}”, clavePrivada);

Fuente 2. Exportar las claves en formato XML

static void pruebaRSA(){

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();string claves = rsa.ToXmlString(true);string clavePublica = rsa.ToXmlString(false);string texto = “Hola, Mundo”;

// Para cifrar solo es necesario la clave pública, // aunque también podemos usar las dos clavesbyte[] datosEnc = cifrarRSA(texto, clavePublica);

// Para descifrar necesitamos la clave pública y privadastring res = descrifrarRSA(claves, datosEnc);Console.WriteLine(res);

}

static byte[] cifrarRSA(string texto, string clavePublica){

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();// La clave pública usada para cifrar el textorsa.FromXmlString(clavePublica);// Convertimos la cadena a un array de bytesbyte[] datos = Encoding.Default.GetBytes(texto);// Generamos los datos encriptados y los devolvemosreturn rsa.Encrypt(datos, false);

}

static string descrifrarRSA(string claves, byte[] datosCifrados){

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();// Las claves usadas para cifrar el textorsa.FromXmlString(claves);// Generamos los datos desencriptadosbyte[] datos = rsa.Decrypt(datosCifrados, false);// Devolvemos la cadena originalreturn Encoding.Default.GetString(datos);

}

Fuente 3. Cifrar y descifrar usando RSA

dotN

etM

anía

<<

45

dnm.inicio.fundamentos<<

métodos que nos permiten tanto el cifrado como eldescifrado.

A la hora de usar la firma digital, el que la gene-ra debe disponer de las dos claves, (pública y priva-da), pero el que comprueba si es correcta solo nece-sita la clave pública.

En el código del fuente 4 podemos ver cómogenerar el valor hash cifrado a partir de una cade-na de texto; también usamos ese valor hash paracomprobar que el texto coincide con el valor hashusado para verificarlo. Para generar el valor hashSHA1 utilizamos un objeto del tipo SHA1CryptoSer-

static void probarDSA(){

DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();string claves = dsa.ToXmlString(true);string texto = “Hola, Mundo”;// Creamos la firma hash usando el texto// y las claves pública y privada// El texto convertido en un valor hash SHA1byte[] datosHash = claveSHA1(texto);// La firma para el valor hash indicadobyte[] firmaHash = crearFirmaDSA(datosHash, claves);

// Comprobamos si es correcto, usando la clave públicastring clavePublica = dsa.ToXmlString(false);// Comprobamos si los datos son correctosbool res = comprobarFirmaDSA(clavePublica, firmaHash, datosHash);if (res)

Console.WriteLine(“La comprobación es correcta.”);else

Console.WriteLine(“La comprobación no es correcta.”);}

static byte[] crearFirmaDSA(byte[] datosHash, string clavesXML){

DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();// Asignamos las claves indicadasdsa.FromXmlString(clavesXML);//DSASignatureFormatter dsaFormatter = new DSASignatureFormatter(dsa);// Indicamos el algoritmo hash a usardsaFormatter.SetHashAlgorithm(“SHA1”);// Creamos la firma y la devolvemosreturn dsaFormatter.CreateSignature(datosHash);

}

static bool comprobarFirmaDSA(string clavePublica, byte[] firma, byte[] datosHash){

DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();// Utilizamos la clave públicadsa.FromXmlString(clavePublica);DSASignatureDeformatter dsaDeformatter = new DSASignatureDeformatter(dsa);// El tipo de algoritmo hash a usardsaDeformatter.SetHashAlgorithm(“SHA1”);// Devolver un valor boolean si la firma es correctareturn dsaDeformatter.VerifySignature(datosHash, firma);

}

static byte[] claveSHA1(string texto){

// Crear una clave SHA1 a partir del texto indicado.// Devuelve un array de bytes con la clave SHA1 generadaUTF8Encoding enc = new UTF8Encoding();byte[] datos = enc.GetBytes(texto);

SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();return sha.ComputeHash(datos);

}

Fuente 4. Comprobación de firmas digitales

viceProvider, para asegurarnos de queel valor hash generado tiene la longi-tud adecuada (20 bytes).

Algoritmos simétricosLas clases que utilizan el algorit-

mo simétrico para la encriptación dedatos utilizan la misma clave tanto paracifrar como para descifrar los datos,además de que se suelen aplicar cuan-do tenemos gran cantidad de datos,principalmente los obtenidos a partirde secuencias. En estos casos, utiliza-remos una secuencia de tipo CryptoS-tream para realizar las tareas de cifra-do y descifrado.

En el código del fuente 5 utiliza-mos la clase TripleDESCryptoService-Provider para cifrar y posteriormentedescifrar el contenido de un fichero.La clase CryptoStream acepta como pará-metros del constructor la secuenciausada para leer o escribir, además deun objeto de tipo ICryptoTransform (elcual obtenemos mediante el métodoCreateEncryptor de la clase de encripta-ción usada) y el modo en el que la usa-remos, para leer o para escribir.

En los dos métodos usados en elejemplo mostrado en el fuente 5, paracifrar/guardar y descifrar/leer, pasamoslas claves correspondientes, las cualesdeben coincidir. Esas claves las pode-mos generar nosotros, teniendo encuenta la longitud esperada, que en elcaso de la clase TripleDESCryptoServi-ceProvider debe ser de 128 a 192 bits.Esas claves también las podemos gene-rar a partir de la creación de una ins-

dotN

etM

anía

<<

46

dnm.inicio.fundamentos<<

Hay que tener presenteque los algoritmos hashcomo SHA1 solo permitencrear valores hash a partirde un array de bytes, perono sirven para recuperar elarray (o texto normal) apartir de un valor hash.

[ ]NOTA static void cifrarFichero(string fichero, string ficSalida,

byte[] bKey, byte[] bIV){

byte[] datos;

using (StreamReader sr =new StreamReader(fichero, Encoding.Default, true))

{datos = Encoding.Default.GetBytes(sr.ReadToEnd());sr.Close();

}using (FileStream fs =

new FileStream(ficSalida, FileMode.Create,FileAccess.Write))

{TripleDESCryptoServiceProvider td =

new TripleDESCryptoServiceProvider();td.Key = bKey;td.IV = bIV;

CryptoStream cs = null;try{// Crear una secuencia de cifradocs = new CryptoStream(fs,td.CreateEncryptor(),CryptoStreamMode.Write);// Escribir los datos cifrados en el ficherocs.Write(datos, 0, datos.Length);

}catch{ }finally{

if (cs != null)cs.Close();

}}

}

static void descifrarFichero(string fichero, string ficSalida, byte[] bKey, byte[] bIV)

{// El proveedor del cifrado y las claves usadas para cifrarTripleDESCryptoServiceProvider td = new TripleDESCryptoServiceProvider();td.Key = bKey;td.IV = bIV;//// Crear la secuencia para leer el fichero cifradousing (FileStream fs =

new FileStream(fichero, FileMode.Open,FileAccess.Read))

{using (CryptoStream cs =

new CryptoStream(fs, td.CreateDecryptor(), CryptoStreamMode.Read))

{// Guardar el contenido de fichero descifradoStreamWriter sw = new StreamWriter(ficSalida);StreamReader sr = new StreamReader(cs);sw.Write(sr.ReadToEnd());sw.Flush();sw.Close();

}}

}

Fuente 5. Cifrar y descifrar ficheros

dotN

etM

anía

<<

47

dnm.inicio.fundamentos<<

tancia de esa clase y usarlas posteriormente. Si la cla-ve usada para leer/descifrar no es la misma que la queusamos al cifrar el fichero, recibiremos una excep-ción. En este caso, esas claves las generamos antes dellamar a esos dos métodos, tal como vemos en el códi-go del fuente 6.

Generar números aleatorios criptográficos

Las clases de .NET Framework utilizan genera-dores de números aleatorios para generar las clavescriptográficas. Nosotros podemos generar tambiénesos números aleatorios por medio de la clase RNGCryp-toServiceProvider, que está basada en la clase abstractaRandomNumberGenerator.

La forma de generar esos números aleatorios espor medio de un array de tipo byte en el que indica-mos cuántas cifras debe generar, ya que en cada ele-mento del array se incluirá una cifra. El método usa-do para generar los números aleatorios es GetBytes(),el cual incluirá todos los valores, incluso el cero. Por

medio del método GetNonZeroBytes() obtenemosnúmeros aleatorios, pero sin incluir el valor cero.

En el código del fuente 7 se generan números ale-atorios usando los dos métodos comentados; el núme-ro de bytes a generar lo dará el tamaño del array pasa-do como parámetro a los métodos.

ConclusionesEn este artículo hemos visto de

una forma práctica cómo podemosusar algunas de las clases que .NETFramework pone a nuestra disposi-ción para cifrar y descifrar la infor-mación que queremos transmitir yque de este modo solo sea “entendi-ble” para aquellos a los que queremospermitírselo.

Si usted prefiere usar Visual Basic,en el código que acompaña a este artí-culo, el cual puede bajar desde el sitioWeb de dotNetManía, se incluyentodos los ejemplos aquí usados tantoen Visual Basic como en C#.

Cuando usemos un objeto de tipo Cryp-toStream, debemos asegurarnos de lla-mar al método Close() para cerrar lasecuencia y eliminar los datos de lamemoria. Si mientras estamos usando unobjeto de tipo CryptoStream se produceun error, la secuencia no se cerrará, portanto es importante que incluyamos lamanipulación de esa secuencia dentro deun bloque using o dentro de un bloquetry/catch, para asegurarnos de que lacerramos en el bloque finally.

[ ]NOTA

TripleDESCryptoServiceProvider td = new TripleDESCryptoServiceProvider();

Console.WriteLine(“Generando el fichero encriptado”);cifrarFichero(fic1, fic2, td.Key, td.IV);Console.WriteLine(“Descifrando el fichero”);descifrarFichero(fic2, fic3, td.Key, td.IV);

// El número de bytes a generarbyte[] numeros = new byte[10];RNGCryptoServiceProvider rnd = new RNGCryptoServiceProvider();

// En los números generados puede haber cerosrnd.GetBytes(numeros);for (int i = 0; i < numeros.Length; i++)

Console.Write(“{0} “, numeros[i].ToString());

Console.WriteLine();

// Genera números sin incluir el cerornd.GetNonZeroBytes(numeros);for (int i = 0; i < numeros.Length; i++)

Console.Write(“{0} “, numeros[i].ToString());

Fuente 6.Al cifrar/descifrar los ficheros debemos usar las mismas claves

Fuente 7. Generar números aleatorios criptográficos

Para los humanos, la deshidratación es una seriaamenaza para la salud, debida a la falta de agua en elcuerpo. Para los flujos de trabajo, sin embargo, ladeshidratación no implica enfermedad ni peligro. Y,más importante, nuestro código no sufre riesgos nifallos. En la jerga de los flujos de trabajo, la deshi-dratación es lo mismo que la descarga o passivation.Esta última característica es el proceso mediante elcual el estado del flujo es almacenado en un mediopersistente (típicamente, una base de datos), y la ins-tancia del flujo, borrada temporalmente de la memo-ria. Más adelante, el flujo es recompuesto y lanzadoa partir de su estado guardado, cuando un eventoexterno produce la reactivación. En este caso, la ins-tancia del flujo sujeto a las técnicas de passivation, eshidratada y vuelve a la actividad. Pero, vamos con laclave de la pregunta: la diferencia entre compensa-ción y rollback. Ambos conceptos se aplican a pro-cesos transaccionales.

Una transacción es un conjunto de pasos inter-dependientes y relacionados que forman una unidadlógica de trabajo. La agrupación de los pasos en unatransacción asegura que el conjunto de pasos es tra-tado como una entidad atómica (o sea, indivisible).O todo el conjunto de pasos intermedios tiene éxi-to, o el conjunto entero falla. Cuando la transaccióntiene éxito, se almacenan los cambios en los recursosprotegidos implicados en ella. En este caso, la tran-

sacción ejecuta una orden commit. Si uno cualquierade los pasos intermedios falla, el efecto de todo loprocesado anteriormente debe ser anulado. Es enton-ces cuando la transacción efectúa un rollback, una ope-ración que garantiza que ninguno de los resultadosparciales queda como remanente de los recursos dela transacción (por ejemplo, en bases de datos). Si latransacción no puede continuar con éxito más allá deun punto dado, deshace los cambios, en un procesocomúnmente denominado rollback.

Aunque expresiones tales como rollback y com-mit, o quizás, commit en dos fases, se suelen asociargeneralmente a operaciones con bases de datos, tie-nen un significado más amplio. En general, las ope-raciones transaccionales son del tipo “todo-o-nada”:o toda la operación funciona, o toda la operaciónfalla. En el contexto de las aplicaciones Windowspara flujos de trabajo, esto supone que un bloque deactividades se completa con éxito, o en caso contra-rio el efecto sobre el sistema es el mismo que si laoperación nunca hubiese comenzado.

En un nivel de abstracción más alto, pueden dis-tinguirse dos tipos de transacciones: transaccionesACID y transacciones de larga duración. ACID esun acrónimo de Atómico, Consistente, Isolated (aisla-do) y Duradero, las 4 bases de la operación transac-cional. Es atómica, porque es una operación tipo“todo-o-nada”. Consistente, porque se garantiza que

Cuando las cosas van mal

Dino Esposito

DDiinnoo EEssppoossiittooes mentor de SSoolliiddQQuuaalliittyy LLeeaarrnniinngg.. Esponente habitual en

los eventos de laindustria a nivel

mundial.Visite sublog en: hhttttpp::////wweebbllooggss..

aasspp..nneett//ddeessppooss.(ttooddoottNNeett..QQAA@@

ddoottnneettmmaanniiaa..ccoomm)

Lo confieso. Soy relativamente nuevo en el tema de diseño y composición de flujos de trabajo. Haytérminos que todavía me confunden. Uno es la deshidratación, por ejemplo. Pero, peor todavía, nosoy capaz de captar la diferencia entre compensación y rollback. ¿Puede explicarlo?

todonet@qa

¿Se puede creer que las cosas pueden ir mal en software? ¿No era el software el imperio de laperfección absoluta, con ordenadores a los que dictar una serie de reglas y clarificar cualquierduda o debilidad humana? El software es un producto humano, y como tal, está sujeto a errores,omisiones, excepciones y fallos de todo tipo. Como pretendemos parecer prudentes y precavi-dos, utilizamos técnicas como el tratamiento de excepciones, páginas de error, compensación yrollback, que analizaremos en la columna de este mes.

t to od d

o ot tN N

e et t. .q q

a a@ @

d do ot t

n ne et tm m

a an ni ia a. .c c

o om m

siempre deja los recursos asociados en un estado cohe-rente. Aislada, porque una transacción no se debe de verafectada por, o afectar ella misma, a otras transaccionesconcurrentes. Y duradera porque, en el proceso de com-mit, persiste cualquier cambio en un estado duradero,no dependiente de un fallo de alimentación o del siste-ma. El modelo ACID es una solución excelente paratransacciones de corta duración, cuando la decisión com-mit/rollback se toma en cuestión de segundos y no haylugar para cambios posteriores. O dicho de otra forma,cualquier cambio persistido es duradero.

Este modelo no es apropiado para todas las posiblesescenarios de negocio en el mundo real. Hay operacio-nes de negocio que suponen varios pasos ejecutándoseen compañías y ubicaciones geográficas diversas. Estastransacciones tienen que esperar minutos, días o sema-nas antes de que se conozcan los datos necesarios parasu continuación. A menudo, tienen que esperar a que seproduzca un evento externo de algún tipo o una entra-da de usuario. Y, con frecuencia, estas transacciones secomponen a su vez de sub-transacciones, que –de acuer-do con los principios ACID– realizan commits o rollbacksrápida y duraderamente.

El final de una sub-transacción no afecta necesa-riamente al resultado de la misma forma, ni al proce-so principal de la transacción. ¿Qué sucede si, en unpaso posterior, sucede algo que obliga a cancelar laoperación completa? ¿Qué pasa con las sub-transac-

ciones completadas? No pueden ser deshechas, perosus efectos deben ser compensados de alguna mane-ra. Consideremos un ejemplo real.

Decides tomarte unas vacaciones en una isla tropi-cal, de forma que reservas un vuelo y una habitación dehotel. Para garantizarte que su servicio es el mejor, lascompañías arreglan un pedido extra de comida y el hoteltendrá que sacar más trabajo en el servicio de lavandería.Ambos, línea aérea y hotel, persisten sus transaccionescon sus respectivos distribuidores y confirman tu pedi-do. Dos semanas más tarde, cancelas tu viaje. La líneaaérea y el hotel pueden necesitar deshacer esos serviciossolicitados y compensar los efectos. Sin embargo, cuan-to más complejas sean las interconexiones entre com-pañías y la sofisticación de las reglas de negocio, se nece-sita más lógica para deshacer los efectos producidos. Lacompensación es un rollback, más cierta lógica añadida.En el contexto de una transacción ACID, el rollback essimplemente la cancelación de lo que se había hechoanteriormente, como si nunca hubiese ocurrido. La com-pensación es cuando comienzas una transacción total-mente nueva, para realizar trabajo adicional que com-pense los cambios anteriores. Como cancelar un pedi-do, o devolver dinero cargado a una tarjeta de crédito.

En Windows Workflow Foundation, tienes queutilizar actividades diferentes para las transaccionesACID y las transacciones compensables de largaduración.

dotN

etM

anía

<<

49

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

dnm.todonet@qa<<

He escrito una librería de clases .NET que implementan mis propias reglas de negocio. En algunoscasos necesito lanzar excepciones fuera de mis clases. Para algunos escenarios comunes, creo que sepuede usar algunas de las clases de excepción predefinidas en .NET Framework. Pero, ¿y si quiero per-sonalizar una excepción para cambiar el nombre o incluso su prototipo?

.NET Framework es totalmente orientado a obje-tos y expone, virtualmente, cada característica median-te un objeto. A no ser que el objeto esté sellado (sea-led), siempre puedes heredar una nueva clase a partirde esa y personalizar el comportamiento. Esto es loque sucede con las excepciones.

En .NET, cada excepción está representada por unainstancia de una clase que hereda de System.Exception.En la tabla adjunta se muestra la lista de propiedades dela clase.

Además, en .NET hay un montón de clases deexcepción del CLR predefinidas. Observemos quetodas las excepciones relacionadas con el sistema deri-van de SystemException, mientras que las excepcionesde clases de aplicación definidas por el usuario deri-van de ApplicationException. Ambas añaden nuevafuncionalidad a la clase Exception. Se suministran,sobre todo, como un medio para diferenciar entre losdos tipos de excepción. Las clases que derivan de Sys-

Propiedad Descripción

Message Mensaje que describe la excep-ción actual.

InnerException Referencia a la excepción inter-na que causó la excepción actual,si la hubiera.

StackTrace Cadena que muestra todos losmétodos llamados, y los númerosde línea en el código fuente dondese hicieron las llamadas.

Source Indica el nombre del objeto quecausó el error.

TargetSite Obtiene el método que lanzó laexcepción actual.

HelpLink Obtiene o establece un vínculoal fichero de ayuda asociado conla excepción.

Cuando se produce una excepción en una aplicaciónASP.NET, el CLR intenta encontrar algún bloque de códi-go que pueda capturarla. Las excepciones recorren su cami-no hacia arriba en la pila, hasta que se alcanza la raíz de laaplicación. Si no aparece ningún manejador de excepcio-nes adecuado durante el camino, la excepción se convier-te una excepción no manejada y el CLR lanza una excep-ción crítica. En este momento, los usuarios reciben unapágina de error estándar, con fondo amarillo.

Como desarrolladores, ¿qué deberíamos hacer con lasexcepciones no manejadas en aplicaciones ASP.NET?

ASP.NET suministra un par de eventos con los quese pueden manejar los errores mediante programación,ya sea a nivel de página o de aplicación. Si sobrescribi-mos el evento Error en la clase Page, podemos capturarcualquier excepción no manejada que se produzca duran-te la ejecución de la página. De forma similar, el eventoError de la clase HttpApplication permite capturar cual-quier excepción no manejada lanzada desde la aplicación.Para escribir tal manejador global, se crea un métodoApplication_Error en Global.asax.

En ambos casos, para informar a los usuarios se les deberedirigir a otra página. Si se opta por una solución pro-gramática, incluso se puede crear dinámicamente la pági-na de respuesta. Si no sitúas ninguna lógica de tratamien-to de excepciones en la aplicación, los usuarios recibirán la

página de errorestándar. La típi-ca página deerror, además,difiere según setrate de usuarioslocales o remo-tos. Por defecto,los usuarios loca-les, o sea los queacceden a la apli-cación a través deun host local, reci-ben una página

que contiene toda la pila de llamadas de la aplicación, ocadena de llamadas a métodos que provocaron la excep-ción, junto a una breve descripción del error. Si la páginase está ejecutando en modo depuración habrá informaciónadicional añadida. Por razones de seguridad, los usuariosremotos reciben una página menos detallada, como la quese muestra en la figura 1.

Para evitar que los usuarios reciban páginas de erroresincomprensibles, puedes asignar de forma declarativa unapágina de error personalizada. Para mostrar una páginamás amigable, con un aspecto consistente con el sitio Web(figura 2), puedes establecer el Web.Config como sigue:

<configuration><system.web><customErrors mode="On"

defaultRedirect="/GenericError.aspx"/> </system.web>

</configuration>

Cualquiera que sea el error, ASP.NET redirigiráahora al usuario a la página GenericError.aspx, cuyoaspecto visual y disposición están totalmente bajo con-trol. Finalmente, con otros pequeños cambios en elfichero Web.Config también puedes definir ad hoc dife-rentes páginas para distintos tipos de error HTTP.

dotN

etM

anía

<<

50

dnm.todonet@qa<<T

odot

Net.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

No soporto esas pantallas amarillas que lanza ASP.NET cuando falla la aplicación. Pero estoy per-dido con la documentación.Ayuda, por favor.

temException son generalmente lanzadas por excepcio-nes no fatales del CLR, recuperables por las aplicacio-nes. Las que derivan de ApplicationException las lanzasiempre una aplicación de usuario.

A la hora de escribir componentes (controles, librerías,clases de soporte), se debería intentar utilizar los tipos deexcepciones predeterminadas. Y optaremos por una per-sonalizada, que describa de forma correcta lo sucedido,solo en el caso de que se piense que el desarrollador tendrá

intención de capturarla, para realizar alguna acción especí-fica basada en sus contenidos.

Cuando es correcto utilizar una nueva clase de excep-ción, heredamos de ApplicationException. A continua-ción, implementamos todos los constructores estándary añadimos tantos miembros como se necesiten, que pue-den ser cualquier cantidad de cualquier tipo. Simple-mente, se añade lo que uno piensa que pueda ayudar aotros a manejar la excepción.

Traducido al castellano por Marino Posadas

Figura 1.Ocurrió un error nomanejado en el servidor

Figura 2.Un aspecto mucho másamigable de la página de error

Programming Windows Presentation Foundation Chris Sells, Ian Griffiths

Editorial: O’ReillyPáginas: 430Publicado: septiembre, 2005ISBN: 0596101139Idioma: inglés

Chris Sells no es un novatillo. Ya comentamos su obra “Windows Forms Programming inC#” (ver dotNetManía nº 14) y le recordamos, además, por su excelente sitio Web(http://www.SellsBrothers.com) y sus celebradas ponencias en eventos Microsoft. Chris está aho-ra en Microsoft, y ha cesado en su actividad escritora, pero hoy vamos a comentar dos obrasen las que él es protagonista. La primera, y de más reciente publicación, es ésta. Una aproxi-mación práctica y bien explicada de los fundamentos operativos de WPF. A diferencia de laobra de Charles Petzold sobre el mismo tema, que comentábamos en el número 30, no setrata de una aproximación concienzuda al problema sino de una especie de “solucionario”rápido, que permite una inmediata puesta en marcha con el producto.

Además, toda la obra está plagada de ejemplos, y se sigue con facilidad, si bien asumeconocimientos suficientes de C# y XML como lenguajes fundamentales. Los ejemplospueden descargarse de http://www.sellsbrothers.com/writing/avbook.

Essential .NETDon Box y Chris Sells

Editorial: Addison-WesleyPáginas: 405Publicado: 2003ISBN: 0201734117Idioma: inglés

Y esta es nuestra segunda recomendación del mes. También figura en ella Chris Sells, comosegundo autor, y –he de decir- que tiene algún inconveniente para más de un lector. El másnotable, quizás, es su antigüedad (2003). Tampoco es un libro extenso, al estilo de los de Pro-sise o Petzold. ¿Por qué lo recomendamos, entonces? Pues, qué quieren que les diga, a lomejor porque lo consideramos el mejor libro que se haya escrito sobre los fundamentos de.NET Framework. Es durillo en más de un pasaje, sí, pero tiene una densidad y una preci-sión en las definiciones y explicaciones, como solo el señor Box y otros pocos son capaces dedar. Existe una descripción detallada y puede descargarse algún capítulo de ejemplo en ladirección http://www.awprofessional.com/bookstore/product.asp?isbn=0201734117&rl=1. Unabiblioteca que se precie tiene que tenerlo.

biblioteca.net

nove

dad

es Programación avanzada de aplicaciones con Microsoft ASP.NET 2.0

Dino Esposito. Editorial: Anaya Multimedia/Microsoft. Pág.: 800. Publicado: enero, 2007.

ISBN: 978-84-415-2136-0. (Versión en castellano).

Bases de datos con SQL Server 2005 Solid Quality Learning. Editorial: Anaya Multimedia/Microsoft. Pág.: 384. Publicado: enero,

2007. ISBN: 978-84-415-2121-6. (Versión en castellano).

Introducción

Microsoft .NET Micro Framework 2.0 es elhermano más pequeño de la familia de productos ymarcos de trabajo .NET. Recién salido al mercado,esta versión del .NET Framework ha sido especial-mente diseñada para ser incluida dentro del firm-ware de aquellos dispositivos a los que incluso lavariante Compact les queda grande.

Esta versión se ejecuta en microprocesadoresde 32 bits y apenas necesita 250 KB de memoriapara su ejecución, lo que la hace apta para aquellosgadgets de diminuto tamaño que no requieran unapotencia excesiva. Según Microsoft, ya ha sido uti-lizado en los relojes SPOT y en los displays Micro-soft Windows® Vista™ SideShow™. Está especial-mente indicada para la construcción de sensores omonitorizadores de redes, elementos de robótica,domótica, dispositivos portátiles, instrumentaciónmédica, sistemas de automatización industrial y unlargo etcétera.

Pese a ser una versión reducida, cuenta conmuchas de las facilidades de sus hermanos mayores,entre las que destaca el acceso a la mayor parte delas clases de los espacios de nombres System.Collec-tions, System.Diagnostics, System.Globalization, Sys-tem.IO, System.Reflection, System.Resources, Sys-tem.Runtime y System.Threading.

Principales característicasTradicionalmente, salvo contadas excepciones,

el desarrollo de firmware se suele llevar a cabomediante el ciclo de editar, compilar, grabar en eldispositivo y comprobar, todo ello utilizando herra-

mientas no muy compatibles entre sí, y con el pro-blema añadido de la inexistencia de depuradores ade-cuados o con la potencia suficiente para agilizar eltrabajo.

Esta versión, al integrarse por completo dentrode Visual Studio 2005, permite utilizar casi todas lasherramientas que este entorno ofrece, aumentandoasí enormemente el grado de productividad, quepuede llegar a ser similar al que se obtiene al desa-rrollar para una PDA u otro aparato equivalente,puesto que se permite la descarga directa sobre eldispositivo.

Pero todavía contamos con más ventajas a lahora de disponer de herramientas para facilitar lastareas de desarrollo. Contamos con un emuladoruniversal; es decir, un emulador que podemos con-figurar a nuestro gusto (heredando de la clase Emu-lator), al que podemos añadir botones, periféri-cos, pantallas, elementos controlados por inte-rrupciones o cualquier otro componente segúnsean nuestras necesidades. Y frente al modelo dedesarrollo tradicional, no es necesario disponerde un dispositivo físico más o menos terminadopara poder desarrollar sobre él, por lo que la cre-ación del firmware y del hardware se puede lle-var a cabo simultáneamente, casi dividiendo porla mitad los tiempos de desarrollo de un nuevoaparato.

El hecho de que el código es código manejadotambién aporta su granito de arena, y realmente sig-nifica una gran innovación en este segmento, pues-to que existe una enorme diferencia entre crear códi-go manejado y pelearse con interrupciones, escritu-ra directa en registros, contención de procesos ytareas similares. Aunque Java lo intentó en sumomento, actualmente no hay dispositivos de este

Microsoft .NETMicro Framework 2.0

Laboratorio.netRafael Ontivero

Rafael Ontiverotiene más de 20 añosde experiencia como

programador enmúltiples lenguajes y

entornos y comoresponsable de

equipos de desarrollo.Actualmente es

director técnico paraEspaña de lamultinacional

SSuuzzoo SSTTCC.

• Nombre: Microsoft .NET Micro Framework 2.0

• Fabricante: Microsoft

• Web: msdn.microsoft.com/embedded/netmf

• Categoría: Marcos de trabajo

• Precio: Gratuito

Ficha técnica

dotN

etM

anía

<<

53

dnm.laboratorio.net<<

tipo desarrollados con él (y debemos recordar queaunque los teléfonos móviles lleven un intérpreteJava, dicho intérprete suele estar realizado en C oC++, así como el resto del software que pudiera eje-cutar el aparato).

También disponemos de clases manejadas paracontrolar chips USART (en general casi cualquier ele-mento serie, como SPI, RS-232…), buses I2C, modu-lación de pulsos (PWM), temporizadores de alta y bajaresolución, primitivas gráficas, acceso genérico deentradas/salidas (GPIO), soporte para imágenes BMPy JPG, manipulación de texto, recolección automáti-ca de basura, globalización, hilos y drivers para con-trolar pantallas LCD.

ArquitecturaEn la figura 1 podemos apreciar la estructura bási-

ca de .NET Micro Framework. La adaptación a nuestro hardware se puede rea-

lizar de dos formas: trasladando el motor de tiempode ejecución a un sistema operativo ya existente, conlo que nos ahorramos el tener que modificar nada, obien utilizando el kit de portabilidad. De este modo,no se necesita ninguna capa extra para que el dispo-sitivo sea capaz de arrancar sobre el hardware; es

decir, el motor de tiempo de ejecución del MicroFramework es capaz de arrancar él solo sin ningúntipo de firmware adicional.

Esta forma de operar requiere que modifiquemosla capa HAL o PAL para adecuarla a nuestras necesi-dades. La capa HAL (Hardware Abstraction Layer) per-

mite tocar directamente laelectrónica, y en general esnecesario modificarla paraadaptar los drivers existentesa nuestro hardware, aunqueesta tarea habitualmente lasuele realizar el fabricantedel microprocesador y delos periféricos, sumi-nistrándonosla ya adaptadaa la arquitectura y estructu-ra de nuestra electrónica.Por su parte, la modifica-ción de la capa PAL (Plat-form Adaptation Layer) esmucho más sencilla, ya quedispone de primitivas demás alto nivel como llama-das asíncronas, estructurasde datos, temporizadores dealto nivel, entrada/salidaseriada, etc.

Una característica queno podemos dejar de men-cionar es la de que el MicroFramework puede ser con-

siderado un sistema operativo embebido completo,ya que mientras el HAL/PAL suministra la inter-faz a las zonas críticas del hardware, con soportemono-hilo para interrupciones, entrada/salida, tem-porizadores físicos, etc., el CLR se encarga de simu-lar el resto, incluyendo la multitarea (en este caso

Figura 1.Arquitectura básica.

.NET Micro Framework puede ser considerado un sistema operativo embebido completo: el

HAL/PAL suministra la interfaz a las zonas críticasdel hardware, y el CLR se encarga del resto

dotN

etM

anía

<<

54

dnm.laboratorio.net<<

cooperativa), el soporte para hilos ydemás características que conformanun sistema operativo moderno. Otrode los temas importantes es la posibi-lidad de, basándonos en los elemen-tos disponibles, poder crear drivers concódigo manejado; quien haya realiza-do este tipo de piezas de softwarepodrá apreciar en su justa medida estacaracterística.

El CLR del Micro Framework con-siste en un subconjunto del CLR de.NET Framework que implementatipos numéricos, clases, arrays (de unasola dimensión), tipos valor, sincroni-zación, hilos, temporizadores, reflexio-nes, serialización, recolección de basu-ra y control de excepciones, así comonuevos elementos que son necesariospara los sistemas embebidos industria-les, como GPIO, SPI o I2C.

Según Microsoft, pruebas de ren-dimiento demuestran que el CLR escapaz de ejecutar una media de 15.000llamadas a métodos manejados porsegundo a una frecuencia de reloj de27,6 MHz (pruebas realizadas sobreun proyecto real, el reloj SPOT). Unnúcleo completo con toda la funcio-nalidad habilitada ocupa apenas 390KB de memoria.

La última capa disponible es la pro-pia biblioteca de clases, con soporte paradepuración, gráficos y DLL. Incluyefuncionalidad para layouts (colocaciónde flujo y redimensionado automáticode componentes), fuentes, imágenesBMP, JPG y GIF (con algunas limita-ciones), lápices, brochas, colores, pri-mitivas de dibujo y manejo de ventanas(incluidas las emergentes). Tambiénincluye partes de Windows Presenta-tion Foundation, pero sin soporte paraXAML.

Lenguaje y soportePor el momento, el único lenguaje

en el que se puede desarrollar para estaplataforma es C#, con Visual Studio2005 como entorno (sólo en sus versio-nes Estándar o Profesional).

De los espacios de nombres habi-tuales, disponemos de System, System.Collections, System.Diagnostics, Sys-tem.Globalization, System.IO, System.Net,System.Net.Sockets, System.Reflection,System.Resources, System.Runtime.Com-pilerServices, System.Runtime.Interop-Services, System.Runtime.Remoting, Sys-tem.Text y System.Threading. General-mente están bastante recortados en fun-cionalidad, aunque la disponible sea lasuficiente para un sistema embebido.Por ejemplo, en System.Collections sólodisponemos de ArrayList y de cincointerfaces.

Adicionalmente, se añade un nuevoespacio de nombres específico para esteentorno, llamado Microsoft.SPOT (deSmart Personal Objects Technology) y queincluye varios sub-espacios nuevos, quese detallan en la tabla 1.

Quizás se pregunte por qué los ele-mentos de dibujo están dentro del espa-cio de nombres SPOT. La explicaciónes bastante sencilla: no estamos hablan-do de una pantalla típica, sino de ele-mentos de salida como displays de unasola o varias líneas, de matrices de pun-tos o incluso de cristal líquido especia-les, como los que podemos encontraren las estaciones meteorológicas o losrelojes.

El emulador extensiblePuede que éste sea el mejor punto

del Micro Framework. Se trata de unemulador que podemos extender fácil-mente para que cubra los dispositivosque va a contener nuestro desarrollo, deforma que mientras se diseñan y cons-

Tabla 1. Espacios de nombres SPOT

Espacio de nombres Contenido

SPOT Contiene un conjunto variopinto de clases queno tienen espacio de nombre propio.

SPOT.Cryptography Contiene lo esencial para la codificación y deco-dificación de datos.

SPOT.Hardware Uno de los más importantes, engloba clases paracontrol de la batería, la CPU, dispositivos I2C,puertos (E/S), puertos tri-estado, puertos serie,interrupciones y entradas y salidas GPIO.

SPOT.Input Ofrece soporte para elementos de entrada comobotones y pulsadores físicos, con control de even-tos y flujos.

SPOT.Net.NetworkInformation Proporciona información y control de interfacesde red.

SPOT.Presentation Contiene clases, estructuras y enumeracionespara realizar salidas por pantalla sobre un dispo-sitivo gráfico (no necesariamente un monitor).

SPOT.Presentation.Controls Dispone de los elementos típicos de las interfacesde usuario gráficas, tales como paneles, elemen-tos desplazables, cuadros de lista, imágenes, etc.

SPOT.Presentation.Media Contiene clases para manipular imágenes (bro-chas, colores, lápices…).

SPOT.Presentation.Shapes Contiene las clases que permiten dibujar primiti-vas gráficas; en concreto, incluye soporte paraelipses, líneas, polígonos, rectángulos y figuras.

dotN

etM

anía

<<

55

dnm.laboratorio.net<<

truyen los prototipos físicos se puedaempezar a implementar la aplicaciónque va a ejecutarse, lo que reduce de for-ma muy notable el tiempo de desarro-llo final.

Podemos extender el emulador dedos formas diferentes. La más senci-lla consiste en utilizar un archivoXML que le indica al motor del emu-lador qué elementos físicos va a emu-lar y cuáles son sus características, así

como qué partes del Micro Frame-work van a estar disponibles. La tabla2 resume los espacios de nombres de.NET Micro Framework 2.0 relacio-nados con el emulador.

La segunda forma de extensión esmucho más potente (y no es que laprimera lo sea poco). Consiste enheredar o crear nuevas clases a partirde las existentes, clases que irán inte-gradas dentro del propio emulador.El concepto llega hasta el nivel depoder heredar de la propia clase Emu-lator y así realizar los cambios opor-tunos.

ConclusiónHemos recorrido las característi-

cas más destacables de este nuevo mar-co de trabajo que Microsoft acaba desacar a la luz, haciendo hincapié en lasnuevas funcionalidades y destacandoaquellas que consideramos son pre-ponderantes a la hora de ayudar a lossufridos desarrolladores de sistemasembebidos de mediano y pequeñotamaño. Pensamos que .NET MicroFramework 2.0 significa un gran pasohacia una unificación y homogeneiza-ción largamente necesitadas entre losdesarrollos horizontales mediante PCy los verticales mediante otros siste-mas basados en microprocesador, con-junción que quizá pudiera ser uno delos primeros pasos hacia un entornodomótico, robótico e industrial ple-namente integrado.

Tabla 2. Espacios de nombres SPOT relacionados con el emulador.

SPOT.Emulator Contiene la clase que representa al emulador, elcontrol de los dispositivos que éste posee y elmotor de configuración.

SPOT.Emulator.Com Clases para simular puertos de comunicación.

SPOT.Emulator.Gpio Clases para trabajar con puertos de E/S generales.

SPOT.Emulator.I2c Implementa el protocolo I2C y los dispositivosconectados a él.

SPOT.Emulator.Lcd Clases para emular dispositivos LCD (pantallasde cristal líquido).

SPOT.Emulator.Memory Clases para emular distintos tipos de memoria,como RAM o FLASH.

SPOT.Emulator.Serial Clases para emular puertos serie.

SPOT.Emulator.Spi Implementa la simulación del bus SPI y los dis-positivos conectados a él.

SPOT.Emulator.Time Proporciona clases para simular servicios de tem-porización.

.NET Micro Framework 2.0 significa un gran pasohacia una unificación y homogeneización

largamente necesitadas entre los desarrollos horizontales y verticales

dotN

etM

anía

<<

56

Llevo tiempo trabajando con grupos que se forman entorno a .NET. Tomé parte en la creación y coordina-ción del DotNetGroup de la Universidad de Deusto(Bilbao) y actualmente de Nuberos.net (grupo de usua-rios de .NET de Cantabria). Con todo ese trabajo engrupos, era solo cuestión de tiempo que intentase cre-ar un grupo en el País Vasco; sólo me hacía falta encon-trar gente interesada y con entusiasmo.

La primera persona que encontré fue Oskar Álva-rez. Le conocí en el primer evento que hizo Nube-ros.net con David Carmona (DPE Microsoft). Pocotiempo después comencé a trabajar con él en la mismaempresa. Conseguí convencerle para que participaradando alguna charla en Nuberos.net y le gustó la expe-riencia. Por aquel entonces ya comentábamos la posi-bilidad de crear un grupo en el País Vasco, pero los doscoincidíamos en que necesitábamos encontrar más per-sonas que quisieran participar en esta aventura si quería-mos llegar a buen puerto. Unos meses después y trassondear a compañeros de trabajo que parecían estarinteresados, me tiré a la piscina y comencé los prepa-rativos para la creación del grupo.

Lo primero era encontrar un nombre. Durante todauna semana estuve pensando nombres, preguntando atodos mis amigos si se les ocurría algo. El nombre deNuberos había funcionado muy bien para el grupo deCantabria. Nadie recordaba nuestros nombres, perotodos se acordaban de Nuberos, por lo que quería unapalabra sencilla y fácil de pronunciar, que tuviese algúntipo de relación con el lugar donde vivimos. Entonces,una tarde volviendo a casa en tren con un amigo surgió,se le ocurrió a él: Artalde. En euskera significa “rebañode ovejas”. Me pareció perfecta. En cuanto llegué a casaregistré el dominio www.artalde.net y di de alta al grupoen INETA Europa. Era el 11 de octubre del 2006 y habíanacido Artalde.net.

Poco tiempo después llegó el CodeCamp 2006de Madrid. Allí Oskar y yo nos encontramos conRodrigo Corral (MVP C++). Rodrigo, aún siendode Burgos, es conocido como el MVP de Bilbao, yaque vive en esta ciudad. Nos comentó que tanto élcomo unos amigos estaban también interesados enque hubiera un grupo de usuarios, por lo que prepa-ramos una reunión a la vuelta del evento.

No hay mejor reunión que la se celebra en unacervecería. Aquí conocimos a Ibon Landa, a GorkaElexgaray y otros. A ellos ya les rondaba por la cabe-za la idea de crear un grupo, por lo que estaban muyinteresados. Había encontrado a personas con mi mis-mo entusiasmo. La maquinaria ya era imparable.

Hicimos la primera repartición de tareas. Conse-guimos una sala en la Universidad de Deusto para lascharlas, un hosting, un responsable para la Web, paralas gestiones…

El día 21 de noviembre del 2006, aprovechando queOskar participaba en el evento de Microsoft de “Prepá-rate para un nuevo día para el desarrollador” que teníalugar en Bilbao, anunciamos el grupo y la fecha de nues-tro primer evento, el 13 de diciembre.

Tras los nervios por ser el primer evento y varioscambios de agenda de última hora, tuvimos nuestro pri-mer evento. Tras mi breve introducción a los grupos deusuarios y lo que era Artalde.net comenzó la verdadera

Artalde.netGrupo de usuarios de .NET del País Vasco

comunidad.net

AArrttaallddee..nneett• ubicación: País Vasco• fecha de fundación: octubre

2006• fundador: Iñigo Herrero• miembros: 50• página web: www.artalde.net• email de contacto:

[email protected]

charla. El tema principal fue WCF y losponentes fueron Oskar Álvarez y MiguelJiménez (MVP C#). Asistieron 34 per-sonas, de las cuales 34 salieron encanta-das y dispuestas a volver.

Actualmente, tras haber realizado unasegunda charla con Rodrigo Corral e IbonLanda sobre Team System en enero yhabiendo casi duplicado el número deasistentes, Artalde.net es toda una reali-dad. Ya tenemos cinco eventos más en larecámara, con temáticas muy variadas:ASP.NET 2.0, bussiness intelligence, ges-tión de proyectos, acceso a datos…

Los eventos los celebramos en la Uni-versidad de Deusto en Bilbao, los miér-

coles de 19:00 a 21:00, y solemos teneruno al mes. Si quieres participar en el gru-po ya sea preparando alguna charla, apor-tando ideas o con alguna iniciativa quequieras llevar adelante, puedes ponerteen contacto con nosotros en el siguientecorreo electrónico: [email protected] quieres estar informado de nuestroseventos y actividades, puedes visitar nues-tra web www.artalde.net y registrarte enla lista de distribución.

Querría invitar a todas las personas aque participen en los grupos de usuarios,ya que es una experiencia fantástica. Tam-bién querría aprovechar para dar las gra-cias a David Carmona y Alfonso Rodrí-

guez del DPE de Microsoft por su entu-siasmo y un trabajo bien hecho, a INE-TA por dar apoyo a los grupos, a los MVPy personas de la comunidad que colabo-ran con los grupos y que nos dan elempujón que nos hace falta, y en defini-tiva, a todas las personas que ayudan a queexistan los grupos de usuarios.

Por último, querría dar las gracias alos compañeros que tengo en Artalde,Oskar, Ibon, Rodrigo, Gorka y muchosotros, ya que gracias a vosotros vamos atener grupo de usuarios para rato.

dotN

etM

anía

<<

57

dnm.comunidad.net<<

AJAX, XNA,WF,WCF,WPF...WTF does that mean?

Gracias a nuestros compañeros de la UPNA (Universidad Pública de Nava-rra), el acto pudo celebrarse en una sala y con unos medios excepcionales.Los magníficos carteles realizados por Sergio Jiménez precedieron en laentrada a nuestra presidenta, Elena Santacana, que hizo una introduccióncomentando los objetivos, planes y acciones realizadas, así como la filosofíadel grupo de usuarios NavarraDotNET. Después, se dio paso a más de 5horas de ponencias que fueron desvelando el significado de las 5 siglas quecomponen el título del evento: AJAX, XNA, WF, WCF y WPF.

No pudimos contar con un ponente mejor que David Salgado Berme-jo (development advisor de Microsoft Ibérica) para zambullirnos en el mundodel desarrollo Web con AJAX. A través de unas demostraciones muy prácti-cas y sencillas, David nos mostró el potencial de AJAX aplicado a ASP.NET.Aprovechamos para explotar sus conocimientos de Windows CommunicationFoundation (WCF) y de Windows Presentation Foundation (WPF). Contó conla inestimable ayuda de Sergio Sierro, que hizo una introducción acerca delas ventajas e inconvenientes de las actuales alternativas para aplicaciones dis-tribuidas (Web Services, COM+, Remoting, etc.).

Después, T.N.T. de AC-DC sonó fuerte en la sala para dar la bienveni-da a Iñaki Ayucar, miembro del proyecto Simax, que vino a hablar sobre eldesarrollo de juegos con DirectX y XNA. Iñaki deleitó al respetable con unarevisión de la evolución de los juegos que puso nostálgico a más de uno, tra-

tando de ver hacia dónde se dirige el mun-do de la programación de videojuegos.Analizó los problemas actuales de estemundillo, los beneficios e inconvenien-tes del código manejado sobre el C++puro y explicó por qué aconseja apostarpor un modelo de desarrollo “más eleva-do”: C#, Managed DirectX o XNA yVS2005, es decir: .NET.

Carlos Segura (Sharepoint MVP)nos enseñó cómo, aun sin ser conscien-tes de ello, cuando pedimos un frito degamba en un bar internamente hace falta una gestión de excepciones, tran-sacciones, manejo de eventos, actividades de código y reglas. Mostró cómomodelar todo el flujo de trabajo que hay detrás de una actividad tan simple ycómo Workflow Foundation nos puede ayudar en ello, despreocupándonosdel funcionamiento de la lógica subyacente y permitiendo al programadorcentrarse en el proceso. Se realizó una charla muy divertida y didáctica, condemostraciones y actividades personalizadas. Simplemente excepcional.

Más información: http://www.navarradotnet.com/Eventos/25Enero07/tabid/72/Default.aspx.

eventos.eventos.eventos.eventos.eventos.eventos

«Desde aquí queremos animar atodas las personas a que

participen en los grupos deusuarios, ya que es una experiencia fantástica»

Íñigo Herrero Guitiérrez del AnilloArtalde.net, grupo de usuarios de .Net del País Vasco

TEXTO: IÑAKI AYUCAR

dotN

etM

anía

<<

58

desvánMicrosoft presenta Windows DreamScene

Ultimate Extra for Vista

noticias.noticias.noticias

Los usuarios de Windows Vista Ultimate ya tienen dispo-nible una de las características que se barajaron como posi-bles durante la construcción del producto, pero que luego noestuvo presente en la primera versión. Se trata de WindowsDreamScene, una exten-sión para el escritorio queincluye movimiento yaspectos tridimensiona-les a la experiencia coti-diana de usuario, a unprecio muy bajo de CPU.Se acompaña de otraherramienta llamadaDeskScapes, tambiéngratuita, que permite lautilización de fondos depantalla dinámicos. Pueden verse algunos ejemplos para des-carga en el sitio http://www.wincustomize.com/articles.aspx?aid=144002&c=1.

Esta nueva característica utiliza ficheros de extensión .DRE-AM, que es capaz de interpretar a petición en diferentes partesdel sistema. Puede verse en funcionamiento simulado en laWeb dentro del mismo sitio, en las páginas: http://www.win-customize.com/skins.aspx?skinid=7&libid=50 y http://www.win-customize.com/skins.aspx?skinid=10&libid=50.

Marino Posadas

Una instalación perfecta para trabajar con WPFComo verá el lector, a partir deaquí este número del desván estácasi dedicado a la tecnología Win-dows Presentation Foundation.Un buen punto de partida (ya quela cosa no está tan clara) consisteen saber qué y en qué orden debe-mos instalar en un equipo para

trabajar a pleno rendimiento con este nuevo motor de renderiza-ción. Eso es justo lo que hace Cristian Manteiga en la siguientepágina: http://geeks.ms/blogs/cristian.

Cómo instalar XNA en Windows VistaSi lo intentamos a partir de Visual Studio 2005 C# Express yXNA, obtendremos un mensaje de error generado por la acciónRegisterWithCSExpress del tipo “Error 1721”, debido a que fal-tan los templates para VS 2005 C# Express. Para que el proce-so sea correcto debemos de modificar el fichero .MSI de ins-talación. Y para eso necesitamos editar el MSI usando unaherramienta llamada Orca disponible en Windows SDK Com-ponents for Windows Installer Developers (http://msdn2.micro-soft.com/en-us/library/aa370834.aspx). Si solo queremos insta-lar el MSI de Orca, podemos hacerlo en la dirección http://asteb-ner.sts.winisp.net/Tools/Orca.zip

Una vez la tengamos instalada, entramos a Orca, abri-mos el MSI de XNA, seleccionamos la tabla InstallExecu-teSequence, borramos RegisterWithCSExpress y grabamos.Finalmente, nos queda instalar los templates, ejecutandoVCSExpress.exe /installvstemplates en una ventana decomandos.

El Blog de LesterSiempre actualizado con noticias de desa-rrollo y especialmente dedicado a Win-dows Presentation Foundation. Hay muybuenas demos, código fuente y trucos,enlaces a recursos sobre Vista (sí, inclu-yendo gadgets) y muchísimo más. Dispo-

nible en http://blogs.msdn.com/llobo/default.aspx

Blog de Beatriz CostaEn la misma línea que el ante-rior, pero mucho más especí-fico en cuanto a temática

(databinding dentro de WPF) y más elevado y exigente el conte-nido de los artículos. Nos recuerda estos sitios monotemáticos,al estilo de www.datagridviewgirl.com (de Marcie Robillard). Sinpaja. Solo buenos ejemplos y artículos. Muy recomendable(http://beacosta.com).

Nueva versión del ya popular XamlPadEditor

XamlPadX. Seencuentra paradescarga en elblog de Lester(http://blogs.msdn.com/llobo/archi-v e / 2 0 0 6 / 1 2 /30/xamlpadx-v2.aspx), querecomendamosantes, y es espe-

cialmente útil para probar código y snippets de XAML.Dispone de nuevas funcionalidades con respecto a laversión que viene con el SDK de Windows Vista,sobre todo la posibilidad de grabar y leer ficheros yun editor de comandos.

uti l idades del messitios recomendados