Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET nº5 junio 2004 • Precio: 6,00 € (España) SQL Server Reporting Services WebForm Templates • Distribuir aplicaciones con .Net Remoting • Cambios sufridos por Object Pascal en Delphi 8 .NET • Configuración de varios sitios Web en IIS 6.0 con una misma dirección IP • Particiones de Directorio de Aplicaciones Universidad Final de la Imagine Cup en España. Open Source lphant, primer peer to peer bajo .NET Comunidades La XI convocatoria del Master Eidos en Tecnologías Avanzadas para el Desarrollo de Software Un veterano a la última dnm.editorial Internet: medio y ámbito << Está bien, habrá que explicarlo... He recibido muchas opiniones que me han hecho pensar que la mayoría de los visitantes al sitio en Internet de esta revista piensan, equivocadamente, que dotnetmania.com es la misma cosa que dotNetManía. Cuando compramos, por ejemplo, un ejemplar de una revista impresa a través de Internet, lo pagamos con nuestra tarjeta de crédito, y más adelante llega el cartero a nuestra casa con el sobre correspondiente, habremos usado Internet como un medio más para hacer una transacción. En este proceso se han empleado materiales tangibles como el papel y el sello, y han intervenido personas como el cartero, o la persona que preparó y envió la revista que pedimos. Sin embargo, si entramos en Internet y compramos un ejemplar de una revista electrónica, lo pagamos con nuestra tarjeta de crédito y lo recibimos en nuestra cuenta de correo electrónico y lo leemos obteniendo permisos desde un servidor DRM, también en Internet, estoy usando a éste como un ámbito, donde todo empieza y termina, no he necesitado de materiales tangibles, ni medios convencionales en ningún momento; de hecho en todo el proceso no habrá intervenido posiblemente ningún ser humano de forma directa. Internet, puramente como ámbito nos trae grandes cosas, y es una gran revolución, no me cabe duda, pero también pone en peligro a las revistas impresas como ésta, y también a los libros tradicionales, e incluso al software, la música, el cine, etc. Pero no es éste el momento ni el lugar donde opinar sobre estos asuntos. Editor Paco Marín ([email protected]) Administración Pilar Pérez ([email protected]) Asesor Técnico/Coordinación Marino Posadas ([email protected]) A cambio, Internet como medio le ofrece a esta revista posibilidades que antes no tenían los medios tradicionales. Tenemos la posibilidad de publicar tanto material de apoyo a cada artículo como queramos, incluyendo bibliografía, el sonido original de una entrevista, vídeos, noticias, enlaces a otros artículos similares o páginas relacionadas y, por supuesto, el código de ejemplo, proyectos, utilidades, etc. Un complemento al papel impensable hasta la aparición de Internet. Incluso el CD que acompañaba a las revistas puede quedar en desuso, puesto que desde Internet puede bajar todo lo que un CD contiene pero con la increíble ventaja de interactuar con artículos de otros números, actualizarse con el tiempo y corregir y ampliar todo el material de apoyo tantas veces como se desee. Ésta y no otra es la misión principal del sitio en Internet de dotNetManía. Por supuesto, también sirve para mostrar cómo es la revista, y más teniendo en cuenta que no distribuimos en quioscos, recoger pedidos e informar de cómo son las personas que escriben aquí, etc. En breve, Internet ha de servir también para enviar avisos a los lectores y que también puedan opinar y dejar su opinión sobre los artículos e incluso para estar puntualmente informado, pues en las noticias el papel de una revista mensual tiene la clara desventaja del tiempo que transcurre entre que la noticia ocurre y cuando realmente llega al lector. En ningún caso dotnetmania.com es un portal o una comunidad virtual, porque dotNetManía es una revista impresa que usa Internet como medio para complementarse y difundirse. Francisco Charte, Fernando Guerrero, Fernando Nogueras, Guillermo ‘guille’ Som, Iván González, Jesús López, Jordi Rambla, Jorge Serrano, José Manuel Alarcón, José Miguel Torres, Juan Torres, Liborio López, Luis Miguel Blanco, Marino Posadas, Miguel Egea, Miguel Katrib, Pablo Abbate, Pedro Gómez, Pedro Pozo, Pepe Hevia, Salvador Ramos Publicidad Juan Manuel Urraca ([email protected]) Diseño y Maquetación Éride Diseño Gráfico Tel.: (34) 91 477 48 85 [email protected] • www.eride.net Redactores y Colaboradores Alejandro Mezcua, Angel Esteban, Antonio Quirós, Antonio Rojo, Daniel Mazzini, David Carmona, Eladio Rincón, Edita Netalia c/ Robledal, 135 28529 Rivas-Vaciamadrid (Madrid) Tf. (34) 91 6667477 Fax (34) 91 4991364 Imprime Gráficas Vallehermoso www.graficasvallehermoso.com Depósito Legal M-3.075-2004 Suscripciones [email protected] Redaccion [email protected] Nuevos colaboradores [email protected] <<dotNetManía << dnm.editorial 3 5 dnm.sumario Final de la Imagine Cup en España 8-12 El proyecto VAMOS, de la universidad politécnica de Valencia, ganador del campeonato universitario Imagine Cup España de Microsoft y por tanto, serán nuestros representantes en la final internacional de Brasil. WebForm Templates 13-15 Antes de que la Web llegara a nuestras vidas, nuestras aplicaciones tenían la apariencia de una o varias ventanas en Windows, o para nosotros los más viejos, una interfaz no gráfica. Sin embargo, era muy común ya desde esas épocas reutilizar la funcionalidad de presentación de la información. SQL Server Reporting Services 16-26 Al fin ante nosotros tenemos un servidor de informes totalmente desarrollado por Microsoft, el SQL Server Reporting Services. Se trata de un servidor de informes basado en Web Services y cuya característica más importante reside en su 'modularidad', que por un lado establece, asegura y actualiza el origen de datos al cual está conectado, y por otro suministra el informe en una fase paralela e independiente. Crear informes con SQL Server Reporting Services 27-33 dnm.sumario Los Reporting Services vienen a completar la amplia oferta relacionada con SQLServer, a completar al motor relacional, que tiene amplias funcionalidades como la replicación, servicios de alta disponibilidad, mecanismos de trasvase de registros, servicios de transformación de datos, tareas programables, un avanzado mecanismo de copias de seguridad. Distribuir aplicaciones con .Net Remoting 34-39 Existe en .Net cuatro maneras de distribuir aplicaciones, a saber: Los servicios web, .Net Remoting, Mensajería (MSMQ) y Componentes empresariales (COM+). Los tres primeros métodos de distribución son controlados por el la plataforma .Net, por lo que sólo explicarán estas tres primeras. Cambios sufridos por Object Pascal en Delphi 8 .NET 40-43 Con el objetivo de poder generar código ajustado a la especificación común de lenguaje (CLS) de la plataforma .NET, Borland ha tenido que introducir ciertos cambios en el compilador de Object Pascal que incorpora la versión 8 de Delphi. Configuración de varios sitios Web en IIS 6.0 con una misma dirección IP 44-45 En este artículo se va a comentar cómo configurar el servidor Web que nos ofrece Windows Server 2003 para disponer de múltiples sitios Web con una misma dirección IP. Esto nos va a suponer un ahorro considerable de direcciones IP. El mecanismo que nos va a permitir reutilizar de esta manera las direcciones IP se denomina encabezado de host, y es el concepto que explicamos en este artículo. Particiones de Directorio de Aplicaciones 46-48 Active Directory en Windows 2003 permite la creación y configuración de una nueva partición de directorio llamada Partición de Directorio de Aplicaciones. Esta partición se replica sólo en los controladores de dominio determinados y siempre que ejecuten Windows 2003. dnm.opensource.net 50 lphant, primer peer to peer bajo .NET dnm.comunidad.net 51-53 La XI convocatoria del Master Eidos en Tecnologías Avanzadas para el Desarrollo de Software. Un veterano a la última dnm.biblioteca.net 54 Moving to VB .NET: Strategies, Concepts, and Code Code: The Hidden Language of Computer Hardware and Software dnm.directo.entrevistas 55-56 Entrevista a Carlos Heras dnm.desvan 58 dnm.noticias 6 noticias.noticias.noticias.noticias.noticias.noticias <<dotNetManía << dnm.noticias Tech-Ed Europe 2004 en marcha El evento europeo definitivo de Microsoft sobre creación, implantación, protección y gestión de soluciones conectadas Ya está aquí la mayor conferencia del año para desarrolladores, arquitectos de software y sistemas y profesionales de las TI europeos. Será desde el 29 de junio al 2 de julio y vuelve a Ámsterdam, en Holanda, después de tres años de celebrarse en Barcelona. En este año habrá contenido adicional sobre movilidad ya que se aprovecha para celebrar conjuntamente la Conferencia Microsoft Mobile Devcon (MDC). Habrá seminarios pre-conferencia en los que te actualizarán rápidamente durante un día completo en las tecnologías más relevantes de desarrollo e infraestructura antes de las conferencias en sí; más de 400 sesiones técnicas que te podrás organizar en tu agenda para completar un ciclo formativo intenso de cuatro días; podrás profundizar en cada tema participando en las charlas presentadas por una lista de expertos de Microsoft y del sector y de los que el resto del año sólo oirás hablar. Algunos de los ponentes serán: Fernando Guerrero (único ponente español del que podéis leer un artículo sobre Yukon en el número 1 de dotNetManía), Don Box, David Chappell, John Craddock, Jim Gray, Rafal Lukawiecki, Steve Riley, Mark Russinovich, Clemens Vasters, etc. Marino Posadas, asesor técnico y coordinador de dotNetManía, estará allí y nos traerá jugosas entrevistas y un completo reportaje del evento. Dadas las fechas del evento, posiblemente retrasemos la salida del siguiente número para publicar un avance del evento. Espero que merezca la pena esperar al siguiente ejemplar unos días más. Si te interesa asistir puedes encontrar más información en microsoft.com/spanish/msdn/Spain/eventos/teched.asp y en microsoft.com/europe/teched/ Danysoft presenta el nuevo InstallShield X La solución le ofrece todo lo que necesita para crear instalaciones de Windows a Linux y de servidores a dispositivos móviles InstallShield X combina el poder y flexibilidad de InstallShield DevStudio con el soporte multiplataforma de InstallShield MultiPlatform, en una única solución para todas las plataformas, sistemas operativos y dispositivos. Sus características avanzadas le permitirán configurar servidores de bases de datos, instalar servicios web, y crear instalaciones para dispositivos móviles. InstallShield X está disponible en dos ediciones: Professional y Premier, para que adquiera únicamente las características que necesite, al precio más conveniente. InstallShield X le ofrece la flexibilidad y potencia para desarrollar todos los instaladores Windows (MSI), InstallScript™, de plataforma cruzada (por ejemplo Solaris, RedHat Linux, Mac OS X y OS/400), y para dispositivos móviles desde una misma herramienta. Sus herramientas automatizadas y asistentes facilitan la creación de todo tipo de instalaciones, por muy complejas que éstas sean. Además sus funciones de eliminación de conflictos aseguran que las instalaciones sean a prueba de fallos, para que usted ofrezca la mejor imagen a su cliente desde el primer momento. Permite suministrar actualizaciones de sus productos rápidamente notificando al usuario final la existencia de actualizaciones de producto. Esto permite reducir significativamente el tiempo, coste y soporte al mantener a sus clientes con las últimas versiones de su producto. En España puede obtener soporte técnico, servicios de formación y consultoría a través de los servicios profesionales Danysoft, empresa que lo representa en exclusiva. (Danysoft.com/installshield.htm) WinHec 2004 A principios del mes de mayo se celebró en Washington la versión Americana del Microsoft WinHEC 2004 (Windows Hardware Engineering Conference), donde cada año se explora el futuro para la plataforma Windows con la industria del PC. WinHEC es el evento donde ingenieros de hardware, desarrolladores de drivers, y fabricantes se dan cita para obtener la información técnica y estratégica para el desarrollo de sus productos y servicios alrededor de Windows. Esta edición se ha centrado en los avances de la tecnología para Windows XP, Windows 2003 Server y, cómo no, en el futuro de Longhorn a pesar de faltarle al menos dos años para su estreno. Microsoft distribuyó la primera versión alpha oficial de Longhorn, aunque en realidad ya hubo una “pre-alpha” para los asistentes al PDC del año pasado. No debemos esperar una versión beta hasta el año que viene. También se distribuyó entre los asistentes algunas nuevas herramientas de desarrollo para Windows como el Windows Longhorn Driver Kit, Windows Driver Foundation, y el Driver Install Frameworks. Más información en http://www.microsoft.com/whdc/winhec/default.mspx Canon v 1.0: Metodología convergente de desarrollo software Desde el segundo semestre de 2003 un Grupo de Metodologías, formado por diferentes profesionales del Área de Soluciones de Negocio y Desarrollo de Software han estado trabajando en el diseño una metodología propietaria para gestionar los proyectos de desarrollo de software que se llevan a cabo en Alhambra-Eidos. Producto del trabajo de dicho grupo es Canon en su versión 1.0. Canon es la metodología interna para desarrollo de software creada por Alhambra-Eidos con la finalidad de mejorar el nivel de madurez con el que se abordan sus distintos proyectos y, por tanto, asegurar la calidad en el resultado de los mismos. Borland y SOFTENG sellan su alianza como partners estratégicos para potenciar el uso de sus productos El acuerdo establece un marco de cooperación para incrementar la productividad de los proyectos en ambas compañías Borland y SOFTENG han anunciado su compromiso de trabajar de forma conjunta para potenciar el uso de sus productos, a través de la organización de eventos y seminarios de formación, realización de consultoría así como de la introducción de mejoras en las prestaciones de los proyectos que desarrolla Softeng. El “know how” en productos Borland, especialmente Delphi, ha llevado a SOFTENG a convertirse en una de las empresas más importantes dentro de su red de partners en España y el único en la actualidad que opera en el área de Cataluña. La mujer empresaria y el eLearning La plataforma de formación virtual Almagesto, escogida por la ASEM como medio formativo para sus afiliadas. Bill Gates en la Keynote Seamless Computing: Hardware Advances for a New Generation of Software en el WinHEC 2004 La Asociación Empresa Mujer -ASEM-, ha puesto en marcha una iniciativa de apoyo al empleo femenino de alto nivel, en colaboración con la Consejería de Trabajo del Principado de Asturias. Como parte de esta iniciativa se presentó el pasado febrero la Primera Feria Virtual ASEM con un doble objetivo, impulsar el área comercial, y brindar una oportunidad de formación múltidisciplinar a través de Internet. Para ello se ha contado con los servicios de Almagesto 4.0, la plataforma de eLearning eLMS de Alhambra-Eidos. CD Kit de recursos ASP.NET versión 2 En este número distribuimos conjuntamente con la revista el CD Kit de recursos ASP.NET versión 2. Este Kit incluye una amplia colección de documentación, ejemplos, guías de arquitectura y catálogos de libros de las editoriales MSPress, Anaya y A!Press. También incluye muchos artículos técnicos en español del sitio web MSDN Online así como un extenso archivo de referencias técnicas, videos y presentaciones narradas, descargas del .NET Framework y del Toolkit de Desarrollo Móvil y un listado de enlaces a sitios de internet relacionados con ASP.NET y el desarrollo en general. Además se han añadido la herramienta de desarrollo ASP.NET Web Matrix, y los ASP.NET Starter Kits, cinco sitios web preconstruidos y fácilmente modificables, que le permitirán comenzar a trabajar de inmediato con la tecnología ASP.NET. Como novedades en esta versión 2 se han incluido dentro del apartado "Descargas" una serie de controles gratuitos ofrecidos por terceras compañías líderes en el sector (como ComponentOne o Infragistics), así como versiones en español de los Starter Kits para Visual Studio .NET dentro de su apartado específico, y la nueva versión del Tour Guiado de WebMatrix. Esperamos que le sea útil. dnm.noticias empresas.empresas.empresas.empresas << dnm.noticias Final de la Imagine Cup en España El proyecto VAMOS, de la universidad politécnica de Valencia, ganador del campeonato universitario Imagine Cup España de Microsoft <<dotNetManía << Imagine Cupes la competición in- 8 formática para estudiantes universitarios que organiza Microsoft a nivel internacional, en la que deben presentarse proyectos en los que se utilicen dispositivos móviles, servicios web y componentes inteligentes que aprendan a lo largo del tiempo. La final a nivel mundial ya está en su segunda edición y consistirá en un evento de varios días de duración en la primera semana de julio, en Sao Paulo, Brasil. Todos los finalistas internaciones de cada país o región competirán por las tres primeras plazas. Los primeros premios son de 25.000, 15.000 y 10.000 dólares para el primero, segundo y tercero respectivamente. En total se repartirán más de 85.000 dólares en premios en metálico para los ganadores. Cinco han sido los proyectos seleccionados para la final de la primera edición en España de Imagine Cup. Para su selección se ha tenido en cuenta tanto su innovación y creatividad como su utilidad y posibilidades de implementación. Procedían de cinco universidades de distintas regiones de la geografía española: la Universidad Politécnica de Catalunya, la Universidad de Deusto del País Vasco, la Universidad Pontificia de Comillas de Madrid, la Universidad de Málaga y la Universidad Politécnica de Valencia. El ganador que nos representará el próximo mes de julio en Sao Paolo ha sido el proyecto VAMOS de la Universidad de Valencia. La propuesta ha sido seleccionada por su innovación, Occasional Sightseeing), un proyecto que nos acerca al museo del futuro, un espacio dinámico, interactivo y cercano al visitante. Un museo que, para los autores de VAMOS, deberá cumplir nuevas funciones como la conservación intelectual (entendida como el estudio, interpretación, cataEl equipo ganador recogiendo sus diplomas junto a Rosa García, logación y valoración de consejera delegada de Microsoft Ibérica; Beatriz Ordoñez, las obras de arte como responsable de Imagine Cup España y el Ilustrísimo Sr. D. Ángel Berna Quintana, director general de la Fundación Pablo VI – UPSA. objetos de carácter estético que constituyen las huellas culturales de la utilidad y originalidad, así como por Humanidad) y la dinamización cultural, las posibilidades de aplicación a la vida dejando atrás su silencioso aposento para real. dialogar con el arte y con la sociedad, interrogando constantemente, relacionándose y modificando el entorno. 1er Premio Una revolucionaria visión que tiene VAMOS: el museo del futuro un gran aliado en las nuevas tecnologías. Así, los autores de VAMOS señalan Museos interactivos, dinámicos, cercaque la arquitectura tecnológica adecuanos al visitante. Ese es el objetivo de da a este nuevo modelo de museo debe VAMOS, un proyecto que, gracias a la cumplir al menos con las siguientes tecnología de los Pocket PCs y las redes características: inalámbricas, nos acerca lo que serán los • Ser compatible con la riqueza sensomuseos del futuro. rial de las visitas físicas. • Enriquecer las visitas con información Acabar con la de carácter virtual para facilitar la noción de los museos comprensión de las obras de arte como meros “conteexpuestas. nedores visuales” de • No ser un mecanismo estático de proobras de arte es el ducción de información sino tener un punto de partida de carácter dinámico que permita variar VAMOS (Virtual los contenidos. Assistant for Museum << dnm.universidad Universidad: Facultad de Informática. Universidad Politécnica de Valencia. Autores: Vicente Bosch, Kristian Eide, José Miguel Esteve y José Antonio Mocholí. Tecnología: .Net FrameWork SQL Server Aplicación: Asistente móvil para la visita a museos, interactiva y personalizada. • Ofrecer bajo un único punto de entrada diferentes servicios. • Proveer información al visitante en cualquier momento durante la realización de una visita. • Personalizar los contenidos que se muestran al visitante en función de sus gustos, de forma transparente y automática. • Facilitar que los visitantes puedan disfrutar del mayor número posible de obras en caso de disponer de poco tiempo para realizar la visita. La respuesta a tan elevadas exigencias parece tener un nombre: VAMOS, un sistema que, basándose en una infraestructura de redes inalámbricas y dispositivos móviles, convierte el museo en un espacio interactivo y a la medida del visitante. Su “secreto”: la movilidad. VAMOS es un sistema completamente móvil, capaz de acompañar al visitante en todo momento durante su recorrido por el museo. Para buscar un ejemplo actual, podría asimilarse a las tradicionales audioguías que desde ya hace tiempo encontramos en cualquier instalación de estas características pero con una importante diferencia: el sistema VAMOS ofrecerá al visitante información multimedia, dinámica, conectividad a Internet y capacidad de navegación aumentando de esta forma la interactividad entre usuario y museo. Comienza la visita Por fin nos hallamos en el interior del museo y, lamentablemente, con menos tiempo del que nos gustaría y sería necesario para poder visitarlo de forma provechosa. Sin embargo, contamos con VAMOS, el sistema que, tras alquilar un dispositivo de mano en el propio museo, nos guiará en todo momento en nuestra visita. Tras indicar al sistema el tiempo del que disponemos, así como nuestras preferencias, éste nos ofrece la ruta perfecta a nuestros requerimientos. En tan sólo un par de clicks nos encontramos visitando las salas y exposiciones que más nos interesaban y además, con toda la información que necesitamos para disfrutar de las obras de arte que en nuestro recorrido vamos encontrando. De repente, nos sorprende una de esas obras. Nos detenemos frente a ella para examinarla más pausadamente. En nuestro Pocket PC, VAMOS nos ofrece todos los datos sobre la misma: su autor, trabajos previos, inspiración, estilo, etc. Nuestro alto en el camino ha merecido la pena pero, claro, también ha retrasado el plan de visita. No hay problema: sin que nos percatemos siquiera, VAMOS ha rehecho nuestra visita al museo, adecuándola ahora al tiempo que nos queda. 2º Premio Never2Late. Despertar siempre a tiempo Despertarse a tiempo siempre, sin miedo a posibles atascos, accidentes o lluvias torrenciales. No hablamos de una película de ciencia-ficción sino de una realidad posible gracias al sistema Never2 Late, el despertador inteligente. Ni un imprevisto más Despertarse con tiempo suficiente pero además teniendo en cuenta aspectos tan decisivos como el estado del tráfico esa mañana, y a esa hora en concreto, y la situación meteorológica. El objetivo: no llegar tarde nunca más. Los beneficios: Hacer más fácil la vida del usuario, aprovechando su tiempo al máximo, ya sea en el trabajo, en su domicilio o el camino entre ambos. Todo ello, de forma rápida y sencilla, tomando como punto de partida la propia experiencia del usuario, sus horarios y tareas habituales, itinerarios, etc. El funcionamiento de Never2Late es sencillo: el primer paso para disfrutar de sus ventajas será el registro gratuito por parte del usuario en la web de la aplicación. Una vez registrado, deberá introducir en el sistema la información de los pasos o tareas que debe realizar en cada ocasión para llegar a su destino, incluidos los posibles caminos que puede utilizar para llegar a éste. Una secuencia más o menos lógica de lo que el usuario hace cada mañana y que el sistema debe conocer, podría ser: 1. Despertar y ducha 2. Desayuno 3. Entrada en el coche 4. Camino A 5. Camino B 6. Llegada a destino/trabajo <<dotNetManía Proyecto: VAMOS (Virtual Assistant for Museum Occasional Sightseeing). Llegar a tiempo. La difícil y estresante tarea a la que solemos enfrentarnos todos cada mañana. El despertador que no suena, la ducha que esa mañana no quiere darnos agua caliente y para colmo, cuando por fin conseguimos salir de casa, un accidente y su consiguiente retención en la carretera. Hagamos lo que hagamos, de nuevo, llegaremos tarde. Pues bien, esta habitual y cotidiana situación tiene los días contados gracias a Never2Late, un sistema móvil que a modo de despertador le permitirá rentabilizar al máximo su tiempo. 9 << dnm.universidad para lograr su propósito, la experiencia del usuario en su utilización es de lo más sencilla y sólo necesita de un dispositivo móvil para disfrutar de ella. 3º Premio Picassoft. El turista inteligente Proyecto: Never2Late. <<dotNetManía Universidad: Escuela Técnica Superior de Ingeniería Universidad Pontificia de Comillas. Autores: Mauricio Asuar García y Alejandro Hernández de Madrid Díaz. Tecnología: .Net FrameWork Web Services Redes Neuronales SQL Server 2000 Programación en C+,ASP.Net Aplicación: Despertador inteligente. 10 Una vez introducida esta información, el sistema Never2Late se sincroniza con el dispositivo móvil del usuario y pronostica, a partir de su propia experiencia, el tiempo necesario para que, al día siguiente, éste se despierte y realice todas sus tareas habituales, llegando a tiempo a su destino. Pronosticar de forma inteligente la hora de despertar al usuario implica valorar, además de la experiencia del usuario, otros factores decisivos como pueden ser la información del tráfico, datos meteorológicos e incluso información del calendario (vacaciones, puentes, días festivos, etc). Con toda esta valiosa información, el sistema Never2Late despertará al usuario a la hora exacta y necesaria para que llegue a su lugar de trabajo justo a tiempo. Es decir, si por ejemplo, Never2Late ve que existe un embotellamiento de tráfico esa mañana en el camino que el usuario tiene que tomar para llegar a su destino, hará que el despertador suene antes para evitar que el usuario se retrase por ese motivo. Pese a que Never2Late utiliza un complejo entramado de redes neuronales, servicios web y técnicas heurísticas Enormes mapas que no consigue nunca doblar adecuadamente; catedrales a las que llega justo cuando están cerradas al público; monumentos que nunca localiza; poco tiempo y demasiadas cosas que ver. Esta escena tan habitual para el turista podrá no repetirse más gracias a Picassoft, un sistema que hace posible un “turismo inteligente”. Un simple Pocket PC será a partir de ahora su mejor guía turístico. Gracias a Picassoft, un programa diseñado por cuatro estudiantes de la Universidad de Málaga, el turista podrá con su dispositivo móvil conocer en todo momento la mejor ruta para visitar los rincones de una ciudad, siempre adecuándose además a sus gustos, tiempo disponible o preferencias. Aprovechar el tiempo El objetivo de Picassoft es claro: permitir que cada turista saque el máximo provecho al tiempo del que disponga para visitar una ciudad y que, a la vez, su experiencia sea lo más rica posible. Para ello, Picassoft ofrece al usuario, mediante un Pocket PC, un recorrido inteligente por la ciudad y lo más importante, totalmente personalizado. Tras ejecutar Picassoft en su dispositivo móvil y elegir el idioma que prefiera, el usuario podrá conocer de forma rápida y sencilla su “perfecto” itinerario. Sus gustos, preferencias, tiempo del que dispone y momento en el que desea realizar la visita son combinados por el sistema con la valoración que otros turistas han otorgado anteriormente a monumentos y puntos de interés para así obtener el recorrido más satisfactorio. Una visita sin duda para recordar siempre. Pero además de ofrecer el mejor recorrido por la ciudad, Picassoft hará que el usuario disponga en la pantalla de su Pocket PC de un mapa que en todo momento le indique su situación actual dentro de la ciudad y de la ruta elegida, así como la ubicación de la próxima parada en la misma. Sencillo, actualizado y personalizado, Picassoft permite además que el usuario edite la ruta en cualquier momento, eliminando y añadiendo lugares de forma manual. La más completa información La ruta perfecta y a medida pero además con toda la información necesaria para que disfrutar de ella al máximo sea una realidad. El sistema Picassoft le acompaña en todo el recorrido ofreciéndole la información más completa de cada uno de los lugares que visita. Así, de forma automática y cada vez que el usuario alcanza uno de sus destinos, el sistema le ofrece en pantalla detallada información audiovisual de carácter turístico sobre el lugar dónde se encuentra: año de construcción, estilos, historia, aspectos más destacados, etc. Todo ello junto a datos de gran utilidad como horarios y días de visita, precios de entradas y ofertas especiales para grupos, así como teléfonos de información. Su opinión es importante La absoluta actualización del sistema y, sobre todo, su permanente ampliación, hacen de Picassoft una importante herramienta no sólo para el turista sino también para los responsables turísticos de cada una de esas ciudades. Así, la aplicación establece que cuando el usuario ha visitado un lugar de la ruta elegida, pueda emitir su valoración sobre el mismo. Esta información pasa a formar parte del sistema, que genera así listas con los lugares mejor valorados por los usuarios y, de igual modo, ofrece cada vez rutas más acordes a estas valoraciones, priorizando los lugares, rincones o monumentos de esa ciudad que más votos positivos han conseguido por parte de las personas que las han visitado. Una valiosa información que no sólo hará mucho más gratificante las próximas visitas de otros turistas, sino que << dnm.universidad Universidad: ETSI Informática. Universidad de Málaga. Autores: Curro Basagoiti, Iñaki Esteve,Antonio Molina y Ana Reyna. Tecnología: Windows XP Professional, Office XP Professional, SQL Server 2000, .Net FrameWork SDK 1.1,Web Matrix, GPS .Net... Aplicación: Servicio de rutas y recorridos turísticos en Pocket PC. permitirá además a las autoridades responsables detectar posibles carencias en las instalaciones o monumentos de su ciudad y mejorar así la calidad de éstos. Una aplicación de futuro que transformará el turismo actual, convirtiéndolo en una actividad enriquecedora, mucho más gratificante, personalizada y, sobre todo, inteligente. Finalista My Street Finder. Un mapa en el bolsillo Obtener un mapa de la ciudad, localizar puntos de interés e incluso saber hacia dónde dirigir nuestros pasos para llegar a ellos. Estos son sólo algunos ejemplos de las numerosas aplicaciones que tiene My Street Finder. Transeúntes, turistas e incluso trabajadores en busca de la ruta más corta hacia su destino pueden, con My Street Finder, obtener en cualquier momento y lugar un mapa de la ciudad en la que se encuentran, al alcance de su mano. Un mapa en el que localizar calles o puntos de interés y, lo más importante, conocer de forma sencilla y rápida el camino para llegar a ellos. Información a medida Basado en una arquitectura clienteservidor, este proyecto permite al usua- rio obtener en su Pocket PC mapas de una ciudad o zona, completamente actualizados. Esto se consigue gracias a la tecnología utilizada por el autor y que consiste en que los mapas generados no se almacenen en el servidor en formato fotografía sino que son datos en tablas que, desde una base de datos, se convierten en imágenes al ser enviados al usuario. Esta característica permite que cada usuario decida qué información del mapa desea recibir: datos de edificios, calles, carreteras, instalaciones eléctricas... el usuario decide el mapa que quiere recibir en su Pocket PC, a la medida de sus necesidades. Además, es necesario destacar la facilidad que ofrece este sistema a la hora de actualizar la información de los mapas ofrecidos. A diferencia de otros sistemas, cuya información está almacenada de forma estática -por ejemplo en imágenes- que no permiten una actualización rápida de las mismas y en pocos años acaban resultando obsoletas, My Street Finder permite hacer cambios continuos en la información sin que ello afecte a la aplicación. La ciudad en movimiento Saber dónde está la calle Leganitos o, incluso, conocer dónde se encuentra la estación de tren más cercana. El usuario puede conectarse al servidor y en unos minutos recibir en su Pocket PC el mapa de la zona de la ciudad en la que se encuentra, aumentar o reducir el tamaño del mismo y, de gran utilidad, “navegar” por la ciudad en su dispositivo. Proyecto: My Street Finder. Universidad: Facultad de Ingeniería-ESIDE Universidad de Deusto. Autor: David Sainz González. Tecnología: Plataforma .Net Global Positioning System Protocolo Estándar de los GPS (NMEA 0183). Cartografía y sistema de coordenadas UMT. Aplicación: Servicio de Mapas <<dotNetManía Proyecto: Picassoft Una ventaja que My Street Finder proporciona permitiendo que el usuario reciba mapas de posiciones adyacentes a la que se encuentra en esos momentos y, de esta forma, obtenga la visión más completa de la zona. Visitar la ciudad al completo pero además, con un “guía” que le acompañe es otra de las posibilidades que el usuario tiene gracias a My Street Finder. Así, esta aplicación hace posible que el usuario active la función guía en su Pocket PC para, además de recibir el mapa que precisa, un símbolo en la pantalla le indique la posición exacta de la calle o punto de interés que busca y además, la dirección que deberá seguir para encontrarlos. Aunque a primera vista, My Street Finder pueda parecer una aplicación destinada a turistas o simplemente transeúntes, el entorno laboral y su mejor productividad es otro de los escenarios donde My Street Finder resulta especialmente útil. Así por ejemplo, este sistema puede facilitar a repartidores, comerciales, instaladores, etc., localizar el punto al que se dirigen de forma más rápida, optimizando de este modo su tiempo de trabajo. Pero además, My Street Finder permite que un usuario conozca en el mapa que recibe la posición exacta en la que se encuentra otro usuario del sistema. A través del mismo protocolo, el usuario puede recibir información sobre otros usuarios como es el nombre y la posición donde se encuentra en esos momentos. 11 << dnm.universidad Esta funcionalidad hace de My Street Finder una herramienta muy útil para los servicios de seguimientos de flotas. De forma sencilla y en tiempo real, camioneros, repartidores o taxistas pueden conocer el punto exacto donde se encuentra cada uno de sus compañeros de trabajo. Calles, puntos turísticos, monumentos, estaciones de tren, My Street Finder ofrece el mapa “a la carta” que necesita. Finalista. RAMPA. El fin de las barreras arquitectónicas Rampas, escaleras, bordillos, obras. Cada día, las personas con alguna deficiencia física o psíquica se encuentran con múltiples barreras arquitectónicas que pueden convertir un simple paseo en una carrera de obstáculos. El proyecto RAMPA busca ayudarles a superar estas dificultades. El cualquier momento y desde cualquier lugar, el usuario de RAMPA podrá, a través de un dispositivo Pocket PC, conocer el trayecto más adecuado a sus deficiencias físicas o psíquicas. Tras conocer las características específicas de movilidad del usuario, RAMPA evalúa las peculiaridades del entorno y así, ofrece un trayecto por el mismo adaptado al usuario. Esta adecuación del recorrido a las características del usuario (y no al contrario como suele ser habitual) mejora enormemente la calidad de vida del mismo. ese camino, inclemencias meteorológicas que pudieran afectar al usuario en su recorrido, eventos especiales que tengan lugar en el mismo, etc. Del edificio a la ciudad La propia definición y diseño del programa RAMPA incluye desde su origen la absoluta escalabilidad del sistema. Así, RAMPA es capaz de ofrecer información relativa tanto al entorno físico de un edificio determinado como de una ciudad o región. Escalable por tanto y completamente personalizable, el proyecto RAMPA permite múltiples opciones de uso. Así, por ejemplo, el sistema ofrece su información de dos modos: de forma pasiva para el usuario: el usuario recibe información sin tener que solicitarla. Para ello, es necesaria una definición previa de la información que le resulta interesante y un registro previo del usuario en el sistema. de forma activa: el sistema recibe una petición del usuario sobre una información concreta. Tanto en un caso como en el otro, RAMPA evalúa las características particulares del usuario para así ofrecerle la información más adecuada a las mismas, de forma sencilla, amigable y actualizada en todo momento. Todas las posibilidades RAMPA ofrece al usuario el mejor recorrido entre dos puntos. Para ello, muchos son los factores que tiene en cuenta. Por un lado, las propias carac- terísticas físicas del usuario. El sistema tiene en cuenta si el usuario va en silla de ruedas, es invidente, etc. Y así elige el recorrido más adecuado según estos rasgos (para una persona que se mueve con muletas por ejemplo, será mejor un camino corto aunque en él haya una escalera ya que se cansa mucho. Sin embargo, ese camino nunca sería el indicado para alguien que se desplaza con una silla de ruedas). En segundo lugar, RAMPA evalúa las características físicas del propio entorno a la hora de elaborar el recorrido adecuado. Así, tiene en cuenta factores como dónde se encuentran rampas, aceras o escaleras, si existe algún tramo en obras, las direcciones de las calles, si hay posibilidad de transporte público, etc. Y por último, el sistema tendrá en cuenta también condiciones como la celebración de eventos especiales o incluso, el clima para si, por ejemplo, está lloviendo, elegir un recorrido que pase mayoritariamente por lugares cubiertos. Por otro lado, y en el caso de que el usuario lo que solicite sea una ruta determinada para llegar a un punto de interés, RAMPA le ofrecerá, junto a la misma, información sobre acontecimientos y/o las instalaciones principales que el usuario va a encontrarse por el camino y que pueden resultar de su interés. Además, el diseño de RAMPA tiene en cuenta que la información debe ser ofrecida de la forma más sencilla en cada caso; así, por ejemplo, si el usuario es invidente, el sistema deberá presentarle una interfaz completamente hablada. <<dotNetManía Encontrar un lugar 12 Además de facilitar el recorrido o ruta más adecuada a las deficiencias físicas o psíquicas del usuario, RAMPA puede también ayudarle localizando el punto de interés o servicio que necesita. Una vez localizado, el sistema mostrará además el recorrido más adecuado para llegar al mismo. La utilidad de esta herramienta se completa aún más con la completa actualización de la información que RAMPA ofrece y que permitirá conocer en todo momento posibles obras en Proyecto: RAMPA Universidad: Facultad de Informática de Barcelona. Universidad Politécnica de Catalunya. Autores: Sergio Edo, Oriol Mercadé y Vanesa Jiménez. Tecnología: Plataforma .Net Servidor CVS de compartición de código fuente frente a Visual SourceSafe. GPS Navigator Tom Tom. Aplicación: Servicio de información sobre trayectos adaptados a personas con deficiencias físicas o psíquicas. Pablo Abbate MCDBA/MCAD/MCSD/MCT Consultor independiente WebForm Templates Antes de que la Web llegara a nuestras vidas, nuestras aplicaciones tenían la apariencia de una o varias ventanas en Windows, o para nosotros los más viejos, una interfaz no gráfica. Sin embargo, era muy común ya desde esas épocas reutilizar la funcionalidad de presentación de la información. sencillo reutilizar funcionalidades incorporadas dentro de los formularios, sólo es cuestión de modificar la apariencia en una clase base y todos los formularios, que de esta clase desciendan, tendrán la misma apariencia por defecto. Al enfocarnos en las aplicaciones Web en ASP.NET descubrimos que el comportamiento de la herencia no es exactamente el mismo que en su par, el formulario Windows. Esto se debe a que en ASP.NET tenemos dos elementos bien diferenciables: el formulario ASCX, cuyo contenido describe los controles que conformarán la apariencia de la página web y, por otro lado, el archivo que contiene las instrucciones en .NET que conforman la lógica que regula el comportamiento del mismo formulario. Esta característica permite distinguir el componente visual de la lógica dentro de la aplicación. Pero, qué pasa si deseamos que la apariencia de un formulario web modelo sea compartida por todos los formularios que sean creados a partir de ese modelo. ¿Podríamos reutilizar la barra de navegación de nuestro sitio en todas sus páginas? ¿Existe la posibilidad de reorganizar la distribución de una página modelo y que los cambios realizados se reflejen en todas las páginas que fueron creadas a partir de ese modelo? ¿Es posible configurar, por medio de propiedades, los frames que deseamos mostrar dentro de una página? La respuesta, en todos los casos, es sí. Funcionamiento de un formulario Web Antes de empezar a trabajar, necesitamos conocer el funcionamiento de una página web: En ASP.NET tenemos dos elementos bien diferenciables: el formulario ASCX, cuyo contenido describe los controles que conformarán la apariencia de la página web y el archivo que contiene las instrucciones en .NET que conforman la lógica que regula el comportamiento del formulario • Una página web desciende de la clase Page del namespace System.Web.UI. • El contenido del archivo .ASCX asociado con el archivo de lógica determinan el comportamiento del formulario web. • No es posible heredar los elementos descriptos en un archivo ASCX. La herencia solo funciona a nivel de código .NET, por lo tanto, si deseamos que una clase herede los controles descriptos en su padre deberemos escribirlos dentro del código. • Si, utilizando el diseñador de formularios, pegamos un control en un Web Form padre, éste no <<dotNetManía << Con .NET, en las aplicaciones Windows, resulta muy 13 << dnm.asp.net Pasos aparecerá en un Web Form hijo. Este comportamiento difiere del formulario de Windows. El proyecto La idea es desarrollar una página modelo que nos permita reutilizar aquellos componentes comunes a todas las páginas sin tener que insertarlos cada vez que creamos un nuevo Web Form. En este caso, haremos un diseño de acuerdo al esquema de la figura 1. Figura 3 Originalmente, nuestro formulario web, responde a la jerarquía de clases que vemos en la figura 2. Después de realizar nuestros cambios, tendrá la siguiente la apariencia de la figura 3. Para los frames que rodean al área de trabajo, utilizaremos user controls que nos permitirán diseñar gráficamente el contenido de estos frames. Veamos como empezar… En un proyecto de Visual Studio 2003 seleccionamos ASP.NET Web Application y lo denominamos WebFormTemplate. Siguiendo con nuestro diseño, necesitaremos cuatro controles de usuario que servirán de frames para cada extremo del área de trabajo. Agregamos, al proyecto, estos cuatro controles con los siguientes nombres: frmEncabezado, frmPie, frmIzquierdo, frmDerecho. En cada user control agregaremos todos los webform controls necesarios para dar el aspecto que queremos a cada frame. Por ejemplo, nuestro frmencabezado podría tener un aspecto similar al de la figura 4. Ahora, agregamos un nuevo Web Form denominado modelform. De este formulario heredarán todos los otros Web Forms de nuestra aplicación. En la sección de code-behind deberemos modificar el comportamiento de dos métodos: Figura1 <<dotNetManía El objetivo es que sólo se deba modificar el contenido del área de trabajo de cada página, y el resto de los componentes sean heredados del modelo. Para personalizar el comportamiento de todos los formularios web crearemos una clase modelo que derive de la clase Page. Llamaremos a esta nueva clase: modelform Todos los formularios de la aplicación deberán descender de modelform para que posean su misma lógica. 14 Figura 2 Figura 4 Figura 5 << dnm.asp.net // Creamos una tabla para distribuir los frames Table TablaPagina = new Table(); TableRow RowContenido = new TableRow(); TableCell CellFrmIzquierdo = new TableCell(); TableCell CellFrmContenido = new TableCell(); TableCell CellFrmDerecho = new TableCell(); // Creamos el Encabezado Form.Controls.Add(LoadControl(“frmEncabezado.ascx”)); // Agregamos el contendio del frame Izquierdo CellFrmIzquierdo.Controls.Add(LoadControl(“frmIzquierdo.ascx”)); // Agregamos el contenido de la página actual Control Area = this.FindControl(“AreaTrabajo”); if (Area != null) CellFrmContenido.Controls.Add(Area); // Agregamos el contenido del frame Derecho CellFrmDerecho.Controls.Add(LoadControl(“frmDerecho.ascx”)); RowContenido.Cells.Add(CellFrmIzquierdo); RowContenido.Cells.Add(CellFrmContenido); RowContenido.Cells.Add(CellFrmDerecho); TablaPagina.Controls.Add(RowContenido); // Agregamos la tabla de contenido a la página Form.Controls.Add( TablaPagina ); // Creamos el Pie Form.Controls.Add(LoadControl(“frmPie.ascx”)); // Agregamos el Form this.Controls.Add(Form); base.CreateChildControls(); } Fuente 1 protected override void Render(HtmlTextWriter writer) { // Rellenamos el inicio del código HTML writer.Write(“<html><head><title>WebForm Template</title><head><body>”); // Rellenamos el contenido de la página. base.Render(writer); // Rellenamos el fin del documento HTML writer.Write(“</body> </html>”) ; Fuente 2 CreateChildControls(): Es implementado por la clase System.Web.UI.Control. Este método es el responsable de la creación de todos los controles hijos en un control contenedor tal como un Page. Lo modificaremos para que agregue nuestros frames a la página actual. Para ello debemos agregar el código fuente 1 al code-behind de nuestro Web Form. Otro método que debe ser sobreescrito es Render, también de la clase System.Web.UI.Control. La tarea que lleva a cabo este método es la de enviar el contenido de un control de servidor a un objeto HTMLTextWriter, el cual escribe el contenido HTML en el cliente. Después de nuestra modificación, el método definitivo tiene el aspecto del fuente 2. Agregamos un nuevo Web Form con el nombre Main.aspx y lo colocamos como formulario de inicio desde el menú de Proyecto. Posteriormente accedemos al código HTML del formulario eliminando todo su contenido. Sólo debe quedar la directiva <@Page …> A continuación, regresando a la ventana de diseño, arrastramos un webform control de tipo Panel sobre el Web Form. Es importante, recordar que el nombre del control agregado debe ser AreaTrabajo. Modificamos las propiedades de tamaño para que abarque el 100% del alto y ancho de la página. Por último, en el código .NET debemos especificar que nuestra página (Main) no desciende directamente de Page, sino que hereda de modelform (nuestro formulario modelo). Para ello deberemos modificar la definición de la clase con el siguiente fragmento de código: public class Main : WebFormTemplate.modelform Bueno, ha llegado el momento de ver cómo ha quedado nuestra primera página terminada. Vea la figura 5. Cada vez que agreguemos una nueva página, deberemos repetir los pasos hechos con Main.ascx y así reutilizaremos todos los controles de usuario. <<dotNetManía protected override void CreateChildControls() { // Reemplazamos el formulario del archivo ascx por // un formulario creado desde el código HtmlForm Form = new HtmlForm(); 15 Por José Miguel Torres Técnico Superior en Desarrollo de Aplicaciones Informáticas MRW SQL Server Reporting Services << SQL ServerReporting Services no es un Add-In para Visual Studio ni ninguna capa basada en .NET para otros servidores de informes de terceros fabricantes. SQL Server Reporting Services está totalmente desarrollado bajo código administrado, en C# y comporta una serie de herramientas <<dotNetManía Al fin ante nosotros tenemos un servidor de informes totalmente desarrollado por Microsoft, el SQL Server Reporting Services. Se trata de un servidor de informes basado en Web Services y cuya característica más importante reside en su ‘modularidad’, que por un lado establece, asegura y actualiza el origen de datos al cual está conectado, y por otro suministra el informe en una fase paralela e independiente. 16 para la administración, creación, implantación, publicación y desarrollo de informes no sólo para orígenes de datos específicos de SQL Server y Oracle, sino también genéricos, pudiendo utilizarse sin ningún problema OLE DB y ODBC. La plataforma SQL Server Reporting Services está formado por tres componentes básicos: • Report Server • Report Designer • Report Server Data Base Report Server es un servicio Web que se hospeda en IIS y ASP .NET y que atiende las peticiones a informes. La razón de que Report Server sea un Web Service stateless, sin estado, hace aumentar su escalabilidad teniendo la capacidad de servicio de unos 10 a 20 informes por procesador, aproximadamente. Actualmente el modelo de progra- mación stateless es el que se viene utilizando en el desarrollo de arquitecturas .NET con Enterprise Services, que empezó ya con MTS, y que han demostrado su ventaja frente a aplicaciones stateful (con estado) como son las aplicaciones cliente/servidor. La ‘modularidad’ que ofrece la arquitectura de Reporting Services hace que, por una parte el administrador disponga de unas herramientas específicas para el mantenimiento de informes y a su vez integradas en tareas de administración como puede ser de sistema o de base de datos, y por otro lado, el desarrollador tiene a su disposición una completa API y servicios, integrados todos en Visual Studio .NET, que le permite desarrollar funciones específicas para los informes, independientemente de que el destino del informe sea Web o Windows Form u otro contexto, por ejemplo móvil. De esta forma cualquier usuario autentificado puede ejecutar o ‘consumir’ informes desde Internet Explorer, o bien desde una herramienta cliente que consuma el informe a través de un servicio Web. La diferencia fundamental con otros diseñadores de informes es que, por Fernando Bocigas, Product ejemplo, Crystal Reports es una herraManager de SQL Server y SQL mienta orientada al diseño de informes Reporting Services de Microsoft Ibérica y, si bien es cierto que puede publicar informes como Servicios Web e incluso posee dos interfaces estandarizadas como mercado. Diseño de informes tabulares, matriciales, son SOAP y COM, dista de la idea de servidor de ofrece SQL Server Reporting con gráficos, con objetos OLE, etcétera, además introServices, con herramientas de duce un concepto llamado ‘snaking columns’ que son administración propias, polílas utilizadas en los periódicos. Permite la interacción ticas de seguridad y más difey navegación por parte del usuario y los formatos de rencias que iremos viendo presentaciones más comunes (pdf, html, xls, csv,...), además adelante, un servidor de más de agregaciones de datos, etcétera. informes en toda regla. El diseñador de informes está integrado con Visual Studio .NET. El motor de diseño posibilita un asistente para la creación de informes y permite la importación desde informes Access, no habiendo posibilidad, de momento, de importación desde Crystal Reports ni de cualquier otro fabricante. Asimismo posee un generador de consultas SQL y posibilidad de vista previa, entre otras características. Desde el punto de vista de la administración de informes, SQL Server Reporting Services nos ofrece una herramienta basada en Web para tal fin. También tenemos la posibilidad de utilizar el intérprete de comandos para ejecutar utilidades e incluso herramientas de programación de secuencias de comandos. La seguridad está basada en funciones, con lo cual podremos controlar el acceso a carpetas, archivos, Fig 1. Diagrama de la arquitectura recursos en general. Dicha seguridad está basada en la autenticación de Windows y/o SQL Server. Otra característica a indicar es el historial de inforCaracterísticas mes, el cual representa en forma estadística cual ha sido la actividad de cada informe, lo que puede ayuA nivel de diseño de informes, con SQL Server dar al administrador y/o arquitecto de un sistema para Rerporting Services, podemos realizar todas las operaperfilar la escalabilidad de la arquitectura. ciones que permiten actualmente los diseñadores del <<dotNetManía << “El potente entorno de desarrollo que pone a su disposición Visual Studio .NET 2003 facilita la creación e implantación de soluciones de creación de informes con la mayor capacidad de ampliación de cara al crecimiento futuro. Microsoft SQL Server Reporting Services también proporciona la flexibilidad añadida de la creación de informes junto a una amplia variedad de fuentes de información, entre las que se incluye SQL Server, OLE DB, ODBC, Oracle y otros proveedores de datos de la plataforma .NET. Entre los formatos de informe se incluyen: formatos Web (HTML), de impresión (PDF,TIFF) y de datos (Excel, XML, CSV)” 17 << dnm.servidores.sql <<dotNetManía Los informes en SQL Server Reporting Server se definen mediante una sintaxis propia llamada (RDL) Reporting Definition Language que permite, basándose en XML, definir un informe con un schema publicado 18 Cada usuario (cliente) de una red corporativa con cuenta autenticada de Windows, por ejemplo, con acceso a SQL Server Reporting Services, dispone de un espacio Mis Informes en los que tiene un espacio para administrar y almacenar sus propios informes; asimismo también se pueden obtener suscripciones propias en un espacio similar llamado Mis Suscripciones. Dichas suscripciones se entienden como distribuidores de informes automáticos a cliente y que pueden ser estándares o controladas por datos, en la que se sirven según una consulta, por ejemplo. La entrega puede ser mediante correo electrónico y/o mediante Web Services o servicios Windows, gracias a la arquitectura modular que están desarrollados los Reporting Services. Los informes se procesan en grupos de dos fases que separan el procesamiento de datos de la representación final. Esto permite representaciones de tipo de formato distintos, una mayor escalabilidad y la posibilidad de programar algunos componente mediante Visual Studio .NET. Esta característica diferencia claramente, la representación de informes de SQL Server Reporting Services con Crystal Reports. Éste último procesa cada informe desde la petición, pasando por la captación de datos y publicación en el visor, en una misma fase, con lo que varias peticiones a un mismo informe implicará una mala administración de recursos ya que hará tantos accesos al origen de datos como peticiones, contrariamente que SQL Server Reporting Services. Los informes en SQL Server Reporting Server se definen mediante una sintaxis propia llamada (RDL) Reporting Definition Language que permite, basándose en XML, definir un informe con un schema publicado. Así que podemos utilizar SOAP para publicar informes desde una aplicación externa, ya sea en Windows o desarrollando controles web forms para renderizar informes publicados de manera transparente para un usuario. SQL Server Reporting Services tiene compatibilidad con herramientas existentes de servicios de análisis pero no será hasta la llegada de Yukon, dónde se fusionarán y aumentará la potencia entre ambos. Requisitos Existen varias versiones de SQL Server Reporting Services: • Standard Edition • Enterprise Edition • Developer Edition • Evaluation Edition Los requisitos de hardware no distan mucho de las necesidades de cualquier software de administración o desarrollo, lógicamente, dependiendo del entorno de desarrollo o de producción en el que se utilice, el hardware tendrá una importancia relevante en la escalabilidad vertical. En cuanto a requerimientos de Software, SQL Server Reporting Services, depende totalmente de un Sistema Operativo servidor; en la tabla 1 podemos observar una relación de requisitos por componentes. Componente Requisitos previos Servidor de informes • Servidor Web con ASP.NET y Servicios de Internet Information Server (IIS) 5.0 o posterior. • MDAC 2.6 o posterior. • Conexión con una instancia de SQL Server 2000 SP3a. • Sitio Web predeterminado accesible a través de http://<nombreDeServidor>. • Para Windows 2003, el equipo debe estar configurado como servidor de aplicaciones. • Para que Windows 2003 utilice la cuenta del servicio de red para ejecutar el servicio Servidor de informes, necesita SQL Server QFE 859. Para descargarlo, visite Soporte técnico de Microsoft. Administrador de informes • Servidor Web con ASP.NET. • IIS 5.0 o posterior instalado y configurado. • Sitio Web predeterminado accesible a través de http://<nombreDeServidor>. Base de datos del servidor de informes Servidor con SQL Server 2000 SP3a. Diseñador de informes Estación de trabajo cliente con Microsoft Visual Studio® .NET 2003 y MDAC 2.6 o posterior. Herramientas administrativas y utilidades Estación de trabajo cliente con acceso a un servidor de informes. Libros en pantalla de Reporting Services Estación de trabajo cliente, sin requisitos previos. Informes y aplicaciones de ejemplo, y base de datos de ejemplo Estación de trabajo cliente, sin requisitos previos. Tabla1. Relación de requisitos previos por componentes a nivel de software. << dnm.servidores.sql Diseñar El diseñador de informes forma parte de Visual Studio y la creación de un informe implicará la creación de un proyecto en el mismo de tipo Business Intelligence, mediante un asistente o simplemente un informe vacío (fig. 2). Figura 3. Esqueleto de un proyecto Business Intelligence. Figura 2. Dos plantillas disponibles para la creación de informes desde Visual Studio .NET 2003 me a nuestra solución como un proyecto más, en definitiva, la utilización de SQL Server Reporting Services y Visual Studio .NET es muy provechosa. También desde Visual Studio .NET, tenemos la posibilidad de implementar y publicar el informe aunque es desde las herramientas encomendadas para ello, donde encontraremos mayor funcionalidad al respecto. Tenemos a nuestra disposición todo el potencial de la interfaz de Visual Studio .NET para el diseño de un informe, desde el generador de la consulta SQL hasta los tipos de informes a utilizar <<dotNetManía En el explorador de soluciones vemos el proyecto con dos carpetas, que refieren a las dos partes o módulos del informe, como muestra en la figura 3, el origen de datos y el diseño del mismo. En el origen de datos tenemos un asistente que nos ayuda a la disposición del mismo. Por defecto, SQL Server Reporting Services viene con una base de datos que ayuda en los tutoriales ya que la mayoría hacen referencia a ella, es lo que la Northwind al Visual Studio, dicha base de datos, AdventureWorks2000, se auto instala en el servidor SQL Server donde reside Report Services. La mayoría de herramientas de diseño del mercado tienen un asistente que facilita el proceso de creación inicial, y en este caso SQL Server Reporting Services no es una excepción. En un tiempo breve creamos un informe en el que quizás lo más complejo sea la construcción de la cadena de la consulta, tarea que se facilita gracias a la herramienta de creación de consultas gráfica de Visual Studio .NET. En la figura 4 vemos parte de un proceso de creación mediante el asistente. Tenemos a nuestra disposición todo el potencial de la interfaz de Visual Studio .NET para el diseño de un informe, desde el generador de la consulta SQL hasta los tipos de informes a utilizar. Podemos ver una vista previa del informe, podemos modificar el diseño cuando y como queramos. Podemos agregar el infor- 19 << dnm.servidores.sql Figura 4.Tres pasos distintos del asistente de creación de informes. La dos herramientas de administración las encontramos en primer lugar en http://localhost/Reports (fig. 6), por defecto, la cual nos brinda operaciones de administración, gestión e implantación y en segundo lugar tenemos un explorador en el que podemos ver los informes implantados. El sitio Web, por defecto, es http://localhost/ReportServer (fig. 7) y si los permisos de autorización nos lo permiten podemos navegar por dicho espacio Web. En el ejemplo que se muestra en estas líneas realizado anteriormente llamado Ejemplo, vemos que hay dos ficheros. El primero hace referencia a la conexión de datos que es compartida y que no es mas que un archivo XML (fig. 8) y el segundo, rptEjemplo, es la definición del informe en RDL y cuando accedemos, <<dotNetManía Implementar y administrar 20 Lo mas importante de la herramienta de administración es que está basada en Web, alojada bajo IIS y ASP .NET y que por tanto deberá estar familiarizado con estos contextos. La seguridad, como viene siendo tradicional entre productos de servidor de Microsoft, puede estar integrada bajo autenticación Windows y su implantación requiere de un estudio detallado y una fase de implantación minuciosa. Es importante la planificación para la implementación y administración de los informes ya que no sólo depende de un origen de datos ( ya que éste puede ser compartido o propio de un informe) con unas premisas de seguridad propias y un alcance local o remoto, sino que además los clientes de estos informes pueden no estar dentro de un dominio local y que por tanto la operación de autorización y autenticación sean imprescindibles, a través de IIS y/o Windows y/o SQL Server. Ver figura 5. Figura 5. Esquema de implantación distribuida. e l << dnm.servidores.sql Figura 6. La herramienta ReportServer Figura 7. Explorador de Informes Como herramientas no gráficas destaca rsconfig.exe para la administración de conexiones, rs.exe para la ejecución de comandos automatizados, rskeymgmt.exe para la administración de cifrado de claves de los informes, rsactivate.exe para la activación instantánea de servidores de informes. La combinación del comando rs.exe junto a los demás permite secuenciar de manera programática operaciones de mantenimiento desde la consola del intérprete de comandos. “Para los profesionales de TI, Reporting Services supone un entorno de creación de informes escalable y seguro que facilita la gestión, el acceso y la entrega de los datos empresariales al usuario final”. Jason Carlson, Product Unit Manager de SQL Server Reporting Services de Microsoft Corp. << <<dotNetManía explorador renderiza el informe hasta su presentación por defecto (fig. 9). De manera transparente existe un componente que se encarga de administrar la utilización de ésta conexión, para que sea compartida por otros informes y para que no consuma más que los recursos necesarios, de ahí que el archivo de conexión sea XML, ya que se trata de un componente basado en Web Service. Toda la información que maneja SQL Server Reporting Services se guarda en una base de datos del servidor SQL Server llamada ReportServer. Es aquí dónde se guarda información de usuarios, informes, roles, eventos, suscripciones, etcétera, y la herramienta Web no hará más que representar la funcionalidades según el perfil del usuario conectado. SQL Server Reporting Services soporta clúster de balanceo de carga en red (Network Load Balanced (NLB)). Al ser un Web Service stateless, sin estado, si reside en un contexto de NLB éste se escalará hacia fuera en caso de que algún servidor esté indispuesto. Además, la base de datos de SQL Server Reporting Services puede residir en un cluster junto a demás servidores SQL Server. SQL Server Reporting Services puede utilizar el SQL Agent para realizar programaciones de entrega. Éstas se programan para que un determinado informe a una determina fecha y hora se entreguen a unos determinados clientes. Todo el proceso es parametrizable lo cual aporta una gran abanico de posibilidades pudiendo incluso seleccionar el medio de transmisión y el formato de salida. 21 << dnm.servidores.sql Figura 8.Acceso al fichero AdventureWorks2000 desde el explorador web de SQL Server Reporting Services Figura 9.Acceso al informe rptEjemplo desde el explorador web de SQL Server Reporting Services Pero las posibilidades de desarrollo van más allá del desarrollo de los informes. SQL Server Reporting Services cuenta con tres interfaces principales. Por una parte WMI (Instrumental de administración de Windows) cuya misión es administrar el servidor de informes; en segundo lugar, el acceso URL que permite la integración en modo de portal para los informes publicados y por último SOAP. SOAP permite la publicación, administración y acceso a cualquier informe y es por ello que empleando las API de SOAP podemos desarrollar una aplicación para administrar un servidor de informes, e incluso contando con servicios Web propios y componentes escalables aprovechando los servicios que ofrece los Enterprise Services a través de los Serviced Components, las posibilidades de desarrollo no se centran únicamente en un marco local limitado físicamente. Destacar que ninguna interfaz está basada en COM+. En la figura 11 vemos el ejemplo de Web Service en el que encontramos algunos métodos que nos ofrece, y que utilizamos con la facilidad y comodidad que brinda la utilización de los Web Services desde Visual Studio .NET. <<dotNetManía Desarrollo 22 En cuanto a desarrollo se refiere, las oportunidades son muy amplias. Utilizando el .NET Framework 1.1, podemos crear extensiones de representación, de entrega, aplicar directrices de seguridad a nivel de informes y nos permite interactuar, no sólo con el origen de datos, también con cualquier aspecto del diseño del informe, todo ello desde un proyecto en cualquier lenguaje .NET. Ya que los informes están definidos por XML bajo la sintaxis de RDL (fig. 10), también podemos perfilar o desarrollar funciones específicas bajo dicha sintaxis y aplicarlas a la representación de los informes, simplemente utilizando las clases que nos ofrece .NET Framework en el espacio de nombres System.XML, particularmente la clase XmlTextWriter, que puede ser utilizada para este fin. Figura 10. Esquema RDL << dnm.servidores.sql De la misma forma que SOAP nos ofrece la posibilidad de administrar un servidor, URL nos permite personalizar un explorador y WMI configurarlo, todo ello desde Visual Studio .NET. En el código de a continuación, un ejemplo de aplicación consola en C# que muestra el nombre y la descripción de un determinado informe registrado, en este caso Ejemplo y el resultado de la aplicación lo vemos en la figura 12. SQL Server Reporting Services cuenta con tres interfaces principales. Por una parte WMI cuya misión es administrar el servidor de informes; en segundo lugar, el acceso URL que permite la integración en modo de portal para los informes publicados, y por último SOAP que permite la publicación, administración y acceso a cualquier informe <<dotNetManía Figura 11.Web Service subministrado por Reporting Services para el acceso y representación a informes desde Visual Studio .NET 23 << dnm.servidores.sql using System; using ConsumidorWS.WebReference; namespace ConsumidorWS { class Class1 { [STAThread] static void Main(string[] args) { ReportingService report = new ReportingService(); report.Credentials = System.Net.CredentialCache. DefaultCredentials; string informe = “/Ejemplo/rptEjemplo”; Property nombre = new Property(); nombre.Name =”Name”; Property descripcion = new Property(); descripcion.Name =”Description”; Property[] propiedades = new Property[2]; propiedades[0] = nombre; propiedades[1] = descripcion; try { Property[] retPropiedades = report.GetProperties (informe,propiedades); foreach (Property p in retPropiedades) { Console.WriteLine (p.Name + “: “ + p.Value ); } } catch (Exception e) { Console.WriteLine (e.Message); } Console.WriteLine(“Teclee Intro para finalizar...”); Console.Read(); } } } Código fuente 1 <<dotNetManía No es sorprendente pues, pensar que un informe puede llegar a ser diseñado, publicado e implantado desde código. 24 Conclusión SQL Server Reporting Services es un conjunto de herramientas integradas cimentadas sobre pro- ductos como SQL Server y Visual Studio .NET. Su integración con demás tecnologías de servidor IIS, ASP .NET, etc. lo hacen único, muy escalable y flexible, lo que puede ser una buena solución para el tráfico de grandes cantidades de documentos en corporaciones cuya extensión del negocio abarca varios países, y para pequeñas que enconaran en SQL Server Reporting Services una herramienta de << dnm.servidores.sql Figura 12. Resultado de la aplicación consola. clasificación y desarrollo de informes fácil e integral. Las API de SOAP que se ofrece para la parte de desarrollo, hace prácticamente parametrizable todo el proceso de utilización de informes así como la admi- nistración, con unas herramientas sencillas y potentes, permite una total adaptabilidad funcional con tareas de mantenimiento de sistema, de sitios Web y de base de datos entre otros. bibliografía Professional SQL Server Reporting Services Paul Turley,Todd Bryant, James Counihan, George McKee, Dave DuVarney Editorial: Wrox Páginas: 800 Publicado: Mayo, 2004 ISBN: 0764568787 Microsoft SQL Server Reporting Services Brian Larson Editorial McGraw-Hill Osborne Media Páginas: 704 Publicado: Mayo, 2004 ISBN: 0072232161 <<dotNetManía Hitchhiker’s Guide to SQL Server 2000 Reporting Services Peter Blackburn,William R.Vaughn 26 Editorial: Pearson Education Págians: 400 Publicado: Previsto para Octubre 2004 ISBN: 0321268288 Por Miguel Egea SQL Server MVP portalsql.com Crear informes con SQL Server Reporting Services Los Reporting Services son una nueva herramienta de servidor asociada a SQL Server. Vienen a completar la amplia oferta relacionada con SQL-Server, a completar al motor relacional, que tiene amplias funcionalidades como la replicación, servicios de alta disponibilidad, mecanismos de trasvase de registros, servicios de transformación de datos, tareas programables, un avanzado mecanismo de copias de seguridad (como vimos en un artículo anterior en esta misma publicación). Completan también a los Analisys Services que ofrecen, servicios avanzados de DataWarehouse, situándose en una rama media dentro del mercado del OLAP. De hecho Microsoft, al menos de nombre los incluye dentro de lo que ha venido a llamar proyectos de Bussiness Intelligence. vidor para la creación, desarrollo, administración y despliegue de informes. Una herramienta extensible que nos dota de base sin embargo con un buen número de funcionalidades muy interesantes, como por ejemplo el data driven subscriptions, es decir, subscripciones que extraen las direcciones de envío, los informes a enviar, los formatos en los que se envía (entre otros). Parte de estas funcionalidades las veremos con ejemplos a lo largo de este artículo. Veremos entre otras cosas, el asistente de creación de informes que nos ofrecen los Reporting Services dentro del entorno de desarrollo de Visual Studio.NET, a través del cual podremos crear de forma sencilla nuestros informes de explotación de información. Veremos también los elementos que podemos colocar en nuestros informes, las fuentes de datos, compartidas o no, la herramienta de diseño de informes y el despliegue de informes con Visual Studio.NET. Sin embargo quedará fuera del alcance de este documento la creación de informes sin Visual Studio; poderse se puede, ya que los la definición de los informes (ficheros RDL –Report Definition Language), es un fichero XML estándar que cumple los requerimientos que marca un esquema de datos XSD público. Es por tanto perfectamente viable crear informes sin Visual Studio.NET, aunque bien es cierto que sería como desarrollar aplicaciones fuera del entorno, algo bastante tedioso. ¿Cómo empezamos? Bueno, la respuesta obvia siempre es: por el principio, lo primero será instalar la parte de servidor. Instalar los servicios de Reporting Services, es una tarea bastante sencilla, tal y como nos tiene acostumbrados Microsoft, hay un asistente que repasa la configuración de nuestro servidor y nos avisa de los prerrequisitos que no cumplimos y nos invita a instalarlos. Necesitamos tener un servidor IIS, en él se desplegarán los informes, éste servidor debe admitir ASP.NET, ya que al final Reporting Services expone un servicio web que es una interfaz perfectamente válida para administrar el servidor. Después nos solicitará rutas, servidor y un servidor SQL en el que instalará varias bases de datos, en concreto instalará las BBDDs ReportServer, ReportServerTempdb y añadirá una base de datos nue- <<dotNetManía << Realmente son una potente herramienta cliente ser- 27 << dnm.servidores.sql va, que contiene un volumen bastante aceptable de datos llamada AdventureWorks2000. Si lo que deseamos es instalar las herramientas necesarias para que un desarrollador construya informes, lanzaremos el mismo programa de instalación, eligiendo eso sí, solamente las herramientas de cliente tal y como aparece en la figura 1. plo utilizaremos algo muy sencillo, Select * from SalesOrderheader. En este paso, el asistente comprueba que la consulta que estamos ejecutando es correcta para SQL. Figura 2 Figura1 [ [ Consejo Un par de clics más y tendremos instalados los Reporting Services listos para desarrollar informes profesionales de forma sencilla. Veremos a continuación cómo crear informes primero siguiendo el asistente de creación de informes, después un poco más en detalle con cada uno de los elementos de los que disponemos en un informe. <<dotNetManía Creando nuestro primer informe 28 Manos a la obra, vamos a construir nuestro primer informe, para eso abriremos el entorno de desarrollo de Visual Studio .NET y elegiremos los proyectos de Bussiness Intelligence, ahí elegiremos el asistente para la creación de informes y cambiaremos a nuestro gusto el nombre del informe. En cuanto seguimos, el asistente encontramos una de las características de los Reporting Services, los orígenes de datos compartidos. Es muy común que buena parte de los informes de una organización utilicen la misma conexión, es decir se conecten a la misma base de datos con parámetros similares, más aún cuando esta conexión puede realizarse en el entorno de seguridad de Windows. Aún así, podemos construir orígenes de datos específicos para cada informe si es que es ese nuestro deseo. En la figura 2 podemos observar la pantalla del asistente a la que nos estamos refiriendo. A continuación el asistente nos preguntará cual es la instrucción SQL que vamos a usar para nuestro informe, para el ejem- Si la BBDD es SQL SERVER no importa realmente para este paso si nuestra sentencia devuelve millones de registros. Para comprobar que la sentencia es correcta,Reporting Services no ejecutan la consulta para devolver registros sino que añade la sentencia SET FMTONLY ON antes para devolver sólo la estructura. En la siguiente pestaña del asistente nos preguntará si deseamos hacer un informe tabular o un informe de matriz, los informes tabulares reflejan los listados tradicionales -ya sabéis, información en columnas más o menos llamativas- pero en columnas, cada registro uno debajo de otro. Elegid esta opción si estáis haciendo un listado de clientes, proveedores, artículos,… Los informes de matriz sirven para contrastar información, son muy similares a los informes de referencias cruzadas de Access por ejemplo, es decir, podemos poner en columnas datos que pertenecen a filas. Son adecuados por ejemplo para mostrar información de diferentes ejercicios o meses. Para nuestro ejemplo elegiremos Matriz, vamos a contrastar la información de ventas por meses, aun- << dnm.servidores.sql que para hacerlo tendremos que personalizar algo nuestro informe al final. Una vez elegido el formato de matriz, nos aparece una nueva pantalla en la que podemos decir qué campos van a ir a página, columnas y filas, y qué campos vamos a mostrar en los detalles. En nuestro caso elegiremos que la fecha (OrderDate) se sitúe en columnas, en filas; situaremos el código de cliente (CustomerID) y en los detalles situaremos el peso y el subtotal (Freight, subtotal). to fecha (que pusimos en columnas) y modificaremos los parámetros tal y como puede verse en la figura 3. Añadiremos un grupo más, a un nivel superior, será el grupo año. Para hacerlo pulsaremos botón derecho sobre la matriz, agregar grupo, y rellenaremos los datos con los valores adecuados. Lo que tendremos que hacer es añadir un nivel de agrupación por años, y después añadir una propiedad al grupo mes que indique que el nivel mes puede mostrarse o no en función del año. Para esto entraremos en la pestaña de visibi- Necesitamos tener un servidor IIS, en él se desplegarán los informes, este servidor debe admitir ASP.NET, ya que al final Reporting Services expone un servicio web que es una interfaz perfectamente válida para administrar el servidor Figura 3 Figura 4 lidad y marcaremos la opción Otro elemento de informe puede alterar la visibilidad, eligiendo el elemento que puede alterar esa visibilidad la caja de texto del año, tal y como se observa en la figura 4. Hay algunos detalles más de formato y alineación que pueden darle un aspecto más profesional a nuestro informe, sin embargo, no me atreveré a hacer ninguna recomendación en este artículo, quizá un buen diseñador gráfico ayude mucho más en esa tarea que un informático. Es importante el aspecto, yo me atrevería a decir que dramáticamente importante, ya que, como dice Anthony T.Mann en su guía sobre Reporting Services, normalmente nuestro cliente será incapaz de valorar la complejidad o sencillez de construir nuestro informe, su único patrón de medida, siempre es el resultado, y muchas veces ese resultado depende más de la maquetación <<dotNetManía Por último el asistente nos muestra algunos formatos predefinidos que pueden ayudarnos a dar un aspecto amigable a nuestro informe sin demasiado esfuerzo. Podéis elegir el que más os guste —después siempre puede cambiarse— además de esa forma podéis ver cual es el que más os gusta. Al final nos pregunta por el servidor de informes, ahí se realizará la implementación del informe, situad en esa casilla la URL para acceder a vuestro servidor de Reporting Services. Con esto hemos creado nuestro primer informe, será necesario ahora personalizarlo y darle más sentido. Nuestro objetivo será construir un informe de ventas por años y meses, que tenga aspecto interactivo, veamos qué pasos debemos dar para conseguirlo partiendo de la base del asistente. Lo primero que haremos será cambiar la expresión de fecha por el mes de la fecha, ya que vamos a hacer las agrupaciones por año y mes. Para esto simplemente accederemos a las propiedades del elemen- 29 << dnm.servidores.sql y el aspecto que de los datos en sí (que por supuesto tienen que ser correctos). [ Consejo Cuando estamos desarrollando informes es bastante común querer tener un acceso ágil a los datos; podemos usar en nuestra consulta bien cláusulas WHERE que disminuyan el número de registros, bien cláusulas TOP que consigan el mismo objetivo. Esto hay que quitarlo justo antes de desplegar el informe. [ Para terminar nuestro informe vamos a darle un poco de sentido, vamos a quitar todos los campos que no usamos para de esta forma mejorar el rendimiento del informe. Nuestra sentencia la vamos a dejar así: SELECT customerid,orderdate,Freight,Subtotal FROM SalesOrderheader WHERE orderdate>=’20040101’ <<dotNetManía El aspecto final del informe es el que podéis observar en la figura 5. Este tipo de informes (y todos en realidad) puede exportarse a Excel, además de a PDF, HTML con Office Web Componets, CSV, e incluso XML con datos del informe. Es decir, tenemos un buen número de formatos que pueden permitirnos que nuestros informes, de forma predeterminada expongan funcionalidades que serían muy complicadas de otra forma. 30 Figura 5 Agregando interactividad a los informes No hay informe que no necesite parámetros, todos de una forma u otra necesitan un conjunto de valores por los que filtrar o algún mecanismo para reducir el volumen de información exactamente al que necesitamos. Naturalmente Reporting Services tiene mecanismos para facilitar esta tarea. Siguiendo con nuestro ejemplo vamos a dotar a nuestro informe de la posibilidad de seleccionar el año del que mostrar la información. Veamos paso a paso como añadirle esta lógica. Lo primero que vamos a hacer es añadir un nuevo conjunto de datos a nuestro informe; este conjunto de datos contendrá una relación de los posibles valores que va a tener nuestro informe. Para ello en el diseñador de Visual Studio .NET seleccionaremos la pestaña datos y a continuación seleccionaremos Nuevo conjunto de datos, tal y como podemos ver en la figura 6. A continuación incluiremos un nuevo conjunto de datos a partir de esta instrucción SQL SELECT DISTINCT Year(orderdate) Año FROM SalesOrderHeader . Este conjunto de datos lo usaremos como base para nuestros parámetros. Como dice Anthony T.Mann en su guía sobre Reporting Services, normalmente nuestro cliente será incapaz de valorar la complejidad o sencillez de construir nuestro informe, su único patrón de medida, siempre es el resultado, y muchas veces ese resultado depende más de la maquetación y el aspecto que de los datos en sí (que por supuesto tienen que ser correctos) Después volveremos a la pestaña de diseño, en la esquina superior izquierda de cualquier report. Pulsando con el botón derecho del ratón nos aparecerá un menú desplegable con varias opciones, entre ellas las de crear un encabezado y pie de página (las veremos al menos brevemente más adelante), también encontrar las propiedades del informe, y además está << dnm.servidores.sql Figura 7 Figura 6 SELECT customerid,orderdate,Freight,Subtotal FROM SalesOrderheader WHERE year(orderdate)=@año Después entraremos en las opciones del dataset, del conjunto de datos que hemos generado y añadiremos un parámetro (esta vez al dataset), que llamare- [ mos @año y cuyo valor será =parameters!parAño.value, consiguiendo así enlazar el informe con los parámetros que estamos solicitando. Añadiendo gráficos a los informes Una de las cuestiones que generalmente es necesaria, es añadir gráficos a este tipo de informes. Pensemos por ejemplo en la factura de la compañía telefónica, todas o casi todas tienen un gráfico de evolución del consumo en los últimos meses, sin embargo, no hay muchas facturas generadas por ERP’s más tradicionales que tengan esta información. En el caso del que estamos hablando, el origen de datos, no tiene nada que ver con la factura, son datos absolutamente disjuntos. Vamos a ver también paso a paso como añadir un gráfico a nuestro informe, aprovecharemos para crear nuestro conjunto a partir de un procedimiento almacenado, ya que hasta ahora en los ejemplos siempre hemos venido usando sentencias directas. Comenzaremos esta parte creando un procedimiento almacenado en la BBDD AdventureWorks2000, el código del procedimiento almacenado será muy sencillo, podemos verlo a continuación: Consejo [ En general las sentencias SQL en que se hacen transformaciones o se usan funciones (como Year() en nuestro ejemplo) no son demasiado óptimas, al hacer esta fórmula estamos impidiendo que SQL Server use los índices que potencialmente podemos tener por el campo. Hay varias formas de mejorar esto: Se puede crear un campo calculado en la tabla que sea el año y construir un índice por ese campo, o se pueden usar rangos de fechas para expresar lo mismo. <<dotNetManía la opción que estamos buscando: la opción de ver los parámetros del report. Seleccionaremos Agregar un nuevo parámetro, como nombre elegiremos ParAño; en el mensaje elegiremos Año del informe; como valores disponibles, elegiremos de consulta, esto nos permitirá seleccionar como valor el conjunto de datos que acabamos de crear. Con esto acabaríamos de crear el parámetro al informe. Está claro que aún no hemos usado el parámetro para construir la sentencia que sirve para obtener los datos y que por tanto afecte al conjunto de datos que hemos usado de base para diseñar el informe de ejemplo. Para conseguir esto, bastará con cambiar la sentencia que nos ha servido de base para el informe, la sentencia, finalmente quedará así: 31 << dnm.servidores.sql Create Proc EvolucionVentasPorMeses (@año smallint ) as begin select month(orderdate) mes,sum(Subtotal) Subtotal From SalesOrderheader where year(orderdate)=@año group by month(orderdate) order by 1 end go A continuación añadiremos un nuevo conjunto de datos. El conjunto de datos se basará en este procedimiento almacenado, es bastante sencillo invocar y no vamos a entrar en más detalles, únicamente recordar que añadiremos el enlace con el parámetro @año, de la misma forma que hemos enlazado este parámetro para el conjunto de datos base para la matriz de datos. Si lo estimamos oportuno, podemos hacer más grande ahora la superficie del informe, y bien en un margen, o bien justo debajo, pincharemos y arrastraremos un nuevo grafico a nuestro informe. Después arrastraremos los campos del nuevo conjunto de datos a la superficie del gráfico, llevaremos el campo subtotal a valores y el campo mes a los campos de categoría. No llevaremos en este caso nada a serie, y además entraremos a personalizar el informe para que no muestre la leyenda. En la figura 8 puede verse el aspecto que tiene en vista previa el informe que acabamos de generar y al que le acabamos de añadir el gráfico. [ Consejo Algunos procedimientos almacenados (en SQL Server) pueden devolver más de un conjunto de registros. Sin embargo Reporting Services solamente usará el primero de ellos, es conveniente tener cuidado con esto y asegurarse de usar SET NOCOUNT ON cuando sea necesario. [ ta con pulsar con el botón derecho en el cuadro superior izquierdo de la ventana de diseño y obtendremos las dos opciones de menú que dan acceso a encabezados y pies. Más allá de lo obvio, lo que tiene cierto interés es cómo usar esos encabezados y pies de página para mostrar la información realmente relevante para todas las páginas. Generalmente es interesante conocer datos como la fecha y la hora de generación del informe, y la página y el total de páginas. Para proporcionar esta información hay variables globales que nos las ofrecen y que a través del editor de expresiones podemos acceder. Para insertar valores, añadiremos un par de cajas de texto en el pie de página arrastrándolos desde el cuadro de herramientas hasta la superficie del pie de página, después desde las propiedades de la caja de texto podemos acceder al editor de expresiones y poner la expresión más adecuada. Para poner la página en la que estamos y la fecha y hora de ejecución hemos usado respectivamente las variables globales Globals!ExecutionTime, Globals!PageNumber y Globals!TotalPages. Despliegue de los informes <<dotNetManía Figura 8 32 Añadir encabezados y pies de página Añadir un encabezado o un pie de página es una tarea muy sencilla en el diseñador de informes, bas- Hasta esta parte del artículo sólo hemos hablado sobre cómo desarrollar los informes, sin embargo, de nada sirve un informe si no puede desplegarse, es decir instalarse en algún lugar y ser visualizado. Para realizar esta tarea veremos las opciones que ofrece Visual Studio .NET y veremos parte de las diferentes opciones de renderizado. Una de las herramientas más potentes para desplegar informes es el propio Visual Studio .NET. La herramienta es capaz de hablar con el Servidor de Reporting Services (a través del servicio web que expone) y enviar la información necesaria para desplegar el informe, tanto los orígenes compartidos de datos como los propios informes. Si lo pensamos tranquilamente, la tarea tampoco es especialmente complicada, no lo es debido a que el resultado de toda nuestra tarea no deja de ser << dnm.servidores.sql Visualización de informes Una vez situado el informe en nuestro servidor de informes necesitaremos que nuestras aplicaciones tengan la capacidad de usarlos, es decir de invocar a esos informes para que muestren la información. Nada más sencillo de conseguir, al fin y al cabo no es más que navegar a una página web en la dirección URL en la que hayamos desplegado nuestro informe, En la figura 9 podemos ver el aspecto que tiene la pantalla una vez ejecutado el informe. ¿Y cómo integramos esta visualización dentro de nuestras aplicaciones? Si las aplicaciones son Web nada Figura 8 más sencillo, podemos poner hiperenlaces a las direcciones URL de los informes, bien con los parámetros en la propia URL, bien sin ellos, y ya se encarga el propio informe de solicitarlos. Si por el contrario estamos desarrollando aplicaciones en ventanas tradiciones, en aplicaciones de escritorio tampoco es que sea mucho más complicado, podemos usar una referencia web al Servicio Web que exponen Reporting Services (http://NOMBRESERVER/ReportServer/ReporService.asmx), y usar los métodos de RENDER para obtener la información de renderizado (incluso en un Stream), o podemos hacerlo también mediante acceso URL, bastará con añadir una referencia al navegador, esta referencia es realizada mediante COM Interop, a los Microsoft Internet Controls. Una vez creada la referencia solamente hay que ejecutar el método Navigate del control pasándole como parámetro la dirección URL en donde hayamos desplegado el informe. ¿Y hace algo más? Pues la verdad es que sí, muchas cosas más, la parte de administración de informes no la hemos tocado en este artículo y la dejamos pendiente para el futuro, de la misma forma, podrían tratarse las suscripciones, que existen de varios tipos, tanto programadas como gobernadas por los propios datos, además de la seguridad y las ‘interioridades’ de los Reporting Services Conclusiones Reporting Services, como herramienta cliente servidor puede ayudarnos a hacer informes profesionales dentro del propio entorno de Visual Studio .NET, de forma ágil y sencilla, definiéndose, a pesar de su juventud en el mercado, como una poderosísima herramienta de generación de informes profesionales. <<dotNetManía un fichero XML con la definición del informe, un fichero de extensión RDL que contiene en sí mismo toda la definición del informe de forma clara y transparente. Para conseguir el despliegue de los informes desde Visual Studio .NET tendremos que usar las propiedades del proyecto. Tres son los parámetros que tendremos que configurar para que se haga el despliegue: OverwriteDataSources, cuyos valores pueden ser ‘True’ o ‘False’, y TargetFolder y TargetServerURL que indican respectivamente la ruta del servidor y la ruta dentro del servidor en el que desplegaremos nuestros informes. Por último simplemente ejecutamos, como si de cualquier proyecto se tratase y tendremos nuestro informe situado en el servidor de informes. El que exista la propiedad OverwriteDataSources es realmente importante, tengan en cuenta que las cadenas de conexión no tienen por qué ser exactamente iguales para acceder desde el entorno de desarrollo en el que estamos suministrando las credenciales con las que hemos entrado al sistema para visualizar la información, que desde el entorno de producción. Es bastante normal que el entorno de desarrollo acceda a servidores de desarrollo y que el entorno productivo a servidores de producción. Dentro de la seguridad podemos programar que se haga impersonación, es decir que el IIS deje pasar nuestras credenciales hasta el servidor (o servidores) desde donde se extraiga la información, pero también podemos decidir usar un nombre de usuario y una contraseña o un usuario de Windows creado solamente para genera los informes. Toda esta tarea de configuración y de administración de nuestro servidor de Reporting Services podría quedar estropeada por que al desplegar un conjunto de informes sobrescribiésemos los orígenes de datos. Otro detalle interesante a mi juicio es que cada una de las configuraciones admite estos parámetros, es decir que podemos estar ejecutando en modo Debug nuestros informes contra servidores de pre-producción o desarrollo y en el momento que estén terminados, simplemente cambiar el combo para decir que desplegamos en productivo y ejecutar la aplicación. 33 Por Daniel Manzini Arquitecto de Sistemas de Información Ubica Solutions Distribuir aplicaciones con .NET Remoting Existe en .Net cuatro maneras de distribuir aplicaciones, a saber: Los servicios web, .Net Remoting, Mensajería (MSMQ) y Componentes empresariales (COM+). Los tres primeros métodos de distribución son controlados por el la plataforma .Net, por lo que sólo explicaré estas tres primeras en los próximos párrafos. << ¿Cuando usar cada método de distribución de aplicaciones? <<dotNetManía Esta variedad de elección tiene su sentido, y radica en lo que quiere hacer el cliente a fin de cuentas con el proyecto. Pueden variar mucho los requerimientos entre una aplicación de facturación y una de logística en tiempo real, pero lo preguntas importantes que debemos hacernos al inicio de estos proyectos son: • ¿Desarrollaré los dos puntos de la aplicación (tanto el cliente como el servidor)? • ¿Qué grado de integración con otras aplicaciones debo tener? • ¿El usuario se conecta y se mantiene conectado, o consulta esporádicamente? • ¿Puedo simular que sigue conectado cuando realmente lo desconecto? • ¿El usuario recibe avisos desde el servidor? 34 Se espera que se utilice un servicio web cuando sea un dato externo, es decir cuando no soy el dueño de la información. También utilizaré un servicio web cuando no sé con exactitud qué plataforma tendrá el cliente o cuando desarrollo información que será solicitada desde muchas aplicaciones diferentes para facilitar la integración. .Net remoting nos es útil cuando deseamos distribuir una aplicación y controlamos los puntos donde se va a distribuir, esto significa por ejemplo que el cliente nos dejará instalar .Net en sus ordenadores clientes y servidor. Además el modelo de remoting nos permite tener distinta serialización (binaria, SOAP, o extendida a partir de IFormatter), distintos canales de envío de mensajes (TCP, HTTP, o extendido a partir de IChannel), distintos modos de programación con los objetos (statefull or stateless) y compartir por valor o por referencia. Un servicio web es mucho más restrictivo en estos últimos puntos. Además .Net remoting puede enviar mensajes desde el servidor hacia los clientes. Si podemos utilizar métodos en forma asíncrona (incluso un servicio web nos crea los métodos BeginOperacion y EndOperacion para utilizarlo asíncrono) ¿Porqué utilizar mensajería? Tanto remoting como web service son tecnologías diseñadas para trabajar en forma síncrona, mientras que la mensajería es exactamente lo contrario, por lo tanto viene con características difíciles de implementar con los otros métodos. Por ejemplo si un servidor se cae, los mensajes se conservan en local hasta que se restablece el servidor, momento en que se envían los mensajes automáticamente. Además es muy útil para la integración de aplicaciones. El caso de integración sería colocar un mensaje en una cola de mensajes que forma parte de un flujo de trabajo de Biztalk, o sin Biztalk, sería tener a un thread que lea los mensajes que llegan y lo deserealice. Como en el presente artículo no tocaremos el tema de mensajería, vea en la tabla 1 que puede ilustrar similitudes y diferencias entre .Net Remoting y Web Service. Pensando con el cliente Aunque una aplicación se encuentre dividida en n capas, se conoce generalmente como aplicaciones cliente servidor a aquellas aplicaciones donde un cliente solicitaba información a un punto central por medio de una LAN. Con tecnología DCOM muchas empresas fueron creando productos distribuidos, con la visualización en formularios, la lógica en los objetos DCOM en otro ordenador (servidor de aplicaciones) y la base de datos en un servidor diferente (el servidor de datos). De este modo, tenemos muchos aplicativos de gestión. Cuando esta gestión no requiere un tiempo vital en la respuesta (un control de gasto, donde para pagar una factura se tarda 60 días y se consulta su estado una media de tres a cinco veces en esos 60 días) se puede distribuir por medio << dnm.plataforma.net Remoting Web Service Reside en Aplicación de consola Windows Service. ASP.NET ASP.NET Se comparte por Valor o referencia Valor Modelo de estado Con o sin estado Con estado Canales TCP, HTTP, o propios HTTP Mensajes Binario, SOAP, o propias SOAP o HTTP con query string Cliente Sólo .Net Cualquiera Sistema de tipos CTS (de la plataforma) XML Schema primeros los llamaré en adelante MBV(del inglés Marshal by Value) y a los últimos MBR (del inglés Marshal by Reference). Por ejemplo tenemos el siguiente método en la clase Empleado_ReglaNegocio en remoto: de servicios web, pero para aquellas aplicaciones donde el tiempo lo es todo (aplicativos para control de ambulancias, por ejemplo) hay que distribuirlo por medio de .Net remoting. Arquitectura de .NET Remoting Para entender la infraestructura de remoting hay que saber tres conceptos: proxies, canales y mensajes. El proxy es un objeto que existe en local que realmente impersona a uno que existe en remoto; para poder realizar esta tarea tiene que tener todos los miembros iguales que el objeto remoto. Lo que hace el proxy cuando se hace una petición en local es delegar la petición por el canal al objeto remoto. El canal representa, entonces, la conexión entre la aplicación local y la aplicación remota. La petición que se realiza antes de llegar al canal se serializa por medio de un formateador, dando por resultado el mensaje que se transmite; al llegar existe otro formatedor que deserealiza el mensaje y realiza la petición en el entorno remoto. La figura 1 ilustra el proceso. Distribución de proyectos La finalidad es compartir objetos que están mas allá de la frontera de la aplicación. Éstos se pueden compartir por valor o por referencia, y conceptualmente funciona igual que un parámetro por valor o por referencia. A los Figura1 Con este ejemplo nos sacamos un par de dudas sobre los valores de retorno en remoting, éstos pueden ser tipos incluidos en la plataforma o clase propias. Si la clase Empleado fuera MBV, entonces obtendríamos en local una copia del objeto remoto —hay que tener en cuanta que este tipo de objeto se ejecutara en local—, mientras que si fuera MBR tendríamos en local un puntero al objeto remoto, que no es nada más ni nada menos que el proxy. Viendo las consideraciones de los objetos por referencia y por valor lo que puedo hacer es tener las entidades de negocio (el empleado con su nombre, apellido, email y otros datos) como MBV, mientras que las reglas de negocio (BuscarUnEmpleado, BuscarEmpleadoporMail, etc.) lo puedo tener como MBR. Cuando llegamos a este punto nos damos cuenta que la clase Empleado debe estar en los lados del remoting, es decir en el cliente y en el servidor. Esto indica que por lo menos cuando trabaje con remoting tendré tres proyectos: el cliente, el servidor y uno compartido donde colocaré las clases que usa el cliente y que solicita al servidor. Y para poder llegar a verlo trabajar tendré dos soluciones: la solución cliente con el proyecto cliente y el proyecto compartido, y la solución servidor con el proyecto servidor y el proyecto compartido. En la vida real, es posible que la solución cliente se distribuya en 100 ordenadores. Ahora nos meteremos con el proyecto compartido ¿es necesario poner las clases? En otras palabras ¿es necesario poner la implementación en cada uno de los 100 clientes? Bueno, ese es un tema de seguridad y de mantenimiento. De seguridad porque .Net se puede <<dotNetManía Tabla 1 public Empleado ObtenerNuevoEmpleado() { return new Empleado(); } 35 <<dotNetManía << dnm.plataforma.net 36 descompilar si no tomamos los cuidados necesarios, y de mantenimiento, porque a la menor incidencia o cambio que tenga en una de las clases que esté en el proyecto compartido tendré que instalar los 100 clientes. Para ello, en el proyecto compartido puedo usar clases abstractas o interfases. Las clases abstractas pueden llegar a tener implementación, por lo que es recomendable utilizar interfases que sólo se implementan en el servidor y como no tienen código de implementación, si alguien logra descompilarlas, pues no verá mucho. Es decir que termino teniendo en la solución servidor tres proyectos, el servidor, el compartido que sólo son interfases, y un proyecto de transferencia que son las clases que implementan las interfases del proyecto compartido, mientras que en la solución cliente nos queda el proyecto cliente y el proyecto compartido. Las consideraciones sobre la distribución no acaban aquí. Los objetos MBV se ejecutan en local, por lo tanto necesitan en local el código para poder funcionar. Como los objetos que voy a compartir son entidades de negocio (a mi me gusta decirles Objetos de Transferencia, ya que en su momento los estudié como parte del patrón Transfer Object 1) tendrá propiedades para acceder a los valores y cambiarlos si es necesario, y algún método que puede responder usando los valores internos del objeto, por ejemplo si estuviera hablando de la clase Detalle de Factura, tendría el método CalcularImporte que multiplicaría la propiedad Cantidad x PrecioUnitario. ¿Porqué no usar DataSet o DataSet tipificados en lugar de objetos de transferencia? Es una buena pregunta. Como ya vimos, cuando un objeto tiene que pasar por un canal se serializa al partir y se deserializa al llegar. Si tuviéramos que distribuir una aplicación en una LAN, usaría serialización binaria, pero con el DataSet tengo un problema, por más que le indique que es serialización binaria se serializa como XML, siendo de un tamaño 5 veces mayor. Eso me trae problemas de tiempo y de carga de red (acompaño un ejemplo con el nombre de serialización. Vea el material de apoyo en dotnetmania.com). A continuación voy a empezar a dejar ejemplos de código, pero antes un 1 “Core J2EE Patterns” de Deepak Alur. comentario sobre los ejemplos. El servidor puede implementarse de tres maneras, una aplicación de consola (para desarrollo viene muy bien), un servicio de Windows, o en IIS. Por sencillez, los distintos ejemplos servidores estarán hosteados por aplicaciones de consola. Primer ejemplo de .NET Remoting Ya puesto en la distribución, pasamos a crear dos soluciones que puedan ir demostrando algunas instrucciones básicas para por el otro lado en el servidor abrir un puerto, con un determinado protocolo, para poder escuchar las peticiones del cliente y por el lado del cliente como abrir el canal (puerto y protocolo) y obtener un objeto remoto. El código lo podrán encontrar bajo el directorio EJEMPLO01. Empecemos por el proyecto compartido, específicamente por las interfases: mos una canal de comunicación, además le indicamos que usaremos el puerto 1234. Luego usamos el método estático RegisterChannel para registrar el canal. Hay que tener presente que si fuera un canal que ya se está usando puede dar un error. Lo aconsejable es colocarlo dentro de un try – catch o pedir con el método GetChannel de la misma clase, si retorno un nulo, registrarlo y sino elevar una excepción. Con el canal registrado, ahora hay que indicarle qué clases se pueden compartir. Tenemos que decirle el tipo de la clase, un nombre del objeto (URI), y por ultimo el tipo de objeto en remoting que es. En cuanto a los nombres, por defecto cuando se comparte un objeto que utiliza el transformador binario (el TCP si no le decimos lo contrario usa serialización binaria, mientras que el HTTP usa serialización SOAP) se coloca como nombre el nombre de la clase seguido de un punto y la exten- namespace ICompartido { public interface IAsignar { void AsignarNombre(string nombre); string ObtenerNombre (); } } Siguiendo con el ejemplo de Empleado, cree una interfaz por la cual le pueda asignar el nombre al Empleado. Ahora pasa al proyecto que tiene la implementación. Ver fuente 1. La clase Empleado se compartirá por referencia. Por tal motivo tiene que heredar directa o indirectamente de MarshalByRefObject. Ésta es otro motivo para recalcar el uso de las interfases ya que .Net acepta tener una única clase base. Para poder compartirse tiene que haber una aplicación que lo lance, en este caso será una aplicación de consola. Generalmente se usa este tipo de aplicación para pruebas y desarrollo, luego lo ideal seria un servicio de Windows. Ver fuente 2. Ahora echemos un vistazo a lo que escribimos para lanzar la aplicación. Por medio de la clase TcpChannel, abri- sión .REM, mientras que si es SOAP se coloca la extensión .SOAP. Para que el objeto pueda ser llamado la aplicación de consola debe estar ejecutándose, por eso lo dejamos con el ReadLine puesto. Ahora que ya tenemos el servidor terminado, pasaremos al cliente. En este caso también lo veremos por medio de una aplicación de consola. Ver fuente 3. En el cliente, llamamos al objeto remoto, para ello, en este caso, usamos el método Activator.GetObject que espera por lo menos dos parámetros: el primero, el tipo de objeto que se va a compartir, como en el cliente sólo tengo la interfaz, coloca la interfaz que espero; y el segundo, es la dirección donde está el servidor, esta dirección está formada por protocolo de comunición + dirección IP (o nombre de maquina) + puerto que está esperando petición + nombre del objeto. Para ase- << dnm.plataforma.net using System; using System.Runtime.Remoting; using ICompartido; namespace Compartido { public class Empleado:MarshalByRefObject,IAsignar { string _nombre; public Empleado() { Console.WriteLine(“Creando el objeto Empleado”); } #region IAsignar Members public void AsignarNombre(string nombre) { Console.WriteLine(“Empleado.AsignarNombre * viejo valor = {0} * nuevo valor {1}”,_nombre,nombre); _nombre=nombre; } public string ObtenerNombre() { Console.WriteLine(“Empleado.ObtenerNombre * retornando el valor {0}”,_nombre); return _nombre; } #endregion } } Fuente 1 using using using using System; System.Runtime.Remoting; System.Runtime.Remoting.Channels; System.Runtime.Remoting.Channels.Tcp; using Compartido; namespace Servidor { class Servicio { [STAThread] static void Main(string[] args) { Console.WriteLine(“Servicio.Main(): Se inicio el servicio”); TcpChannel tcpch= new TcpChannel(1234); ChannelServices.RegisterChannel(tcpch); RemotingConfiguration.RegisterWellKnownServiceType( typeof(Empleado), “Empleado.rem”, WellKnownObjectMode.Singleton); Console.WriteLine(“Presione ENTER para terminar el servicio”); Console.ReadLine(); } } Fuente 2 <<dotNetManía } 37 << dnm.plataforma.net using using using using System; System.Runtime.Remoting; System.Runtime.Remoting.Channels; System.Runtime.Remoting.Channels.Tcp; using ICompartido; namespace Cliente { class ClienteInicio { [STAThread] static void Main(string[] args) { TcpChannel ch = new TcpChannel(); ChannelServices.RegisterChannel(ch); IAsignar obj = (IAsignar) Activator.GetObject( typeof(IAsignar), “tcp://127.0.0.1:1234/Empleado.rem”); Console.WriteLine(“Ya tengo el proxy creado”); obj.AsignarNombre(“dotNetMania”); string retorno = obj.ObtenerNombre(); } } } Fuente 3 gurarme de que funcione en cualquier ordenador puse 127.0.0.1 en lugar del nombre de mi ordenador (también podía haber puesto localhost). ¿Con ganas de probarlo? Compile todo, ejecute el servidor, luego el cliente, y podrá ver como en el servidor solicitó el cliente. Ahora vamos a poner un punto de interrupción en el cliente donde decimos que el proxy ya está creado. Paramos el servidor si estuviera andando y volvemos a lanzarlo, luego lanzamos el cliente hasta que llegue al punto de interrupción. Según el código del cliente, el objeto ya fue creado por el método GetObject, pero si vemos en la consola del servidor, el constructor aún no avisó que se creó el objeto ¿Bug de .Net? ¿Llamo a mi psicólogo? No tranquilo, es así, ahora veremos el porqué. <<dotNetManía Tipos de objetos en .Net Remoting 38 Los objetos MBR se pueden activar de tres maneras: SingleCall, Singleton, Activado desde el Cliente. Igualmente podemos decir que son dos divisiones genéricas: aquella donde el servidor administra Nos cuestionaremos cada decisión de diseño de aplicaciones distribuidas y veremos como podemos resolverlas con .Net Remoting aplicando las mejores prácticas la creación de un objeto (SingleCall y Singleton), y aquella donde se administra desde el cliente. El SingleCall funciona igual que un servicio web sin estado. Lo que sucede es que cuando se hace la petición, se crea, ejecuta el método y se destruye el objeto remoto. Esto hace que los objetos SingleCall sean los más escalables de los tres tipos. Generalmente se utilizan para procesos largos. En contra, se puede decir que no recuerda nada del usuario que está utilizándolo. Para ver un ejemplo, sólo cambiaremos en el ejemplo anterior, en el servi- dor, el WellKnownObjectMode.Singleton a WellKnownObjectMode.SingleCall. Al ejecutarlo, veremos que en el servidor se construye dos veces el objeto Empleado; esto es porque hay dos llamadas, una donde le asigno el nombre y una donde le pido el nombre. El Singleton es una sola instancia del objeto remoto para todos los procesos clientes que la llamen. Es muy útil para compartir información entre clientes. El tiempo de vida por defecto es de 5 minutos. Para ver cómo se comportan, cambiaremos el servidor otra vez a Singleton y ejecutaremos dos veces seguidas el cliente. La primera vez que ejecutamos el cliente, la variable nombre estaba vacía y le asignamos el nombre dotNetMania, la segunda vez le volvimos a asignar el mismo valor, sencillamente porque no se destruyó el objeto, mantenía el mismo valor y lo compartía con el nuevo proceso cliente. Los pasos quedan reflejados en la consola del servidor. Por ultimo tenemos los objetos que se pueden activar del lado del cliente. Al activarse del lado del cliente puedo hacer un new, lo cual se puede considerar una ventaja porque el código queda mucho mas fácil de leer, pero sólo podemos usar el constructor por defecto, si quisiéramos otros constructores deberíamos compartir la implementación. El problema más importante que tienen es la escalabilidad, ya que como la activación se maneja desde el cliente, varios clientes podrían crear instancias iguales; esto con un tipo de objeto singleton sería una sola instancia, y lógicamente consumiría menos recursos del servidor. En el caso que no quisiéramos compartir las interfases, podemos utilizar una herramienta que se llama SoapSuds. La herramienta SoapSuds no extrae la información sobre distintos constructores, sólo el constructor por defecto. Algo importante en torno al SoapSuds, si tienes la versión 1.1 del Framework, Microsoft te recomienda que esperes a que exista un service pack para que funcione correctamente o que contactes a un número de teléfono de soporte. Para mas información ver (http://support.microsoft.com/default.aspx?scid=k b;en-us;823445). Cabe aclarar que con la versión 1.0 no tenía problemas. << dnm.plataforma.net Una buena practica en .Net Remoting Para lograr todo esto, lo que deberíamos hacer es que la clase no se exponga directamente, sino indirectamente como respuesta a un método. Esto se conoce como una factoría2, donde cada método de la factoría mapea a un constructor. Empezaremos por la interfaz: public interface IFactoria { IAsignar CrearEmpleado(); IAsignar CrearEmpleado(string nombre) } Como se ve, sobrecargo el método CrearEmpleado de igual manera que está sobrecargado el constructor de la clase Empleado, luego en el proyecto compartido agrego la clase Factoria e implemento la interfaz IFactoria. Ver fuente 4. Como la factoría será llamada desde el cliente, necesitamos que herede de MarshalByRefObject. En la aplicación de consola que inicia el servidor, en lugar de exponer la cla2 3 namespace Compartido { public class Factoria:MarshalByRefObject, IFactoria { public Factoria() { } #region Factoria Members public IAsignar CrearEmpleado(string nombre) { return new Empleado(nombre); } public IAsignar CrearEmpleado() { return new Empleado(); } #endregion } } Fuente 4 se Empleado, ahora exponemos la clase Factoria y lo dejamos Singleton porque existirá una sola factoría para todos los clientes. Esto lo hace escalable. de en lugar de encapsular la creación de un objeto, encapsulamos las llamadas del cliente al servidor. Pero eso será tema de otro día al igual que otras pre- RemotingConfiguration.RegisterWellKnownServiceType( typeof(Factoria), “Factoria.rem”, WellKnownObjectMode.Singleton); En el cliente, los cambios quedan de la siguiente forma: guntas. (¿Cómo hago para cambiar el servidor de ordenador sin reinstalar IFactoria factoria = (IFactoria) Activator.GetObject( typeof(IFactoria),”tcp://127.0.0.1:1234/Factoria.rem”); Console.WriteLine(“Ya tengo el proxy creado”); IAsignar obj = factoria.CrearEmpleado(“dotNetMania”); string retorno = obj.ObtenerNombre(); Como se verá, no puedo usar directamente el constructor específico de la clase empleado, pero por medio de la factoría obtengo los mismos resultados. Esto constituye una buena práctica dentro de remoting, porque no comparto la implementación, tengo la posibilidad de usar constructores, y de llamar indirectamente. La idea principal es que la interfaz no cambie, entonces el cliente se puede mantener. Bajo esta misma buena práctica, también podríamos usar el patrón Facade3, don- “Design Patterns” de Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides Idem II todos los clientes? ¿Qué hago si en el parque de ordenadores son todos Windows Me o 98? ¿Dónde realizo el host? ¿Y si quisiera usar esta misma arquitectura en un solo puesto de trabajo, pero el día de mañana quiero tener 5 ordenadores conectados a un servidor? ¿Cómo hago para que un objeto remoto permanezca siempre activo? ¿Cómo se avisa el cliente desde el servidor? ¿Cómo puedo utilizar Remoting con Multiservidores? ¿Cómo puedo aplicar seguridad?) <<dotNetManía Una ventaja que nos trae este tipo de activación es la posibilidad de usar distintos constructores, como comparto implementación, puedo hacerlo fácilmente. Encontrarán el ejemplo en el directorio EJEMPLO02. En el cliente la primera vez uso el constructor por defecto y luego otro constructor donde le asigno el nombre al empleado. En el servidor tuvimos que cambiar la manera de publicar el objeto, ahora usamos dos llamadas a la clase RemotingConfiguration, la primera a la propiedad ApplicationName, para decirle el nombre, y por último al método RegisterActivedServiceType y le pasamos el tipo que queremos compartir como parámetro. En el cliente, después de registrar el canal, ejecutamos el método RegisterActivatedClientType y le pasamos el tipo de objeto y la dirección donde está el servidor como parámetros. Pero, comparto implementación y eso no me termina de convencer, no me gusta mucho por principios de programación distribuida ¿qué puedo hacer para tener la ventaja de constructores y no tener que compartir implementación, y que sea escalable? 39 Por Francisco Charte Torre de Babel fcharte.com Cambios sufridos por Object Pascal en Delphi 8 .NET Con el objetivo de poder generar código ajustado a la especificación común de lenguaje (CLS) de la plataforma .NET, Borland ha tenido que introducir ciertos cambios en el compilador de Object Pascal que incorpora la versión 8 de Delphi. << Introducción La primera versión de Delphi, a punto de ser liberada hace ahora casi una década, contaba con un evolucionado compilador de Pascal orientado a objetos, conocido como Object Pascal, que generaba código de 16 bits para el sistema operativo Windows. Con Delphi 2 apareció el compilador que producía código de 32 bits para la plataforma Win32, nombre con el que ha venido denominándose genéricamente a la plataforma de ejecución que representan todas las versiones de Windows de 32 bits. Aunque con ciertas <<dotNetManía A diferencia de otros lenguajes .NET, la actual versión de Object Pascal, en Delphi 8, no contempla la posibilidad de crear alias para los ámbitos con nombre 40 mejoras y extensiones a lo largo de los años, lo cierto es que ese compilador era, básicamente, el mismo hasta la versión 7. Delphi 8 es la primera versión de este producto preparada para crear aplicaciones para la plataforma .NET de Microsoft, lo cual ha obligado a construir un compilador prácticamente nuevo que, en lugar de código nativo, genera código IL. Éste debe ajustarse a una especificación, conocida genéricamente como CLS (Common Language Specification), que hace posible la reutilización del código entre distintos lengua- jes, así como la interoperabilidad entre sus clases. Los lenguajes .NET pueden contar con características que, a pesar de estar presentes en el sistema común de tipos o CTS, no formen parte de la CLS, que podríamos ver como un subconjunto de aquél. El cumplimiento con dicho subconjunto, sin embargo, es inevitable. En la CLS se detallan ciertas construcciones que deben ser contemplados en cualquier lenguaje, algunas de las cuales no existían en el lenguaje Object Pascal como lo conocíamos hasta Delphi 7 o, de existir, no se comportaban exactamente como se indica en dicha especificación. Por ello ha sido necesario introducir algunos cambios, agregando nuevas palabras clave, eliminando ciertos tipos y alterando otros para poner Object Pascal al mismo nivel, sino superior, que los demás lenguajes .NET. La nueva sintaxis de Object Pascal, cuyos puntos más destacables van a ser descritos en este artículo, no están presentes actualmente en las versiones del compilador para Win32, pero Borland ha asegurado que actualizará dicho compilador para guardar un paralelismo que facilite el mantenimiento de una misma base de código entre proyectos Windows y proyectos .NET. Módulos y ámbitos con nombre En la plataforma .NET las definiciones de tipos se almacenan jerárquicamente en ámbitos con nombre, o namespaces, tales como System.Windows.Forms o Microsoft.Windows. Las aplicaciones pueden definir sus propios ámbitos con nombre, a fin de distribuir el código, así como hacer referencia a otros para poder usar los tipos definidos en ellos. El ámbito con nombre, sin embargo, es un concepto inexistente en Object Pascal… hasta ahora. << dnm.lenguajes.net program dotNetMania.Ejemplos.Programa1; begin … En este caso la palabra program indica que el código de este módulo se introducirá en un ámbito denominado dotNetMania.Ejemplos.Programa1. El nombre físico del archivo coincidiría con el del ámbito, añadiéndose únicamente la extensión correspondiente. El cuadro de diálogo de opciones de proyecto, en Delphi 8, cuenta con un apartado en el que puede indicarse un ámbito por defecto que se añadiría automáticamente como prefijo al nombre de los módulos, no teniendo así que especificarlo en cada uno de ellos. Los módulos de código fuente tendrían el nombre indicado tras program o unit, pero los generados por el compilador reflejarían el nombre completo incluyendo el ámbito por defecto. Figura 1. Podemos establecer un ámbito por defecto en las opciones de proyecto Para completar la posibilidad de trabajar con ámbitos con nombre, en esta nueva versión la cláusula uses, utilizada para hacer referencia a módulos externos, contempla la posibilidad de ir acompañada de nombres completos de ámbito. Por ejemplo: amplia del concepto de privado. En la CLS, sin embargo, un miembro private debe ser visible exclusivamente para los miembros de la clase de que forma parte, pero nunca desde el exterior. Con la visibilidad protegida ocurre otro tanto. En Object Pascal un miem- uses System.Windows.Form, System.Drawing, System.Net, dotNetMania.Ejemplos.Programa1; A la hora de hacer referencia a un determinado tipo, por ejemplo el nombre de una clase, una estructura o enumeración, pueden emplearse referencias completas, precediendo el identificador de tipo del nombre completo del ámbito, o bien referencias simples siempre que éstas no entren en conflicto con identificadores locales. Tras añadir la anterior cláusula uses a un módulo, por ejemplo, los identificadores Form y System.Windows.Forms.Form serían equivalentes, haciendo referencia en ambos casos a la clase Form del ámbito System.Windows.Forms. Visibilidad de los miembros de un tipo Hasta la versión del compilador incorporado en Delphi 7, Object Pascal contemplaba la existencia en un tipo, por ejemplo la definición de una clase, de miembros privados, protegidos, públicos y publicados, utilizándose las palabras clave private, protected, public y published para especificar la visibilidad de un bloque de declaraciones. Todos los lenguajes .NET pueden asignar a los miembros de sus tipos una visibilidad entre tres posibles: pública, protegida y privada. El problema estriba en cómo se entienden estos términos, existiendo diferencias entre los lenguajes .NET, para ser más exactos la especificación común, y Object Pascal. En Object Pascal un miembro private es accesible desde la propia clase y también desde cualquier punto del módulo en que se ésta se haya definido. Podríamos decir que es una interpretación bro protected es visible desde la propia clase, las clases derivadas de ésta y cualquier punto del módulo del que forme parte. En la plataforma .NET un miembro protegido sólo puede ser visible en la clase donde se ha definido y las clases derivadas a partir de ella, exclusivamente. Las estructuras de datos con métodos y propiedades no deben ser vistas como sustitutas de clases, su aplicación se reduce a tipos más o menos simples aunque con alguna funcionalidad Cómo podría Object Pascal adecuarse a las exigencias de la CLS y, al tiempo, evitar que el código existente dé problemas a causa del cambio. Si Borland hubiese optado simplemente por restringir la visibilidad de los miembros private y protected, evitando que sean accesibles desde puntos del módulo externos a su clase, la conversión de proyectos de versiones previas sería más problemático. Por ello se eligió añadir dos nuevos modificadores de visibilidad: strict protected y strict private, que serían funcionalmente equivalentes a los protected y private de C# o Visual Basic. Teniendo en cuenta estos nuevos modificadores, ahora la definición de <<dotNetManía Los módulos Object Pascal, ya sean módulos de programa, de paquete o cualquier otro tipo, indican su nombre tras palabras clave como program, unit, library y package. Dicho nombre, además, establece indirectamente también el nombre del archivo físico, algo habitual en Pascal. La nueva versión del compilador de Object Pascal contempla el uso de las mismas palabras clave anteriores para recoger no sólo el nombre del módulo, sino la especificación de un ámbito completo. Podemos, por tanto, iniciar un programa con una línea así: 41 << dnm.lenguajes.net una clase podría tener la estructura siguiente: tras que la segunda es un tipo por referencia, del que van creándose objetos MiClase = class strict private MiembroPrivado: string; strict protected MiembroProtegido: string; private MiembroDeEnsamblado: string; protected MiembroProtegidoDeEnsamblado: string; public MiembroPublico: string; end; mediante asignación dinámica de memoria. Además, las estructuras no pueden contar con métodos virtuales ni heredar unas de otras. En Delphi .NET podríamos definir una estructura de datos como la siguiente sin problemas, posibilidad inexistente en versiones previas del compilador de Object Pascal. Figura 2. El Explorador de código contempla los nuevos modificadores de visibilidad de Object Pascal <<dotNetManía Estructuras de datos más funcionales 42 En Object Pascal las estructuras de datos, definidas como registros con la palabra clave record, pueden contener exclusivamente variables, campos de datos que, además, son accesibles públicamente desde cualquier punto en el que sea visible el tipo. En los lenguajes .NET, por el contrario, las estructuras de datos pueden contener miembros de otros tipos, como puedan ser los métodos, las propiedades y los constructores, además de especificadores de visibilidad idénticos a los de las clases. Incluso pueden implementarse interfaces en una estructura. ¿Cuál es, entonces, la diferencia entre una estructura y una clase? Básicamente que la primera es un tipo por valor, que se aloja en la pila, mien- TPunto = record strict private x, y: Integer; public constructor Create(FX, FY: Integer); procedure Dibuja; end; A pesar de contar con un constructor, las variables de tipo TPunto se alojarían como valores en la pila, como un número o un carácter, no como un objeto de una clase. bilidad está ahora presente mediante la nueva palabra clave final, cuyo uso se muestra en el siguiente fragmento de código: ClaseBase = class public procedure Metodo: virtual; end; ClaseDerivada = class(ClaseBase) public // marcamos el método como de uso final procedure Metodo; override; final; end; Este mismo concepto puede aplicarse también a la definición de una clase, convirtiéndola en clase de uso final, es decir, una clase de la que no podrían derivarse otras. Si, por ejemplo, definimos una clase especializada en una tarea muy específica, no tendría sentido permitir la creación de otras a partir de ella. En un caso así su cabecera incluiría la palabra sealed. Ver figura 3. ClaseEspecializada = class sealed … Figura 3. El compilador nos indica que no podemos derivar de una clase de uso final Métodos y clases de uso final El mecanismo de herencia de Object Pascal, como el de cualquier otro lenguaje orientado a objetos, permite redefinir en una clase derivada miembros declarados como virtuales en la clase base. Esto hace posible la especialización de los métodos sin obstaculizar el mecanismo de utilización genérica conocido como polimorfismo. Lo que no existía hasta el momento era la opción de redefinir el método y, al tiempo, indicar que no podría redefinirse más en clases derivadas. Dicho en otras palabras: convertir un método heredado en un método de uso final. Esa posi- Una clase de uso final es lo inverso de una clase abstracta, pensada exclusivamente para servir como base de otras y no para crear objetos a partir de ella. Para que una clase fuese considerada abstracta debía obligatoriamente contener al menos un método abstracto, sin implementación, algo que también ha cambiado en esta nueva versión. Ahora podemos hacer abstracta cualquier clase simplemente añadiendo el modificador abstract en la definición: ClaseAbstracta = class abstract … << dnm.lenguajes.net En la plataforma .NET cualquier clase puede contar con miembros de clase, también conocidos como miembros estáticos. Estos miembros, que pueden ser variables, propiedades y métodos, pertenecen a la clase en sí, no a los objetos que pudieran crearse de ella. Para utilizarlos se dispone el nombre de la clase y, a continuación, el nombre del miembro. En la biblioteca de clases .NET existen clases compuestas exclusivamente de miembros estáticos y que son de uso final, ofreciendo servicios para los cuales no es necesario crear objetos previamente. Object Pascal cuenta con la noción de métodos de clase, pero su implementación al nivel del compilador es distinta de los miembros estáticos de una clase .NET. No existía, hasta el momento, la posibilidad de definir variables y propiedades de clase. En esta nueva versión los métodos de clase .NET se denominan métodos estáticos de clase, definiéndose mediante la adición de la palabra clave static al final. Las variables de clase se definen en apartados class var, equivalentes a var pero cuyos miembros pertenecerán a la clase, y las propiedades de clase simplemente anteponiendo la palabra class, como puede verse en el siguiente fragmento de código. Object Pascal es la posibilidad definir unos tipos dentro de otros, es decir, tipos anidados. Una clase, por ejemplo, podría contener la definición de otra clase, que sería o no accesible desde el exterior dependiendo de la visibilidad que tenga. La definición de un evento en Delphi 8 contempla la necesidad de la multidifusión, algo habitual en la plataforma .NET. Un mismo evento puede estar vinculado a varios métodos, de tal forma que todos ellos se ejecutarían en el momento en que se genere dicho evento. Para dar cabida a esta nueva necesidad, la definición de un evento // Clase TPunto con algunos operadores sobrecargados TPunto = class strict private FX, FY: Integer; public // Operador + class operator Add(A,B: TPunto): TPunto; // Operador class operator Subtract(A,B: TPunto): TPunto; // Operador string() class operator Implicit(A: TPunto): string; … end; // Implementación del operador de suma class operator TPunto.Add(A,B: TPunto): TPunto; begin // Creamos un nuevo objeto con coordenadas // suma de los dos puntos result := TPunto.Create(A.X+B.X,A.Y+B.Y); end; MiClase = class sealed private class var Variable: Integer; // una variable de clase public class procedure Metodo; static; // Método estático de clase // Propiedad de clase class property Propiedad: Integer read Variable write Variable; end; Esta clase, de uso final, tiene una variable de clase, un método estático de clase y una propiedad de clase, de tal manera que podría utilizarse completamente usando la sintaxis MiClase.Metodo o MiClase.Propiedad, sin tener que crear objeto alguno. Otras novedades y cambios Otra de las novedades que incorpora la nueva versión del compilador de Un concepto novedoso introducido en la plataforma .NET es la posibilidad de asociar atributos a los tipos y sus miembros, datos que se convierten en meta-información que se almacena en los ensamblados conjuntamente con el código y puede recuperarse posteriormente con el mecanismo de reflexión. La sintaxis con la que se usan los atributos en Delphi 8 es prácticamente idéntica a la de C#, situándose entre corchetes delante del elemento al que se asociará. Por último, también hay que mencionar los elementos del lenguaje que han desaparecido por ser totalmente incom- sustituye los apartados read y write, utilizados hasta ahora, por add y remove, y la asignación directa de un método a un evento por los procedimientos Include y Exclude. En una clase además de variables, métodos, propiedades y eventos también es posible ahora definir operadores. La sobrecarga de operadores facilita la ejecución intuitiva de ciertas operaciones. La sintaxis general queda resumida en el siguiente fragmento de código: patibles con la plataforma .NET, entre los cuales destacaríamos el operador @, la directiva absolute, los tipos Pointer y PChar, el tipo Real48, los archivos tradicionales de Pascal file of tipo o los procedimientos de gestión de memoria como GetMem y FreeMem. Todos ellos tienen un tipo o mecanismo equivalente o similar en la plataforma .NET. Como puede apreciarse, los cambios sufridos por el lenguaje Object Pascal en su adaptación al universo .NET han sido muchos y, algunos de ellos, importantes. Se han descrito los que el autor ha considerado de mayor relevancia pero sin ánimo de ser exhaustivos. En la cartera quedan otros temas, quizá de uso menos habitual, como las clases que actúan complementando a otras (class helpers), alguna directiva nueva como $AUTOBOX o el operador & para poder usar como identificadores palabras que son reservadas en Object Pascal. <<dotNetManía Miembros de clase 43 Por Ángel Esteban Software Architect Alhambra-Eidos Configuración de varios sitios Web en IIS 6.0 con una misma dirección IP En el presente artículo se va a comentar cómo configurar el servidor Web que nos ofrece Windows Server 2003 para disponer de múltiples sitios Web con una misma dirección IP. Esto nos va a suponer un ahorro considerable de direcciones IP. El mecanismo que nos va a permitir reutilizar de esta manera las direcciones IP se denomina encabezado de host, y es el concepto que pasamos a explicar a continuación. << Existe la posibilidad de utilizar la misma dirección IP <<dotNetManía entre diferentes sitios Web. Esta situación en la que varios sitios Web comparten una misma dirección IP se denomina multihosting (hospedaje múltiple o servidor multisitio). Con un solo equipo y una instalación del servidor Web IIS 6.0 (Internet Information Services) puede dar la impresión de que disponemos de múltiples equipos, con un sitio Web distinto en cada máquina, cuando en realidad pueden estar en la misma. Esta característica de servidor multisitio es bastante interesante para los proveedores de servicios de Internet, ya que podrá ofrecer a cada cliente un nombre de dominio que tendrá asociado una dirección IP distinta. Teóricamente se pueden crear un número ilimitado de sitios Web dentro de un mismo servidor. En IIS 6.0 tenemos dos opciones a la hora hospedar diferentes sitios Web: 44 • Asignar varios nombres de dominio y direcciones IP a una tarjeta adaptadora de red, es decir, una dirección IP distinta para cada sitio Web. • Utilizar una única dirección IP en una tarjeta de red y asignar varios nombres de dominio a la misma dirección, cada nombre de dominio se corresponderá con un sitio Web diferente. En este caso a una misma dirección IP le corresponden varios sitios Web (multihosting). • Un sitio Web va a distinguirse atendiendo a la combinación de tres parámetros: • Una dirección IP. • Un número de puerto. • Un encabezado de host. Una vez que hemos utilizado el encabezado de host dentro de IIS ya no podemos utilizar la dirección IP del servidor Web para acceder al sitio Web predeterminado de dicho servidor El encabezado de host (host header name) es el nombre con el que los usuarios conocen el sitio Web, es decir, se corresponde con el nombre de dominio asociado a un sitio Web, por ejemplo www.dotnetmania.com es el encabezado de host del sitio Web de esta revista. Cuando un cliente solicita una página a través del navegador Web la cabecera de petición HTTP correspondiente contendrá, además de la dirección IP de la máquina, el nombre de dominio que aparece en la URL. Esa información es detectada por el servidor Web e interpretada de forma conveniente para determinar qué sitio Web ha demandado el cliente, de esta forma se podrá diferenciar los sitios Web que tienen asignados una misma dirección IP. Se debe recordar que para poder utilizar un nombre de dominio lo debemos registrar en el sistema de << dnm.servidores.iis nombres de dominio (DNS, Domain Name System) a través de un servidor de nombres. El encabezado de host es una característica ofrecida por el protocolo HTTP 1.1, por lo tanto los navegadores que se conecten a nuestro servidor también deben soportar esta característica, que nos permitirá distinguir entre los diferentes sitios Web asociados a una misma dirección IP. El encabezado de host es soportado por los navegadores Internet Explorer y Netscape Communicator a partir de sus versiones 4.0. Los navegadores más antiguos no soportan los encabezados de host, por lo tanto, en el caso de que varios sitios Web compartan la misma dirección IP, el servidor Web no podrá determinar a qué sitio Web quiere acceder el usuario, ya que no ha enviado la información que identifica el nombre del sitio Web (nombre de dominio) al que se quiere acceder. En estos casos lo recomendable es actualizar la versión del navegador Web. número de puerto y que se distingan por el encabezado de host. Configurando el sitio Web La herramienta de configuración de IIS 6.0, es decir, el Administrador de Servicios de Internet (Administrador de Internet Information Services) nos ofrece la posibilidad de realizar la configuración de los encabezados de host para nuestro sitio Web. Esto nos lo permite hacer a través de la hoja de propiedades de sitio Web. Al diálogo de identificación avanzada de sitio Web llegamos desde la hoja de propiedades del sitio Web pulsando el botón “Avanzadas”. En el diálogo que aparece en la siguiente figura se nos permite configurar el encabezado de host, así como la dirección IP y el número de puerto del sitio Web. Figura 2. Especificando el encabezado de host ción IP ni en el encabezado de host, automáticamente el servidor Web mantendrá este sitio Web detenido hasta que no se haya subsanado el error. El encabezado de host también lo podemos indicar a la hora de crear un nuevo sitio Web. En el segundo paso del asistente de creación del sitio Web aparece una caja de texto en la que podemos especificar este dato, tal como se puede apreciar en la figura. Por defecto el encabezado de host aparece en blanco. Utilidad del encabezado de host Figura1. Identificación avanzada de sitio Web Figura 3.Asistente para la creación de un sitio Web En este diálogo se ofrecen una serie de botones, “Agregar”, “Quitar” y “Modificar” que nos permiten cambiar las diferentes configuraciones de identificación para el sitio Web, cuando pulsamos alguno de estos botones aparece otro dialogo, como el de la siguiente figura, que nos permite modificar o añadir las propiedades que van a identificar de forma única un sitio Web. También es posible indicar el número de puerto SSL en el caso que se utilicen conexiones seguras. Si se modifica la configuración de un sitio Web y entra en conflicto con otro existente, es decir no se diferencian ni en el número de puerto ni en la direc- Una vez que hemos utilizado el encabezado de host dentro de IIS ya no podemos utilizar la dirección IP del servidor Web para acceder al sitio Web predeterminado de dicho servidor. Si queremos hacer esto debemos asignar la dirección IP del servidor a un sitio Web determinado como si fuera un encabezado de host, es decir, el encabezado de host sería la propia dirección IP y no un nombre de dominio. Con este apunte finaliza este artículo que espero sea de gran utilidad a la hora de configurar servidores Web con Internet Information Services. <<dotNetManía Ya sabemos que un sitio Web dentro de IIS 6.0 viene definido por la combinación de tres parámetros: dirección IP, número de puerto y encabezado de host. Para que un sitio Web se distinga de otro debe diferenciarse en al menos en uno de los parámetros citados anteriormente. Los sitios Web pueden compartir dos cualesquiera de sus tres componentes de identidad con otros sitios Web, siempre y cuando se diferencien en el tercero. De esta forma dos sitios Web pueden tener el mismo encabezado de host y la misma dirección IP pero distinto número de puerto. Si asignamos a un sitio Web un número de puerto distinto del estándar (el puerto 80), nuestros clientes deberán escribir el número de puerto en la URL. De las múltiples combinaciones que pueden surgir a la hora de albergar distintos sitios Web, la más interesante puede ser la de sitios Web que compartan la misma dirección IP y el mismo 45 Por Pedro Gómez Alhambra-Eidos Particiones de Directorio de Aplicaciones Active Directory en Windows 2003 permite la creación y configuración de una nueva partición de directorio llamada Partición de Directorio de Aplicaciones. Esta partición se replica sólo en los controladores de dominio determinados y siempre que ejecuten Windows 2003. << Las aplicaciones y los servicios podrán utilizar esta par- tición como base de datos y utilizar así las ventajas que ofrece Active Directory. Los miembros del grupo de administradores del Enterprise pueden crear y administrar dichas particiones. Estas particiones tienen la ventaja de que sus datos se replican con otros controladores de dominio del bosque para proporcionar redundancia y tolerancia a errores. ¡Sólo con los controladores de dominio especificados! Con lo cual, replicaremos en los controladores que nos resulten localmente más útiles. Otra ventaja es que las aplicaciones y los servicios que utilizan LDAP podrán seguir utilizando este protocolo para almacenar datos y acceder a los mismos. Al igual que una partición de dominio, la partición de aplicaciones forma parte del espacio de nombres del bosque y sigue la misma nomenclatura. Sus tres posibles ubicaciones en un bosque serían: <<dotNetManía • Nuevo árbol de bosque 46 Estas particiones tienen la ventaja de que sus datos se replican con otros controladores de dominio del bosque para proporcionar redundancia y tolerancia a errores • Árbol secundario de una partición de directorio de aplicaciones • Árbol secundario de una partición de directorio de dominio KCC (Generador y Comprobador de Topología de Réplica) mantiene automáticamente la topología de replicación de todas las particiones y mantiene la misma programación de réplica que las particiones de dominio. También está la ventaja de que los objetos almacenados en una partición de directorio de aplicaciones no se replican al Catálogo Global. El motivo es evitar que las consultas LDAP a distintos Catálogos Globales no devuelvan datos incoherentes. Creación de una partición de Aplicación 1. Abrimos Símbolo de Sistema y ejecutamos ntdsutil 2. Escribimos domain management 3. Desde domain management, escribimos connection 4. Desde connection, escribimos connect to server nombreservidor 5. Desde connection, escribimos quit 6. Desde domain management, podemos hacer lo siguiente: • Para crear una partición escribimos: create nc particióndirectorioaplicaciones controladordedominio • Para eliminar una partición escribimos: delete nc particióndirectorioaplicaciones << dnm.servidores.windows nar la última réplica de una partición de aplicaciones ya que podemos perder los datos que estén en esa partición definitivamente. Mostrar la información sobre una Partición del Directorio de Aplicaciones Figura 1. En el ejemplo, creamos una partición de directorio de aplicaciones llamada test y que se va a ubicar en un dominio llamado exchange2003.aes. El parámetro null sirve para especificar que queremos crear dicha partición en el controlador al cual estamos conectados. Si no, tendremos que escribir el nombre DNS del controlador de dominio 1. Abrimos Símbolo del Sistema y escribimos ntdsutil Otra ventaja es que las aplicaciones y los servicios que utilizan LDAP podrán seguir utilizando este protocolo para almacenar datos y acceder a los mismos. Figura 2. En el ejemplo, añadimos una réplica de la partición test a un controlador de dominio llamado exchange2.exchange2003.aes Agregar o eliminar una Réplica de una Partición de Directorio de Aplicaciones Una réplica es una instancia en otro controlador de dominio. Los pasos a seguir son los siguientes: • Para agregar una réplica escribimos: Add nc replica particióndirectorioaplicaciones controladordedominio Figura 3 • Para eliminar una réplica escribimos: Remove nc replica particióndirectorioaplicaciones Para añadir o eliminar una réplica, podemos utilizar también el comando null. Debemos tener cuidado al elimi- 2. Escribimos domain management 3. Desde domain management, escribimos connection 4. Desde connection, escribimos connect to server nombreservidor 5. Desde connection, escribimos quit 6. Desde domain mangement escribimos list <<dotNetManía 1. Abrimos Símbolo del Sistema y escribimos ntdsutil 2. Escribimos domain management 3. domain management, escribimos connection 4. Desde connection, escribimos connect to server nombreservidor 5. Desde connection, escribimos quit 6. Desde domain mangement podemos hacer lo siguiente: 47 << dnm.servidores.windows También está la ventaja de que los objetos almacenados en una partición de directorio de aplicaciones no se replican al Catálogo Global Al crear la zona nos aparecerá la opción de la figura 5. También, mediante la línea de comandos se puede implementar de la siguiente manera: Figura 4 1. Abrimos Símbolo de Sistema 2. Escribimos: dnscmd nombreservidor /createbuiltindirectorypartitions /Domain/Forest/AllDomains Figura 5 En el servidor DNS se habrá creado la zona correspondiente a la partición. De no ser así, se puede crear manualmente desde la consola de DNS. Ver figura 4. nombreservidor es el nombre DNS del Servidor DNS y es obligatorio. createbuiltindirectorypartitions Crea una partición de directorio de aplicaciones predeterminada. /Domain Crea una partición de directorio de aplicaciones DNS predeterminada para todo el dominio donde se encuentra el servidor DNS especificado. /Forest Crea una partición de directorio de aplicaciones DNS predeterminada para todo el bosque donde se encuentra el servidor DNS especificado. /AllDomains Crea una partición de directorio de aplicaciones DNS predeterminada de todo el dominio en un servidor DNS de cada dominio del bosque. El parámetro nombreservidor se omite para /AllDomains ya que el equipo en el que se ejecute este comando debe unirse a un dominio del bosque en el que se desean crear todas las particiones de directorio de aplicaciones predeterminadas de todo el dominio. Se libera la Beta 1.0 de SharpDevelop: Fidalgo Se libera la Beta 1.0 del Proyecto Mono SharpDevelop Fidalgo (beta 1 de SharpDevelop) ya está terminado y ya está en el modo de sólo corregir bug. Cuenta con características como integración con NUnit, Holding, Assambly Analyzer, C++.NET backend, panel mini visor de clases, conversor VB.NET a C#, mejora de los File Templates y de la importación/exportación a Visual Studio .NET. SharpDevelop o #develop es un IDE gratis para proyectos de VB.NET y C# para la plataforma .NET. Es Open Source bajo licencia GPL Tras la adquisición de Novell, Mono el proyecto del Miguel de Icaza, una implementación open source del framework .NET para Linux, Unix y Windows. Mono pretende aportar un entorno de desarrollo para Linux con la mayor productividad conocida, permitir a los desarrolladores escribir aplicaciones del lado del servidor, aplicaciones cliente y servicios web y desplegarlos bajo Linux, Solaris, MacOs X, Windows NT/XP y otros sistemas UNIX. Esta es la primera beta de dos previstas antes de publicar la versión definitiva. http://www.go-mono.com/archive/beta1/beta1.html Más información en: http://www.icsharpcode.net/OpenSource/SD/ noticias.noticias.noticias.noticias << dnm.opensource.net por Juanjo Ariño lphant, primer peer to peer bajo .NET lphant es un proyecto de código abierto que implementa un cliente peer to peer (p2p) para la red eDonkey/eMule. Está escrito en C# íntegramente y es compatible con eMule y eDonkey (pudiendo incluso continuar descargas iniciadas con estos programas). <<dotNetManía proyecto lo hemos desarrollado un << Este grupo de programadores que inicialmente 50 trabajábamos con C++ y que colaborábamos en el desarrollo de eMule. Las motivaciones iniciales fueron aprender C#, el entorno .NET y comprobar la potencia de .NET en una aplicación exigente en cuanto a comunicaciones, multihilo, CPU, estabilidad y manejo de memoria. Una aplicación p2p para la red eDonkey maneja cientos de conexiones simultáneas, tanto entrantes como salientes y no sólo se limita a TCP sino que usa intensivamente UDP. Todas estas conexiones tienen que sincronizarse para acceder a ficheros o a listas, por lo que las capacidades multihilo hay que explotarlas. Además, el programa debe de permanecer muchos días sin reiniciarse por lo que se tiene que ser extremadamente cuidadoso con la estabilidad y el consumo de memoria. El uso de la CPU también es importante ya que debe de funcionar en background mientras el usuario hace un uso habitual del resto de aplicaciones, sin notar un descenso en su rendimiento (continuamente mientras el ordenador se dedica a otras tareas (por ejemplo reproducir video con buena calidad)). Por otro lado debe tener un interfaz de usuario fácil de usar y un aspecto que no se puede alcanzar con los controles estándar. Antes de aparecer la plataforma .NET, para desarrollar una aplicación con estos requerimientos la opción más lógica era C++. Pero con la llegada de .NET nos pareció buena idea comprobar si puede hacer sombra a C++ en su propio terreno. En el peor de los casos aprenderíamos C# y sabríamos cuales son sus puntos flacos. Después de varios meses de desarrollo (al ser GNU, en nuestros ratos libres), de sacar más de 15 versiones, de contar con más de 3.000 usuarios simultáneos y 70.000 descargas del programa, hemos comprobado que .NET es perfectamente válido para este tipo de desarrollos. Incluso lphant supera en algunos aspectos a programas escritos en C++ más trabajados como el eMule. Teniendo en cuenta que la gran mayoría de usuarios de este tipo de aplicaciones no tiene instalado .NET Framework, este tipo de proyectos supone una justificación para que el .NET Framework se instale en una gran cantidad de ordenadores domésticos. Por nuestra experiencia, la necesidad de instalar .NET Framework no está siendo un inconveniente serio una vez pasada una fase de reticencia inicial dónde tampoco se sabía cómo funcionaba el programa. A lo largo del proyecto hemos disfrutado de las ventajas que supone emplear .NET. Particularmente hemos comprobado como no nos hemos tenido que preocupar de los detalles de la implementación y nos hemos podido centrar en la resolución del problema. Otra de las virtudes a destacar ha sido el excelente control de excepciones que lleva .NET, por lo que es bastante fácil resolver los bugs que se van encontrando. Además cuando a algún un usuario le salta una excepción nos informa con el volcado de pila si necesidad de compilar versiones de debug especiales. Los principales problemas encontrados durante el desarrollo de este proyecto han sido los relacionados con el interfaz gráfico (donde, por falta de funciones de .NET se ha tenido que usar la API de Windows) y el manejo de memoria (donde pagamos nuestra falta de experiencia para trabajar con memoria manejada). De cara a los desarrolladores interesados en aprender .NET, el código fuente de lphant puede ser muy didáctico ya que cubre muchos e importantes aspectos de la programación en .NET: Comunicaciones: lphant exprime al máximo la capacidad de comunicaciones de .NET, soportando cientos de conexiones simultáneas tanto TCP como UDP Multithreading: lphant maneja una cantidad de threads muy alta que deben de ser sincronizados para acceder a ficheros comunes o a listas (Hashtables, ArrayList,…). Modularidad: lphant utiliza la facilidad que proporciona .NET para hacer aplicaciones modulares mediante namespaces y proyectos separados. Servicios web. El núcleo de lphant es autónomo e independiente del interfaz, de esta manera el interfaz puede funcionar de forma remota, ya que el núcleo expone sus objetos como servicios web que el interfaz consume. Creación de controles y WinForms. Para el interfaz gráfico de lphant se han creado diversos controles, especialmente complejos por la interacción con la API WIN32 son los controles derivados de ListView creados. Por otro lado lphant dispone de un motor de skins para los diversos controles. XML: lphant demuestra cómo usar archivos XML ya que los usa para la mayoría de archivos que necesita, sólo en aquellos casos en los que necesita ser compatible con eMule o eDonkey no usa XML. Multilenguaje: lphant tiene un motor multilenguaje propio basado en XML Portabilidad: El núcleo de lphant se compila perfectamente con MONO. Lamentablemente al no estar totalmente soportados los WinForms en MONO no puede decirse lo mismo del interfaz. lphant destaca por tener un núcleo al que se accede tanto en local como por acceso remoto mediante SOAP, completamente separado del interfaz gráfico. El núcleo de lphant es una librería que expone todas las funcionalidades de la red eDonkey, por lo que cualquiera puede integrar la red eDonkey en sus aplicaciones con muy poco esfuerzo. Invitamos a los desarrolladores interesados en el proyecto a colaborar o a aprender con un programa muy divertido de desarrollar. En el foro de desarrollo de la página web de lphant damos soporte a la gente interesada en el código y que desea saber cómo funciona. Para más información http://www.lphant.com dnm.comunidad.net << dnm.comunidad.net Un veterano a la última La XI convocatoria del Master Eidos en Tecnologías Avanzadas para el Desarrollo de Software para desarrolladores tienen tanta solera como el Master Eidos en Desarrollo de Software. En el curso 2004/2005 entra en su undécima convocatoria. Son once años formando a lo más granado de los programadores de nuestro país y de Latinoamérica. Fundamentalmente centrado en las tecnologías de desarrollo de Microsoft, viene haciendo de la programación en .Net su asunto troncal desde hace ya tres años, de hecho la aparición de la novena edición (curso 2002/2003) prácticamente coincidió con el lanzamiento al mercado de Visual Studio .Net. Para que nos hablen de la versión prevista para el curso 2004/2005 nos hemos reunido con algunas de las personas que en Alhambra-Eidos mantienen algún tipo de responsabilidad sobre dicho curso, y que además son colaboradores habituales de este medio: Luis Miguel Blanco: Coordinador y autor de una buena parte de los contenidos del Master, así como tutor de la versión virtual. Pepe Hevia: Instructor de la versión presencial y creador destacado del material didáctico. Marino Posadas: Coordinador de muchas de las once versiones realizadas hasta ahora, instructor en ambas modalidades, autor de documentación y Microsoft MVP en 2003 y 2004 (.Net Framework y Visual C#, respectivamente). Y por último, Antonio Quirós, que realizó el primer diseño del Master allá por el año 93 y hoy continua ayudando en la adecuación programática que cada año se realiza. dnm: Podríais hacernos una breve reseña histórica de vuestro Master. Antonio Quirós: Bueno, si no hay más remedio nos remontaremos a la prehistoria (risas). Allá por 1992 comenzó a cobrar vida el área de formación de la entonces denominada Grupo EIDOS. Nuestro ámbito de especialización, cliente/servidor. Como una consecuencia natural derivamos hacia Visual Basic y SQL Server. Más tarde fue la programación web, luego XML y los servicios web. Este año en Alhambra-Eidos nos hemos decantado por la programación para dispositivos móviles. En fin que cada convocatoria tiene su leit motiv y a poco que analicemos los temaAntonio Quirós, General Area Manager de Alhambra-Eidos rios de las once convocatorias hasta ahora realizadas caeremos en como muchos recordarán, era Clipper. que estamos analizando la historia tecImpartíamos seminarios, cursos, confenológica del desarrollo de software en rencias, etc. En seguida nos planteamos los últimos once años. el diseño de un programa de más calaTodo esto, por supuesto, en cuanto do que sirviera para reglamentar y proa lo tecnológico. Si nos centramos en fundizar en el conocimiento de los prolos aspectos organizativos es de destagramadores que, por aquel entonces, aún car también que el Master pasa por dos mantenían una fuerte composición autoetapas claramente diferenciadas. Una Tampoco podíamos permanecer ajenos a la aparición de SQL Server Reporting Services. Consideramos que esta es una de las más importantes noticias para el mundo del desarrollo y, por tanto, teníamos que darle cabida en nuestros programas didacta en sus perfiles. Existía un enorme déficit en el conocimiento de la orientación a objetos y, yo creo que desde entonces eso centraba nuestra propuesta formativa. Así surgió la primera convocatoria. Luego vino Windows y el primera es la que se produce desde 1993 a 1997 en que sólo se realizan versiones presenciales y otra segunda que acaece desde 1998 donde ponemos en circulación las primeras ediciones virtuales y mixtas. En los primeros años los temas <<dotNetManía << Pocos programas formativos 51 << dnm.comunidad.net <<dotNetManía Marino Posadas, Software Architect de Alhambra-Eidos 52 tecnológicos y académicos primaban sobre los demás. Desde 1998 hay también una fuerte componente logística en toda la labor previa al lanzamiento. En este momento se alternan las tres mecánicas de organización y podemos decir con orgullo que todos los años liberamos al mercado tanto titulados que han hecho el Master en su versión presencias como en las virtual o mixta. Respecto al alumnado también aparecen cambios históricos curiosos. Los primeros asistentes procedían casi exclusivamente del mundo profesional. Su afán era reciclarse tecnológicamente, estar a la última, poder llegar a tecnologías que sus empresas les demandaban. Más tarde se realizó la incorporación del mundo universitario. Algunos alumnos venían a realizar el Master como un estudio de postgrado que les permitiera ganar puntos curriculares, ya que nuestro producto siempre ha gozado de un amplio prestigio empresarial. Por último, hay que reseñar que tras la adecuación realizada el año pasado para adecuar los contenidos del Master para que pudieran servir de base en la obtención de la certificación MCAD, el alumno que busca la obtención de dicha certificación se ha incorporado también a nuestra peculiar fauna. dnm: ¿Qué asunto consideráis que en este momento es el principal valor aportado a la colectividad de desarrolladores? Marino Posadas: Creo que existen varios valores añadidos. Por un lado, la existencia de manuales on-line que permiten un primer acercamiento a una tecnología e incluso decidir si queremos o no profundizar en un tipo de conocimientos. Por otro, los cursos tutorizados suponen que no solo vas a seguir un manual fijo y previsto para tu progreso, sino que si -como muchas veces pasa- te atascas, un profesor asociado a cada módulo puede darte respuestas tanto en línea como en diferido. Y, por supuesto, no nos olvidemos de la revista Algoritmo, donde se publican artículos de calidad sobre novedades tecnológicas, que suponen una avanzadilla y una nota de atención sobre posibles opciones a seguir en un futuro cercano. Son casi 10 años de publicaciones desde que Algoritmo estaba en papel, y todavía se la sigue considerando un producto referente para miles y miles de desarrolladores y profesionales de las TIC. Finalmente, si además queremos algún manual a bajo precio para leer en el metro, La Librería Digital completa perfectamente este panorama. dnm: Fuisteis de los primeros en abordar el formato eLearning de modo serio para este tipo de programas for- mativos. ¿Cómo valoráis estos años de trabajo al respecto? Luis Miguel Blanco: Ha resultado en una experiencia francamente positiva. Ser pionero te otorga una ventaja enorme si organizas una buena estructura formativa, marcando la pauta al resto que todavía no ha empezado. De esa manera te conviertes en el espejo en el que se miran todos aquellos que se propongan acometer un proyecto similar al tuyo. Por supuesto que esta situación te obliga a tener que trabajar más, ya que para gran parte de los procesos a desarrollar, léase elaboración y organización de los contenidos, sistemas de evaluación, establecimiento de relaciones con el alumnado, etc., debes permanecer en constante innovación, puesto que no hay nadie todavía que haya realizado nada similar. Sin embargo, y volviendo al punto anterior, abonas el terreno para los demás y eso supone un elemento posicionador muy importante en el mercado de acciones formativas eLearning. Centrándome ya en la parte de ele- De izquierda a derecha: Marino Posadas, Luis Miguel Blanco y Pepe Hevia En este momento se alternan las tres mecánicas de organización y podemos decir con orgullo que todos los años liberamos al mercado tanto titulados que han hecho el Master en su versión presencial como en la virtual o mixta << dnm.comunidad.net Novedades de la versión para el curso 2004/2005 Un módulo específico de Introducción a la ingeniería de software Un módulo específico de Programación de Dispositivos Móviles con Visual Studio .Net Ampliación del módulo de SQL Server 2000 para dar cabida a Reporting Services Actualización de todos los módulos de Java para dar cabida a las novedades de dicho mundo como los foros, la cafetería, el Tablón de Anuncios. Dichas áreas permiten tener la sensación de que realmente existe un colectivo paralelo a donde dirigirse, existiendo un grupo de personas con las mismas inquietudes y necesidades que nosotros. dnm: ¿Qué te planteas cuando diseñas y confeccionas el material que luego formará cada uno de los módulos del Master? Pepe Hevia: Ante todo, la ilusión de poder proporcionar al usuario del módulo todos los conocimientos posibles, de cara a facilitar que la asimilación de todos los conceptos que se tratan en el curso le resulte una experiencia asequible y agradable. Para ello se introducen también otro tipo de nociones ajenas al master, pero que en cierto modo puedan verse relacionadas indirectamente con él -lo cuál implica conocer, estudiar, investigar todos esos elementos y saber relacionarlos-. De esta manera el alumno puede entender toda la temática, dentro del contexto en que se va a aplicar y siempre desde la perspectiva de “romper los mitos”. Mi misión radica en hacerlo tan práctico y claro como sea posible -por mucho trabajo que esto lleve- y tan ameno como me gustaría que me contaran las cosas: con humor, ejemplos de la vida real, etc. Todo ello sin perder de vista el rigor, la seriedad y la responsabilidad que todo este proyecto conlleva, por supuesto. dnm: Qué novedades aporta la versión para el curso 2004/2005 Antonio Quirós: Este año es un poco curioso. En otras ocasiones hemos actualizado en el sentido de quitar unas cosas y poner otras. Sin embargo para el curso 2004/2005 sólo hemos ampliado, es decir que estamos ante una ver- sión, como se dice literariamente, corregida y aumentada. A nuestro programa del año pasado, ya fuertemente actualizado y estructurado a través de la noción de servicios web, le hemos añadido varias cosas. En primer lugar, un módulo dedicado a introducir en el ámbito de la ingeniería del software. El perfil del desarrollador cada vez es más alto y, por tanto, queremos huir de un programa solo tecnológico. Tenemos que hablar también de arquitectura, de metodologías, de gestión de proyectos, de aseguramiento de la calidad, etc. Asimismo, hemos introducido un módulo de programación de dispositivos móviles con Visual Studio .Net. Consideramos que este es el entorno hacia el que hoy todos los desarrolladores deben girar la vista, ya que si aún no han tenido la oportunidad de hacer alguna aplicación al respecto, les faltan décimas de segundos para que sus jefes les hagan caer el correspondiente marrón. Así, pues, desde la óptica de siempre, es decir la arquitectura multicapa ahora cubrimos la capa de interfaz con tres niveles diferentes: Windows, Web y dispositivos de movilidad. Tampoco podíamos permanecer ajenos a la aparición de SQL Server Reporting Services. Consideramos que esta es una de las más importantes noticias para el mundo del desarrollo y, por tanto, teníamos que darle cabida en nuestros programas. Para hacerlo hemos ampliado nuestro curso de SQL Server 2000 a fin de introducir dicha tecnología. Por último, y aunque eso es menos interesante para los programadores que trabajan con herramientas Microsoft, hemos actualizado también los contenidos de los módulos de Java para dar cabida a las novedades que en dicho mundo se han producido en los últimos tiempos. <<dotNetManía mentos que componen la oferta formativa de Alhambra-Eidos, creo que hemos conseguido combinar armoniosamente todas las tecnologías a nuestra disposición para lograr una relación tutoralumno altamente cercana a la presencial. Uno de los más importantes recursos lo compone el uso de nuestros videoseminarios, no sólo porque ya esté implantado, sino porque la evolución que observamos en las herramientas disponibles para su desarrollo está progresando con un alto grado de calidad, lo que permite comunicar más información al alumno a través de la combinación de elementos multimedia: audio, video, diapositivas, texto, etc. dnm: El año pasado se adecuó vuestro Master al temario necesario para preparar la certificación MCAD, tan valorada por los programadores. Esta puede realizarse a través de este plan formativo o a través de los cursos oficiales de Microsoft. ¿Qué diferencia existe? Antonio Quirós: En AlhambraEidos preparamos a los alumnos por ambas técnicas. Hay que recordar que en España somos el centro de referencia de Microsoft para formar a desarrolladores y el que más certificados MCAD entrega cada año. Una y otra son técnicas adecuadas y con las dos logramos resultados válidos. La diferencia está en que el Master aporta más valor añadido, es decir, tiene más cosas, enseña más la vertiente práctica. Si además de aprobar el MCAD quieres profundizar en las técnicas de desarrollo y en las buenas prácticas a seguir tu programa es el Master. Si lo que quieres es certificarte y, además te corre prisa hacerlo y no puedes dedicar un año académico, tu programa debe estar basado en los cursos oficiales de Microsoft. dnm: ¿Qué crees que es lo que más valoran los alumnos de vuestro Master? Marino Posadas: Quizá la organización de los cursos en una secuencia de dificultad paulatina, que permite dar pasos seguros en el proceso de aprendizaje. Éste se potencia mediante los autotests, garantizando que los pasos anteriores nos han conducido a donde nos encontramos con conocimiento de causa suficiente. También, en las versiones virtual y mixta, citaría lo que ahora se llaman “espacios de colaboración”, 53 << dnm.biblioteca.net dnm.biblioteca.net Moving to VB .NET: Strategies, Concepts, and Code Daniel Appleman Editorial: A!Press Páginas: 560, Rústica Publicado: Junio 2001 ISBN: 1893115976 Hoy nos centramos en dos autores bien conocidos por los programadores. Appleman, antiguo miembro del equipo de desarrollo de Visual Basic 1.0, nos introdujo al API de Windows hace varios años en una obra clásica. Ahora, vuelve a la carga con VB.NET donde más que una revisión del producto, nos muestra su propia visión del mismo. << Contrasta con la anterior versión, recomienda estrategias, anuncia posibilidades y enumera los cambios más importantes, en una obra que podríamos llamar “comparativa”, de la que cabe destacar, además, el estudio en profundidad de los cambios debidos a la presencia de Programación Orientada a Objetos, las capacidades Multiproceso, la interacción con COM+ y la forma en que .NET gestiona la memoria. Es una obra que se lee mejor ahora que en el momento de su aparición, cuando ya se conoce el producto y el lenguaje, y puede apreciarse mejor su perspicacia. Code:The Hidden Language of Computer Hardware and Software Charles Petzold Editorial: Microsoft Press Pag.: 393, Rústica Año: Noviembre 1999 ISBN: 073560505X <<dotNetManía Una obra curiosa, cuanto menos. Analiza en términos sencillos muchos de los fundamentos de la informática (hardware y software), y va avanzando en complejidad desde el código Morse a las interfaces de usuario visuales. Es la obra de 10 años de reflexión —según sus propias palabras en el prefacio— que el autor de “Programación en Windows”, y “Programación en Windows 95”, publicó hace 3 años para recoger toda una vida de experiencia docente y divulgadora de estos mundos. 54 Recorre los inicios, incluso remontándose al siglo IXX, revisa los logros más importantes de los pioneros de la informática del siglo pasado, y revisa desde los fundamentos conceptos archisabidos (Puertas lógicas, ASCII, Coma flotante), de los que siempre sabe entresacar la visión clara y explicativa de quien ha conocido la informática en profundidad y se plantea ahora explicarla con palabras sencillas. Para nostálgicos, pero también para novatos. Por Marino Posadas MVP Visual Developer C# Alhambra-Eidos www.elavefenix.net Entrevista a Carlos Heras << Borland lleva ya una larga trayectoria desde Turbo Pascal, pasando por Delphi y la serie de los Builder en la actualidad. ¿Cómo definirías la estrategia de Borland en estos momentos? Actualmente Borland no sólo ofrece herramientas de desarrollo, como siempre ha hecho, sino que su estrategia actual se centra en ofrecer una solución completa de desarrollo de ciclo de vida de las aplicaciones (ALM), tanto para .NET como para J2EE. Esto quiere decir que el foco para Borland en estos momentos es el equipo de desarrollo al completo que necesitan herramientas de gestión de requisitos, análisis y diseño, codificación, pruebas, despliegue y gestión de cambios y configuración. Enlazando con la pregunta anterior…y de acuerdo con las previsiones –que sé que tenéis- sobre crecimiento, ¿pensáis que en España ese crecimiento va a materializarse en alguna iniciativa concreta? En concreto en España ya se ha materializado en varias compañías que han adoptado la solución completa de Borland, y como es lógico estamos trabajando para ampliar el numero de compañías que lo adopten en los próximos meses. ¿Qué es eso sobre Borland y la “Suiza del Software”? Es un ejemplo muy explicito que usamos cuando queremos explicar la neutralidad de Borland que ofrece soluciones en todas las plataformas y lenguajes. En la actualidad, parece claro que existen dos plataformas de desarrollo que aglutinan a la mayor parte de los usuarios: J2EE y .NET. ¿Cómo se ubica Borland y cuáles son sus planes de soporte futuros? Borland es consciente de ello y por eso proporciona la misma solución para ambas plataformas. Pero además, tenemos un producto, Borland Janeva, que ofrece interoperabilidad entre .NET y J2EE a través de RMI sobre IIOP. Con este producto es posible conectar componentes .NET con servidores de aplicaciones J2EE sin necesidad de utilizar Web Services, lo que en ciertos casos supone un nivel mayor de seguridad. Respecto a la construcción misma de las aplicaciones, me consta que Borland ha publicado herramientas que pretenden cubrir el ciclo completo de desarrollo. ¿Puedes hablarnos algo más de esto? ¿Incluye eso la parte de instalación de aplicaciones? Como he comentado anteriormente la estrategia de Borland es precisamente ofrecer una solución que cubra el ciclo completo de desarrollo de aplicaciones, tanto para J2EE como para .NET. Las dos características principales de la solución de Borland son la integración y la modularidad. Integración en cuanto que todas las fases del ciclo deben estar integradas para en cualquier momento poder volver atrás, modificar algo, y ver que consecuencias tendrán esas modificaciones en el desarrollo de la aplicación. Y modularidad en el sentido de poder <<dotNetManía Carlos Heras es Alliances & Indirect Sales Manager de Borland Ibérica que junto a Néstor Miranda, Director General lleva al frente de Borland en España desde sus inicios. Aprovechando la celebración del Borland Days el pasado mes de mayo hemos querido conversar con él especialmente para que los más viejos recordemos nuestros tiempos de programadores en Turbo Pascal en DOS. 55 <<dotNetManía << dnm.directo.entrevistas 56 sustituir alguna herramienta de Borland por otra de los principales fabricantes que hay en el mercado, sin que ello implique una perdida de integridad entre las distintas fases de desarrollo de la aplicación. Dentro ya de la parte que nos interesa en esta revista (.NET), ¿Cómo sitúas Delphi .NET dentro de el panorama de los lenguajes de la actualidad? ¿Y C# Builder? ¿Os decantáis más por uno que por otro? Delphi para Borland es uno de sus productos estrella, afortunadamente tenemos varios, y su evolución a .NET creo que es un paso decisivo en la vida de este producto. Para la comunidad de desarrolladores de Delphi supone facilitarles la migración a la plataforma .NET lo que significa encaminarse al futuro sin abandonar el pasado. Borland C# Builder es un claro ejemplo de la intención de Borland de ofrecer una solución para cualquier lenguaje. Últimamente, Blake Stone, Arquitecto Principal de JBuilder se ha incorporado al equipo de desarrollo de Visual Studio .NET. ¿Qué tal os tomáis esas “deserciones”? ¿Crees que son todavía secuelas de la marcha de Anders Hejlsberg? Bueno yo no hablaría de deserción sino que simplemente Blake ha aprovechado la oportunidad que se le brindaba de mejorar su carrera profesional, y eso es algo que cualquiera haría. Por otra parte es una garantía para el futuro de cara a la buena integración entre los productos de Microsoft y de Borland, y además es un reconocimiento explicito del nivel de calidad de los ingenieros de Borland. En cuanto a las consecuencias que su marcha pueda ocasionar hay que tener en cuenta que en Borland se trabaja por equipos y que la salida de una persona, por muy valida que sea, no tiene por que suponer una merma de la productividad del equipo. ¿Cuantos desarrolladores de Delphi estimáis que habrá actualmente en el mundo? Borland tiene más de dos millones de usuarios de sus herramientas Windows. Evidentemente, una parte muy importante de esta cifra es de desarrolladores Delphi. También tenemos más de un millón en herramientas Java, y claro, la mayor parte de éstos son usuarios JBuilder. ¿Cómo afrontáis la localización de vuestros productos? El proyecto de localización se lidera en USA para todo el mundo y luego se trabaja con agencias locales. En el caso de España se traduce únicamente para España debido a las diferencias entre el castellano que se habla aquí y el que se habla en América Latina. En América Latina se utiliza la versión inglesa. Borland ibérica distribuye sus productos a través de mayoristas como Ingram Micro y GTI, pero también de minoristas como Danysoft que, sin embargo, parecen tener una estrecha relación con vosotros. La gran diferencia es que Danysoft da un gran valor añadido que nosotros estimamos muchísimo y esto hace que, efectivamente, nuestra relación con ellos sea muy estrecha. En cualquier caso mantenemos una estrecha relación de más de 15 años con Ingram Micro y GTI. Pero claro, Danysoft da servicios de formación, soporte, consultoría, etc. y esto es fundamental para nosotros. Y por último, trata de mirar por la bola de cristal, y anticípanos cómo ves el futuro inmediato de la construcción de software… Bueno resumiendo un poco creo que el futuro del desarrollo de aplicaciones se va a centrar en dos plataformas, J2EE y .NET, y que cada vez se va a industrializar más, en el sentido de una mayor utilización de herramientas especificas para cada una de las fases del ciclo de vida del desarrollo de las aplicaciones, para construir un software de mayor calidad y en el menor tiempo posible. Borland Day acoge durante su primera edición a más de 500 participantes Borland celebró ante más de 500 asistentes la primera edición de su macro evento Borland Day. Bajo el lema “Potencie su Desarrollo” dio a conocer a todos los profesionales involucrados en el proceso de desarrollo de aplicaciones, su definición, diseño, desarrollo, test, despliegue y gestión de sus soluciones totalmente integradas así como sus nuevas actualizaciones. Junto a sus principales socios estratégicos en España, Borland pretender brindar la mejor solución en la creación del software para la empresa. Con más de 20 ponencias y workshops en tres salas en paralelo destacan las áreas más importantes en el proceso creativo del software: productividad, calidad y movilidad. Durante este encuentro Borland ha aprovechado para mostrar las distintas soluciones para plataformas J2EE,Microsoft.NET, herramientas de definición y diseño, desarrollos sobre dispositivos móviles, soluciones CORBA, novedades de sus IDEs, JBuilder, Delphi, C++, y sus servicios de consultoría, formación y soporte. Borland incrementa la productividad de las empresas con el máximo rendimiento de las inversiones gracias a su estrategia ALM de gestión del ciclo de vida de las aplicaciones basada en tres cualidades primordiales: flexibilidad, rapidez y libertad de elección de la plataforma. Como partners estratégicos Borland Day contó con los líderes más importantes del sector: Accenture, Bea Systems, HP, Mercury Interactive, Microsoft, Oracle y Telefónica Móviles que mostrarán la integración de sus productos con la soluciones Borland. “En esta jornada todos los profesionales de TI, directores, responsables de proyectos, analistas y desarrolladores, habrán podido ver la única solución de desarrollo independiente, basada en estándares y totalmente integrado con los líderes del sector, con la que reducir sus costes y aumentar su productividad” aseguró Néstor Miranda, Director General de Borland Ibérica. << Suscripción a dotNetManía ❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) y beneficiarme de la oferta del 10% de descuento por un importe total de 60 € para España; o por 75 € para el resto de Europa; o por 90 € para el resto del mundo (IVA incluido). ❑ Deseo suscribirme a dotNetManía por un año (11 números) por un importe de 45 € por ser estudiante (IVA incluido). Aporto fotocopia del carné de estudiante o sello del centro académico (IMPRESCINDIBLE). OFERTA VÁLIDA SÓLO PARA ESTUDIANTES RESIDENTES EN ESPAÑA. IMPORTES VÁLIDOS HASTA NUEVA OFERTA DATOS DE FACTURACIÓN CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . DATOS DE ENVÍO (sólo si son distintos de los datos de facturación) CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . FORMA DE PAGO ❑ Talón nominativo a nombre NETALIA, S.L. ❑ Giro postal a nombre NETALIA, S.L. ❑ Transferencia bancaria a nombre de NETALIA, S.L. a: La Caixa Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia) Usted autoriza a la mecanización de estos datos. El responsable y destinatario de éstos es Netalia, S.L. Usted tiene derecho a acceder a sus datos, modificarlos y cancelarlos cuando lo desee. Sus datos no serán cedidos en ninguna de las formas posibles a terceras partes y no se utilizarán más que para el buen funcionamiento de su suscripción a la revista dotNetMania y para informarle de las actividades comerciales que realice la editorial Netalia, S.L. Si no desea recibir información comercial de esta empresa marque la casilla siguiente ❑ ❑ Domiciliación Bancaria Indique su número de cuenta: ❑ Tarjeta de crédito ❑ VISA ❑ MASTERCARD ❑ AMERICAN EXPRESS Número de su tarjeta: Fecha de caducidad: / (Imprescindible) Firma y sello (imprescindible) a ❑ Nº1 ❑ Nº2 ❑ Nº3 Envíe este formulario por email a la dirección [email protected], o al fax (34) 91 499 13 64 También puede enviarlo por correo postal a la siguiente dirección: de de 20 ❑ Nº4 C/ Robledal, 135 28529- Rivas Vaciamadrid Madrid (España) noticias.noticias.noticias.noticias.noticias << dnm.desvan Longhorn Los pasados días 24-26 de Mayo, se celebraron en Barcelona las Jornadas Académicas Microsoft Research 2004, segunda edición de los encuentros MicrosoftUniversidad que reunieron a más de 200 profesores universitarios y MVP’s de diferentes tecnologías. Durante 3 jornadas, algunos de los más sobresalientes investigadores y divulgadores de tecnologías Microsoft plantearon el “estado del arte”, bajo el epígrafe “Docencia e investigación en un mundo de Aplicaciones Orientadas a Servicios”, pudimos escuchar a: Rosa M. García, Stephen Emmott, Rafal Luckawiecki (“A Subjective View of Next Decade in IT”), Ivan Medvedev (“Security Framework on the CLR, future developments and Security at Microsoft”), David Carmona (“Nueva generación de aplicaciones orientadas a servicios Indigo, WS*”), Adam Wiener (“Microsoft Data Access current and future: import/export data from SQL Server as XML and an introduction to ObjectSpaces”), Fernando Guerrero (“SQL Server Yukon - nuevas necesidades de los sistemas de información”), Hugo Zaragoza (“Combinando Information Retrieval y Machine Learning en investigación”), Catherine Heller (“Nueva generación de herramientas de desarrollo con Visual Studio .NET Whidbey”), Pablo Rodríguez (“Distribución de contenidos en redes de datos móviles e inalámbricas”), Damien Watkins (“Multilanguage programming teaching with .NET”) , Michal Cierniak (“.NET Rotor as a research platform”) y Don Syme (“The .NET Common Language Runtime and the .NET Platform: What we’ve achieved and where we’re going”). La mayor parte de ellos, trabaja en alguno de los centros de investigación que Microsoft mantiene en Redmond, Beijing (China) o Cambridge (Reino Unido), o son conocidos divulgadores de tecnologías. Además de esta iniciativa, algunas noticias se hacen eco de las novedades que la compañía quiere implantar de cara a las búsquedas en Internet: posibilidad de búsquedas personalizadas y configurables de forma simple, epígrafes como “Cosas que he buscado antes”, “Cosas que podrían ser interesantes” (en función de preferencias del usuario), o extender el concepto de búsqueda a cualquier objeto contenedor (documento, correo, fichero, etc.). No obstante si de un producto puede decirse que aglutina un conjunto de novedades fruto de la investigación, ese es la nueva versión del S.Operativo (Windows Longhorn, ya anunciado de forma oficial para 2006 y su versión de servidor para 2007), que no sólo se ha rehecho desde cero, sino que no para de sorprendernos con nuevos apuntes sobre su arquitectura. En este caso, se trata de su modularidad. A diferencia de las versiones anteriores, en que el producto se presentaba en diferentes versiones (Home/Professional para XP y Web, Standard, Enterprise o Datacenter para el servidor), Longhorn podrá configurarse a gusto del usuario, incorporando aquellas partes que se necesiten, agrupadas por roles de actividad, según anunciaba Jim Livingston en el pasado Windows Hardware Engineering Conference (WinHEC) en Seattle. Sin embargo, en la versión de cliente, será el vendedor el que podrá realizar la selección de módulos a incluir en el sistema. Mark Myers, Senior Program Manager de Longhorn, lo daba a conocer como los “bloques de construcción del sistema”, que permitirán un tiempo de instalación de 15 minutos y un montón de nuevas características en las instalaciones distribuidas y desatendidas. Enlaces recomendados <<dotNetManía Jasoft 58 Marino Posadas Microsoft se centra en la investigación Sitio de José Manuel Alarcón, otro asiduo de congresos, autor de varios libros y colaborador habitual de revistas informáticas, mantiene este sitio, donde encontrarás muchas de sus aportaciones personales http://www.jasoft.org/ VSJ NET Home (inglés): http://www.vsj.co.uk/dotnet/ Más código abierto de productos Microsoft Ahora le toca el turno a Windows Template Library, que al igual que sucedió anteriormente con Windows Installer XML, ha sido liberado bajo Common Public License (open-source) y SourceForge Repository, como vehículos de publicación. Nuevos lenguajes .NET: F#, Zonnon, Delphi .NET y Fortran 95 .NET: La producción de compiladores para MSIL no cesa. Los últimos incorporados a la ya larga lista (más de 30 miembros) son los citados. Para más información, ver: http://www.vsj.co.uk/dotnet/display.asp?id=289 Mercado de fichajes El hasta ahora CTO de Borland, y arquitecto de JBuilder, Blake Stone, se incorpora a Microsoft en el equipo de desarrollo de Visual Studio .NET 2005 (Dpto. Visual Studio Core). Para más datos, ver http://msdn.microsoft.com/ vstudio/team/bios/blakes . La sombra de Hejlsberg sigue siendo alargada… utilidades del mes Gif Optimizer: comprime todos los GIF de un sitio sin reducción de calidad apreciable (gratis): http://chemware.co.nz/tgo.htm FABER TOYS: Para usuarios que les gusta saber que pasa en su ordenador (gratis): Ejecuta programas Windows sin utilizar el Registro. http://www.faberbox.com/fabertoys.asp
© Copyright 2024