19/12/06
CD G IN RAT CL IS UI DO
Portada SoloP 145
08:45
Página 1
LA PRIMERA REVISTA DE PROGRAMACIÓN EN CASTELLANO
Precio: 6 € (España) (IVA incluido)
•
AÑO XIII. 2.ª ÉPOCA
OPINIÓN Vista y no Vista MIDDLEWARE Primera aproximación a Windows Vista REDES Mecanismos de cache en ASP.NET 2.0 Programación JavaScript Orientada a Objetos
• Nº 145 •
UNA PUBLICACIÓN DE:
REVISTAS PROFESIONALES S.L.
DISEÑO Sistemas SCM para la Gestión de la Configuración del Software VÍDEO-TUTORIAL Desarrollo de una bolera virtual con Java y Eclipse CANAL PANDA Los mitos en la seguridad
Técnicas avanzadas de programación AJAX con ASP.NET
Mobile Web Controls Crear un portal web para dispositivos móviles implica tener en cuenta la heterogeneidad de los mismos y sus variables: tamaño de la pantalla y de teclado, navegador web, lenguaje soportado…
Los Mobile Web Controls de ASP.NET permiten crear páginas web visibles en todo tipo de dispositivos móviles, siendo transparente para el desarrollador las peculiaridades de los mismos, y evitando de esta manera hacer una página para cada dispositivo.
Noticias, javaHispano, Comunidad .NET, Libros, CD-ROM, Preguntas y Respuestas
INTERIOR PORTADA.qxd
20/12/06
11:30
Pรกgina 66
03 Editorial 145.qxd
20/12/06
11:11
Página 3
EDITORIAL Número 145 Ed i t a : R EVISTAS PROFESIONALES S.L. solop@revistasprofesionales.com
¿LE IMPORTA QUE LE HAGA UNAS PREGUNTAS? Solo Programadores quiere agradecer a todos los lectores que,
C/ Valentin Beato 42,3ª.28037 - Madrid.
pacientemente, responden a las encuestas que se van planteando en la
http://www.revistasprofesionales.com
zona privada. En el momento de escribir estas líneas, el 89% de las
http://digital.revistasprofesionales.com
respuestas están de acuerdo en que concentrar varios artículos de
E d i to r Agustín Buelta •••••••••••••••••••••••••••••••••• Co o r d i n a c i ó n T é c n i c a - R e d a c c i ó n Carlos Laparra ••••••••••••••••••••••••••••••••••
temática similar es una buena idea. Por eso, empezamos el año 2007 dedicando bastantes páginas de Solo Programadores a ASP.NET. Para bien o para mal, la historia de Internet y su imparable dinamismo exigen al programador de aplicaciones web una serie de conocimientos y habilidades que no tienen mucho que ver con la programación de
Maquetación
aplicaciones que se estudia en las facultades de informática. En la web,
Alfonso Sabán Mejías
lo “normal” es programar de modo desordenado, sin disponer ni siquiera
•••••••••••••••••••••••••••••••••• As e s o r í a d e Pu b l i c i d a d Felipe Ribagorda Tel.:91 304 87 64 D e l e g a c i ó n e n B a r ce l o n a C/ Rocafort,241/243,5º 1ª Mariano Sánchez
de tipos, empleando una gran cantidad de código para desempeñar tareas sencillas... y sin poder aislar completamente el contenido de la presentación, y mucho menos de la funcionalidad. ASP.NET es la propuesta de Microsoft para ordenar este caótico (a la vez que encantador) mundo de la programación web que, paradójicamente y pese a todos sus inconvenientes, no hace más que crecer.
Tel.:93 322 12 38 •••••••••••••••••••••••••••••••••• S u s c ri pc i o n e s Tel:91 304 87 64 Fax:91 327 13 03 ••••••••••••••••••••••••••••••••••• I m p re s i ó n
SUMARIO
L.M.S.Solución Gráfica ••••••••••••••••••••••••••••••••••• D i s t ri b u c i ó n
OPINIÓN 12
Vista y no Vista
DISPOSITIVOS MÓVILES Motorpress Ibérica D I S T R I B U C I O N E N M E X I CO DIMSA - C/ Mariano Escobedo,218 Col.Anáhuac.11320 México,D.F. D I S T R I BUCION EN ARG E N T I N A Capital Federal:Distrimachisa Interior:York Agencysa - Tlf:(5411) 433 150 51 •••••••••••••••••••••••••••••••••• Quedan expresamente prohibidas la reproducción,la distribución y la comunicación pública de todo o parte de los textos contenidos en esta publicación,por cualquier medio y en cualquier soporte,y para cualquier fin,incluyendo la realización de resúmenes de prensa comerciales,sin la autorización expresa de esta Editorial,conforme a lo dispuesto en la vigente Ley de Propiedad Intelectual.La infracción de la presente prohibición será perseguida penalmente.
14
Mobile Web Controls de ASP.NET
MIDDLEWARE 22
Primera aproximación a Windows Vista
REDES 32 40 46
Mecanismos de cache en ASP.NET 2.0 (I) JavaScript Orientado a Objetos (I) Extensiones AJAX para ASP.NET (II)
DISEÑO 54
Sistemas SCM para la Gestión de la Configuración del Software (I)
VÍDEO-TUTORIAL 64
Bolera virtual
Depósito legal:M-26827-1994 P R I N T E D I N S PA I N COPYRIGHT 30-06-2005 P.V.P.6,00 Euros Precio en Canarias,Ceuta y Melilla: 6,15 Euros
Asociación Española de Editoriales de Publicaciones Periódicas
Y ADEMÁS. . . 04 06 08 10 60 62 66
Noticias javaHispano: Virtual Ant, ICEfaces, Borland y más Canal Panda: Los mitos en la seguridad Comunidad .NET: ¿Preparados para un nuevo día? Libros. Búsqueda de libros en Google Books Preguntas y Respuestas CD-ROM.
04-5 Noticias.qxd
20/12/06
11:16
Página 4
NOTICIAS
ICROSOFT
El lanzamiento de productos más importante de su historia La disponibilidad para empresas de Windows Vista, 2007 Microsoft Office system y Exchange Server 2007 es el lanzamiento más importante en toda la historia de Microsoft. Diseñados para ayudar a las empresas a prosperar en un mundo caracterizado por la comunicación inmediata, el crecimiento del volumen de información y su constante cambio, estos nuevos productos proporcionan una plataforma que, según la compañía, mejorar el modo en que las personas convierten la información en nuevas oportunidades de negocio. Estos tres productos juntos se centran en cuatro áreas críticas: Simplificar la forma en que la gente trabaja en equipo: Desde las nuevas funcionalidades de Windows diseñadas para los trabajadores móviles y la mensajería unificada facilitada por Exchange Server 2007, hasta las herramientas de colaboración y gestión documental incluidas en Microsoft Office SharePoint Server 2007, los nuevos productos cambiarán la forma en que la gente trabaja en equipo, en cualquier lugar y momento. Localizar la información y mejorar la perspectiva del negocio: La completa integración con la plataforma y la disponibilidad de las nuevas tecnologías de búsqueda y las herramientas de inteligencia del negocio, más potentes y fáciles de utilizar, ayudarán a los empleados a localizar y utilizar la información de una manera más sencilla, agilizando el camino que va desde la creación de una idea hasta su ejecución. Ayudar a proteger y gestionar el contenido: Las herramientas de gestión avanzada del contenido y de retención de documentos combinadas con las funcionalidades para mejorar la protección de la confidencialidad de los datos, convierten al proceso de autorización al contenido en el punto de partida para los procesos de negocio automatizados y el cumplimiento con las nuevas medidas regulatorias. Incrementar la seguridad y ayudar a reducir los costes de TI: Con una seguridad mejorada por defecto y por diseño, las nuevas versiones de Windows, 2007 Office system y Exchange Server 2007 ofrecen un gran avance en materia de seguridad, agilizando la instalación y gestión, ayudando a reducir los costes y permitiendo a los departamentos de TI centrarse en facilitar nuevas capacidades que proporcionarán una gran ventaja estratégica.
El impacto económico de Windows Vista Según un informe realizado por la consultora IDC, para Microsoft este lan-
IPSOFACTO
El uso de la tecnología Voz sobre IP Según un estudio realizado por Ipsofacto (www.ipsofacto-research.com), empresa del grupo Elogia especializada en investigación online, sólo el 24% de los internautas conoce la tecnología de telefonía Voz sobre IP, y Skype es la herramienta más empleada por los españoles. La investigación, también centrada en el uso de mensajes instantáneos, se ha obtenido realizando entrevistas a una muestra de 600 individuos, representativa de la población española que tiene acceso a Internet, a través de la metodología CAWI (Computer Assisted Web Interviewing). El objetivo de la investigación era observar el cambio que está teniendo lugar en las formas de comunicación a distancia entre individuos, gracias a la rápida difusión de las nuevas tecnologías en los hogares españoles. Según los resultados obtenidos, la penetración de Voz sobre IP en España, y con ella la posibilidad de llamar por teléfono a costes muy baratos o incluso gratis, es todavía baja. Probablemente la causa sea la frecuente inclusión del coste de las llamadas telefónicas en las cuotas mensuales de acceso a Internet, SOLO PROGRAMADORES nº 145
4
zamiento es un acontecimiento importante, ya que el sistema operativo Windows para equipos cliente representa el 30% de los ingresos de Microsoft y el 60% de los ingresos operativos. Pero el impacto de Windows Vista en el mercado va a ir mucho más allá de Microsoft, ya que también va a impulsar los ingre- Kevin Johnson, co-presidente sos y el crecimiento de muchas compa- de la División de Servicios ñías de TI de todo el mundo que venden y Plataformas de Microsoft y Rosa Mª García, hardware, desarrollan software, propor- Corporation presidenta de Microsoft Ibérica, cionan servicios para TI o actúan como en la rueda de prensa celebrada canales de distribución. en Madrid. Este informe indica que: En su primer año de distribución, IDC espera que Windows Vista se encuentre instalado en más de 100 millones de ordenadores en todo el mundo, y que más de 30 millones de ordenadores en la región que forma parte del estudio, funcionen con Windows Vista. En los seis países estudiados, el empleo relacionado con Windows Vista va a alcanzar más del 20% de los trabajos en TI en su primer año de distribución. Aunque una gran parte de este empleo cambiará con respecto al relacionado con Windows XP, más del 50% del aumento en el número de puestos de trabajo en TI se va a ver impulsado por Windows Vista. Por cada euro de ingresos que Microsoft obtenga de Windows Vista en el año 2007 en los seis países estudiados, el ecosistema más allá de Microsoft va a recoger casi 14 euros en ingresos. En el año 2007 este ecosistema debería obtener más de 32.000 millones de euros (40.000 millones de dólares) en venta de productos y servicios relacionados con Windows Vista. En esta región formada por seis países, más de 150.000 compañías de TI que producen o distribuyen productos o servicios que funcionan con Windows Vista van a emplear más de 400.000 personas en el año 2007, y otras 650.000 van a ser contratadas en empresas que utilizan TI. Aunque el estudio se ha centrado en seis países europeos (Dinamarca, Francia, Alemania, Polonia, España y Reino Unido), esta región representa más del 65% del gasto en TI en la zona económica de la UE (es decir, la UE más Croacia, Noruega, y Suiza). La adopción rápida y generalizada de Windows Vista significa que su lanzamiento no sólo va a afectar a Microsoft, sino que también va a tener un impacto positivo en las economías locales de Europa. Más información en http://www.microsoft.com/spain. ya sea ADSL, cable u otros. La investigación, sin embargo, aún no ha llegado a su fin, y en este momento está intentando comprender cuál es el perfil sociodemográfico y de hábitos de consumo de los usuarios de tecnologías VOIP, ya que éstos pertenecen a la categoría de los “innovadores”, un grupo siempre muy interesante para los responsables de marketing. Con respecto al software de mensajería instantánea, Microsoft Messenger domina el mercado, pues el 89% de encuestados lo eligen como el más utilizado. El horario en el que más se chatea está comprendido entre las 20h y las 24h. Otro aspecto a destacar son las ubicaciones geográficas de las personas que chatean. El 62% de los encuestados afirma chatear con otra persona del estado español, el 43% suele intercambiar mensajes instantáneos con alguien de su misma ciudad y el 22% lo hace con individuos que se encuentran fuera de España. De este modo, a través de las nuevas tecnologías, que cada vez nos condicionan menos en tiempo y espacio, se descubren nuevos nichos de mercado. Asimismo, se hace imprescindible que las empresas líderes se alimenten de este tipo de estudios para descubrir las nuevas necesidades, derivadas de los nuevos espacios sociales. http://digital.revistasprofesionales.com
04-5 Noticias.qxd
20/12/06
11:16
Página 5
NOTICIAS
SUN MICROSYSTEMS
Java Platform Standard Edition 6 y NetBeans 5.5 Sun Microsystems ha anunciado la disponibilidad de Java Platform Standard Edition 6 (Java SE 6). Este lanzamiento es el resultado de dos años de trabajo de desarrollo, que han implicado un proceso de revisión abierto a la comunidad y una estrecha colaboración entre los ingenieros de Sun y más de 330 desarrolladores externos . El software Java SE 6 es compatible con las versiones previas de la plataforma Java, lo que garantiza que los desarrolladores puedan aprovechar los conocimientos adquiridos sobre otras versiones, y protege las inversiones anteriormente realizadas en tecnologías Java. La potente combinación de la nueva versión de Java SE y el entorno de desarrollo integrado (IDE) NetBeans 5.5, que soporta las nuevas características de Java SE 6, proporciona a los desarrolladores un marco de trabajo fiable, abierto y compatible para crear y suministrar aplicaciones basadas en Java, más rápida y fácilmente que nunca. NetBeans 5.5 es el primer y único IDE disponible de forma gratuita que ofrece un soporte completo a Java EE 5. NetBeans 5.5 contiene nuevas características, tales como un API Java Persistence, herramientas de productividad JAX WS 2.0 y mejoras en el NetBeans GUI Builder (antes conocido como Proyecto Matisse). Además, Sun ha lanzado simultáneamente cinco paquetes de valor añadido para NetBeans 5.5:
BSA
10 consejos para una experiencia on line segura Existe un alto riesgo de que el software a la venta en sitios web de subastas sea ilegal, a pesar de los continuados intentos, tanto de los proveedores de software como de los propios sitios web, de atajar el problema. Un estudio publicado por IDC, titulado “Los riesgos de obtener y utilizar software pirateado: 2006”, revela que, del software a la venta en un conocido sitio web de subastas, sólo el 49% era original, el 39% era fraudulento y el 12% restante venía con componentes que eran fraudulentos o se trataba de software original que había sido manipulado. También existe un serio riesgo legal, dado que la piratería de software va contra la ley. Y, sobre todo, los usuarios no podrán tener derecho a recibir actualizaciones del producto, soporte técnico, manuales ni documentación. No tendrán ninguna garantía de calidad o fiabilidad del software y, además, los consumidores dejarán su red expuesta a virus y fallos de seguridad. Ante esta situación, BSA propone diez consejos prácticos a los consumidores: 1 . Confía en tu instinto. Comprueba el precio fijado por el vendedor on line con respecto al valor estimado del software en las tiendas. Tanto si es vendido como nuevo o usado, si el precio del producto parece “demasiado barato para ser verdad”, puede tratarse de un producto fraudulento. 2. Asegúrate de que es auténtico. Desconfía de productos de software que no incluyen pruebas de autenticidad, como discos originales, manuales, licencia, políticas de servicio o garantías. 3 . Lee la etiqueta. Ten cuidado con productos que no parecen originales, como por ejemplo los que lleven etiquetas escritas a mano. 4 . Cuidado con los Back-ups. Ten especial cuidado con evitar a los vendedores que te ofrecen hacer copias de back-up. Es un claro indicio de que el software es ilegal. También asegúrate de comprobar la versión del software. Mucha gente se ha quejado de haber recibido versiones promocionales o educativas cuando creían haber comprado el producto de software completo o estándar. 5 . Duda de las compilaciones. Ten cuidado con las compilaciones de títulos de software de diferentes fabricantes en un mismo CD. Cuando compras más de un programa de software, asegúrate de que cada programa va en un disco separado. El hecho de recibir un solo CD cuando se han adquirido dos o más programas diferentes, es una señal segura de que han sido pirateados.
http://digital.revistasprofesionales.com
NetBeans Enterprise Pack: añade al IDE todas las herramientas necesarias para escribir, probar, securizar y depurar aplicaciones SOA empleando XML, BPEL y Servicios Web Java. NetBeans Mobility Pack: soporte para JSR-226 que permite a los desarrolladores utilizar gráficos vectoriales escalables en sus aplicaciones Java ME. NetBeans Profiler 5.5: soporte para diversos Runtime Environments y facilidades en la tarea de crear perfiles Enterprise Java Beans. NetBeans Visual Web Pack (preliminar): desarrollo visual de aplicaciones web basadas en estándares y JavaServer Faces compatibles con AJAX. NetBeans C/CC++ Pack (beta): aplicaciones C/CC++. Los desarrolladores C/CC++ pueden usar el IDE NetBeans junto a sus propias herramientas y compiladores. Sun ofrece soporte para NetBeans a través de su programa de servicios Sun Developer Expert Assistance. Más información y descargas sobre Java SE 6 en http://java.sun.com/javase/6. El IDE NetBeans se puede descargar junto a Java SE 6 en http://java.sun.com/javase/downloads o, de forma separada, en http://www. netbeans.org. Los desarrolladores que quieran unirse, sin coste alguno, al programa Sun Developer Network, pueden registrarse online en la dirección http:// developers.sun.com/register. 6 . Consigue la dirección del vendedor, si es posible. Recuerda que si no puedes contactar con el vendedor después de hacer la compra, puedes no tener recurso si el producto resulta ser pirata. BSA recibe numerosos reportes acerca de vendedores que son inaccesibles desde el momento en que han cobrado la venta. Por lo tanto, procura obtener los datos de contacto del vendedor. 7 . Guarda los recibos. Guarda toda la información que te sea posible acerca de la transacción y del vendedor. Imprime una copia de tu orden de compra y confirmación de la venta y archívalas. Se trata de un paso importante que te puede ayudar a protegerte hasta que hayas verificado que el software adquirido es legítimo. Esta información te ayudará para argumentar tu caso si el producto es pirata y necesitas emprender alguna acción con respecto al sitio web de subastas, el sitio facilitador del pago o el desarrollador del software. 8 . Ten cuidado al cruzar la frontera. Toma precauciones cuando trates con vendedores de software de otros países. La distancia física, las diferencias en los sistemas legales y otros factores podrían complicar las cosas si hay problemas con la transacción. 9 . Busca una marca de confianza. Busca una marca de confianza de una organización reconocida para asegurarte de que el vendedor on line es fiable y tiene una probada trayectoria de clientes satisfechos. En caso de duda, busca información en la web acerca del sitio en cuestión para determinar su legitimidad. 1 0 . Haz tus deberes. Antes de hacer una compra, investiga todo lo que puedas acerca del vendedor o fabricante. Comprueba la clasificación y el prestigio del vendedor o los comentarios de la gente cuanto estés en un sitio de subastas. Los vendedores más legítimos tendrán gran número de respuestas de otros usuarios, y si son bien reputados y fiables, casi todas serán positivas. Es una buena señal de lo que puedes esperar de tu transacción. Los efectos de utilizar software pirata pueden ser muy serios. Si crees que has sido víctima de la piratería de software, por favor, comparte tu experiencia con BSA para ayudar a otros consumidores a protegerse y tener una experiencia segura cuando compran on line. Los testimonios pueden ser enviados a www.bsacyber safety.com/fraud. Para más información acerca de cómo protegerse y disfrutar de todos los beneficios de comprar on line, puedes visitar el sitio de ciber seguridad de BSA en www.bsacybersafety.com
5
SOLO PROGRAMADORES nº 145
06-7 Javahispano.qxd
20/12/06
11:21
Página 6
JAVAHISPANO
Actualidad Java de la mano de javaHispano Virtual Ant, la forma más simple de crear tareas de Ant Virtual Ant permite construir scripts para la popular herramienta Ant de Apache sin necesidad de escribir ni una sola línea de XML o aprender a emplear asistentes. Virtual Ant crea un sistema de ficheros virtual, que replica el sistema de ficheros de la máquina en la cual se ejecuta, para el cual proporciona una interfaz similar al explorador de Windows. En ese sistema virtual el programador mueve ficheros, copia, crea archivos .jar mediante un menú contextual, etc., sin que todas estas acciones afecten al sistema real. Virtual Ant graba en una macro todas las acciones. Una vez el programador ha terminado de interactuar con el sistema de ficheros la herramienta genera un script de Ant que reproduce todas las acciones realizadas. También es posible cargar scripts Ant en la herramienta y ejecutarlos sobre el sistema de ficheros virtual, sin modificar el sistema de ficheros real, para ver sus efectos. En el momento de escribir estas líneas la herramienta se encuentra en versión alfa. Cuando esté terminada, Placidsystems, la compañía que ha desarrollado la herramienta, la pondrá a la venta a un precio que probablemente ronde los 20 $ por usuario.
ICEsoft libera ICEfaces bajo licencia Mozilla ICEfaces es una librería de componentes JSF que hace un uso exhaustivo de técnicas Ajax para mejorar la experiencia del usuario. Se integra con prácticamente todos los IDE con soporte para JSF (Eclipse, Java Studio Creator, JDeveloper, Rational Developer y Workshop Studio) y, para muchos, se trata de la mejor librería de componentes JSF del mercado. Hasta hace poco ICEsoft distribuía dos versiones de la librería. Una gratuita, ICEFaces Community Edition, y otra de pago que incluía mejoras orientadas a aplicaciones con una gran carga de trabajo, así como herramientas de administración. Recientemente toda la funcionalidad de la versión de pago se ha liberado bajo licencia Mozilla e IceSoft sigue vendiendo servicios de consultoría, soporte y formación en torno a esta librería.
Borland escinde una rama de la compañía que se hará cargo de la división de los IDE Finalmente Borland no ha encontrado un comprador que le satisfaga para la división de los IDE de la compañía y ha decidido crear a partir de ella una nueva compañía, CodeGear. Esta compañía será lo más independiente posible de la matriz ya que, según fuentes Borland, los IDE no guardan relación con la línea de negocio que pretende seguir la matriz. CodeGear ya ha anunciado el producto JBuilder 2007, la primera versión del entorno de desarrollo que no está basada en la plataforma desarrollada por Borland sino en Eclipse. Está por ver el éxito de este producto ya que, si bien JBuilder siempre ha sido una herramienta excelente y todavía cuenta con muchos leales seguidores, el entorno tendrá que producir un incremento considerable en la productividad para justificar el gasto de varios miles de dólares frente al uso de alternativas gratuitas como Eclipse o Netbeans.
SOLO PROGRAMADORES nº 145
6
http://digital.revistasprofesionales.com
06-7 Javahispano.qxd
20/12/06
11:21
Página 7
JAVAHISPANO
Actualidad Java de la mano de javaHispano
MobileZoo, un zoológico de teléfonos móviles Java ME MobileZoo (http:// mobilezoo.biz) es un portal que pretende convertirse en un "zoológico" que contenga todos los teléfonos móviles Java ME del planeta, entendiendo por zoológico un lugar al cual uno puede ir a contemplar todas las "especies" y aprender sobre ellas. Los creadores del portal han diseñado una aplicación Java ME que se descarga gratuitamente y que, al ejecutarse en un terminal, lanza una serie de pruebas de todo tipo sobre él, recolecta los resultados y los envía a la base de datos del "zoológico". Entre estas pruebas están la capacidad de proceso y la memoria disponible en el terminal, el soporte de las diferentes API, información sobre la conectividad, etcétera. El portal también recolecta datos estadísticos, como por ejemplo el porcentaje de terminales que soportan una determinada API o funcionalidad, la cota de mercado de cada fabricante de terminales o los modelos que vende cada compañía. Ambos tipos de información pueden resultar extremadamente valiosos para decidir a qué sector del mercado enfocamos nuestras aplicaciones.
Versión 3.0 del reproductor de música Jlgui Recientemente se ha liberado la versión 3.0 de Jlgui, el reproductor de música implementado en Java más popular. Este clon de WinAmp soporta una gran cantidad de formatos de audio (WAV, AU, AIFF, MP3, OGG VORBIS, FLAC, MONKEY's AUDIO y SPEEX) gracias al uso de la librería JLayer. También permite importar listas de reproducción en los formatos M3U y PLS, y puede emplear los skins compatibles con Win Amp 2.0. Entre las novedades de la versión 3.0 se encuentran mejoras en el aspecto visual, soporte de nuevos formatos de audio, más menús contextuales y la capacidad de realizar búsquedas en la lista de canciones. El reproductor, al igual que la librería que permite reproducir los distintos formatos de audio, se distribuye bajo licencia LGPL.
OPINIÓN
Ant y/o Maven 2.x
Sí, habéis leído bien. En el título pone "y/o", en lugar de “versus”, y a continuación explicaré porqué. Ant se ha convertido en un herramienta de facto para la construcción de proyectos Java. Ant ha cumplido, y cumple muy bien, la finalidad para que fue concebida. Con Ant podemos definir nuestro proceso de compilación, empaquetado, distribución y otras labores típicas asociadas al ciclo de vida de un desarrollo de software. Sin embargo Maven, partiendo de una serie de conceptos que la caracterizan, como por ejemplo su modelo conceptual para proyectos (P.O.M.) o la propuesta para organizar el código fuente mediante una estructura de directorios, nos ayudará a mantener y organizar nuestros proyectos. Sería injusto comparar Ant y Maven porque estas herramientas nos ayudan a gestionar nuestros proyectos a niveles distintos aunque, si únicamente necesitamos una herramienta de construcción, ambas son herramientas que han sabido resolver perfectamente las necesidades de estos procesos. Si, además, necesitamos una gestión del proyecto a más alto nivel donde definir recursos, dependencias, perfiles, o generar un sitio web con toda la información aportada, Maven es nuestra opción. Para los proyectos que ya están empleando Ant, cabe resaltar que pueden ser migrados con cierta comodidad, porque desde Maven se puede usar Ant gracias a uno de sus plugins. Para los proyectos que estén comenzando creo que es una buena oportunidad para definirlos con Maven. Manuel J. Recena Soto (recena@eii.us.es, www.manuelrecena.com[/blog]).
Sobre el autor Abraham Otero (abraham.otero@javahispano.org) es responsable de calidad y miembro de la junta de javaHispano. http://digital.revistasprofesionales.com
7
SOLO PROGRAMADORES nº 145
08-9 Panda.qxd
20/12/06
11:23
Página 8
CANAL PANDA
Los mitos en la seguridad FERNANDO DE LA CUADRA
El mundo de la informática está lleno de mitos y de leyendas difundidas por correo electrónico o simplemente comentadas boca a boca. Estas leyendas no son solo los famosos hoaxes o las cartas en cadena, sino que se dan por hecho una serie de cosas que no suelen ser ciertas, pero son tan difíciles de probar que se dan por ciertas sin comprobación ninguna. Y, dentro del mundo de la seguridad informática, existen también esos extraños mitos. Uno de ellos, con un fundamento real, está cada vez más desvirtuado: los creadores de códigos maliciosos son buenos programadores. Hace tiempo, cuando los virus estaban en su prehistoria, este mito podía ser cierto. Para que un programa pudiera multiplicarse automáticamente sin que un usuario se diera cuenta y sin que los también prehistóricos programas de seguridad lo detectaran, debía haber sido creado por un buen programador. Era necesario un gran conocimiento de los sistemas, de las posibilidades que brindaban, además de poseer una gran capacidad de innovación. Sin embargo, hoy en día estos programadores han dejado de ser esas “estrellas” de la codificación informática. Los códigos maliciosos son cada vez más burdos, con menos innovación y más “chapuceros”.
tación de los distintos elementos de un programa mediante grafos. Estos grafos son líneas que relacionan cada subrutina del código, de manera que un programa sencillo y bien construido tendría un grafo simple y claro, mientras que un programa sin organización interna y sin una adecuada sistematización ofrecerá un grafo muy complejo y desordenado. Además, dos programas similares ofrecerán grafos también similares, lo que ha llevado a PandaLabs, el laboratorio de detección de malware de Panda Software, a utilizarlos para establecer similitudes entre distintas variantes de un mismo código malicioso, ya que las llamadas a una misma función dentro de distintos programas se muestran gráficamente en los grafos. Cuando PandaLabs hizo el análisis de un “bot” (Gaobot.AAF), se sorprendieron con su grafo: no solo por su espectacularidad (le llamaron “La Estrella de la Muerte”, por su parecido a la de “La Guerra de las Galaxias”) sino por su extraña complejidad. ¿Por qué se obtiene este extraño y complejo dibujo? Sencillamente, porque el código fuente original de la familia de bots Gaobot fue puesto a disposición de los creadores de
El caso de Gaobot.AAF La afirmación de que los creadores de código malicioso son malos programadores (o por lo menos mucho menos buenos de lo que se piensa) no es gratuita, ya que existen métodos para analizar los programas y ver cómo han sido construidos. Uno de ellos, muy utilizado por su resultado visual, es la represen-
SOLO PROGRAMADORES nº 145
8
Figura 1. Análisis del bot Gaobot.AAF, denominado “La Estrella de la Muerte” por PandaLabs.
http://digital.revistasprofesionales.com
08-9 Panda.qxd
20/12/06
11:23
Página 9
CANAL PANDA
Los mitos en la seguridad
código malicioso, y cada uno de ellos hizo nuevas variantes. Pero esas variantes no estaban optimizadas, por lo que la complejidad iba creciendo en cada variante. En lugar de demostrar su capacidad como buenos programadores, los creadores de variantes de Gaobot únicamente demuestran que, efectivamente, el mito del gran conocimiento que tienen, son únicamente aprendices de ladrón mediante copias de código ajeno.
Los virus “indetectables” Otro mito muy difundido, y alimentado por numerosos correos electrónicos falsos es que existen virus (o gusanos, o troyanos, etc.) que no pueden ser detectados por ninguna solución de seguridad. Y desgraciadamente, aunque sea mentira, en ocasiones se airea este mito. Hace poco apareció la noticia de que un estudiante había creado un troyano con el cual grababa imágenes de las webcam de compañeros de instituto y luego les chantajeaba con el material grabado. Se decía que el troyano creado era “indetectable”. La afirmación de que un troyano es indetectable contradice esa información, según la cual las autoridades crearon un sistema para detectar y eliminar ese código. ¿Es indetectable o no? El problema radica en la dificultad para detectar un ejemplar determinado de troyano. La mayoría de los fabricantes de soluciones antivirus dependen de las muestras de los códigos maliciosos para poder elaborar una rutina de detección y eliminación, por lo que es necesario que se den dos circunstancias: 1 . El código malicioso debe despertar sospechas en un usuario. Si no se muestra un mensaje, o si no se lleva a cabo alguna acción especial en el ordenador que haga al usuario darse cuenta de que algo extraño pasa, el sistema permanecerá infectado ya que no podrá mandarse una muestra a los laboratorios para su análisis.
2 . El código malicioso debe tener una cierta propagación. De esta manera aumenta la probabilidad de que alguno de los usuarios afectados notifique a los laboratorios la aparición del código. En el caso de este troyano no se dieron ninguna de las dos, ya que el troyano no mostraba absolutamente ningún mensaje ni daba pistas que pudieran delatarle, prácticamente tal y como hacen todos los caballos de Troya. Y al estar distribuido en muy pocos sistemas (únicamente los de los compañeros de clase del autor de troyano), tampoco se pudo sospechar de él. Por lo tanto, nos encontramos frente a una muestra de la situación del malware hoy en día: ejemplares reducidos y escondidos. Así las empresas antivirus no los detectarán, tal y como reza la noticia. Sin embargo, esa afirmación no es completa: no los detectarán hasta que no se conozcan. A pesar de todo, este problema surge únicamente con los sistemas antiguos de detección de códigos maliciosos. Estos sistemas confían ciegamente en los datos almacenados sobre programas maliciosos, sin tener otros sistemas de detección. Así, todo aquello que no esté en su base de datos de firmas de programas, será considerado adecuado. La tecnología más moderna contra códigos maliciosos evita estos problemas, ya que en lugar de ceñirse exclusivamente en el conocimiento previo de los códigos maliciosos, los busca en función de su comportamiento. Así, un programa que quiera llevar a cabo alguna acción maliciosa en un ordenador, será detenido no porque se le conozca, sino por las acciones que iba a llevar a cabo. Mientras que los usuarios sigan confiando en soluciones parciales y anticuadas para la detección de virus y otros programas malignos, no podrán protegerse adecuadamente ya que para ellos seguirán existiendo “códigos indetectables”, en lugar de simplemente “programas peligrosos no conocidos hasta el momento”.
Gran crecimiento del número de troyanos PandaLabs, laboratorio de detección de virus de Panda Software, ha detectado un crecimiento en el número de troyanos a finales del 2006. Los troyanos son códigos maliciosos que permanecen en un sistema llevando a cabo diversas tareas sin que el usuario se dé cuenta de ello, por lo que su peligro es muy elevado. En la actualidad, y debido a la nueva dinámica que los autores de malware han iniciado, estos troyanos tienen como objetivo en su inmensa mayoría, el robo de las contraseñas utilizadas por los usuarios para los servicios financieros. Los siguientes códigos maliciosos más detectados por PandaLabs son los Bots (de la palabra "robot") y Backdoors, sistemas que también permiten el uso fraudulento de un sistema. El número de estos dos últimos tipos de malware, aunque también elevado, es muy inferior al de los troyanos, y su frecuencia de aparición disminuye o se mantiene durante el año 2006. Según Luis Corrons, Director de PandaLabs, este aumento de troyanos "pone en evidencia a los autores de malware, que lejos de intentar conseguir elementos que les den fama, buscan únicamente enriquecerse con los datos de los usuarios". Los sistemas de detección de códigos maliciosos de Panda Software también pueden detectar troyanos, "incluso sin conocerlos previamente, ya que las tecnologías TruPreventTM de Panda Software están preparadas para proteger contra cualquier código, sean virus, gusanos o, como este caso, los muchos troyanos que venimos encontrando". Además, los troyanos no sólo siguen siendo los primeros, sino que continúan aumentando su ventaja con respecto al resto de tipos de malware, sobre todo frente a categorías en declive, como los virus clásicos, programas potencialmente no deseados, herramientas de hacking, etc. En el otro extremo de la tabla, encontramos en claro retroceso a los dialers. Estos programas alteran los números telefónicos de conexiones por módem y tienden a desaparecer. Tanto el aumento de conexiones de banda ancha como la proliferación de redes Wi-Fi hacen que las conexiones por módem sean cada vez menos utilizadas y por tanto los dialers pierdan su campo de acción.
Sobre el autor Fernando de la Cuadra (Fdelacuadra@pandasoftware.com) es editor técnico internacional de Panda Software (http://www.pandasoftware.com).
http://digital.revistasprofesionales.com
9
SOLO PROGRAMADORES nº 145
10-11 Spain net
20/12/06
11:26
Página 10
COMUNIDAD .NET
¿Preparados para un nuevo Día? PEP LLUIS BAÑO (Presidente de SpainNet, miembro del comité de INETA-Latam y Microsoft MVP Visual Developer)
Justo después de saborear las dulces mieles del Framework 2.0, nos empiezan a llegar ondas de lo que esta por venir… Una vez más, el gran compromiso y esfuerzo de Microsoft en aras de conseguir afianzar una plataforma madura y establela abre la disyuntiva. ¿Qué hago?, ¿empiezo o me espero? Sin duda alguna “estamos en un Universo que se está expandiendo” y, paradójicamente, podríamos definir dicha expansión como la fuerza que empuja a los objetos de un medio a desplazase por su espacio en una dirección y a una velocidad marcada por el impulso aplicado inicialmente. No es casual entender que muchas de las observaciones que efectuamos a simple vista reflejan nuestras realidades más cotidianas. Así pues, podríamos deducir que la anterior es una definición de objetivo, a partir de un origen, donde el acontecimiento de un hecho predetermina el destino temporal en un espacio futuro.
La Escalera del Universo Estático Muchos de nosotros nos quejamos constantemente del frenético ritmo que nos imponen los avances tecnológicos, porque quizás preferimos un modelo estático que pertenece a una época en la que después de una dilatada carrera, subida peldaño a peldaño, terminábamos acomodándonos a una situación donde los conocimientos previos adquiridos nos ayudaban a desarrollar una muy larga y tranquila vida profesional, siendo considerada por algunos como el estadio ideal para llegar sin complicaciones a una buena jubilación.
SOLO PROGRAMADORES nº 145
10
Con la Teoría de las Cuerdas ¡el conocimiento es Dinámico! Los más dedicados y con espíritu más vocacional, y en función de ciertas condiciones, consiguen llegar a un segundo estadio. Este nivel no es que permita grandes desahogos económicos ni mayores reconocimientos sociales, pero marca realmente la diferencia entre los que suben peldaños de escaleras y los que forman parte de una entropía cuya curva de aprendizaje se dilata logarítmicamente respecto al espacio/tiempo.
Dicho esto… Visto y no visto llega el Vista y con él la apuesta por los sistemas operativos x64, su HyperTheading, su Multi Core con paralelismos de ejecución o la brutal irrupción de aplicaciones para dispositivos móviles, la unificación de criterios y la integración para realizar todo ello desde un único entorno de programación… ¡Ya no nos queda la menor duda! Somos testigos de una gran explosión tecnológica cuya energía guiará nuestra expansión desplazándonos en una dirección y a una velocidad vertiginosa. Pero, al margen de productos, multinacionales, intereses comerciales, estrategias y políticas, estamos aquí para visionar un nuevo espacio donde todo ese conjunto de acciones se convierte en la tecnología que nos empuja a expandir nuestro conocimiento mas allá de los límites digitales. No debemos esperar a mañana para trepar por la cuerda; en nuestro oficio, el mañana es llegar tarde. Quizás nos dé pereza empezar, pero os puedo asegurar que agarrarnos a esa cuerda nos va a impulsar y permitir conocer nuevos universos de conocimiento inexplorados, cual enorme burbuja que asoma, asombra y cautiva pero que sin duda termina apasionándonos. O sea, que bienvenidos a la cuerda y no tardéis en uniros a ella si queréis evitar que la burbuja termine aplastándonos! http://digital.revistasprofesionales.com
10-11 Spain net
20/12/06
11:26
Página 11
COMUNIDAD .NET
¿Preparados para un nuevo Día?
Universo 2007 Papá Noel y los Reyes nos dejarán este año una larga lista de tecnologías. Quizás no todas verán la luz de una manera inmediata, pero vale la pena empezar a indagar y hablar sobre ellas o de sus nombres. Por supuesto, vamos a tener Windows Vista con su recién estrenado Office 2007 System, respaldado con productos de gran calibre como Exchange Server 2007, Sharepoint Server 2007 y una renovada apuesta en la infraestructura de protección. Con nuevos conceptos como la “UC” Unificación de Comunicaciones con Office Communications Server 2007 así como la potenciación de herramientas de visualización de datos tales como el Visio 2007, sin olvidarnos de la nueva moda del BI “Bussines Intelligence”, cuyos objetivos para las empresas se concentran en permitir el control, acceso, visualización e interacción en general sobre toda la información de su negocio, totalmente centralizada desde un punto único. Nuestra faceta más desarrolladora se completará con un buen avance y un importante cambio de mentalidad en la que el objetivo primordial es mejorar la experiencia del usuario. Para ello, Vista nos trae nuevas formas de conectar la información con los usuarios, con búsquedas integradas y mejores interfaces. En ese sentido, Vista y 2007 Office System van a trabajar juntos al servicio de los desarrolladores, modernizando el UI con 2D, 3D, enlace a datos, animación, texto, contenidos media, etc., con un nuevo lenguaje de definición XAML que básicamente aportara flexibilidad, simplicidad y prestaciones desconocidas hasta ahora en nuestros diseños. ¡Bienvenido también a la nueva era del diseño! Por lo tanto, resumiendo y en líneas generales, disponemos de cuatro nuevos pilares que conforman el Framework 3 incluido en Vista. La construcción, mejora y diferenciación en la experiencia del interfaz de usuario en Windows Vista estará fundamentada en: W P F , Windows Presentation Fundation. La construcción de “aplicaciones conectadas” (para el Desarrollo de aplicaciones distribuidas) irá a cargo de: http://digital.revistasprofesionales.com
La propia escalera del conocimiento ayuda a subir peldaños.
W C F , Windows Communitacion Fundation. Para el modelado declarativo en procesos de negocio tenemos: W W F , Windows WorkFlow Fundation. Finalmente, en cuanto a seguridad, se incorpora un nuevo espacio para gestión de Entidades llamado: C a r d S p a c e. Estas cuatro pinceladas tienen que ser una buena pista para adecuar la velocidad y dirección que marca esta ola de expansión, sin miedos ni complejos. Después del pasado TechEd en Barcelona, estoy convencido que nuestra comunidad de desarrolladores (y por extensión la Latinoamericana) debe despertar de su largo letargo y abrirse camino no solo en estas nuevas tecnologías, sino anticipándose a las futuras y llegar así a conseguir presencia con luz propia que le corresponde. Por si fuera poco, y con todos estos cascabeles sonando, ahora más que nunca disponemos de una increíble comunidad de desarrolladores y usuarios, unidos en pro de compartir todo ese conocimiento que se expresa como energía en forma de movimiento. Estos son realmente los exponentes de esta nueva fuerza, y en ellos podemos encontrar los ingredientes necesarios que nos ayuden a trepar. No olvidemos que podéis beneficiaros de
todas las actividades de lanzamiento que estas comunidades ponen a vuestra disposición a través de sus charlas y eventos en Alicante, Murcia, Barcelona, Madrid, Castilla y la Mancha, Galicia, Navarra, Málaga, Cantabria, Huelva, La Coruña entre otros. Podréis conocer más sobre ellos en http://www.microsoft.com/spanish/msdn/ community/g_usuarios_esp.mspx o en http://europe.ineta.org/Countries/Spain/ Home/tabid/235/Default.aspx. Por lo que respecta a Latinoamérica, podréis encontrar un huracán de grupos dispuestos a liderar estas reuniones y actividades en http://www.inetalatam.org/ default.aspx. Para terminar, os recomiendo estar al día sobre la convergencia entre .NET y Mono, a la vista de los acuerdos alcanzados entre Novell y Microsoft. Podéis leer sobre ella en http://www.novell.com/linux/microsoft/ press-conference_transcript.html y en http://www.microsoft.com/presspass/press/ 2006/nov06/11-02MSNovellPR.mspx. No deja de ser interesante y un buen augurio, al menos hasta el 2011, para algunos de los que solo somos programadores. Mis mejores deseos para todos los lectores en este 2007. ¡Feliz año! 11
SOLO PROGRAMADORES nº 145
12 OPINION
20/12/06
11:31
Página 12
OPINIÓN
Vista y no Vista NICOLÁS VELÁSQUEZ ESPINEL
¿Quién no ha oído hablar a estas alturas de Windows Vista, el nuevo sistema operativo de Microsoft? Mucho se ha dicho y teorizado sobre las bondades de este sistema que llega para jubilar a Windows XP, aunque ahora que parece que por fin es cierto que llega a las tiendas es el momento de analizar qué implicaciones puede suponer para todos nosotros. Parece que al final, y salvo catástrofe, la espera del nuevo Windows Vista ha llegado a su fin. Todas las agencias de comunicaciones se han hecho eco de que Microsoft tiene previsto lanzar las seis versiones definitivas (¡seis!) de su nuevo y revolucionario sistema operativo para finales de enero del 2007, si bien ya está disponible en sus versiones para empresas (para los que posean licencias corporativas) o para los que estén dispuestos a comprar más de cinco copias en algunas tiendas especializadas. Aunque, como es lógico, existen muchos “Vistaescépticos”, se dice en los mentideros de la red que puede suponer una revolución como lo fuera en su momento la aparición de Windows 95. Prueba de ello es que la compañía de Bill Gates ha hecho un gran esfuerzo mejorando la seguridad de su nuevo sistema operativo destacando las actualizaciones de la biblioteca de Windows, las medidas antispyware o sus nuevas y llamativas características gráficas (basadas en transparencias o el estilo llamado “aero”) y un poderoso motor de bús-
Bill Gates anunciando Windows Vista
SOLO PROGRAMADORES nº 145
12
La interfaz de Windows Vista.
queda. Pero a esto habrá que sumar la encriptación del disco duro, el nuevo y rediseñado Internet Explorer 7, el potente buscador de escritorio, el control parental, mejores políticas de backups para facilitar los procesos a los usuarios o los sistemas colaborativos P2P. Todo ello, eso sí, con varios años de retraso (tendría que haber sido lanzado en 2005) y con toda una serie de opciones eliminadas con respecto a la propuesta que se hiciera en su momento (atrás quedaron características muy ambiciosas, como por ejemplo un nuevo sistema de escritura binaria que permitía una nueva compleja organización, búsqueda e intercambio de información), lo que no evita que emane cierto halo de que puede ser algo especial. Si Microsoft tira la casa por la ventana por algo será, ¿no? Lo interesante en este caso es evaluar todas las implicaciones que puede llegar a tener la implantación (paulatina) de este sistema operativo porque ya son muchas las voces que se han alzado cuestionando los motivos reales que puede haber detrás de lanzar un nuevo sistema y lo que esto pueda suponer para nosotros, los mortales. Para empezar, se teme que los requerimientos para ejecutar Vista puedan suponer un nuevo revulsivo en lo relativo a la inversión económica del hardware aunque, a priori, Microsoft ha tranquilizado al “pueblo” dibujando un panorama más tranquilizador y anunciando que la configuración mínima demandará sólo un PC a 800 Mhz, 512 Mb de memoria, tarjeta gráfica con soporte de DirectX 9 y 15 GB de espacio libre en disco duro. Todo sea dicho, bastante normal para los tiempos que corren. Pero uno de los aspectos que tiene visos de convertirse en determinante para el futuro de Vista (y de nuestra concepción del sistema operativo) tiene que ver con su sistema de protección de licencias. Es indudable que, hoy por hoy, una de las causas de que el sistema esté instalado en el 90%
de los ordenadores de todo el mundo (unos 900 millones) reside en la “facilidad” de conseguir e instalar copias piratas de Windows. Y es que, paradójicamente, Microsoft le debe mucho a los piratas, aunque parece ser que (ya obtenida la cuota de mercado) con Vista será otro cantar. A partir de ahora los piratas se las van a ver y desear, aunque cualquiera sabe ya que hacker y desafío son términos inseparables. Por lo pronto, la fiebre Vista ya ha hecho que este sistema operativo corra por las redes P2P y que hasta algunos se atrevan con los supuestos cracks que prometen activarlo, pese a que también se ha informado de que uno de los más difundidos (denominado "Windows Vista All Versions Activation 21.11.06") incorpora el troyano llamado “Trojan-PSW.Win32.LdPinch” dedicado a recolectar contraseñas y enviarlas por correo a su creador. Pero este no el único aviso que se ha hecho sobre vulnerabilidades ya que, según la empresa de seguridad informática Sophos (luego corroborada por la propia Microsoft), Vista es afectado por el 40% de todos los programas maliciosos que circulan actualmente por Internet, aunque todavía no se hayan creados virus específicamente para Vista. Por lo pronto, la compañía de Redmond espera tenerlo instalado en más de 100 millones de ordenadores en su primer año, aunque también son realistas y ya cuentan con que la implantación de Vista será lenta… pero segura. Lo apoyan los analistas que predicen que, a finales de 2007, un 5% de los PC operativos en todo el mundo funcionará con alguna de las versiones empresariales de Vista (frente a un 47% que probablemente correrá bajo Windows XP Professional, y casi un 10% lo hará todavía con Windows 2000 Professional). Para predicar con el ejemplo la propia Microsoft ha instalado Vista en más de 60.000 PC de la compañía, animando a sus clientes empresariales a seguir su ejemplo. Qué menos. Lo que está claro es que Windows Vista va a crear muchos puestos de trabajo (se espera que unos 20.000 en el sector de las Tecnologías de la Información y la Comunicación en España durante el año 2007) lo que es un buen principio. La creación de puestos de trabajo siempre lo es. Sólo esperamos de cara al usuario que la nueva versión sea tan estable como predica Bill Gates. Desde luego, desde que apareciera Windows 3.1 han tenido tiempo para ir depurándola, ¿no? http://digital.revistasprofesionales.com
13 Linux.qxd
20/12/06
11:32
Página 66
MANDRIVA LINUX 2007 FREE Mandriva Linux 2007 incorpora versiones de última generación de los principales proyectos de código abierto, tales como: kernel 2.6.17, KDE 3.5.4, GNOME 2.16, y muchos otros.
• Nuevo soporte de escritorios 3D (tanto AIGLX como XGL) y una nueva utilidad para configurarlos (drak3d) Mejoras en rpmdrake - Herramienta para la instalación de aplicaciones La Ora - Nuevo tema de escritorio y protectores de pantalla Mejoras en la interfaz de configuración de redes con soporte a acceso del tipo inalámbrico y 3G/GPRS Soporte para XDG - un sistema de menú estándar de freedesktop.org Nueva infraestructura "Web 2.0", similar a Ruby on Rails, Django y Catalyst
• • •
•
•
•
Nuevo cortafuegos para configurar un firewall redundante con ucarp(invictus-firewall)
14-20 Móviles .qxd
20/12/06
11:45
Página 14
DISPOSITIVOS MÓVILES
Mobile Web Controls de ASP.NET DAVID SAINZ y AITOR ALMEIDA (Investigadores de la Cátedra de Telefónica Móviles en la Universidad de Deusto)
En este artículo veremos cómo hacer páginas web que puedan mostrarse en móviles, de una forma sencilla y cómoda, utilizando ASP.NET. Introducción La llegada de ASP.NET y su evolución ASP.NET 2.0 ha traído varios cambios al mundo de la programación de páginas web. Estos cambios han sido en todos los sentidos, pero hay uno especialmente innovador el cual permite crear páginas web que sirvan para multitud de dispositivos a la vez. Estos nuevos elementos toman el nombre de Mobile Web Controls. Con ellos, será posible programar webs que sean accesibles desde teléfonos móviles sin tener que utilizar lenguajes específicos. Todo esto programando de igual forma a la utilizada para crear páginas normales ASP.NET. Cuando programamos para dispositivos móviles nos damos cuenta de la verdadera heterogenei-
dad de éstos. Cada uno utiliza un lenguaje diferente para representar las páginas: unos utilizan HTML de una forma similar a un PC de sobremesa, otros usan WML, otros cHTML (una versión reducida de HTML), etc. Este es el primer inconveniente que nos encontrábamos a la hora de programar: o bien se elige un lenguaje y se desecha la posibilidad de hacer páginas para el resto de dispositivos, o bien se hace una página por lenguaje, lo que multiplica el trabajo. Además de esto, cada dispositivo tiene unas características físicas muy diferentes: diferentes tipos y tamaños de pantalla, teclados completos, teclados táctiles o teclados reducidos (teléfono móvil). Todo ese conjunto de elementos tan distintos hacen muy difícil la creación de páginas uniformes para todos. Además de todo esto, cada hardware tiene sus propias capacidades; unos tienen una potencia de proceso considerable mientras que otros aún hoy se quedan atrás. El creador de páginas web muchas veces tiene que enfrentarse a toda esta heterogeneidad. Bajo toda esta diversidad, las páginas web para móviles sólo tenían la posibilidad de programarse bajo un solo perfil de dispositivo, que solía ser una media entre todos. Esto resultaba en que los aparatos más potentes no demostraban su
Figura 1. Los dispositivos móviles tienen diversos interfaces y capacidades. Las webs no se ven de la misma forma en ninguno de ellos.
SOLO PROGRAMADORES nº 145
14
http://digital.revistasprofesionales.com
14-20 Móviles .qxd
20/12/06
11:45
Página 15
DISPOSITIVOS MÓVILES
Mobile Web Controls de ASP.NET
potencia y mostraban páginas pobres, y los menos potentes muchas veces no podían procesar partes de las páginas. La alternativa era programar una página distinta para cada tipo de dispositivo, pero eso se convertía en un caos a la hora de actualizar y mantener los contenidos, además de un esfuerzo enorme a la hora de crear lo que debería ser una sola página. Por esta razón se han creado los Mobile Web Controls: controles que se adaptan a cada tipo de dispositivo móvil.
¿Qué son los Mobile Web Controls? Los Mobile Web Controls son controles de formulario web similares en su manejo a los clásicos de ASP.NET. La peculiaridad de los mismos es que son capaces de mostrarse en pantalla de forma diferente dependiendo del dispositivo que los esté visualizando. De esta manera, el programador se olvida de que existen varias clases de hardware y trabaja bajo una capa única, sabiendo que estos controles se encargarán de adaptarse. La forma de adaptación puede llegar a ser muy precisa ya que pueden llegar a adaptarse incluso no sólo a un tipo de hardware, sino a un modelo concreto con unas capacidades específicas. La forma de conseguirlo internamente no es demasiado complicada. El propio servidor (normalmente IIS) es el que detecta el dispositivo y manda adaptarse a los controles de la página. En el propio servidor se instalan los llamados adaptadores de dispositivo, que son los encargados reales de hacer las conversiones necesarias. El funcionamiento es el siguiente: 1 . Se analiza el dispositivo que ha pedido la página. 2 . Se elige el adaptador de dispositivo adecuado de entre los existentes. 3 . El adaptador analiza las capacidades del dispositivo. 4 . Según lo que el dispositivo soporte y el lenguaje que utilice, el adaptador traducirá el Mobile Web Control de la forma más apropiada y se lo enviará. 5 . El dispositivo una vez recibida la página adaptada para su perfil, puede mostrar los controles sin problemas. Es importante notar que el dispositivo destino no recibe el Mobile Web Control, sino que recibe código HTML, WML o derivado. El control no viaja por la red y se adapta una vez llegado al dispositivo, sino que en el propio servidor se convierte en http://digital.revistasprofesionales.com
Figura 2. Creando un formulario web móvil con Visual Studio 2005.
código que el destino es capaz de interpretar. Esta arquitectura es extensible de forma que pueden agregarse nuevos adaptadores en el momento en que sea necesario tener en cuenta nuevos perfiles. Por ejemplo cuando salgan al mercado móviles con grandes pantallas y amplios teclados, puede crearse un nuevo perfil y utilizar un adaptador concreto para ellos. Por defecto estos adaptadores están incorporados en la instalación del framework .NET.
Programando los controles Estos controles se programan de una forma muy similar a la utilizada en los controles normales de ASP.NET. Se representan en forma de etiquetas y siempre que es posible tienen el mismo nombre que sus correspondientes en ASP.NET. La diferencia es que el prefijo de la etiqueta deja de ser “asp” para pasar a ser “mobile”. Eso servirá para diferenciar unos controles de otros. En HTML, para insertar una caja de texto se utiliza la siguiente etiqueta: <input name=“TextNombre”/>
En ASP.NET y utilizando controles normales la etiqueta es:
arrastrando se logran hacer los formularios, de forma exactamente igual a como se haría con los controles normales. Para hacer esto hay que crear un nuevo sitio web o utilizar uno existente, ya que Visual Studio 2005 no requiere que el sitio web entero sea para móviles, es posible insertar páginas para móviles dentro de una sede para PCs de sobremesa. Existe sin embargo una restricción: las páginas normales no pueden albergar Mobile Web Controls, por tanto debemos separar las páginas que se visitarán por PCs o similares de las que se visitarán a través de móviles y crear entonces páginas especiales para ello. En el explorador de soluciones se puede añadir una nueva página que en lugar de ser una de las normales (Web Form) será una página de controles móviles (Mobile Web Form). Una vez añadida esta página, en el Tool Box aparecerá una nueva sección llamada “Mobile Web Forms” en la que estarán los controles. No obstante, así como una página web no puede albergar un control móvil, una página para móviles no puede contener controles normales. Ambos mundos permanecerán separados en la mayor parte de los casos. Sin embargo, esto no debería ser un problema ya que
<asp:TextBox ID=”TextBox1” runat =”server”></asp:TextBox>
En ASP.NET utilizando Mobile Web Controls la etiqueta es: <mobile:TextBox ID=”TextBox1” runat=”server”> </mobile:TextBox>
Las etiquetas pueden teclearse a mano o crearse a través de un IDE adecuado. Utilizando Visual Studio 2005 es sencillo crear los controles, ya que pinchando y
Figura 3. A la izquierda, la propiedad “BreakAfter” está a “false” en las etiquetas y el botón “Mandar”. A la derecha, la propiedad está siempre a “true”.
15
SOLO PROGRAMADORES nº 145
14-20 Móviles .qxd
20/12/06
11:45
Página 16
DISPOSITIVOS MÓVILES
LISTADO 1
Código de un formulario con Mobile Web Controls
<html xmlns=”http://www.w3.org/1999/xhtml” > <body> <mobile:Form ID=”Form1” Runat=”server” Title=”Opiniones”> <mobile:Label ID=”Label2” Runat=”server” BreakAfter=”False”>Nombre:</mobile:Label> <mobile:TextBox ID=”TextBox1” Runat=”server”>David</mobile:TextBox> <mobile:Label ID=”Label3” Runat=”server” BreakAfter=”False”>Opini&#243;n:</mobile:Label> <mobile:TextBox ID=”TextBox2” Runat=”server”>Muy Buena</mobile:TextBox> <mobile:Command ID=”Command1” Runat=”server” BreakAfter=”False”>Mandar</mobile:Command> <mobile:Command ID=”Command2” Runat=”server”>Cancelar</mobile:Command> </mobile:Form> </body> </html>
puede crearse una página móvil muy completa y gracias a las propiedades de los controles, un PC de sobremesa también será capaz de ver una página de este tipo de forma normal. Como se puede observar en la figura 2, al crear un formulario web móvil el aspecto gráfico es un tanto distinto, y es que los controles no pueden colocarse en cualquier lugar. Estos formularios tienen una disposición de controles en pantalla llamada “FlowLayout”. Esta forma de colocar los controles es la predeterminada y se basa en colocar cada control en una línea diferente, pudiendo controlarse la alineación horizontal a izquierda, derecha y centrado. Esta limitación resulta a veces muy estricta, pero hay un mecanismo para hacerla algo más flexible: cada control tiene una propiedad llamada “BreakAfter”, que si está a “true”, significa que el siguiente control se presentará en la siguiente línea, y si está a “false” significa que el siguiente control aparecerá justo al lado. Esto es típico cuando se utilizan cajas de texto y etiquetas. Para lograr que una etiqueta y su correspondiente caja de texto aparezcan en la misma línea, se coloca la propiedad “BreakAfter” de la etiqueta a “false”. Aún así, este “FlowLayout” resulta muy poco flexible en ocasiones aunque ayuda a mantener un diseño uniforme. Recordemos que estamos trabajando en páginas que se van a mostrar en muchos tipos de pantallas, grandes y pequeñas. Este tipo de colocación de controles ayudará a mostrar los controles de forma parecida en diferentes dispositivos. De esta manera, crear un formulario gráficamente produce el siguiente código del listado 1. Hemos visto que para programar los controles para móviles de manera gráfica se procede exactamente igual que para los controles web normales. Pues de igual modo sucede con la programación de sus propiedades y eventos, ya que la manera de proceder es también similar, puesto que desde la página
SOLO PROGRAMADORES nº 145
16
de código también se accede a los controles para manejar sus propiedades y métodos.
Los controles existentes Los controles que se pueden colocar en una página móvil son variados y, aunque no son excesivamente sofisticados, cumplen con las funciones básicas necesarias en este tipo de páginas. A continuación analizamos cada uno de estos controles.
Form Es el contenedor del resto de controles y el formulario típico de cualquier página. Sin embargo, tiene una peculiaridad, y es que dentro de la misma página puede haber varios formularios. Sólo uno es visible cada vez pero todos están dentro, de forma que pasar de un formulario a otro no implica cambiar de página. Es típico encontrarse con un formulario de envío de datos y otro formulario de “Datos Enviados”, todo ello en una sola página. Hay 2 propiedades especialmente útiles: A c t i v e F o r m : Esta propiedad no es del propio formulario, sino de la página (se accede directamente con “this.Active Form”). Es un “String” que tiene el nombre del formulario activo cada vez. Pasar de un formulario a otro dentro de una misma página es en realidad cambiar esta propiedad. P a g i n a t e : Esta propiedad del formulario sirve para dispositivos con pantallas pequeñas. Si el formulario es grande y contiene varios controles, este booleano se pone a “true” para que se pagine automáticamente. De esta manera un formulario ocupa varias páginas por las que se puede ir navegando. <mobile:Form id=“F1” runat=“server”/>
Panel Un panel es otro contenedor de controles. Se puede colocar dentro de un formulario y
a su vez él mismo contener más controles. Esto se suele utilizar mucho en aquellos momentos en los que es necesario añadir controles dinámicamente en tiempo de ejecución. Si esto se hace con un formulario, los controles aparecerían al final, y muchas veces lo que se desea es que aparezcan en un lugar concreto, por ejemplo hacia la mitad, antes de unos controles y después de otros. Es común colocar el panel en aquél lugar donde se quieren colocar los controles dinámicamente y después añadir los controles directamente al mismo. Este panel gracias al “FlowLayout” del que se ha hablado, es capaz de expandirse según se vayan añadiendo controles de forma que ni siquiera es necesario especificar un tamaño concreto, los controles van ocupando su espacio. La propiedad interesante del panel es: C o n t r o l s : Es en realidad una lista de controles, se van añadiendo a ella los Mobile Web Controls que se desea que aparezcan en el panel. <mobile:Panel id=“P1” runat =“server”> [Controles] </mobile:Panel>
TextView Este control sirve para colocar grandes cantidades de texto. Para mostrar contenidos de mensajes o noticias, es común utilizar controles como este. Es un control que se combina con el atributo de paginación del formulario y se parte automáticamente en trozos, dejando por pantalla unas cuantas líneas y dando la posibilidad de navegar hacia el siguiente trozo de mensaje o el anterior. La propiedad más interesante es: T e x t : En este ”String” se deja el mensaje entero a mostrar. Es el propio control el encargado de partirlo en trozos si es necesario paginarlo. A través de las características del dispositivo que pide la página se averigua cómo paginar el texto (si es que hay que paginarlo). http://digital.revistasprofesionales.com
14-20 Móviles .qxd
20/12/06
11:45
Página 17
DISPOSITIVOS MÓVILES
Mobile Web Controls de ASP.NET
LISTADO 2
Código para manejar un ObjectList
public partial class FormMovil : System.Web.UI.MobileControls.MobilePage { private class Persona { private string nombre; public string Nombre { get { return nombre; } set { nombre = value; } } private string apellidos; public string Apellidos { get { return apellidos; } set { apellidos = value; } } private string dni; public string Dni { get { return dni; } set { dni = value; } } private string oficio; public string Oficio { get { return oficio; } set { oficio = value; } } public Persona(string dni, string nombre, string apellidos, string oficio) { this.dni = dni; this.nombre = nombre; this.apellidos = apellidos; this.oficio = oficio; } } protected void Form1_Activate(object sender, EventArgs e) { //Creamos 4 personas Persona[] personas = new Persona[4]; personas[0] = new Persona(“123456”, “David”, “Sainz González”, “Investigador”); personas[1] = new Persona(“456987”, “Aitor”, “Almeida escondrillas”, “Investigador”); personas[2] = new Persona(“325897”, “Ana”, “García Sánchez”, “Arquitecto”); personas[3] = new Persona(“852695”, “Ángel”, “Ibañez Ruiz”, “Analista”); //Asignamos las personas al ObjectList (Data Binding) this.ObjectList1.DataSource = personas; //El campo principal será el DNI this.ObjectList1.LabelField = “Dni”; //Cambiamos el texto del botón ‘Back’ this.ObjectList1.BackCommandText = “Volver”; //Realizamos el Data Bind this.ObjectList1.DataBind(); } }
Link El control “Link” sirve para insertar un hipervínculo dentro de la página. Este hipervínculo puede apuntar a una web para móviles o a otro recurso, por lo que habrá que tener cuidado de no redirigir a una página que el propio dispositivo no sea capaz de soportar. Por lo demás, es una etiqueta link normal, con la peculiaridad de poder adaptarse al formulario y su http://digital.revistasprofesionales.com
“FlowLayout”, además de adaptarse al dispositivo destino. Las propiedades principales para manejarla son: T e x t : Se trata del texto que se desea que el usuario lea cuando visite la página. N a v i g a t e U r l : Es la dirección a donde se redirige la página una vez el usuario ha hecho clic sobre el hipervínculo.
PhoneCall Este control es parecido a un link en su aspecto, pero su función es distinta. Dado que muchas de estas páginas son vistas por teléfonos móviles o elementos con capacidad de realizar llamadas telefónicas, este control da la posibilidad de llamar a un número de teléfono determinado cuando se hace clic sobre él. Es decir, sin que el usuario tenga que marcar dicho número, el 17
SOLO PROGRAMADORES nº 145
14-20 Móviles .qxd
20/12/06
11:45
Página 18
DISPOSITIVOS MÓVILES
dispositivo hace la llamada directamente. Es muy común en los formularios del tipo “Contacte con Nosotros”, sustituyendo al típico “mailto”, permitiendo una llamada directa en lugar de enviar un mail. Las propiedades principales del control son: T e x t : El texto que el usuario verá en el formulario. P h o n e N u m b e r : El número de teléfono que se marcará automáticamente en cuanto se haga clic sobre el control. <mobile:PhoneCall id=“call1 ” runat=“server” PhoneNumber=“23458961”> Texto </mobile:PhoneCall>
Figura 4. Arriba, el control “ObjectList” mostrando todos los elementos que contiene. Abajo, el mismo control mostrando los detalles del elemento seleccionado.
Calendar Este control es uno de los que más muestran la potencia de los Mobile Web Controls. Su forma puede variar mucho dependiendo del dispositivo destino, mostrándose como un calendario normal de ASP.NET en un navegador de un PC, o una caja de texto donde escribir la fecha en un teléfono móvil de display reducido. También puede adquirir más formas dependiendo de la potencia de visualización, como por ejemplo una lista desde donde seleccionar los meses y los días.
ObjectList Es un control interesante para visualizar elementos con varios campos. Debido a que las reducidas pantallas en pocas ocasiones dejan mostrar tablas con comodidad, este control permite mostrar todos estos elementos de una forma mucho más organizada. Primero, se muestra una lista con todos los objetos que contiene, sólo mostrando el campo principal. De esta forma el control es parecido a una lista normal. La salvedad es que cada campo es un hipervínculo que nos lleva a ver todos los detalles del elemento, es decir, nos lleva a ver el resto de campos. Esta lista también se adapta mucho a las capacidades de dispositivo y es el sustituto ideal del elemento “Table” de ASP.NET normal. Este control está programado de forma que no haya que introducir una sola línea de código para manejar el funcionamiento ni la visualización de cada elemento. Al hacer clic sobre cada objeto en la lista automáticamente aparecerá una pantalla que desplegará todos los detalles. Lo único que hay que hacer es rellenar los datos del control
SOLO PROGRAMADORES nº 145
18
Figura 5. Formulario donde crear filtros de dispositivo.
(normalmente a través de Data Binding) y especificar cuál será el campo principal. Si, como se ve en el listado 2, creamos un array de clases “Persona” con “DNI”, “nombre”, “apellidos” y demás, podemos dar esos datos al “ObjectList” y especificar que el campo principal sea el “DNI”. Lo que hará entonces este control es sacar una lista con todos los “DNI” que contiene. Al pinchar sobre cada uno de ellos nos llevará a otra página automáticamente donde nos mostrará los detalles de la “Persona”. Esto se puede ver en la figura 4. Las propiedades interesantes del control son: L a b e l F i e l d : Es un ”String” donde se especifica el nombre del campo principal del “ObjectList”. B a c k C o m m a n d T e x t : Cuando se va a la página donde se visualizan los detalles, automáticamente se coloca un
botón para navegar hacia atrás, de nuevo hacia la “ObjectList”. Este ”String” marca el texto que debe aparecer en ese botón.
Pero hay más… Además de todos estos controles están las típicas etiquetas, cuadros de texto, botones y demás controles tan comunes en un formulario. Los listados anteriormente son mencionados por ser especiales para móviles o tener alguna característica especialmente interesante.
Personalizando controles según el dispositivo Todos los controles vistos, como se ha dicho anteriormente, son capaces de adaptarse automáticamente, pero existen adehttp://digital.revistasprofesionales.com
14-20 Móviles .qxd
20/12/06
11:45
Página 19
DISPOSITIVOS MÓVILES
Mobile Web Controls de ASP.NET
más formas de hacer que la adaptación sea mucho más personalizada, siendo nosotros como programadores los que controlemos cómo se va a mostrar cada elemento del formulario dependiendo de quién lo visualice. Para hacer esto, primero necesitamos saber, desde nuestra propia página, qué dispositivo está accediendo, y dependiendo de ello poder realizar una acción u otra. Para ello se utilizan los “filtros de dispositivo”.
¿Qué son los filtros de dispositivo? Los filtros son los elementos dedicados a ayudarnos a diferenciar un dispositivo de otro, o unas capacidades de dispositivo de otras. Por ejemplo, para diferenciar si el dispositivo entiende lenguaje HTML o WML se utiliza uno de estos filtros. En realidad nosotros vamos a verlo como un gran “if” en el que, por ejemplo, si el dispositivo acepta HTML haremos unas cosas y si no, otras. La forma de crear estos filtros es muy sencilla, ya que Visual Studio tiene herramientas para ayudarnos. Para empezar hemos de crear primero los filtros de dispositivo que deseemos, por ejemplo, filtrar según soporten HTML (PCs normales y Pocket PCs) o WML (teléfonos móviles). Para ello en Visual Studio pinchamos sobre cualquier control y en sus propiedades veremos una llamada “Applied Device Filters”. Pinchando en ella nos aparece un cuadro de diálogo. En él debemos pinchar en el botón “Edit…”. Esto nos abrirá otro formulario donde podremos crear filtros de dispositivo. Dentro de este formulario pulsamos el botón de “Add Device Filter” para crear un nuevo filtro y le damos un nombre: HTML. En la lista de propiedades a comparar seleccionamos “PreferredRenderingType” y en el cuadro de texto de argumento tecleamos “html32”. Con esto estamos especificando que seleccionamos los dispositivos que prefieren mostrar el texto en HTML. Podemos crear otro filtro exactamente igual pero llamado “WML” y cuyo argumento contenga “wml11”. Así se pueden tener dos filtros creados.
Figura 6. Formulario para cambiar las propiedades de un control usando Property Overrides.
La lista de elementos a comparar es muy extensa y abarca desde tamaño de pantalla al modelo del dispositivo, con lo cual se pueden llegar a crear filtros muy precisos. Los creados servirán para diferenciar teléfonos móviles que aceptan WML, de PCs con navegadores normales que aceptan HTML. Al pulsar “OK” en este formulario pasamos al formulario anterior, donde ya podemos añadir a una lista los filtros creados, para poderlos utilizar.
Property Overrides Una vez tenemos los filtros de dispositivo que deseemos, una manera de personalizar los controles según los mismos es el llamado “Property Overrides”, es decir, modificar las propiedades de un control según las cualidades de un dispositivo. Esto se hace también de manera gráfica utilizando Visual Studio, lo que convierte a estos “Property Overrides” en algo potente y fácil de manejar. Tan fácil como seleccionar un control y hacer clic sobre su propiedad “PropertyOverrides”, donde aparecerá un formulario nuevo, con una lista de selección y un cuadro de propiedades. En la lista de selección aparecerán los filtros de dispositivo aceptados. Si está vacía se repite el paso de añadir filtros, visto en el apartado anterior. Seleccionando un filtro de esa
lista, aparecerá el cuadro de propiedades para el control. De tal forma que podemos, por ejemplo, colocar la propiedad “Visible” a “false” en el filtro WML y a “true” en el filtro HTML. Esto ocasionará que un navegador que acepte HTML vea el control mientras que el que acepte WML no lo vea. El cuadro de propiedades que pueden cambiarse es muy amplio y abarca muchos elementos normalmente ligados a la forma de presentación del control. Este abanico de propiedades que pueden modificarse puede servirnos para mejorar la adaptación automática que ya viene dada por defecto en los controles.
Device Specific Además de todo lo visto existe otro mecanismo de personalización de páginas, unos controles especiales llamados “Device Specific”. Estos controles se colocan dentro de cualquier formulario o panel, pero si no se hace nada más con ellos no aparecerán en las páginas, porque no son controles en sí mismos. Estos controles sirven para colocar código dentro de ellos. Los “DeviceSpecific” se utilizan para colocar en la página código especial en cuanto se detecta un dispositivo concreto. Es posible detectar una cierta gama de teléfonos móviles e insertar código WML literal, espe-
LISTADO 3
Detectando el tipo de cliente
<mobile:DeviceSpecific ID=”DeviceSpecific1” Runat=”server”> <Choice Filter=”WML” Xmlns=”http://schemas.microsoft.com/mobile/html32template”> </Choice> <Choice Filter=”HTML” Xmlns=”http://schemas.microsoft.com/mobile/html32template”> </Choice> </mobile:DeviceSpecific>
http://digital.revistasprofesionales.com
19
SOLO PROGRAMADORES nº 145
14-20 Móviles .qxd
20/12/06
11:45
Página 20
DISPOSITIVOS MÓVILES
Figura 7. Un “DeviceSpecific” dentro de un formulario.
Figura 8. Diferentes vistas de un control “Calendar” según el dispositivo que lo esté visualizando.
cialmente para ellos. Los “DeviceSpecific” trabajan también con filtros de dispositivo para averiguar quién ha pedido la página. Sin embargo a diferencia del Property Overrides, que cambia las propiedades de un control, este mecanismo coloca código directamente en la página, ya sea HTML, WML, controles ASP normales, etc. Desde Visual Studio se pueden colocar estos controles especiales, que tienen también una propiedad “AppliedDeviceFilters” para ir añadiendo los filtros de dispositivo
LISTADO 4
deseados. Una vez se hace esto, se puede mirar directamente en el código de etiquetas de la página. Si se aplican los filtros creados en apartados anteriores queda una estructura como esta: Podemos apreciar unas etiquetas llamadas “Choice”, que son las que van a actuar como un gran “if”. Se detecta el tipo de dispositivo que pide la página y dependiendo de sus características se activa un “Choice” u otro. Dentro de cada elemento “Choice” se escribe directamente el código que se desea. Se Ejemplo de Device Specific
<mobile:Panel id=”Panel1” runat=”server”> <mobile:DeviceSpecific id=”DeviceSpecific1” runat=”server”> <Choice Filter=”isWML11” Xmlns=”http://schemas.microsoft.com/mobile/html32template”> <ContentTemplate> <mobile:Label ID=”l1” Runat=”server”>Discos</mobile:Label> </ContentTemplate> </Choice> <Choice Filter=”isHTML32” Xmlns=”http://schemas.microsoft.com/mobile/html32template”> <ContentTemplate> <table cellpadding=”0” cellspacing=”0”> <tr> <td colspan=”2”><img src=”barraH.jpg” /></td> </tr> <tr> <td valign=”top”><img src=”barra.jpg” /></td> <td valign=”top”></td> </ContentTemplate> </Choice> </mobile:DeviceSpecific> </mobile:Panel>
SOLO PROGRAMADORES nº 145
20
puede detectar, por ejemplo, si se trata de un PC que utiliza un navegador normal y colocar entonces controles ASP normales, o detectar un teléfono móvil e insertar código WML con funciones específicas. Un ejemplo de código de utilización del ”DeviceSpecific” está en el listado 4. En ese código se coloca un panel y dentro de él un control “DeviceSpecific”, con los filtros para HTML y WML. Si el dispositivo sólo soporta WML se coloca un Mobile Web Control tipo “label” y si soporta HTML se coloca código HTML directamente para escribir una tabla. Junto con el artículo se adjuntan una serie de ejemplos que muestran el funcionamiento tanto del Device Specific como del Property Overrides y, en general, el funcionamiento de los Mobile Web Controls. Pueden abrirse directamente con Visual Studio 2005 y ejecutarse para ver cómo trabajan. La forma normal de verlo en un PC es con un navegador convencional, pero si se navega con un teléfono móvil o se utiliza un emulador, puede notarse el gran cambio y la adaptación. Es posible bajarse una versión de evaluación de 30 días de un emulador de navegador para móviles. Funciona bajo Windows y se puede descargar desde aquí: http://download.winwap.org.
Conclusiones En este artículo se ha visto cómo programar páginas para dispositivos móviles utilizando unos controles especiales de ASP.NET, llamados Mobile Web Controls. Se ha hablado de su potente capacidad de adaptación al hardware de quien pide las páginas y se ha visto cómo personalizarlos aún más utilizando mecanismos como Property Overrides o Device Specific. Crear este tipo de páginas es muy sencillo y el hecho de que puedan agregarse a sitios web de ASP.NET que no sean específicos para móviles puede dar mucha potencia, programando una web de la manera habitual pero a la vez creando secciones dentro de ella preparadas para cualquier tipo de dispositivo. En un mundo en el que los teléfonos móviles están a la orden del día y donde el acceso a Internet a través de ellos es cada vez más frecuente, crear secciones dedicadas a estos teléfonos en los portales web es una opción a considerar tanto desde el punto de vista de su utilidad como de la imagen de empresa. http://digital.revistasprofesionales.com
Suscripcion Solop2005
21/12/06
15:04
Página 1
Suscripción a Sólo Programadores SUSCRIPCIÓN PARA ESPAÑA Opción A: Suscripción anual con 25% descuento: 54 euros* (3 revistas gratis, 18 euros de ahorro) Opción B: Suscripción anual con 15% descuento: 61,20 euros* (tapas de regalo, 10,80 euros de ahorro) *10 euros de gastos de envío para la opción contrareembolso
SUSCRIPCIÓN PARA EXTRANJERO Opción C: Suscripción anual con 25% descuento 90 euros (gastos de envío incluidos) FORMA DE PAGO EXTRANJERO: Tarjeta de crédito + fecha de caducidad
FORMAS DE PAGO PARA ESPAÑA Contrareembolso (10 euros gastos de envío) Giro Postal a Revistas Profesionales, S.L. Transferencia al Banco Popular: c.c:0075/1040/43/0600047439 Talón Bancario a nombre de Revistas Profesionales Domiciliación Bancaria Tarjeta de Crédito + fecha de caducidad
Solicitud de suscripciones y más información en el teléfono 91 304 87 64, en el fax 91 327 13 07 y en rpsuscripciones@revistasprofesionales.com
22-31 Middleware.qxd
20/12/06
12:22
Página 22
MIDDLEWARE
Primera aproximación a Windows Vista PABLO OLMOS
La mayoría de los lectores sabrán que la nueva versión del sistema operativo Windows ya está lista para llegar al gran público. Sin embargo, es posible que la misma mayoría de lectores se formulen preguntas del tipo… ¿Qué ediciones habrá del producto? ¿Qué diferencias existen entre ellas? ¿Hay novedades en cuanto a la interfaz de usuario? ¿Y en cuanto a la accesibilidad? ¿Y en cuanto al rendimiento? ¿Han incluido mejoras relativas a la conectividad? Y sobre todo… ¿Nos afecta todo esto a nosotros, los desarrolladores? Introducción Windows Vista, la última y por lo tanto más reciente evolución del sistema operativo de Microsoft, está ya entre nosotros. Seguro que el lector habrá oído ya mucho acerca de esta nueva edición de Windows, pues la maquinaria de comunicación de Microsoft empezó el lanzamiento del producto hace ya muchos meses. Sin embargo, es posible que aún no tengamos claro qué de nuevo nos aporta Windows Vista. Todos hemos oído que, obviamente, será una revolución, puesto que aporta mejoras en cuanto a la usabilidad, la conectividad, etc. pero desde Sólo Programadores creemos necesario hacer un exhaustivo análisis de las tecnologías incorporadas a esta nueva versión con objeto de mostrarlas a los lectores de una manera estructurada y organizada. Esperemos que este artículo sirva para concretar y aclarar las ideas del lector acerca de “todo lo nuevo” que trae consigo Windows Vista, y convertir esta “nebulosa de novedades” en una lista de funcionalidades concretas.
SOLO PROGRAMADORES nº 145
22
Bibliografía y fuentes de información El contenido de este artículo es fruto de la síntesis y resumen de distintas fuentes de información, entre las cuales destaca por un lado el extenso documento “Windows Vista Product Guide” y, por otro, el conocimiento y la información adquirida por un servidor como consecuencia de mi asistencia a la mayoría de eventos y conferencias organizadas por Microsoft acerca de este tema, como pueda ser el Tech-Ed o la presentación de Windows Vista.
Ediciones de Windows Vista Antes de abordar las nuevas funcionalidades que nos aporta Windows Vista, creemos necesario hacer un breve repaso a las ediciones disponibles del producto. Como consecuencia de la gran variedad de ediciones, este suele ser uno de los puntos más turbios y que ofrece mayor confusión. Como previo a la descripción de funcionalidades presente en cada edición, vale la pena comprar el cambio de estrategia de Microsoft con respecto a Windows XP. Con Windows XP, existían 6 ediciones: Home Edition, Media Center Edition, Professional Edition, Tablet PC Edition, Professional x64 Edition y, para mercados emergentes, Starter Edition. Mientras que Windows XP Home Edition y Windows XP Professional Edition iban dirigidas a un perfil específico de usuarios, las otras 4 ediciones estaban orientadas a determinadas configuraciones de hardware. Ahora, Microsoft ha reorientado su estrategia de ediciones, ofreciendo varias SKU (ediciones comerciales para usuario final) dirigidas siempre a perfiles de usuario, anteponiendo siempre el destinatario de la tecnología al hardware, con la idea de ajustar la oferta a la demanda. Con esta http://digital.revistasprofesionales.com
22-31 Middleware.qxd
20/12/06
12:22
Página 23
MIDDLEWARE
Primera aproximación a Windows Vista
filosofía, Microsoft pone a disposición del público las siguientes ediciones de Windows Vista.
Windows Vista Home Basic
Edición básica para consumidores de mercados desarrollados, en la que podremos encontrar las siguientes características: Mejoras en seguridad y fiabilidad. Control parental. Interfaz de usuario Windows Vista Basic. Innovaciones en las funciones de búsqueda y organización. Funciones de red mejoradas.
Edición orientada íntegramente a su uso profesional, dirigida a trabajadores de pequeñas, medianas o grandes empresas que tengan equipos de sobremesa o portátiles. Incluye todas las funcionalidades de la edición Home Basic y añade: Interfaz de usuario Windows Aero. La función Windows Tablet PC. Sincronización de equipo a equipo. Características empresariales importantes, como unirse a un dominio, compatibilidad con las directivas de grupo y sistema de archivos de cifrado. Características específicas para pequeñas empresas, como fax y escáner.
Windows Vista Enterprise
Windows Vista Home Premium
Edición principal de Windows Vista, orientada a los consumidores que disponen tanto de equipos de sobremesa como equipos portátiles. Incluye todas las características de la edición Home Basic y añade: Interfaz de usuario Windows Aero. La funcionalidad de Windows Media Center. Creación y grabación de DVDs. La función Windows Tablet PC. Sincronización de equipo a equipo.
Máxima edición de Windows Vista, tanto para equipos de sobremesa como equipos portátiles, orientada sólo a aquellos usuarios que tengan sus equipos cubiertos por un contrato Microsoft Software Assurance. Incluye todas las características de la edición Business y añade: Cifrado de unidad de BitLocker de Windows. Todos los idiomas del mundo para la interfaz. Virtual PC Express. Subsystem for UNIX-based Applications (SUA).
Windows Vista Starter
Windows Vista Ultimate
Edición más profesional que las dos anteriores, va orientada a personas que utilizan el mismo equipo (de sobremesa o portátil) tanto para trabajar como para otras tareas lúdicas. Esta edición incluye las funcionalidades de Home Premium y añade las funcionalidades de la edición Enterprise (véase más adelante).
Edición más limitada de Windows Vista, orientada a las familias y a nuevos usuarios de determinados mercados emergentes. Destacamos de esta edición las siguientes funcionalidades: Mejoras en la seguridad y fiabilidad. Innovaciones en las funciones de búsqueda y organización. Interfaz de usuario de Windows Vista Basic. Sistema operativo de 32 bits diseñado específicamente para equipos económicos.
Windows Vista Business
Interfaz de usuario La interfaz de usuario de un sistema operativo es, quizás, el punto que más heterogehttp://digital.revistasprofesionales.com
Figura 1. Oferta segmentada por usuarios, según sean “Customers” (Basic, Premium, Ultimate), “Small Business” (Business, Ulti -mate) o “Medium and Large Businesses” (Business, Enterprise).
neidad de opiniones despierta entre la comunidad de informáticos y también de usuarios convencionales. Por un lado, hay quien defiende que no necesita un escritorio en 3D y a todo color para administrar sus archivos, ejecutar sus aplicaciones y, en general, gobernar su PC. A favor de esta postura, básicamente está el consumo excesivo de recursos de una interfaz gráfica sobrecargada. En el otro extremo, están quienes acogen con buenos ojos todas aquellas mejoras relativas a la interfaz, entendiendo que una interfaz gráfica potente y bien diseñada tiene una clara repercusión (en clave positiva) en la productividad. Y es precisamente en esta línea en la que se sitúa Microsoft, ya que muchas de las novedades de Windows Vista tienen que ver con su “aspecto”.
Cuatro niveles gráficos de experiencia de usuario Windows Vista ofrece 4 niveles de experiencia de usuario que se basan en las funcionalidades gráficas del sistema. Entre ellas, la más destacada es, a su vez, la más sofisticada, que recibe el nombre de Aero. Sin embargo, vamos a repasar uno por uno cuáles son estos 4 niveles: Experiencia Windows Básico: Ofrece el entorno gráfico más sencillo, muy simplificado en relación a lo que conocemos de versiones anteriores de Windows. Básico puede correr en cualquier edición de Windows Vista, y no tiene requerimientos específicos en cuanto al hardware. Experiencia Windows Clásico: Ofrece las mismas funcionalidades que Básico, pero con la apariencia de Windows 2000. Clásico también está disponible en todas las ediciones y tam23
SOLO PROGRAMADORES nº 145
22-31 Middleware.qxd
20/12/06
12:22
Página 24
MIDDLEWARE
poco tiene requerimientos específicos de hardware. Experiencia Windows Estándar: Ofrece un aspecto más sofisticado, añadiendo confiabilidad y rendimiento mejorado en cuanto a la usabilidad del sistema. Esta experiencia, basada en la avanzada tecnología de gráficos de Vista, ofrece un mejor control de las ventanas y una mayor definición. La experiencia Estándar va orientada a equipos con mayores capacidades gráficas, que dispongan hardware gráfico compatible con el nuevo Modelo de Controladores de Pantalla de Windows (WDDM). E x p e r i e n c i a W i n d o w s A e r o : Ofrece la experiencia gráfica más avanzada, disponible para los clientes del Programa de Ventajas de Windows Original de Microsoft que tengan equipos con hardware gráfico compatible con WDDM. En los últimos eventos organizados por Microsoft, las demostraciones de las capacidades de Windows Aero han sido de las más llamativas. Lo más destacable de esta tecnología son los efectos de cristal y reflexiones presentes en las ventanas, que permiten crear un marco suave y agradable, gracias al cual podemos concentrarnos en el contenido de la ventana (véase la figura 2). Hay otras dos nuevas y atractivas características de Aero: Flip y Flip 3D, pensadas para optimizar la administración de ventanas. Flip es una actualización del clásico “Alt+Tab” para cambiar la ventana activa. Ahora, en lugar de mostrar los iconos de las ventanas, Aero nos mostrará una miniatura de las ventanas, tal como puede verse en la figura 3. Por su parte, Flip 3D ofrece una nueva manera de encontrar la ventana que se desea. En este caso, al presionar las teclas
Figura 2. La experiencia gráfica Aero incluye ventanas con efectos traslúcidos que pueden ser configurados por el usuario.
SOLO PROGRAMADORES nº 145
24
“Inicio+Tab” Aero nos muestra una vista ampliada y en 3D de todas las ventanas activas, como puede verse en la figura 4.
es, quizás, lo más llamativo. La figura 5 muestra el comportamiento de la funcionalidad de búsqueda en el menú de inicio.
Figura 3. Flip en acción (“Alt+Tab”) para seleccionar la ventana activa.
Figura 5. Tan solo escribiendo la letra “c”, Vista nos muestra los programas que empiezan por dicha letra (“Calculator”, “Chess”, “Control Panel”, etc.) así como los ficheros y directorios que también empiezan por “c”.
Figura 4. Flip 3D en acción (“Inicio+Tab”) para seleccionar la ventana activa.
Funciones de búsqueda y organización Después de la espectacular interfaz gráfica proporcionada por Aero, otra de las grandes novedades presentadas en los más recientes eventos organizados por Microsoft es la función de búsqueda y organización de la información. Windows Vista pone a nuestra disposición, tanto en el menú de “Inicio” como en las ventanas del Explorador de Windows, una caja de texto con la que podremos realizar búsquedas rápidas tanto de programas como de ficheros. El funcionamiento es muy sencillo, basta con escribir el texto de aquello que queremos encontrar y Vista nos irá mostrando y modificando, a medida que vayamos escribiendo, la lista con los resultados. Por ejemplo, si escribimos “Excel”, Vista nos mostrará los documentos Excel de nuestro equipo pero también el enlace para lanzar Microsoft Excel. Si lo que queremos es buscar un documento cuyo autor es “Pablo”, será suficiente con escribir “Pablo”. Realmente, las posibilidades de búsqueda son bastante potentes y su facilidad de uso
Figura 6. El aspecto y las funcionalidades ofrecidas por el Explorador de Windows han sufrido importantes cambios.
El explorador de Windows Vista El Explorador de Windows es un clásico entre los usuarios de este sistema operativo. Es la aplicación más utilizada, ya que nos permite acceder y organizar todo tipo de información, desde fotografías hasta documentos, pasando por ficheros de audio, vídeo, etc., es decir: todo. Por lo tanto, es lógico y normal que Microsoft haya puesto especial atención en mejorar la funcionalidad de esta parte del sistema. Como puede apreciarse en la figura 6, el nuevo explorador de Windows ofrece: B ú s q u e d a i n s t a n t á n e a : Siempre disponible, permite encontrar archivos y aplicaciones tal como se ha descrito en el punto anterior (véase la figura 7). http://digital.revistasprofesionales.com
22-31 Middleware.qxd
20/12/06
12:22
Página 25
MIDDLEWARE
Primera aproximación a Windows Vista
B a r r a d e c o m a n d o s : Muestra las funcionalidades adecuadas en base a los archivos que están siendo mostrados por el explorador (véase la figura 8). I c o n o s a c t i v o s: Muestran una miniatura del contenido real de cada archivo. P a n e l d e v i s t a p r e v i a: Ofrece información detallada acerca del fichero seleccionado (véase la figura 9). P a n e l d e l e c t u r a: Permite tener una vista previa del contenido de aquellos archivos que tiene esta función habilitada.
(CRT) han dejado paso a las pantallas planas, basadas en la tecnología Pantalla de Cristal Líquido (LCD), empleadas ya tanto en los equipos de sobremesa como en el salón de los hogares. Por esta razón, y en vista de este nuevo panorama, ClearType se presenta como una importante funcionalidad pensada, sobre todo, para aquellos usuarios que pasamos horas frente a la pantalla.
el acceso a la información. Veamos algo más sobre los nuevos Microsoft gadgets.
Sidebar Windows Sidebar es el panel que encontramos a la izquierda de la pantalla, en el escritorio (véase la figura 11). La función de este panel es la de albergar a los gadgets del usuario, situándolos así en un punto de acceso rápido. Windows Sidebar puede configurarse para permanecer siempre visible o bien descansar bajo la ventana activa.
Gadgets
Figura 10. ClearType es una tecnología patentada por Microsoft.
Figura 7. Funciones de búsqueda instantánea del Explorador de Windows.
Figura 8. Funciones de barra de comandos del Explorador de Windows.
Figura 9. Funciones de vista previa del Explorador de Windows.
Tecnología ClearType ClearType será nuestro último punto de análisis por lo que respecta a las novedades de la parte gráfica del nuevo Windows Vista. Pero… ¿qué es ClearType? ClearType es una tecnología patentada por Microsoft que tiene por objetivo mejorar la legibilidad del texto en pantalla, influyendo positivamente también en la comprensión y la velocidad de lectura (véase la figura 10). ClearType ya estaba presente en algunas ediciones de Windows XP, aunque no estaba activo por defecto, ya que ClearType es una tecnología especialmente diseñada para las pantallas de última generación, muy poco frecuentes hace unos años. Sin embargo, ahora el escenario es completamente distinto: recientemente, las pantallas de Tubo de Rayos Catódicos http://digital.revistasprofesionales.com
Los gadgets, un nuevo concepto de aplicación en Windows Los gadgets de Windows Vista nacen con el objetivo de resolver un problema “de concepto”, presente en muchos sistemas operativos: Para utilizar una aplicación, lo primero es ejecutarla. El problema ocurre cuando tenemos la necesidad de acceder a varias fuentes de información de manera reiterativa en varios momentos del día. Es decir, imaginemos que, a lo largo del día, tenemos que utilizar en repetidas ocasiones recursos como la calculadora, la página web que nos ofrece noticias meteorológicas, la página web que nos ofrece noticias deportivas, la página web que nos ofrece noticias internacionales, nuestro planificador de tareas y el calendario. Para todo esto, Windows XP nos ofrecía dos opciones: Una de ellas era lanzar la aplicación deseada en cada momento: abrir la calculadora, abrir el calendario, abrir nuestro planificador de tareas y el explorador de Internet. La segunda opción era mantener todas estas aplicaciones activas, minimizadas en la barra del escritorio, para poder usarlas cuando fuera necesario sin tener que ejecutarlas de nuevo. En ambos casos, se producía una sobrecarga de rendimiento en el sistema. En este sentido, los gadgets de Vista pretenden facilitar las tareas más repetitivas del usuario que tienen que ver con
Los gadgets pueden definirse como miniaplicaciones de naturaleza muy diversa. Tal como se explica desde Microsoft, desde un gadget podemos conectarnos a un servicio web para obtener cualquier tipo de información (meteorológica, tráfico, mapas , etc.), así como a cualquier aplicación del sistema (véase la figura 12). Es decir, un gadget puede tener cualquier fin, por lo que será nuestro ingenio, el de los desarrolladores, quien pueda ex Figura 11. Windows plotar todas las Sidebar, el panel donde se capacidades de alojan nuestros gadgets. este nuevo tipo de aplicaciones. En futuras ediciones de Sólo Programadores, esperamos poder ofrecer las nociones necesarias para el desarrollo de este tipo de programas para Windows Vista. Mientras tanto, solo comentar que Vista incorpora, por defecto, un buen número de gadgets, aunque Microsoft ofrece, en el sitio http:// microsoftgadgets.com, muchos otros para que puedan ser descargados e instalados. 25
SOLO PROGRAMADORES nº 145
22-31 Middleware.qxd
20/12/06
12:22
Página 26
MIDDLEWARE
Figura 12. Gadgets en el escritorio de Windows Vista.
virus, indexación, etc.) pasen a ocupar buena parte de la memoria para realizar sus tareas. El problema surge cuando el usuario regresa a su puesto de trabajo y quiere utilizar las aplicaciones que estaba utilizando antes de ausentarse. En este momento, el sistema debe de restaurar la memoria RAM para dejarla tal como estaba, con la consiguiente pérdida de rendimiento. Es en este momento cuando el usuario tiene la sensación de que su equipo funcionaba mejor antes de abandonar su puesto de trabajo. SuperFetch administra la memoria mediante un algoritmo que da prioridad a las aplicaciones de usuario sobre las tareas en segundo plano. Con SuperFetch, las tareas en segundo plano se siguen ejecutando en aquellos momentos en los que el equipo está inactivo. Sin embargo, cuando finalizan SuperFetch las elimina de la RAM para ubicar nuevamente las aplicaciones del usuario.
E/S de baja prioridad
Windows incorpora una serie de tecnologías orientadas, precisamente, a ofrecer un alto rendimiento.
Aunque la tecnología SuperFetch va a influir positivamente en el rendimiento del sistema, otro de los aspectos claves en la capacidad de respuesta del sistema son las operaciones de Entrada/Salida (E/S). En Windows XP todas las aplicaciones tenían la misma prioridad a la hora de acceder a un dispositivo, como por ejemplo el disco duro. Ahora, Windows Vista introduce el concepto de E/S de baja prioridad, lo cual permite escribir aplicaciones que tendrán menos prioridad a la hora de acceder a los dispositivos externos.
SuperFetch
ReadyBoost
Nueva tecnología de administración de memoria disponible en Windows Vista, que permite ofrecer una experiencia de rendimiento consistente. Los algoritmos de gestión de memoria anteriores a SuperFetch únicamente cambian el contenido de la memoria RAM cuando una nueva aplicación debe ejecutarse. Es entonces cuando actúan para buscar sitio en la memoria RAM del equipo. Con algoritmos de este tipo, el problema surge cuando el usuario abandona su puesto de trabajo durante unas horas. Esto provoca que aquellas tareas que se ejecutan en segundo plano (escaneo de
Todos sabemos que una de las maneras de mejorar el rendimiento de nuestro equipo es aumentar la memoria RAM. Esta solución, obviamente, sigue siendo válida para Windows Vista, aunque es algo costosa. La tecnología ReadyBoost permite extender la memoria del equipo, enchufando una unidad flash USB, por ejemplo, que actuará como una memoria caché adicional y que ofrecerá un tiempo de acceso mucho menor a al del disco duro. Combinar las tecnologías Ready Boost con SuperFetch puede aportarnos una mejor capacidad de respuesta por parte del sistema operativo.
Figura 13. Página web de Microsoft dedicada a los gadgets de Windows Vista (http://microsoftgadgets.com).
Rendimiento Estas líneas van especialmente dirigidas a los usuarios de sistemas Windows: seguro que todos hemos vivido inconsistencias en el rendimiento de nuestros sistemas. Es decir, un día las aplicaciones se inician de manera rápida y funcionan bien, sin embargo, por causas desconocidas, el paso del tiempo hace que nuestro sistema cada vez sea más lento y que las aplicaciones tarden más en iniciarse. Además, los programas van mucho más rápidos por la mañana que a última hora de la tarde, cuando estos llevan todo el día en marcha. ¿Por qué ocurre esto? ¿Será capaz Windows Vista de acabar con esta inconsistencia de rendimiento? En este sentido, la nueva versión de
SOLO PROGRAMADORES nº 145
26
http://digital.revistasprofesionales.com
22-31 Middleware.qxd
20/12/06
12:22
Página 27
Sólo Programadores en Formato Digital Por menos dinero Llegará antes a su ordenador que a los quioscos Entra en http://digital.revistasprofesionales.com Suscripción anual a Sólo Programadores (12 números) por sólo 27 euros Suscripción anual a Sólo Programadores (12 números) y a Mundo Linux (6 números) por sólo 30 euros Regalo de un CD-ROM con el archivo de los 12 ejemplares de la temporada 2004-05
22-31 Middleware.qxd
20/12/06
12:22
Página 28
MIDDLEWARE
Figura 14. La interconexión de dispositivos es más fácil con Connect Now.
Utilizar la tecnología ReadyBoost es muy sencillo, algo que los usuarios sin duda agradecerán: basta con enchufar el disco externo USB. En este momento, Windows Vista comprobará la velocidad de acceso y, en caso de que sea un dispositivo apto para la tecnología ReadyBoost, el sistema nos mostrará una ventana de diálogo en la que nos preguntará si queremos utilizar este dispositivo para extender la memoria de nuestro equipo. Así de simple.
solo será necesario insertar el disco USB al dispositivo en cuestión para que éste obtenga todos los datos de configuración de la red, quedando así conectado de manera casi instantánea. La idea que hay tras Connect Now es, como puede suponerse, facilitar al usuario las tareas de conexión entre dispositivos heterogéneos, como puedan ser varios equipos, impresoras, reproductores de música, sistemas de juego, etc.
Tablet PC ReadyDrive Tecnología que tiene por objeto ofrecer un inicio, hibernación y reanudación más rápido. La utilización de esta tecnología tiene como requisito el disponer de un disco duro híbrido (integra la memoria flash no volátil en la unidad de disco). ReadyDrive está pensado para equipos móviles, ya que permite que estos puedan prescindir, en ocasiones, del disco duro mecánico, con el consiguiente ahorro de energía.
Esta sección va dedicada a los usuarios de sistemas Tablet PC. Las novedades que expondremos en este punto serán bienvenidas por los usuarios de este tipo de dispositivos, que a menudo han experimentado un sentimiento de frustración al realizar acciones como seleccionar varios elementos, uso de la pantalla táctil sin el lápiz, escritura a mano, borrado de caracteres, etc.
Lápiz mejorado
Redes Windows Vista aglutina todas las funciones relativas a la conexión del equipo en el Centro de Redes, puesto de control que permite al usuario comprobar el estado de su conexión, ver gráficamente la topología de la red y los equipos conectados, así como solucionar problemas de conexión. Sin embargo, en nuestra opinión la mejora más destacable es el concepto Connect Now de Windows Vista. Gracias a Connect Now, es posible guardar la configuración de la red en una unidad de almacenamiento flash USB, que nos permitirá simplificar el proceso de agregar a la red equipos o dispositivos adicionales. Para ello, tan
SOLO PROGRAMADORES nº 145
28
El uso del lápiz en Windows XP Tablet PC Edition presentaba, básicamente, dos problemas. Por un lado, falta de precisión, ya que en ocasiones podía resultar algo difícil apuntar a un elemento pequeño, como por ejemplo una barra de desplazamiento. Por otro lado, falta de
“feedback” por parte del sistema cuando el usuario punteaba con el lápiz. Esto último provocaba que el usuario no supiera si era debido a que no había punteado con suficiente fuerza o bien a que el sistema era lento. Ambos problemas han sido solucionados con la presente edición de Windows Vista para Tablet PC. Por un lado, el lápiz ofrece mayor precisión, y por otro, ofrece comentarios visuales cuando punteamos, gracias a los cuales podremos saber de qué manera el sistema ha percibido la presión que hemos hecho sobre la pantalla (véase la figura 15). Además, Windows Vista añade el concepto de “Movimientos rápidos del lápiz”, una nueva funcionalidad que nos permitirá realizar acciones de manera ágil aumentando así nuestra productividad. Por ejemplo, desplazando con velocidad el lápiz en sentido descendente conseguiremos el mismo efecto que si punteamos sobre la barra de desplazamiento y arrastramos hacia abajo (véase la figura 16). También es posible realizar acciones de edición, como copiar, cortar y pegar. Además, los movimientos rápidos del lápiz pueden ser personalizados.
Pantalla táctil compatible En caso de que la entrada táctil del dispositivo esté disponible, podrán realizarse las acciones sobre ella con el lápiz, pero también con los dedos. Obviamente, con el dedo se pierde precisión, sin embargo Windows Vista nos mostrará un “área de acción”, similar al puntero del ratón, que se desplazará debajo de nuestro dedo y que nos asistirá en las tareas donde se requiera mayor precisión.
Mejor reconocimiento en la escritura a mano El reconocimiento de la escritura a mano es un tema complejo, pues cada persona
Figura 15. Comentarios visuales mostrados por Windows Vista al puntear con el lápiz sobre nuestro Tablet PC.
http://digital.revistasprofesionales.com
22-31 Middleware.qxd
20/12/06
12:22
Página 29
MIDDLEWARE
Primera aproximación a Windows Vista
revisar si hay nuevos correos electrónicos en la bandeja de entrada o bien chequear la agenda del día.
Reconocimiento de voz
Figura 16. Usando los movimientos rápidos el lápiz para leer un documento de varias páginas.
tiene su caligrafía particular. Es muy probable que el lector haya intentado escribir alguna palabra con un dispositivo dotado de reconocimiento de escritura y se haya sentido frustrado por la baja tasa de éxito en el reconocimiento. La solución que se ha adoptado referente a este tema en Windows Vista es el entrenamiento del sistema. De esta manera, el usuario no tendrá que cambiar su manera de escribir, sino que será el reconocedor de escritura quien adaptará su comportamiento en función del estilo de escritura del usuario, después de un periodo de entrenamiento, claro está.
teléfonos móviles, ordenadores portátiles, etc. La idea que hay tras Windows SideShow es ofrecer al usuario la posibilidad de realizar acciones rápidas de manera ágil sin la necesidad de abrir el portátil, tal sólo interactuando con la pantalla auxiliar (véase la figura 17). Estas acciones pueden ser, por ejemplo,
Windows Vista es un sistema sensibilizado con la accesibilidad, y prueba de ello son las numerosas aportaciones que hace en este campo. Sin embargo, la más espectacular de ellas es la que tiene que ver con el reconocimiento de voz. Podemos dar fe de que las demostraciones de reconocimiento de voz realizadas por el personal de Microsoft en los distintos eventos celebrados en los últimos meses, han sido realmente espectaculares. Es importante destacar que el reconocimiento de voz no se limita a ciertos comandos, sino que permite al usuario dictar un texto, reconociendo así el lenguaje natural. En efecto, el reconocimiento de voz de Windows Vista permite a los usuarios prescindir del ratón y del teclado para muchas de las acciones más habituales, como puedan ser la redacción de un documento de texto o un correo electrónico (ahora bastará con dictarlo, no será necesario escribirlo), ejecutar un programa como Microsoft Excel, minimizar una ventana, etc.
Mejores opciones de borrado En Windows XP Tablet PC Edition el borrado de palabras o caracteres se hacía mediante el dibujo del símbolo Z. Windows Vista se muestra más tolerante en este sentido, ya que ofrece más variedad de dibujos para la acción de borrado, como por ejemplo M o W. Además, si el lápiz del Tablet PC incorpora borrador, éste también puede ser usado para hacer correcciones en la escritura.
Windows SideShow Windows SideShow es una nueva plataforma orientada a funcionar en dispositivos con pantallas secundarias, ya sean http://digital.revistasprofesionales.com
Figura 17. Los dispositivos con pantalla auxiliar podrán explotar las características de Windows SideShow.
29
SOLO PROGRAMADORES nº 145
22-31 Middleware.qxd
20/12/06
12:22
Página 30
MIDDLEWARE
El inconveniente que presenta, y que es inherente a las tecnologías de reconocimiento del lenguaje natural, es que el sistema requiere de un entrenamiento para ofrecer tasas de reconocimiento aceptables. En este sentido, después de un entrenamiento guiado por un asistente (proceso que puede llevarnos entre una hora y dos horas), el sistema empezará a reconocer nuestra voz. Sin embargo, sí es posible afirmar que el sistema funcionará cada vez mejor, puesto que en cada sesión de interacción mediante voz el sistema aprenderá de nuestra forma de hablar, consiguiendo así mejores resultados cada vez que usemos el reconocedor. Además, Windows Vista también incorpora un sistema de síntesis de voz, por lo que el sistema no solo está preparado para escuchar, sino que también podrá hablar.
WinFX WinFX es el nombre que recibe el nuevo modelo de programación en el que se basarán las nuevas aplicaciones creadas para funcionar sobre Windows Vista. WinFX incluye a la plataforma .NET y, además, incorpora Cuatro módulos cuya funcionalidad se detallará a continuación. Sin embargo, aquí va un avance: Presentation Foun Windows d a t i o n ( W P F ) : Proporciona las clases necesarias para la capa de presentación de las aplicaciones. Más allá de los clásicos formularios de introducción y presentación de datos, WPF permitirá interfaces de usuario avanzadas basadas en documentos y multimedia. Tecnología “InfoCard” de Micro s o f t : Orientado al acceso de la información online más sensible, añade seguridad en este tipo de acciones comprometidas. Windows Communication Foun d a t i o n ( W C F ) : Proporciona los recursos necesarios para crear aplicaciones orientadas a servicios del tipo “bajo demanda” y/o “tiempo real”. Windows Workflow Foundation ( W F ) : Propone un modelo de programación, así como un conjunto de herramientas, que facilitará el modelado de procesos empresariales, así como el desarrollo de aplicaciones basados en ellos.
SOLO PROGRAMADORES nº 145
30
El objetivo de WinFX es ofrecer un marco de desarrollo coherente, que permita crear aplicaciones que ofrezcan experiencias de usuario gratificantes y que puedan explotar al máximo las virtudes del sistema operativo Windows Vista. Según se afirma desde Microsoft, las nuevas características de WinFX permitirán abrir la puerta a nuevos tipos de aplicaciones, muy difíciles de concebir e implementar en las versiones anteriores de Windows.
Windows Presentation Foundation WPF es el subsistema encargado de todo lo relativo a la presentación en Windows Vista. Como programadores, nos interesará usar WPF en nuestros desarrollos, ya que nos permitirá crear interfaces de usuario nunca vistas hasta ahora, que podrán combinar 2D con 3D, incluir documentos, gráficos vectoriales, vídeo, audio y, como gran novedad, voz. XAML es la piedra angular de este subsistema, ya que permite separar de forma definitiva los elementos de interfaz de usuario de la lógica de la aplicación. Gracias a esto, la interfaz de usuario podrá ser desarrollada de manera íntegra por un equipo de diseñadores, siendo mínima la colaboración necesaria entre estos y los programadores. Sólo Programadores ya dedicó en su día una extensa serie de artículos a esta tecnología. Sin embargo, prometemos profundizar más en ella, por lo que esperamos poder ofrecer, en breve, más artículos en esta línea.
Windows Communication Foundation Windows Communication Foundation es uno de los pilares de WinFX. Es la infraestructura de comunicaciones que nos permitirá, a nosotros los desarrolladores, programar aplicaciones distribuidas seguras, estables y orientadas a servicios (SOA). Windows Communication Foun dation se apoya en tecnologías ya conocidas y probadas como Enterprise Services, System Messaging, .NET Remoting, ASMX y WSE, y añade a todo ello la compatibilidad con REST, RSS y los protocolos de servicios web WS-* entre muchos otros.
Windows Workflow Foundation En el subsistema Windows Workflow Foundation encontraremos tanto las herramientas, como el motor, como el modelo de programación necesario para crear soluciones basadas en los procesos de negocio particulares de cada momento. El objetivo de un subsistema como este no es otro que el permitir a las empresas y a los fabricantes de software (ISV) diseñar con más facilidad software capaz de modelar negocios que están en constante evolución.
Y también .NET Como se ha visto, WinFX incorpora una serie de funcionalidades orientadas exclusivamente a programadores, y repartidas en los cuatro subsistemas vistos anteriormente. Sin embargo, además, WinFX también incluye .NET framework, quedando así un entorno tecnológico absolutamente completo.
InfoCard Conscientes de los peligros existentes en la Red, sobre todo en lo relativo a la suplantación de la identidad (phishing), Microsoft ha desarrollado una tecnología que vendrá incluida en WinFX, cuyo nombre en clave es “InfoCard”, gracias a la cual, entre otras cosas, podremos prescindir del sistema de identificación de usuario por excelencia: usuario/contraseña. “InfoCard” basa su funcionamiento en tarjetas de identidad (credenciales) que el usuario final podrá adquirir en centros de confianza (bancos, empresas, instituciones públicas, etc.) para luego usar en sus transacciones. El objetivo no es otro que proporcionar experiencias de usuario más seguras y cómodas.
Conclusiones Con este artículo hemos pretendido dar una visión global del nuevo sistema operativo de Microsoft: Windows Vista. Como se ha dicho, las novedades son muchas, y van orientadas tanto a los usuarios finales, como a los desarrolladores de software. Como profesionales de este sector, y teniendo en cuenta la cuota de mercado que acaparan los productos de Microsoft, estamos obligados a conocer, como mínimo, todas y cada una de las prestaciones de esta nueva plataforma. Esperemos que este artículo haya servido como punto de partida. http://digital.revistasprofesionales.com
22-31 Middleware.qxd
20/12/06
12:22
Página 31
REGALO DE 2 CD-ROMs CON LOS ARCHIVOS DE LOS 12 EJEMPLARES DE LA TEMPORADA 2004-05 DE MUNDO LINUX Y SOLO PROGRAMADORES
Suscripción a Mundo Linux y Sólo Programadores SUSCRIPCIÓN PARA ESPAÑA Opción A: Suscripción anual con 35% descuento: 69,90 euros* (9 revistas gratis, 50,19 euros de ahorro) Opción B: Suscripción anual con 15% descuento: 91,42 euros* (1 tapa de regalo de cada revista, 21,61 euros de ahorro) *10 euros de gastos de envío para la opción contrareembolso
SUSCRIPCIÓN PARA EXTRANJERO Opción C: Suscripción anual con 35% descuento 96,91 euros (gastos de envío incluidos) FORMA DE PAGO EXTRANJERO: VISA + fecha de caducidad
FORMAS DE PAGO PARA ESPAÑA Contrareembolso (10 euros gastos de envío) Giro Postal a Revistas Profesionales, S.L. Transferencia al Banco Popular: c.c:0075/1040/43/0600047439 Talón Bancario a nombre de Revistas Profesionales Domiciliación Bancaria VISA + fecha de caducidad
Solicitud de suscripciones y más información en el teléfono 91 304 87 64, en el fax 91 327 13 07 y en rpsuscripciones@revistasprofesionales.com
30-36 Redes cache
20/12/06
14:51
Página 32
REDES
Mecanismos de cache en ASP.NET 2.0 (I) JUAN LUIS CEADA RAMOS
Con este artículo iniciamos una serie en la que abordaremos uno de los aspectos más potentes de ASP.NET 2.0: la cache. Gracias a los mecanismos de cache ofrecidos por el framework .NET, podremos mejorar el rendimiento de nuestras aplicaciones web de una manera rápida y sencilla. Introducción Antes de la llegada de ASP.NET, si queríamos cachear contenidos para optimizar el rendimiento de nuestras aplicaciones no teníamos más alternativa que “currarnos” nuestro propio sistema de cache, usando lo que teníamos más a mano. Bien usando variables de sesión, de aplicación o incluso guardando contenidos en el disco la primera vez que eran generados. Por supuesto, no contábamos con más ayuda, así que toda la lógica de control sobre los contenidos cacheados también recaía sobre nosotros. Si necesitábamos que estos expirasen pasado un tiempo o ante una determinada condición, teníamos que añadir código adicional a nuestros desarrollos. Afortunadamente, llegó ASP.NET y, con él, un nuevo mecanismo para cachear contenidos completamente integrado en el framework. Por fin cachear contenidos iba a ser fácil y productivo. Además con todas las facilidades del mundo: Cache de páginas web completas, o sólo de algunas partes. Cache de objetos (¡cualquier clase de objeto!). Caches que se pueden anular por si solas pasado un tiempo, cuando cambien determinados datos, e incluso ante cambios en la base de datos (novedad en .NET 2.0). Y por si todo esto no nos basta, siempre podemos ampliar el mecanismo de cache de ASP.NET con otros desarrollados por terceros.
SOLO PROGRAMADORES nº 145
32
¿Cuándo debemos cachear? La respuesta no es sencilla. Por supuesto habrá escenarios donde no sea posible cachear contenidos, pero lo normal es que sí podamos. ¿Candidatas perfectas? Páginas de acceso frecuente, en las que su contenido no necesite estar actualizado al segundo, donde la generación de la página lleve cierto tiempo y recursos, y donde el contenido de la página sea válido para multitud de usuarios. Esto es importante: el contenido guardado en cache, a diferencia del que se almacena en la sesión de usuario, es válido para todos y cada uno de los usuarios del sistema. Por tanto, ¡prohibido guardar en cache una página que contenga datos de un usuario en particular! Un ejemplo de página perfecta para ser cacheada: la página principal del diario El Mundo (www.elmundo.es). Es una página bastante pesada (en torno a 700kb), donde seguramente haya decenas o cientos de accesos a la base de datos por cada petición, y que sin dudarlo debe de ser una de las páginas más accedidas de España. Su contenido no necesita estar actualizado al segundo. No pasa nada si una noticia se publica y tarda 10, 15, o 30 minutos en aparecer. Bastaría con cachear la página principal durante 30 minutos para reducir los accesos a la base de datos en miles de veces. Y si surge una noticia de máxima urgencia, siempre se puede vaciar la cache manualmente. O incluso reducir el tiempo de expiración de la misma a 5 minutos. Aún con tan poco tiempo, los resultados serán más que apreciables, incrementando por tanto la capacidad de nuestro servidor web para servir páginas (ver figura 1). También hay ocasiones donde es no es conveniente cachear. Por ejemplo, páginas con pocos accesos, páginas muy dinámicas cuyos contenidos varíen en función del usuario, páginas que no accedan a la base de datos, o aquellas donde sea imprescindible que la información este siempre actualizada. Lo cierto es que incluso en estos escenarios “adversos” siempre hay algo que se puede cachear. Por ejemplo, en una página específica para un usuario puede que algunas secciones sean comunes a todos (las últimas noticias, la lista de noticias más leídas, etc.). En este caso bastaría con aplicar el http://digital.revistasprofesionales.com
30-36 Redes cache
20/12/06
14:51
Página 33
REDES
Mecanismos de cache en ASP.NET 2.0 (I)
cacheo parcial de páginas. O si el contenido de una página debe de estar permanentemente actualizado, siempre podemos recurrir al microcaching, estableciendo tiempos de expiración de 60 segundos o menos. Una vez dejado claro cuáles son los contenidos más propensos a ser cacheados, veamos cómo hacerlo.
Cache de páginas completas Hacer que una página se guarde en cache la primera vez que se solicite es sorprendentemente fácil. Basta con añadir la directiva “OutputCache” en la cabecera de la página. Por ejemplo: <% OutputCache Duration=”3600”
Figura 1. Incluso con caches de 1 segundo de duración se obtienen mejoras en la capacidad de respuesta del servidor web. Fuente: http://aspalliance.com/251.
VaryByParam=”none” %>
Esta sentencia hace que la página se cachee durante 3600 segundos (1 hora). Por supuesto la directiva “OutputCache” tiene algunos parámetros adicionales. La sintaxis completa es la mostrada en el listado 1. El atributo “Duration” tiene un propósito claro. Controla la duración en segundos de la página en cache. El atributo “Location” sirve para especificar dónde se debe cachear el contenido de la página. Los posibles valores son “Any” (valor por defecto, el contenido cacheado puede almacenarse en cualquier punto por donde pasen los datos, ya sea el servidor, el cliente, o algún proxy intermedio), “Client” (el contenido se cachea en el cliente), “Downstream” (el contenido se cachea en los servidores proxy intermedios o en el cliente), “Server” (el contenido se cachea en el servidor), “ServerAndClient” (sin comentarios) y “None” (el contenido no se cachea, equivale por tanto a desactivar la cache). Con respecto al valor “None” debéis saber que desactiva la cache a nivel de página, pero no la cache de los controles de usuarios que la tengan activada (partial caching). ¿Cuándo usar una u otra localización? Lo normal es dejar el valor por defecto, “Any”, para que el contenido se cachee en cualquier punto de la cadena de ejecución
LISTADO 1
Figura 2. Una página que es perfecta para cachear: www.elmundo.es.
(cliente, proxy intermedio, servidor). Si el navegador cliente tiene la cache activada, la página le aparecerá en pantalla sin que la petición haya tenido que llegar al servidor, reduciéndose por tanto el tráfico que este soporta. Si el cliente tiene la cache desacti-
Sintaxis de OutputCache
<%@ OutputCache Duration=”#ofseconds” Location=”Any | Client | Downstream | Server | None | ServerAndClient “ Shared=”True | False” VaryByControl=”controlname” VaryByCustom=”browser | customstring” VaryByHeader=”headers” VaryByParam=”parametername” CacheProfile=”cache profile name | ‘’” NoStore=”true | false” SqlDependency=”database/table name pair | CommandNotification” %>
http://digital.revistasprofesionales.com
vada, al menos nos quedará la esperanza de que algún proxy intermedio haya cacheado la página. Si tampoco ha ocurrido esto, entonces nuestro último cartucho es nuestro servidor, que servirá la página de la cache en vez de tener que generarla de nuevo. Sólo en algunos casos puede ser interesante usar los otros valores. Por ejemplo, el valor “Client” puede usarse para cachear páginas directamente en la máquina cliente. De esta forma podríamos conseguir que páginas específicas para un usuario (cuyo contenido requiera autorización o se genere en función del login) también se puedan 33
SOLO PROGRAMADORES nº 145
30-36 Redes cache
20/12/06
14:51
Página 34
REDES
Este atributo nos permite indicar al sistema de cache que debe basarse en determinados parámetros de la página a la hora de cachearla. Con el valor “none”, como hemos visto, se almacenaría en cache una única versión de la página. Con lo siguiente: VaryByParam=”categoria”
se cachearía una página distinta por cada categoría que se solicitase. Con esto: VaryByParam=”categoria;producto”
Figura 3. Ejemplo de cache de páginas, con un tiempo de expiración de 10 segundos.
se almacenaría separadamente en cache cada página que se solicite con una combinación de los parámetros categoría y productos distinta. Y con esto: VaryByParam=”*”
Figura 4. Ejemplo de cache de páginas, con sustitución post cache.
beneficiar de la cache, puesto que la página cacheada sólo sería visible para el usuario en cuestión (es lo que se conoce como cache privada). Por supuesto, al delegar el almacenamiento en la máquina del usuario no podemos garantizar que se vayan a cachear los datos, porque en la mayoría de los navegadores se puede desactivar el uso de páginas cacheadas. Sobre el atributo “DiskCacheable” no hay mucho que decir, salvo que lo encontraréis en multitud de documentación pero en realidad no funciona. Se “cayó” de ASP.NET con el cambio de la versión Beta 2 a la versión final. Según la propia Microsoft “esta característica no satisfacía nuestros objetivos de rendimiento”. Con respecto los atributos “Vary*”, nos servirán para indicar cuándo se deben cachear múltiples versiones de una página.
Supongamos que tenemos una página a la que hay que llamar con la siguiente URL: http://server/mipagina.aspx?categoria=1
En dicha página, además tenemos esta directiva: <% OutputCache Duration=”3600” VaryByParam=”none” %>
que hace que la página se cachee durante 1 hora. ¿Qué pasará cuando el usuario solicite otra categoría? Pues que se le servirá la página que está en cache, y por tanto, vería datos relativos a la categoría 1, independientemente de la categoría que esté solicitando. ¿Cómo evitamos este comportamiento? Usando el atributo “VaryByParam”.
se tendría en cuenta cualquier parámetro a la hora de cachear la página. Hay que tener cuidado con el uso que hacemos de este atributo. Tened en cuenta que cachear contenidos consume memoria en el servidor. Si existiesen 10 categorías, con una media de 20 productos en cada categoría, un VaryByParam=”categoria;producto” significaría que se podrían llegar a guardar en cache hasta 20*10 = 200 páginas. Si cada una de ellas pesase unos 100KB, ¡podríamos ocupar hasta 20 MB de memoria! Y ni os cuento el peligro que puede suponer usar el “*”. El atributo VaryByHeader es similar al anterior. Almacena en cache separadamente cada página en función de las cabeceras HTTP. Por ejemplo, con: VaryByHeader=”Accept-Language”
la cache contendría una versión distinta de la página solicitada para cada lenguaje existente. Este atributo además se puede combinar con el anterior (y cuidado porque de nuevo se pueden generar más entradas en cache de las deseadas). Por último, “VaryByCustom”. Básicamente nos permite indicar un criterio propio para que se guarden diferentes versiones de la
LISTADO 2
Creando un perfil de cache
<caching> <outputCacheSettings> <outputCacheProfiles> <add name=”cache1horasinparams” duration=”3600” varyByParam=”none” /> <add name=”cache30minporlenguaje” duration=”1800” VaryByHeader=”Accept-Language” /> </outputCacheProfiles> </outputCacheSettings> </caching>
SOLO PROGRAMADORES nº 145
34
http://digital.revistasprofesionales.com
30-36 Redes cache
20/12/06
14:51
Página 35
REDES
Mecanismos de cache en ASP.NET 2.0 (I)
misma página en cache. Por falta de espacio no nos podemos parar mucho más con este atributo, pero os dejo un enlace a un artículo donde podréis aprender mucho más sobre él: http://msdn2.microsoft.com/ en-us/library/ms550239.aspx. Lo cierto es que pocas veces he usado estos dos últimos atributos. Normalmente, con “VaryByParam” he tenido (y tendréis) más que suficiente, pero es importante que los conozcáis. Una cosa más: el atributo “VaryByParam” es obligatorio, así que tendréis que incluirlo en la directiva “OuputCache” si o si, aunque sea de esta manera: VaryByParam=”none”
Figura 5. Ejemplo de cache de objetos. <%@ OutputCache CacheProfile
Sobre el atributo “SqlDependency”, hablaremos en la próxima entrega, cuando veamos las dependencias.
Perfiles ¿No pensáis que andar colocando en cada una de vuestras páginas (o en alguna de ellas) directivas “OutputCache” a la larga puede dificultaros el mantenimiento? Imaginad que se os ocurre cambiar el tiempo de expiración. ¿Tendréis que ir página a página cambiando el atributo “Duration”? Se puede, desde luego. Pero es mucho más sencillo definir un perfil. Para crear un perfil de cache basta con que añadáis algo como lo que contiene el listado 2 a la sección “system.web” del “web.config”. En este caso hemos creado dos perfiles. Uno que cachea durante una hora, sin hacer múltiples versiones de la página, y otro que cachea durante media hora y que genera múltiples versiones en función del idioma del navegador. Para hacer uso de ellos, bastará con hacer:
=”nombredelperfil” %>
Un cambio en el perfil afectaría inmediatamente a cualquier directiva “OutputCache” que lo use.
Sustitución post-cache Seguro que alguno está pensando: “tengo una página que es candidata perfecta para ser cacheada, pero no puedo hacerlo porque tengo que mostrar en la cabecera un mensaje personalizado en función del usuario”. Buenas noticias, también han pensado en esto los chicos de Microsoft. Si queréis cachear una página, pero necesitáis que una parte de ella se mantenga dinámica (sin tener que recurrir al partial caching), entonces tendréis que usar el control “<asp:Substitution>”. Este control actúa como un contenedor, donde podremos situar cualquier cadena que deseemos. La cadena puede ser un simple mensaje de texto plano, o un texto de cientos de líneas en formato HTML. Sea lo que sea, tampoco conviene que
sea algo excesivamente largo o que lleve tiempo generar, porque entonces estaríamos desaprovechando parte del aumento de rendimiento que nos permite el uso de la cache. El funcionamiento es el siguiente: insertaremos un control “<asp:Substitution>” en la página. En su propiedad “MethodName” indicaremos el nombre del método que devolverá la cadena a mostrar. Dicho método lo codificaremos en el code behind de la página .aspx donde hayamos insertado el control, y debe tener el siguiente interfaz: public static string NombreDelMetodo(HttpContext context) { //hacer cosas return cualquiercadena; }
Cada vez que solicitemos la página en cuestión, esta se extraerá de la cache, pero antes de devolver el contenido al cliente se realizará la “substitución”, llamando al método que hayamos definido, que retornará la cadena que queramos. Existe una alternativa por
TABLA 1. Algunos ejemplos de cacheo en tiempo de diseño y su alternativa en tiempo de ejecución Tiempo de diseño <% OutputCache Duration=”100” Location=”Any” VaryByParam=”none” %>
Tiempo de ejecución Response.Cache.SetExpires(DateTime.Now.AddSeconds(100)); Response.Cache.SetCacheability(HttpCacheability.Public);
<% OutputCache Duration=”100” Location=”Client” VaryByParam=”none” %>
Response.Cache.SetExpires(DateTime.Now.AddSeconds(100)); Response.Cache.SetCacheability(HttpCacheability.Private);
<% OutputCache Duration=”100” Location=”None” VaryByParam=”none” %>
Response.Cache.SetCacheability(HttpCacheability.NoCache);
<%@ OutputCache Duration="60" Location="Downstream" VaryByParam="None" %>
<% OutputCache Duration=”100” Location=”Any” VaryByParam=”categoria” %>
http://digital.revistasprofesionales.com
Response.Cache.SetExpires(DateTime.Now.AddSeconds(100)); Response.Cache.SetCacheability(HttpCacheability.Public); Response.Cache.SetNoServerCaching(); Response.Cache.SetExpires(DateTime.Now.AddSeconds(100)); Response.Cache.SetCacheability(HttpCacheability.Public); Response.Cache.VaryByParams["categoria"] = true;
35
SOLO PROGRAMADORES nº 145
30-36 Redes cache
20/12/06
14:51
Página 36
REDES
Figura 6. Ejemplo de partial caching.
código para el control “asp:substitution”: el método “Response.WriteSubstitution (NombreDelMetodo)”. Como podéis ver, en este caso también hacemos uso de un método callback para escribir la cadena “sustituta”. Gracias a este método podremos aprovecharnos de las sustituciones sin necesidad de tener que insertar un control en la página, y con la ventaja de que el método callback puede estar en cualquier clase, y no sólo en el code behind de la página. Una cosa más: cuando se usa la sustitución automáticamente se modifica la localización de la cache (atributo “Location” de la directiva “OutputCache”), pasando a ser “server only”. Es la única forma de garantizar que el contenido de la cache va a ser “sustituido” en todas las peticiones, ya que si se cachease en el cliente a partir de la segunda petición ya no habría sustitución posible.
Partial caching Hasta ahora hemos hablado de cachear páginas completas. Pero a veces resulta más interesante cachear sólo partes de estas. Supongamos una página donde el usuario puede hacer login. No podemos cachear la página completa porque si no cuando el usuario haga login seguirá viendo la página tal y como estaba la primera vez, ¡incluyendo los controles donde se le solicita que haga login! Sin embargo, el resto de la página sí es susceptible de ser cacheado. En este caso, tendríamos que hacer partial caching. Para hacer partial caching necesitamos dividir nuestra página en partes. Cada una de estas partes se implementaría como un control de usuario. Así, podríamos tener un control de usuario con el menú, otro con los enlaces más comunes, otro con las noticias, etc. Para hacer
SOLO PROGRAMADORES nº 145
36
que cada uno de estos controles cachee su contenido bastaría con añadir una directiva “OutputCache” en la cabecera de cada página .ascx del control. Por ejemplo: <%@ OutputCache Duration = “1800” VaryByParam=”idcategoria”
troles cacheados. Puesto que ahora es solo una parte de la página la que se cachea, los eventos típicos de la página (Page_Load, Page_Init) se van a ejecutar con cada petición de la página. Si en alguno de ellos, por ejemplo en el “Page_Load”, hacemos referencia a cualquier control de usuario que se esté cacheando, podemos encontrarnos con una excepción. Esto es así porque el control sólo existirá en la primera petición, pero en posteriores peticiones el control se generará a partir de la cache y por tanto no existirá realmente. Así que para evitar errores lo mejor es tomar precauciones en nuestro código. Antes de intentar acceder a cualquier control de usuario con la cache activa tendremos que verificar que dicho control existe: protected void Page_Load() { if (ControlDeUsuarioCacheado != null) { //Acceder a las propiedades del control }
Shared=”true” %> }
Como podéis ver, es muy similar al cache de páginas completas. Tan sólo aparece un nuevo atributo, “Shared”. Este nos permite indicar si el contenido del control será el mismo en todas y cada una de las páginas donde este se use. Esto nos permitirá, por ejemplo, insertar el control en una master page garantizándonos que cuando el contenido del control se cachee se hará una única vez, y dicha entrada de cache será usada en cada una de las páginas donde aparezca el control. En caso de que “Shared” tome por valor ”false”, habrá tantas versiones del control en cache como páginas haya donde este aparezca. Otro atributo específico para la cache de controles de usuarios es “VaryByControl”. Es similar a “VaryByParam”, pero en este caso las múltiples versiones en cache del control de usuario se generarían en función de algún componente que esté dentro de él. Por ejemplo, con la directiva: <%@ OutputCache Duration = “1800” VaryByParam=”none” VaryByControl=”cbCategoria” Shared=”true” %>
se generaría una entrada en cache por cada variación del control “cbCategoria” (un combo con la lista de categorías). Si dicho control contuviese 10 elementos, podría haber hasta diez versiones distintas en cache del control de usuario. Una advertencia: cuidado a la hora de acceder en tiempo de ejecución a los con-
Cuando el contenido del control se extraiga de la cache, su referencia será nula, y por tanto, no deberemos interactuar con él.
Kernel mode cache Cuando se utiliza IIS 6.0 en combinación con ASP.NET, podemos disfrutar, de forma totalmente transparente para nosotros, del kernel mode cache. Cuando se den determinadas circunstancias, nuestras páginas cacheadas se almacenarán en el kernel cache de IIS. Próximas peticiones de la página ni siquiera llegaran al motor de ASP.NET. Serán resueltas directamente por el núcleo de IIS, extrayendo los datos de la cache y devolviéndolo al usuario. ¿Qué ventaja nos aporta este mecanismo frente al “normal”? Pues básicamente rendimiento, ya que al no implicar a ASP.NET, los resultados se devuelven mucho más rápido. Y como encima no tenemos que hacer nada para usarlo, mucho mejor. ¿En qué circunstancias entra en juego la cache en modo kernel? Sólo cuando la directiva “OutputCache” de la página cacheada contiene únicamente el valor ”None” para “VaryByParam”. Además, la página no debe tener restricciones de seguridad (debe ser visible en conexiones anónimas). En cualquier otra circunstancia, el cache del kernel no entrará en juego, sólo el cache “normal” proporcionado por ASP.NET. Este cache tiene un pequeño bug que podría daros algún dolor de cabeza. Hace poco tuve conocimiento del problema a raíz de un post http://digital.revistasprofesionales.com
30-36 Redes cache
20/12/06
14:51
Página 37
REDES
Mecanismos de cache en ASP.NET 2.0 (I)
en el blog de José Manuel Alarcón. Puesto que el lo explica excelentemente, os dejo el enlace al post en cuestión: http:// www.jasoft.org/blog/PermaLink,guid,52842e 30-6c1f-470c-9835-41667452b24d.aspx.
Cacheando en tiempo de ejecución Hasta ahora todo lo que hemos visto acerca de la cache de páginas y controles sólo nos sirve para trabajar en tiempo de diseño. Pero, ¿qué pasa si queremos decidir si cachear o no en tiempo de ejecución? Pues que tendremos que recurrir al API, y en concreto a la clase “HttpCachePolicy”, a la que accederemos a través del objeto “Response.Cache”. Este objeto nos proporcionará acceso a los diferentes métodos de la clase, y gracias a él podremos modificar la duración de la cache, la visibilidad de la misma (publica o privada), etc. El uso de este objeto es extremadamente sencillo, os bastará con ver algunos ejemplos para que captéis su funcionamiento. En la tabla 1 podéis ver algunos de los ejemplos anteriores junto con su equivalencia en tiempo de ejecución. Cómo podéis ver, el funcionamiento básico es sencillo. Se establece la expiración de la cache, y a continuación se indica dónde se va a cachear la página: en el cliente (cache privada, es exclusiva para un usuario), en el servidor (cache pública, es la misma para múltiples usuarios), en los servidores proxy intermedios (se considera cache publica de nuevo), etc. Si queréis ampliar información sobre la cache “HttpCacheability”, os recomiendo que acudáis a la MSDN (por ejemplo http://msdn2.microsoft.com/enus/library/system.web.httpcachepolicy.aspx ), aunque creo que normalmente no trabajaréis con esta clase. Lo normal será que trabajéis con la directiva “<%Output Cache%>” en tiempo de diseño, aunque algunas veces trabajar en tiempo de ejecución sea la única alternativa (véase este caso: http://blogs.snapsis.com/Perma Link,guid,46c9ab35-9bb7-4ff9-a8e963ff3497c7f0.aspx).
Creando nuestro propio sistema de cache de páginas Como comenté al principio del artículo, es posible complementar el mecanismo de cache de ASP.NET con otros desarrollados http://digital.revistasprofesionales.com
por terceros. Puesto que por motivos de espacio no es posible explicaros cómo hacerlo en este artículo, os dejo una web donde podréis descargar y estudiar un sistema de cache, que a diferencia del que proporciona .NET, guarda las páginas cacheadas en disco, reduciendo por tanto el consumo de memoria del servidor. Está disponible en http://blogs.msdn.com/dmitryr/ archive/2005/12/13/503411.aspx. Básicamente, lo que hace el autor del código es crear un módulo HTTP (HttpModule) que se suscribirá a determinados eventos del ciclo de vida de una petición ASP.NET. En concreto a los eventos “Resolve RequestCache” y “UpdateRequestCache”. Es ahí donde el módulo se encargará de cachear los contenidos (Update Request Cache) y de recuperar contenidos de la cache (ResolveRequestCache). Para más información acerca de estos eventos podéis consultar el número 142 de Sólo Programadores. Para almacenar el contenido en disco, el módulo hace uso de un filtro HTTP, algo que aprenderemos a usar en un próximo artículo.
Cache de objetos Hasta ahora hemos hablado de cachear a nivel de página e incluso de controles de usuarios. Básicamente hemos cacheado textos. En concreto, la salida HTML de la página. Pero a veces puede convenirnos cachear objetos de cualquier tipo. Por ejemplo un “RecordSet” con datos muy comunes cuyo coste de extracción sea alto, una “DataSet”, una cadena XML, una lista de datos, una colección de objetos, etc. Para ello nos valdremos de la propiedad “Cache” de la clase “Page”, que no es más que un objeto de tipo “System.Web.Caching.Cache”.
LISTADO 3
Gracias a este objeto, añadir cualquier contenido a la cache es tan simple como hacer: Cache[“clave”] = objeto
Para extraerlo, basta con hacer: objeto = Cache[“clave”]
Como podéis ver, bastante sencillo. El objeto cache internamente almacena una lista de pares nombre-valor. Por eso podemos trabajar con él como si de una colección se tratase. Podemos acceder a sus elementos mediante claves de tipo cadena (Cache[“clave”]). Para asignar nuevos elementos se procedería como con cualquier otra colección, ya que existen los métodos “Insert”, “Add”, además del socorrido “Cache[“clave”]=objeto”. En el antiguo ASP, para hacer algo similar a esto teníamos que recurrir al objeto “Application”. Una de las ventajas del objeto “Cache” sobre aquel es que este tiene internal locking, es decir, se bloquea solo cuando modificamos los datos, evitándonos tener que hacer lock y unlock. Además podemos, al igual que en el cacheo de páginas, establecer duraciones máximas de la cache, cosa que con el objeto “Application” no podíamos hacer. Y por si fuera poco, al estar gestionado por ASP.NET, el uso de la memoria es más racional, vaciando si es necesario entradas de la cache para que la memoria que ocupan pueda ser usada por el servidor. Esto último tiene un efecto colateral bastante importante, y que tendréis que tener muy en cuenta. Puesto que un objeto situado en la cache puede ser liberado sin previo aviso, nunca jamas debéis confiar en que un objeto introducido en la cache vaya a estar siempre ahí. Por tanto, vuestros códigos deberían parecerse a este: Ejemplo del método Add
private void AvisameCuandoBorres(string key, Object obj, CacheItemRemovedReason r) { System.Cache.Add(key, “Cache regenerada”, null, DateTime.Now.AddSeconds(5), Cache.NoSlidingExpiration, CacheItemPriority.High, null); } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { CacheItemRemovedCallback onRemove = new CacheItemRemovedCallback(AvisameCuandoBorres); Page.Cache.Add(“misdatos”, “12354”, null, DateTime.Now.AddSeconds(5), Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove); } Response.Write(Cache[“misdatos”]); }
37
SOLO PROGRAMADORES nº 145
30-36 Redes cache
20/12/06
14:51
Página 38
REDES
if (Cache[“clave”]==null){
bajo de recursos y tenga que liberar memoria. A mayor prioridad, más tiempo permanecerá el contenido en cache. El rango de prioridades lo marca la enumeración “CacheItemPriority”, y va desde “Low” hasta “NotRemovable”. Y por último, el parámetro “onRemove Callback” nos permite indicar un delegado opcional, de tal forma que si un objeto se elimina de la cache (voluntaria o involuntariamente) se llamará a la función delegada para notificarnos dicho evento. La función tiene que ser de tipo “CacheItem RemovedCallback”, y por tanto tendrá este interfaz:
Cache[“clave”] = generarcontenido(); } MiTipoDeDatos miobjeto = (MiTipoDeDatos)Cache[“clave”]; //hacer otras cosas
Insertando elementos en la cache Como hemos dicho, asignar un objeto a la cache es tan simple como hacer “Cache[“clave”]=objeto”. Sin embargo, de esta forma no estaremos aprovechando la potencia de este objeto. Para ello tendremos que recurrir a los métodos “Add” e “Insert”. Aunque por el nombre pudiera parecer que su cometido es el mismo, lo cierto es que hay una sutil diferencia. Mientras que el método “Add” sólo inserta nuevos elementos en la cache, el método “Insert” es capaz de insertar nuevos elementos, así como modificar los ya existentes. Por tanto este código: Cache.Add(“clave”, “prueba”); Cache.Add(“clave”, “otra prueba”); Response.Write((string)Cache[“clave”]);
devolvería como resultado la cadena “prueba”, mientras que este otro: Cache.Add(“clave”, “prueba”); Cache.Add(“clave”, “otra prueba”); Response.Write((string)Cache[“clave”]);
devolverá la cadena “otra prueba”. El método “Add” tiene una única sobrecarga, cuyos parámetros coinciden con una de las sobrecargas más completas del método “Insert”. Tiene el siguiente interfaz: public Object Add ( string key, Object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback )
El parámetro key nos permitirá especificar una clave para los datos que vamos a introducir en la cache. Esta clave nos permitirá acceder al contenido cacheado en cualquier momento, y debe ser única. El parámetro “value” es de tipo “Object”, y en él pasaremos el objeto que queramos cachear. Puesto que es de tipo “Object” admitirá que
SOLO PROGRAMADORES nº 145
38
public delegate void
Figura 7. Tabla comparativa de la diferencia de rendimiento entre el uso del cache de ASP.NET y el Kernel Mode Cache.
CacheItemRemovedCallback (
le asignemos cualquier cosa que se nos ocurra. El parámetro “dependencies” nos permite asociar una o más dependencias entre el elemento insertado y uno o varios elementos externos, de tal forma que cuando dichos elementos “externos” cambien, la cache se invalidará. Veremos más sobre dependencias en una próxima entrega. El parámetro “absoluteExpiration” nos permitirá indicar un tiempo de caducidad para la entrada en cache. Tiene que ser un tiempo absoluto. Por ejemplo, dentro de 10 segundos (DateTime.Now.AddSeconds(10)) o dentro de 2 horas (DateTime.Now. AddSeconds(7200)). A diferencia de este, el parámetro “slidingExpiration” nos permitirá indicar un tiempo de expiración relativo. Si indicamos 60 segundos, la cache expirará 60 segundos después del último acceso. Así que si hubiese un acceso cada 30 segundos (por ejemplo) la cache nunca expiraría. Estos dos parámetros no se pueden usar a la vez. Por tanto, si usamos “absoluteExpiration”, el otro parámetro deberá tener el valor “Cache.NoSlidingExpiration”. Si usamos “slidingExpiration”, el otro deberá tener como valor “Cache.NoAbsoluteExpiration”. Nota: para poder hacer uso de estos y otros enumerados relacionados con el objeto cache tendréis que incluir la sentencia:
Object value,
using System.Web.Caching;
en vuestras páginas. El parámetro “priority” nos permite indicar qué prioridad tendrá el elemento cacheado. La prioridad se utiliza para decidir qué objetos se liberan en primer lugar en caso de que el servidor ande
string key,
CacheItemRemovedReason reason )
Un ejemplo de uso del método “Add” (y por analogía del “Insert”) podría ser el que se muestra en el listado 3. En este caso, cuando la cache expire pasados 5 segundos, esta se volverá a regenerar, pero puesto que no volvemos a indicar función callback, la regeneración sólo se llevará a cabo una vez.
Borrando elementos de la cache Para borrar un elemento de la cache bastará con hacer: Cache.Remove[“clave”]
Esto sería un borrado explícito. Habría un borrado implícito si el servidor necesita liberar memoria o si expira la entrada de cache. Ya hemos visto cómo estar preparados para esta eventualidad: o bien regeneramos la cache ayudándonos de funciones callback, o antes de extraer un elemento de la cache comprobamos que este no es nulo.
Conclusiones Aprender a manejar la cache convenientemente puede suponer grandes mejoras en el rendimiento de nuestras aplicaciones web. En la próxima entrega veremos cómo manejar aún más eficientemente los datos en cache gracias a las dependencias, que nos permitirán establecer relaciones entre la cache y ciertos elementos, de tal forma que la cache expirará automáticamente ante determinados eventos. http://digital.revistasprofesionales.com
39 publicidad foro
● ● ● ● ● ● ● ● ●
19/12/06
12:15
Página 1
Mobile Web Controls de ASP.NET Un OCR para el reconocimiento de dígitos decimales Web Semántica Programando Mash-ups Web 2.0 con Google y Yahoo APIs (I) Aplicaciones de voz con C# Aplicaciones web 100% Java con Google Web Toolkit Web Parts en ASP.NET 2.0 Aplicaciones J2EE con JSF Indigo, una plataforma orientada a servicios
30-34 Redes JS
20/12/06
15:01
Página 40
REDES
JavaScript Orientado a Objetos (I) ADOLFO ALADRO GARCÍA
Con el movimiento denominado Web 2.0 comienza a extenderse más que nunca el concepto de aplicación Web frente a la visión tradicional de páginas que llevan a páginas que... En el centro de este cambio están las tecnologías como AJAX. JavaScript juega un papel protagonista también. Pero ya no se habla de aquel viejo JavaScript de “document.write”, sino de métodos, propiedades, prototipos, etc., es decir, de un verdadero lenguaje de programación moderno. Introducción A la hora de crear sites y servicios web, cada día es mayor el uso de AJAX así como de interfaces avanzadas y modernas, que sacan el mayor partido posible al DOM, JavaScript, CSS, etc. En concreto, el lenguaje JavaScript ha dejado de ser algo “menor” para convertirse en el centro y la herramienta con la que desarrollar aplicaciones web complejas como las que ofrecen GMail o Flickr, por citar dos ejemplos. En la presente serie
de artículos se expondrán los fundamentos de una programación JavaScript realmente moderna y Orientada a Objetos. El objetivo es dejar atrás las prácticas que se podrían denominar del tipo “document.write” para dar paso a otras mucho más potentes y avanzadas, con creación de objetos, interfaces, manejo de eventos, etc. Para el desarrollo de los ejemplos se utilizará Eclipse (www.eclipse.org). Además, existe un plug-in gratuito para Eclipse con el que se pueden programar scripts de JavaScript con algunas de las ventajas típicas de cuando se desarrolla en Java: función de autocompletar, sintaxis de colores, etc. El plug-in se denomina JSEclipse y puede descargarse gratuitamente de www.interaktonli ne.com/Products/Eclipse/JSEclipse. La instalación es bastante sencilla siguiendo las instrucciones que aparecen el site.
Objetos en JavaScript En JavaScript, la palabra reservada “function” se usa para crear un objeto además de para crear funciones, como es lógico: function Cookie(sName, sValue, sPath, sDomain, dExpires) { ... }
Teniendo en cuenta la definición anterior, los objetos se crean tal y como se muestra seguidamente:
Sitio web del plug-in para Eclipse llamado JSEditor.
SOLO PROGRAMADORES nº 145
40
http://digital.revistasprofesionales.com
30-34 Redes JS
20/12/06
15:01
Página 41
REDES
JavaScript Orientado a Objetos (I) var oCookie = new Cookie(“test”, “1”, null, “.spp.com”, new Date());
En términos de programación Orientada a Objetos, se diría que la función o el procedimiento anterior es el constructor del objeto. Los parámetros de la función son los parámetros del constructor. La palabra reservada “new” crea una nueva instancia y la asigna a la variable “oCookie”. En JavaScript las variables no tienen tipo a priori. La palabra reservada “var” permite definir la variable. A este respecto es preciso observar que usar “var” no es estrictamente necesario. En muchos scripts, especialmente los antiguos, “var” no se usa con frecuencia. Cuando esto ocurre, afecta principalmente al ámbito de la variable, que pasa a ser una variable global. Por esta razón es siempre conveniente usar la palabra “var” cuando se quiere crear una variable, fijando claramente de entrada el ámbito de la variable. El cuerpo del constructor sirve fundamentalmente para dos cosas. La primera es lo que tradicionalmente se hace en los constructores: inicializar los atributos del objeto. La segunda es definir el objeto. A continuación se muestra cómo: this.sName = sName; this.sValue = sPath; this.sDomain = sDomain; this.dExpires = dExpires; this.toString = function() { ... }
Especificación del lenguaje ECMA-262, que es la base del lenguaje JavaScript.
Métodos En el cuerpo de “function Cookie() {...}” también se crea un método del objeto. Se hace de una forma muy parecida a la creación, y asignación, de los atributos. this.toString = function() { ...
sDomain, dExpires)
El nombre del método, “toString” en este caso, acompaña a la palabra reservada “this”. En realidad es como si se definiera un atributo con la salvedad de que el valor que le es asignado es en realidad una función, declarada mediante el uso de la palabra reservada “function”. De lo anterior se deduce que después de crear una instancia del objeto se puede hacer en cualquier momento: alert(oCookie.toString());
http://digital.revistasprofesionales.com
La palabra reservada “prototype” permite escribir, y en algunos caso reescribir, la definición misma de un objeto en JavaScript. Usándola en la implementación del objeto “Cookie” quedaría tal y como se muestra a continuación: function Cookie(sName, sValue, sPath,
}
Atributos de los objetos La palabra reservada “this” se emplea para fijar el ámbito. Cuando en el cuerpo de “function Cookie() {...}” se utiliza “this”, significa que se está haciendo referencia a un atributo de esa función, o más propiamente se diría que de ese objeto. Así por ejemplo, el uso de “this.sName” indica que el objeto tendrá un atributo “sName”. En realidad “this.sName = sName” lo que hace es crear el atributo “sName” y después asignarle el valor del parámetro “sName”. Si un atributo no existe, y se hace algo del tipo “this.xxx = 3”, en ese momento se crea el atributo “xxx” con un valor igual a “3”. Es decir, lo atributos pueden crearse, y no sólo asignarse, durante todo el ciclo de vida de un objeto.
Definición de objetos con prototype
Si el método tuviera que recibir parámetros, estos aparecerían en la definición: this.toString = function(sCharEcoding)
{ ... Cookie.prototype.toString = function() { ... } }
Sin embargo, lo anterior no resuelve el hecho de que cada vez que se crea una nueva instancia del objeto “Cookie” se está creando y asignando una nueva función. Una de las formas más sencillas de evitar lo anterior es la siguiente: function Cookie(sName, sValue, sPath,
{ ... }
El inconveniente principal que presenta este método de creación de objetos es que cada vez que se ejecuta una sentencia del tipo “var oCookie = new Cookie()”, en el caso de los métodos en realidad se están creando funciones nuevas “toString”. Ello da pie a otra forma de crear objetos en el lenguaje JavaScript y que consiste en el empleo de la palabra reservada “prototype”.
sDomain, dExpires) { ... if (Cookie._initialized == undefined) { Cookie.prototype.toString = function() { ... } } Cookie._initialized = true; }
41
SOLO PROGRAMADORES nº 145
30-34 Redes JS
20/12/06
15:01
Página 42
REDES
La primera vez que se ejecute el constructor (la función “Cookie”) el atributo “_initialized” ni siquiera estará definido. Entonces se crean los métodos del objeto que, una vez definidos no es necesario redefinir, y que son compartidos por todas las instancias de la “clase”. Al finalizar la tarea anterior se asigna al atributo “_initialized” el valor “true”, de forma que más adelante nunca más se vuelven a crear y asignar los métodos. El caso anterior muestra una de las formas mejores y más optimizadas para definir y crear objetos en JavaScript.
Prototype y la redefición de objetos estándar Algunos navegadores, como Firefox, permiten acceder a la propiedad “prototype” de los objetos estándar. Normalmente muchas de las propiedades y métodos de estos objetos no pueden modificarse por razones de seguridad. En cambio sí que es posible extender la funcionalidad de estos objetos, tarea que con frecuencia hay que realizar cuando se desarrollan aplicaciones web que deben funcionar en varios navegadores distintos. Por ejemplo, Internet Explorer implementa el método “insertAdjacentElement” para los elementos de una página web. Dado un elemento de la página, este método permite insertar otro elemento en distintas posiciones. El navegador Firefox no implementa este método, pero utilizando la propiedad “prototype” resulta fácil emularlo. El primer paso consiste en detectar si el navegador reconoce el elemento “HTMLElement”, que es el tipo base de todos los elementos de una página. Para ello se emplea el operador “typeof” de JavaScript.
LISTADO 1
Código del método insertAdjacentElement
switch (where) { case ‘beforeBegin’: this.parentNode.insertBefore(parsedNode,this) break; case ‘afterBegin’: this.insertBefore(parsedNode,this.firstChild); break; case ‘beforeEnd’: this.appendChild(parsedNode); break; case ‘afterEnd’: if (this.nextSibling) this.parentNode.insertBefore(parsedNode,this.nextSibling); else this.parentNode.appendChild(parsedNode); break; }
del método “insertAdjacentElement”, siguiendo el mismo proceso que el descrito en el ejemplo anterior con el objeto “Cookie”, es decir, accediendo a la propiedad “prototype”: HTMLElement.prototype.insertAdjacent Element = function (where,parsedNode) { ... }
El método recibe dos parámetros. El primero es una cadena de texto indicando la posición con respecto al elemento donde va a insertarse el nuevo elemento. El segundo parámetro es el elemento a insertar. El código fuente del método se muestra en el listado 1.
El propósito de este método es emular fielmente la funcionalidad que implementa Internet Explorer, y que podemos ver en la documentación que se encuentra en msdn.microsoft.com/workshop/ author/dhtml/reference/methods/insertadjacentelement.asp. El parámetro “where” indica dónde va a insertarse el nuevo elemento con respecto al elemento cuyo método se ejecuta: b e f o r e B e g i n : El nuevo elemento se inserta antes de que el otro comience. En términos de HTML, lo anterior es lo mismo que decir, por ejemplo, que dado elemento representado por “<div>... </div>” el nuevo elemento se situará justo antes del código “<div>”.
if(typeof HTMLElement!=”undefined” && ! HTMLElement.prototype.insertAdjacent Element) { ... }
El segundo paso consiste en verificar la existencia del método “insertAdjacent Element” en el prototipo del objeto. Si la condición primera se cumple, así como esta segunda, entonces ese script está ejecutándose en un navegador que no implementa el método “insertAdjacentElement” pero que al mismo tiempo permite acceder a la propiedad “prototype” de los elementos estándar. El bloque dentro de la sentencia “if” anterior comienza con la creación y asignación
SOLO PROGRAMADORES nº 145
42
Centro de desarrollo para JavaScript de Mozilla.
http://digital.revistasprofesionales.com
30-34 Redes JS
20/12/06
15:01
Página 43
REDES
JavaScript Orientado a Objetos (I)
a f t e r B e g i n: El nuevo elemento se inserta justo después de que el otro comience. Siguiendo con el paralelismo anterior, el nuevo elemento se situaría justo después del código “<div>”. b e f o r e E n d : El nuevo elemento se sitúa antes de que el otro acabe. En el ejemplo que se viene aplicando, se situaría justo antes del código “</div>”. a f t e r E n d: El nuevo elemento se sitúa justo después de que el otro acabe. En el ejemplo, se situaría justo después del código “</div>”. La implementación emplea métodos estándar propios del DOM, como son “insert Before” o “appendChild”, así como atributos también estándar del DOM, como por ejemplo “parentNode” o “nextSibling”. Este ejemplo pretende únicamente ilustrar el uso de “prototype” alterando la definición de los objetos estándar del navegador. En sucesivas entregas se verán más aspectos de la programación JavaScript en el contexto del DOM, es decir, interactuando con los elementos de la página que son accesibles desde los scripts.
Definición de objetos con JSON JSON (JavaScript Object Notation) es una de las alternativas más utilizadas hoy en día para la creación y definición de objetos. Representa una sintaxis simple y ligera (en el sentido de ocupa pocos KB). En realidad, cuando se usa JSON más que definir objetos lo que se hace es definir datos, aunque más adelante también se verá cómo combinar JSON con las técnicas anteriores hasta llegar a una forma mucho más depurada de programar en Javascript con Orientación a Objetos. Es decir, un objeto definido con las sintaxis JSON se parece bastante a un documento de datos en formato XML. A continuación se muestra un ejemplo sencillo de objeto: ({“id”:1234,”name”:”madonna”})
La cadena anterior representa un objeto con dos propiedades. La primera se llama “id” y la segunda “name”. En esta sintaxis las propiedades del objeto quedan separadas por comas. Las dos propiedades tienen valores, que son en el primer caso “1234”, un valor numérico, y en el segundo una cadena de texto, “madonna”. Obsérvese que los nombres de las propiedades se escriben entre comillas dobles. No ocurre lo mismo con los http://digital.revistasprofesionales.com
Centro de desarrollo para JavaScript de Microsoft.
valores, que sólo emplean las comillas cuando se trata de cadenas de caracteres. La expresión que acaba de mostrarse puede evaluarse con JavaScript haciendo: var oUser = eval(‘({“id”:1234,”name”: ”madonna”})’);
Después de ejecutar la expresión anterior pueden emplearse las expresiones “oUser.id” o “oUser.name”, de forma que la variable “oUser” hace referencia a un objeto. No sólo pueden utilizarse valores numéricos y cadenas de texto. También pueden emplearse arrays:
sión lo más compacta posible. Por ejemplo: var oData = [“lunes”, “martes”, ...];
La propiedad llamada “email” representa la lista de direcciones de correo electrónico de ese usuario, de forma que después de ejecutarse la expresión anterior podrá hacerse, por ejemplo, “oUser.email[1]” para acceder a la segunda de las direcciones de correo electrónico de ese usuario. Con JSON también es posible definir objetos como valores de las propiedades de otros objetos. Siguiendo con el ejemplo anterior, se puede hacer:
var oUser = eval(‘({“id”:1234,”name”:
{
”madonna”,”email”:[“madonna@com”, ”madonna@gmail.com”]})’);
En el ejemplo modificado existe una tercera propiedad, “email”, que en realidad tiene un array. En JavaScript los array pueden crearse de dos formas. La primera consiste en emplear el constructor. Por ejemplo: var oData = new Array(); oData[0] = “lunes”; oData[1] = “martes”; ...
La segunda forma se emplea para crear e inicializar array, todo en una sola expre-
“id”: 1234, “name”: “madonna”, “email”: [“madonna@com”, ”madonna@gmail.com”], “phone”: {“normal”:1111111111, “mobile”:2222222222} }
La propiedad “phone” de objeto es a su vez otro objeto, que cuenta con las propiedades llamadas “normal” y “mobile”. De lo anterior se deduce que se pueden usar expresiones del tipo “oUser.phone.normal” para acceder al número de teléfono normal del individuo representado por el objeto. 43
SOLO PROGRAMADORES nº 145
30-34 Redes JS
20/12/06
15:01
Página 44
REDES
JSON y AJAX: JSON vs XML El siguiente ejemplo muestra un documento XML estándar: <user> <name>Madonna</name> <addrs> <addr type=”home”> madonna@com</addr> <addr type=”work”> madonna@warner.com</addr> </addrs> </user>
El documento anterior puede escribirse en forma de objeto JSON tal y como se muestra seguidamente: { “name”: “Madonna”,
Código fuente del objeto Cookie mostrador por el editor JSEditor.
En cambio, si la aplicación trabaja con XML, la propiedad “responseXML” permite acceder directamente al objeto.
Métodos con JSON
“addrs”: [ {“type”: “home”, “value”: “madonna@com”}, {“type”: “work”, “value”: “madonna@warner.com”}
Con JSON también se pueden definir métodos. Siguiendo con el ejemplo del objeto para leer y escribir cookies, con JSON puede hacerse como se muestra a continuación: var cookie =
]
En el ejemplo anterior hemos visto que desaparece el papel de constructor. A veces emplear JSON es mejor, y en otras ocasiones es mejor emplear la propiedad “prototype”. También existen formas de combinar varias técnicas, como por ejemplo: function Cookie(sName, sValue, sPath, sDomain, dExpires)
{
}
¿Qué ventajas presenta una representación frente a otra? La ventaja principal de JSON está en el rendimiento. Interpretar una expresión JSON y obtener con ello un objeto JavaScript es en general una tarea más rápida y ligera. Interpretar XML es pesado, y su tratamiento tampoco se caracteriza precisamente por el alto rendimiento. Por otra parte, los documentos XML ofrecen una alternativa “más estándar”. Su uso no está vinculado a ningún lenguaje de programación mientas que JSON es algo propio de JavaScript. Cuando se crean aplicaciones web con AJAX se pueden emplear ambas opciones. De hecho el objeto “XmlHttpRequest”, en cualquiera de las implementaciones que hacen los distintos navegadores, cuenta con dos propiedades, “responseText” y “responseXML”. Con la primera se accede directamente al texto devuelto por la llamada HTTP mientras que la segunda devuelve el objeto DOM correspondiente al XML, ya correctamente interpretado. Si la aplicación trabaja con JSON lo más habitual es usar expresiones del tipo: eval(oXmlHttpReq.responseText);
SOLO PROGRAMADORES nº 145
Combinación de técnicas para crear mejores objetos
44
sName: null,
{ ... }
sValue: null,
Cookie.prototype =
sDomain: null,
{ toString: function()
dExpires: null,
{ ... }
toString: function() };
{ var sCookieStr = ‘’; ... return sCookieStr; } };
Obsérvese que esta notación es distinta a la empleada hasta el momento. Es otra posibilidad. El nombre de las propiedades del objeto no está entrecomillado. Las propiedades (nombre:valor) siguen separándose por comas. El método “toString” se define de forma equivalente a como se hace con las propiedades. Dicho de otra forma, los métodos son propiedades del tipo “function”. Cuando dentro de una de esas “funciones” se emplea la palabra reservada “this” se está haciendo referencia al propio objeto. Por ejemplo, si dentro del método “toString” se utiliza la propiedad “sDomain” del objeto, se utilizará la expresión “this.sDomain”.
var oCookie = new Cookie(...);
En el primer bloque se emplea la palabra reservada “function” para definir el constructor del objeto. Posteriormente, con la ayuda de la propiedad “prototype” y empleando la otra notación, se definen métodos, etc. Finalmente la creación del objeto sigue las mismas pautas de siempre.
Conclusiones Se han dado los primeros pasos en la programación Orientada a Objetos con JavaScript. Esto no tiene nada que ver con “document.write(...)” y otros clásicos de los primeros scripts que se hacían en las páginas web hace años. Utilizar JavaScript no es sinónimo de que no se pueda elaborar una programación estructurada y moderna, como se irá viendo a lo largo de esta serie. http://digital.revistasprofesionales.com
45 atrasados.qxd
19/12/06
12:27
Página 1
NÚMEROS ANTERIORES 144 - Diciembre 2006
143 - Noviembre 2006
Zune, la gran apuesta de Microsoft, Java Goes Open Source, SIMO 2006, Microsoft Tech Ed: Developer 2006, interoperatividad entre Java, Mono y .NET, programando Mash-ups Web 2.0 con Google y Yahoo! APIs (y III), programando Java EE esde cero (y IV), extensiones AJAX para ASP.NET (I), la Web Semántica (y II), un OCR para el reconocimiento de dígitos decimales y mucho más. 1 CD-ROM incluido.
Google compra YouTube, creación de un Mash-up combinando datos de Google Maps, Yahoo! Weather RSS y Google Translation, técnicas avanzadas de manipulación y almacenado de imágenes con Java 2D, programación el patrón modelo-vista-controlador desde Java EE, localización geoespacial con Google Maps, técnicas profesionales para la personalización del asistente de instalación de nuestra aplicación, algoritmo Mínimax, la Web Semántica y mucho más. 1 CD-ROM incluido.
142 - Octubre 2006
141 - Septiembre 2006
Programando Mash-ups Web 2.0 para crear aplicaciones que integran datos de Google y de Yahoo!, filtrado de imágenes con la API Java 2D, cómo ampliar la funcionalidad de nuestro servidor web IIS, interfaces de usuario basadas en la JavaServer Pages Standard Tag Library (JSTL), qué aportan las metodologías de desarrollo, generando un empaquetado del tipo "setup.exe" para distribuir nuestras aplicaciones a los usuarios finales y mucho más. 2 CD-ROM incluidos.
140 - Agosto 2006 Introducción a la programación de robots con Robocode, programación de aplicaciones móviles con Bluetooth, análisis profundo del nuevo framework Google Web Toolkit para la programación de aplicaciones web 100% Java, Concurrent Verson Control, 8 trucos de ASP.NET para lucirse en la empresa, desarrollo de Web Parts propios y la tercera entrega de nuestro coleccionable dedicado a Visual Studio. 1 CD-ROM incluido.
Desarrollo de aplicaciones de escritorio .NET que pueden ser gobernadas por el usuario mediante comandos de voz, introducción al API Java 2D, despliegue de aplicaciones ASP.NET en Linux en 10 minutos, primera entrega del curso centrado en la programación Java EE desde cero, metodologías de desarrollo (tradicionales vs. ágiles), estrategias avanzadas en Robocode y mucho más. 1 CD-ROM incluido.
Si te falta algún número de la temporada, ahora tienes la oportunidad de conseguirlo Precio Oferta descuento Precio por ejemplar: 6€
1 a 10 = 10% dto. / 11 a 20 = 20% dto. 21 a 30 = 30% dto. / 31 a 40 = 40% dto. +40 = 50%
BOLETÍN DE PEDIDO Rellene o fotocopie el cupón y envielo a REVISTAS PROFESIONALES, S.L. (Revista SÓLO PROGRAMADORES) C/ Valentín Beato, 42 - 3ª Planta - 28037 MADRID Tel.: 91 304 87 64 - Fax: 91 327 13 03 - www.revistasprofesionales.com - rpsuscripciones@revistasprofesionales.com Deseo me envíen los número/s: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NOMBRE Y APELLIDOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .EDAD . . . . . . . . TELÉFONO . . . . . . . . . . . . . . . . DOMICILIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .C.P.: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CIUDAD . . . . . . . . . . . . . . . . . .PROVINCIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FORMAS DE PAGO
Giro Postal a nombre de REVISTAS PROFESIONALES, S.L. Talon Bancario a nombre de REVISTAS PROFESIONALES S.L. Domiciliación Bancaria Contra Reembolso (5€ de gastos de envio por paquete) Banco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Domicilio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Firma: Numero de cuenta: _ _ _ _/ _ _ _ _/ _ _ / _ _ _ _ _ _ _ _ _ _ _ _ Titular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tarjeta de crédito _ _ _ _/ _ _ _ _/ _ _ _ _/ _ _ _ _/ Fecha de caducidad: Extranjero: Gastos de envio 5€ por paquete. Unica forma de pago tarjeta de crédito (VISA, Mastercard, American Express,...)
46-52
Redes ajax
20/12/06
15:10
Página 46
REDES
Extensiones AJAX para ASP.NET (II) ERICH BÜHLER
En esta segunda entrega nos sumergiremos de lleno en el mundo AJAX, y aprenderemos los paradigmas de programación que deben seguirse, así como los controles proporcionados por las extensiones AJAX para ASP.NET. Introducción En el artículo anterior te mostré cómo surgió, además de cómo se instala y funcionan las extensiones de AJAX para Microsoft ASP.NET. En esta segunda parte realizaremos un viaje de mucho más bajo nivel, ya que cubriré los diferentes controles y técnicas indispensables para que puedas construir aplicaciones del nuevo paradigma. Si la entrega pasada fue la base del funcionamiento, esta será el comienzo de tu vida y obra en lo que a Microsoft AJAX respecta. Analizaremos el detalle de la instalación así como la utilización de las propiedades del lado del servidor y los eventos en el explorador (cliente). Dejaré para la tercera y última parte la creación de un componente personalizado AJAX, esto es, tu propio control, así como el uso de XMLScript y servicios web. Pero no deseo marearte, por lo que vamos a comenzar por el principio, o al menos, el principio de este artículo, en donde me explayaré sobre los distintos paquetes disponibles para las extensiones.
Como característica adicional, se agrega un nuevo tipo de proyecto a Visual Studio 2005, el que ofrece los flamantes componentes en la barra de herramientas. Sin embargo si vas a la página oficial de Microsoft AJAX (ajax.asp.net) verás que existen varias instalaciones disponibles, lo que puede resultar un poco confuso. Es por ello que la tabla 1 muestra las distintas opciones y su aplicación. Es importante que la leas atentamente antes de continuar, ya que esto te ahorrará más de una futura confusión.
Trabajando con lo esencial La infraestructura provee el bloque fundamental para todo proyecto ASP.NET que desee contar con características AJAX, por lo que deberás bajar e instalar el paquete si quieres implementar los ejemplos aquí incluidos. La instalación es muy sencilla, ya que solamente requiere ejecutar el binario y aceptar todos los pasos allí propuestos (ve al siguiente hipervínculo para obtener el paquete): http://go.microsoft.com/fwlink/ ?LinkID=77296
Una vez hecho esto, puedes verificar si todo ha ido bien abriendo Visual Studio 2005. Allí nota-
Paquetes de AJAX... una de las partes más confusas Si leíste la entrega anterior sabrás que las extensiones de Microsoft AJAX son un conjunto de tecnologías que se integran con ASP.NET y que permiten ejecutar código que resida en el servidor sin necesidad de refrescar los elementos de la interfaz gráfica, más allá de los datos en sí (uffhh! esta definición suena demasiado larga, pero bueno... no te preocupes, veremos cómo es todo este asunto a lo largo del artículo). A su vez, se hace uso extensivo de JavaScript y hojas de estilo para brindar una interfaz gráfica mucho más interactiva (arrastrar y soltar, estirar controles, IntelliSense basada en un servicio web, etc.).
SOLO PROGRAMADORES nº 145
46
Figura 1. Proyecto AJAX en Visual Studio.
Figura 2. Controles para AJAX en Visual Studio.
http://digital.revistasprofesionales.com
46-52
Redes ajax
20/12/06
15:10
Página 47
REDES
Extensiones AJAX para ASP.NET (II)
TABLA 1. Paquetes de AJAX para ASP.NET Paquete
Descripción
ASP.NET AJAX
Esta es la infraestructura en sí, deberás instalarla para tener acceso al resto. CTP es un agregado para Microsoft AJAX que adiciona algunos controles (WebParts, WebProfile, etc.) y que se enmarca dentro de la iniciativa de Software abierto de Microsoft. Ofrece alrededor de 25 controles que se enmarcan dentro de la iniciativa de Software abierto de Microsoft. Agrega un nuevo tipo de proyecto a Visual Studio para crear controles AJAX personalizados. La parte cliente de la infraestructura, solamente de utilidad si empleas un servidor distinto a Internet Information Services.
ASP.NET AJAX CTP AJAX Control Toolkit AJAX Control Extender Microsoft AJAX Library
TABLA 2. Controles AJAX para ASP.NET Control ScriptManager
Descripción
ScriptManagerProxy
Inyecta el código JavaScript necesario en la página para que ella ofrezca las características de AJAX. Se emplea cuando estás trabajando con páginas maestras (veremos un ejemplo más abajo).
Timer
Hace posible ejecutar una petición asíncrona al servidor cada un período determinado de tiempo.
UpdatePanel
Permite indicar las secciones de la página que emplearán el modelo de llamadas asíncronas AJAX.
UpdateProgress
Exhibe un contenido personalizado cuando se realiza una llamada asíncrona AJAX.
rás una nueva plantilla de proyecto llamada ASP.NET AJAX-Enabled (ver figura 1). Basta entonces con hacer doble clic en esta para que tu travesía al nuevo mundo comience. A simple vista la solución web luce similar a cualquier otra con la que te hayas cruzado anteriormente, pero sin embargo, existen 2 diferencias importantes. La primera es que se adiciona una referencia a la biblioteca “Microsoft.Web.Extensions”. Como podrás imaginar, ella no es más que el núcleo de funcionalidades AJAX. La segunda (y quizá más notoria) es que se inserta una nueva ficha llamada “AJAX Extensions” dentro de la barra de herramientas. Podrás encontrar allí 5 nuevos controles, similares a los que se exhiben en la figura 2. Si abres el formulario web predeterminado observarás que un nuevo componente llamado “ScriptManager” es inyectado en la parte superior. Obvia este elemento por unos instantes, ya que lo veremos de aquí a unas líneas de distancia... Si bien todos los nuevos integrantes de la barra de herramientas exhiben el gráfico de engranaje, estos se emplean para diferentes tareas, las que están lógicamente relacionadas a potenciar las características de la interfaz gráfica o su funcionalidad. No existen más diferencias, por lo que si ejecutas la aplicación, deberías obtener un comportamiento normal, esto es, una página en blanco. http://digital.revistasprofesionales.com
Te mencioné anteriormente que el núcleo de AJAX se llama “Microsoft.Web. Extensions”. Como información sana de saber, es bueno que conozcas dónde se encuentra. Esto te permitirá agregar AJAX a un proyecto estándar de ASP.NET: C:\Archivos de Programa\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\<versión>
Si tienes un segundo, navega a la carpeta y observa el contenido de la misma. Por ejemplo, la referencia a “Microsoft. Web. Extensions” apunta a un archivo de igual nombre, el que es una biblioteca (ensamblado) de la plataforma .NET. Ella es la que se inserta dentro de la barra de herramientas; puedes como práctica inicial eliminar la ficha creada por AJAX y agregar una nueva, arrastrando y soltando este archivo. El resultado final debería devolverte los 5 controles. Ha llegado el momento de que hagamos un breve recorrido por los distintos elementos de la nueva ficha (tabla 2). A lo largo de este artículo me encargaré de desvelarte el misterio de cada uno en forma más extensa.
Donde todo comienza... ScriptManager Debes adicionar un control de este tipo en toda página donde quieras utilizar los componentes o características AJAX. Si no lo haces, entonces será un formulario web estándar en vez de uno mejorado:
<asp:ScriptManager ID=”ScriptManager1” runat=”server” />
Como su nombre lo indica, “ScriptManager” administra el código script que será necesario inyectar en la página para que ella ofrezca las características de la nueva infraestructura. Por el sólo hecho de dibujar el control estarás ganando las siguientes funcionalidades: 1 . Infraestructura AJAX en el explorador para que funcionen los restantes componentes de las extensiones. 2 . Que una página pueda refrescar la información de los controles sin necesidad de actualizar el formulario web en su totalidad. 3 . Adicionar cualquier script que tú hayas escrito para que sea enviado al explorador cada vez que se acceda al formulario (ver la propiedad “Scripts” en la tabla 3). 4 . Clases proxy que simplifican la invocación de servicios web desde código Script escrito en el explorador. 5 . Posibilidad de autenticar un usuario antes de invocar a un servicio web, así como también utilizar la información de perfil referente al mismo. De más está decirte que si tienes la intención de hacer uso de alguno de los restantes 4 controles, el primer paso será entonces el soltar este elemento en la página; de no hacerlo obtendrás un error en tiempo de ejecución. La tabla 3 contiene alguna de las propiedades de “ScriptManager”, que pueden 47
SOLO PROGRAMADORES nº 145
46-52
Redes ajax
20/12/06
15:10
Página 48
REDES
TABLA 3. Propiedades de ScriptManager Propiedad
Descripción
AsyncPostBackErrorMessage AsyncPostBackTimeout
Establece o retorna el texto a ser exhibido en caso de que se produzca un error en el servidor o la llamada. Tiempo máximo que se tendrá que esperar para una llamada asíncrona. Si se desean o no las características de AJAX (actualizar solamente los valores de los controles en vez del modelo estándar de refrescar toda la página), El valor predeterminado es “True". Consultar en el servidor si la llamada se debió a que se refrescó la página o a una invocación asíncrona del modelo AJAX. Tiempo máximo para cargar los fuentes script en el navegador. Archivos con fuentes de script que deseas se envíen al explorador. Estas podrían contener tus propias funciones JavaScript o VBScript. Lista de servicios web a los que quieres que los fuentes de script en el explorador tengan acceso.
EnablePartialRendering IsInAsyncPostBack ScriptLoadTimeout Scripts Services
LISTADO 1
Usando UpdatePanel
<asp:UpdatePanel ID=”UpdatePanel1” runat=”server”> <ContentTemplate> <!—Los controles son insertados aquí —> </ContentTemplate> </asp:UpdatePanel>
también ser evaluadas/configuradas desde código. En realidad, en la mayor parte de los casos te remitirás a dibujar este elemento para luego olvidarte del mismo. El próximo paso lógico es siempre diseñar la interfaz gráfica empleando los otros controles AJAX. Cabe destacar que solamente puedes tener un objeto “Script Manager” por página y que la primera vez que accedas la misma se bajaran los fuentes script para que AJAX funcione, lo que puede requerir algunos segundos adicionales (luego se dejan disponibles en la caché de Internet Explorer o Firefox).
El panel de actualización: UpdatePanel El paso siguiente a adicionar “Script Manager” es definir las secciones de la página que deseas se actualicen, recuerda que de esto se trata AJAX. Esta funcionali-
dad se podría traducir en algo así como “oye, trae el resultado del servidor para estos textbox pero no toques el resto de la interfaz”. Es aquí donde entra en juego el elemento “UpdatePanel”; como nos dice su nombre, es un panel de actualización. Cualquier control que se encuentre allí y que produzca una ida al servidor, acarreará tan solo el refresco de los datos de los miembros contenidos (listado 1). El resto de la página se mantendrá intacta y la invocación será realizada de modo asíncrono, por lo que el usuario podrá continuar realizando otro tipo de tareas con la interfaz (veremos esto más adelante). Ahora, presta atención a la figura 3. Cada vez que se haga clic en el botón “Confirmar”, se irá en forma asíncrona al servidor (pero sin generar una nueva página), se traerán los datos, y se modificarán los miembros involucrados. Si se tiene un componente fuera del panel de actualización y en esta petición al servidor se intenta modificar su contenido, entonces el resultado será descartado y se dejará el valor original, tal como si fuese de lectura.
Secuencia de eventos en llamadas asíncronas
Figura 3. Controles dentro de un panel de actualización.
SOLO PROGRAMADORES nº 145
48
El ejemplo anterior es sencillo pero nos servirá para aclarar algunas características de la infraestructura. Cuando se accede a la página por primera vez, el evento inicial-
Figura 4. Evento “Page_Load” ejecutado en una llamada asíncrona.
mente ejecutado es “Page_Load”. Esto suena bastante lógico ya que la misma está siendo creada. Sin embargo el panorama no es tan claro cuando se trata de AJAX. Si se hace clic en el botón “Confirmar” de la figura 3, entonces se irá por el evento clic al servidor en forma asíncrona, para luego volver con los valores y actualizar los miembros en cuestión. La pregunta del millón es... ¿Cuál será la secuencia de eventos en este caso? Se podría pensar inicialmente que si se hace clic en un botón solamente se ejecutará ese evento. Sin embargo, esto es erróneo, ya que la página tiene que ser generada cada vez. Es por ello que no importa si es el primer acceso o la consecuencia de un evento asíncrono, el procedimiento “Page_Load” será siempre ejecutado (figura 4). He construido una pequeña aplicación que lista en un “Listbox” los diferentes eventos iniciados. Cuando se hace clic en “Confirmar”, primero se lanza “Page_Load” y luego el procedimiento asociado al botón. Esto es así ya que pese a que en el navegador no se refresca la totalidad de la página, es necesario en el servidor generar la misma en su totalidad. Por último comentarte que no es posible realizar dos llamadas al servidor al mismo tiempo, si una nueva se inicia, entonces anulará a la anterior (mediante script es posible indicar prioridades sobre ellas). http://digital.revistasprofesionales.com
46-52
Redes ajax
20/12/06
15:10
Página 49
REDES
Extensiones AJAX para ASP.NET (II)
LISTADO 2
Figura 5. Disparadores del panel de actualización.
Panel de actualización y disparadores (Triggers) En algunas ocasiones querrás que la acción de un control fuera de todo panel actualice a uno o más elementos “UpdatePanel”. La idea para este ejemplo es que el usuario tenga la posibilidad de marcar en el botón de verificación si come o no zanahorias (podrían ser también manzanas, pero... ¿has visto antes alguna vez que incluya este tipo de preguntas?). Deseo que esta acción refresque el panel de “Login”. Por desgracia dicho control está fuera de todo “UpdatePanel”, lo que acarreará que se vaya al servidor por una nueva página y se regenere toda la interfaz (esto es verdadero para el caso que el control “comeZanahorias” tenga la propiedad “AutoPostback” configurada a verdadero). Afortunadamente los paneles de actualización ofrecen los llamados disparadores (Triggers), los que permiten condicionar que se refresque un determinado “UpdatePanel” al inicio de uno o más eventos de controles. Para ello, tienes que seleccionar las propiedades del mismo y luego ir a “Triggers”, lo que abrirá una nueva ventana donde se especifican los posibles elementos y eventos (figura 5). Ahora tienes que agregar “come Zanahorias” y el evento “CheckedChanged”. El último paso es verificar que la propiedad
Figura 6. Panel “updError”.
http://digital.revistasprofesionales.com
Código generado por Visual Studio
<asp:ScriptManager ID=”ScriptManager1” runat=”server” /> <div> &nbsp; <asp:UpdatePanel ID=”UpdatePanel1” runat=”server”> <ContentTemplate> .... </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID=”comeZanahorias” EventName=”CheckedChanged” /> </Triggers> </asp:UpdatePanel>
LISTADO 3
Código del evento clic para el botón Confirmar
Protected Sub Confirmar_Click(ByVal sender As Object, ByVal e As System.EventArgs) If Me.Email.Text = “” Or Me.Contraseña.Text = “” Then lstErrores.Items.Add(“Mail o contraseña no válidas”) updError.Update() End If End Sub
LISTADO 4
Configuración del control updError
<asp:UpdatePanel ID=”updError” runat=”server” UpdateMode=”Conditional”> <ContentTemplate> <asp:Label ID=”Label1” runat=”server” Font-Bold=”True” ForeColor=”Red” Text=”Error:”></asp:Label> <br /> <asp:ListBox ID=”Errores” runat=”server” Width=”320px” BackColor=”#FFC0C0”></asp:ListBox> </ContentTemplate> </asp:UpdatePanel>
“AutoPostback” del componente en cuestión esté configurado a verdadero; en caso contrario, nada de esto funcionará. ¡Esto es todo! Ahora, el inicio del control externo al panel forzará a que el mismo se regenere. Para el caso de que te encuentres dentro de los que les gusta ver el código ASP.NET generado por el diseñador, fíjate en el listado 2 y verás el que configura al disparador.
Actualización condicional Otra característica destacable es la posibilidad de refrescar un panel en forma condicional. Esto quiere decir que puedes indicar desde código cuándo y cómo deseas que esto se lleve adelante. Observa la interfaz gráfica de la figura 6. Como ves, he agregado un nuevo panel llamado “updError”, que contendrá una lista de los diferentes problemas encontrados durante la ejecución. La idea es que solamente se actualice si efectivamente ha habido algún error, de lo contrario debería permanecer constante. Como puedes apreciar en el listado 3, cada vez que se hace clic en el botón “Confirmar”
se refrescará “updError” si ha existido algún problema. Esto se lleva adelante invocando al método “Update” del panel. Una cosa más que debes configurar es la propiedad “UpdateMode” de “updError”, estableciéndola a “Conditional” (el valor por defecto es “Always”, lo que significa siempre). El código resultante debería verse similar al listado 4. De ahora en adelante, se mostrarán el error para el caso que no se ingrese un valor en alguna de las cajas de texto.
Paneles anidados y visibilidad Una característica muy útil es la posibilidad de insertar uno o más paneles dentro de otro. Esto te permite refrescar ciertas zonas dentro del mismo elemento, o la totalidad para el caso que el control pertenezca al componente superior. A la hora de diseñar tu interfaz gráfica es sano tener en cuenta la interacción de las diferentes partes y su repercusión, así como aquellos elementos que deseas asociar mediante disparadores (Triggers) o los que quieres actualizar manualmente usando el método “Update”. 49
SOLO PROGRAMADORES nº 145
46-52
Redes ajax
20/12/06
15:10
Página 50
REDES
LISTADO 5
Gestionando la visibilidad de un panel
If Me.Email.Text = “” Or Me.Contraseña.Text = “” Then updError.Visible = True Errores.Items.Add(“Mail o contraseña no válidas”) updError.Update() End If
LISTADO 6
Ejecución en caso de llamada asíncrona
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Me.ScriptManager1.IsInAsyncPostBack Then ‘El código aquí escrito se ejecutará solamente si la página fue solicitada ‘por el inicio de un evento asíncrono AJAX End If End Sub
a otro elemento de este tipo. Por lo tanto, la solución es mover el panel de error dentro del principal, tal como exhibe la figura 7.
Ejecuciones asíncronas en el servidor
Figura 8. Control "ScriptManager" en la página maestra.
Figura 7. Visibilidad de un panel.
Esto no tiene mayores dificultades, y te lo dejo como práctica adicional, sin embargo, existe un tema más que es realmente interesante, con el que me he topado cuando estaba realizando el desarrollo para un cliente. En muchas ocasiones querrás ocultar o mostrar un determinado panel en base a una condición, sin necesidad de actualizar la página completa. Si prestas atención a la figura 7, te darás cuenta que solamente debería mostrarse el bloque conteniendo los errores para el caso de que exista alguno. Lo primero que se me ocurrió fue hacer algo tan simple como lo que se detallo en el listado 5. Sin embargo, obtuve un error en tiempo de ejecución. El motivo es que cualquier parte de la interfaz gráfica que quiera ser actualizada dinámicamente mediante AJAX debe estar dentro de un “UpdatePanel”, esto también incluye
En muchas ocasiones desearás condicionar ciertas partes de tu código a que se ejecuten solamente como resultado de una llamada asíncrona AJAX, en lugar de ejecutarse en la generación completa de la página. Esto es útil cuando se está dentro del evento “Page_Load”. Fíjate en el listado 6. Como ves, en este caso consultamos “IsInAsyncPostBack” para saber si efectivamente se trata de una llamada asíncrona AJAX (pertenece a “ScriptManager” y no al panel en sí).
Páginas maestras y ScriptManagerProxy Las páginas maestras fueron introducidas en ASP.NET 2.0 y permiten resolver el problema de no tener un conjunto de elemen-
Figura 9. El control “UpdateProgress” en acción.
tos de interfaz gráfica común para todo el proyecto (como por ejemplo un encabezado, menús, pie de página, etc.). Cuando se trabaja con AJAX es una buena idea el situar al control “ScriptManager” en la página maestra, ya que esto ofrece las siguientes ventajas: El componente se tiene en un solo lugar, por lo que las propiedades serán las mismas para todas las páginas. Si adicionas un script personalizado mediante la propiedad “Scripts”, entonces estará visible para la aplicación en su totalidad. El script de AJAX será cargado una única vez. Pese a los notables beneficios, trae consigo dos problemas: el primero radica en la forma de acceder desde la página secundaria al control “ScriptManager”, la siguiente línea que usamos anteriormente fallaría en este contexto: ‘El elemento ya no se encuentra en esta página sino en la Maestra. If ScriptManager1.IsInAsyncPostBack Then
Para resolver esto, debe obtenerse primero una referencia a la página maestra para luego acceder al control y guardar la referencia, observa el listado 7. Ya que ahora tienes un “ScriptManager” general para toda la aplicación, entonces siempre se cargarán los mismos scripts, incluso si no van a ser empleados por el formulario web. Para solucionar esto, que es el segundo problema, se encuentra un elemento adicional llamado “Script
TABLA 4. Nuevos eventos AJAX Descripción
Nombre del evento PageLoaded beginRequest
Se inicia cuando la página ha sido cargada. El código aquí escrito se ejecutará antes de realizar una llamada asíncrona Ajax.
endRequest
Este evento se inicia cuando se tiene la respuesta de una petición asíncrona Ajax.
SOLO PROGRAMADORES nº 145
50
http://digital.revistasprofesionales.com
46-52
Redes ajax
20/12/06
15:10
Página 51
REDES
Extensiones AJAX para ASP.NET (II)
LISTADO 7
Acceso a ScriptManager desde página secundaria
Dim SM As Microsoft.Web.UI.ScriptManager Dim miMaestra = Me.Master SM = miMaestra.getScriptManager() If SM.IsInAsyncPostBack = True Then ‘Hacemos algo realmente interesante... End If
LISTADO 8
Usando UpdateProgress
<asp:UpdateProgress ID=”UpdateProgress1” runat=”server” AssociatedUpdatePanelID=”UpdatePanel1”> <ProgressTemplate> <p style=”background:red;”>Por favor espere...</p> </ProgressTemplate> </asp:UpdateProgress>
LISTADO 9
Nuevos eventos AJAX
<script type=”text/javascript” language=”Javascript”> //Registra los eventos para la página. Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(PageLoaded); Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest); Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
Mejorando la interfaz de usuario con ASP.NET AJAX Control Toolkit
//Procedimientos de evento. function beginRequest(sender, args) { } function PageLoaded(sender, args) { } function endRequestHandler(sender, args) { } </script>
ManagerProxy”, que hace posible que configures archivos de script específicos para cada página en particular.
El control UpdateProgress En las aplicaciones Windows cada vez que se está realizando un proceso, es posible mostrar una barra de progreso, la que indica que hay un trabajo que se está llevando adelante (y alternativamente cuánto falta para que finalice). En Microsoft AJAX encontramos algo similar, lo que se obtiene a través del componente “Update
la página, el que tenga a cargo realizar algún proceso tan pronto como se vuelve del servidor. Sin embargo, esto funciona bien en el modelo tradicional pero no cuando se emplea AJAX, ya que los miembros del formulario web podrían estar siendo modificados sin necesidad de recargar el mismo. Es por ello que AJAX ofrece ahora nuevos eventos, los que hacen posible detectar los diferentes escenarios. La tabla 4 detalla alguno de los mismos. Si nos fijamos en el listado 9, veremos que en el encabezado del bloque se asocian los eventos con las funciones, utilizando el método “add_<evento>” más el nombre del procedimiento a vincular. Estos objetos pertenecen a la biblioteca cliente de AJAX, la que es cargada por “ScriptManager” en la página. Una vez indicados los mismos, basta que escribas la implementación en los respectivos bloques.
Progress” (ver listado 8). “Progress Template” debe contener el valor a exhibir, lo que será mágicamente mostrado cuando se lanza una llamada asíncrona al servidor. Puedes adicionalmente indicar el nombre de un panel en la propiedad “Associated UpdatePanelID” para el caso que solamente esté visible cuando sea este el que lo inicia.
Utilizando eventos del navegador
Uno puede pensar que los controles más interesantes están dentro del paquete que contiene la plataforma AJAX de Microsoft, sin embargo esta no adiciona más que unos pocos elementos y la infraestructura en si. Es aquí donde Control Toolkit entra en juego para ofrecer alrededor de 25 componentes que extienden las capacidades de la interfaz gráfica. Los elementos son parte de un proyecto de ejemplos provistos por la iniciativa de código abierto de Microsoft (www.codeplex.com), por lo que puedes bajar los fuentes y modificarlos a tu gusto. Antes de hacer nada deberás instalar el paquete de la siguiente dirección (es un archivo ZIP a descomprimir): http://www.codeplex.com/Release/
Es una tarea bastante común la de escribir código JavaScript en el evento load de
ProjectReleases.aspx?ProjectName =AtlasControlToolkit
TABLA 5. Carpetas creadas en la instalación de AJAX Control Toolkit Nombre de la carpeta
Descripción
AjaxControlToolkit
Contiene la implementación de los diferentes controles AJAX, los fuentes de cada componente se encuentran dentro de una carpeta diferente con su nombre. Puedes abrir AjaxControlToolkit utilizando Visual Studio 2005. Visto que es un proyecto de biblioteca, no podrás ejecutarlo a no ser que hagas uso de la solución de ejemplo.
SampleWebSite
Ejemplo con componentes del proyecto anterior que usa la biblioteca generada por AjaxControlToolkit.
http://digital.revistasprofesionales.com
51
SOLO PROGRAMADORES nº 145
46-52
Redes ajax
20/12/06
15:10
Página 52
REDES
LISTADO 10
Control ResizableControlExtender en nuestra página
<cc1:ResizableControlExtender ID=”ResizableControlExtender1” runat=”server” TargetControlID=”Panel1” HandleCssClass=”tp” HandleOffsetX=”10” HandleOffsetY=”10” MinimumWidth=”20” /> <asp:Panel ID=”Panel1” runat=”server” Width=”100” Height=”20”> <asp:TextBox ID=”TextBox1” runat=”server” Style=”width: 100%; height: 100%;” /> </asp:Panel>
LISTADO 11
Hoja de estilo
<style type=”text/css”> .tp { width: 10px; height: 10px; background-color: red; } </style>
Esto inyectará automáticamente los controles, y los dejará listos para ser usados. Sin embargo, los componentes en sí extienden a los ya existentes, por lo que te recomiendo que sigas leyendo para ver cómo funciona este concepto.
Extensiones de controles
Figura 10. Propiedades del panel.
Se habrá creado entonces el nombre de la carpeta que tú indicaste, almacenando allí los recursos necesarios. La tabla 5 ofrece el detalle de las carpetas instaladas a las que tendrás que prestar atención. Puedes abrir “SampleWebSite” con Visual Studio 2005 si quieres probar el comportamiento de los distintos controles. Esto te servirá para decidir cuáles quieres emplear y la forma de hacerlo. Cada página a su vez brinda las diferentes sus propiedades y un ejemplo. Me imagino que también querrás hacer uso de los mismos en tu solución. Para ello lo primero que tienes que hacer es adicionar una ficha en la barra de herramientas. Posteriormente tienes que indicar la opción de seleccionar elementos y agregar el siguiente ensamblado DLL:
Para no romper compatibilidad con los controles web ASP.NET existentes, Microsoft ha diseñado los llamados extensores AJAX. Ellos, básicamente se heredan de una clase llamada “AjaxControlExtender” y sirven para potenciar a un control estándar web (agregarle más propiedades), de la misma forma que la espinaca lo hace con Popeye. Primero se dibuja el extensor, luego se indica cuál es el control a mejorar, y por último se tendrá el elemento Web ASP.NET con una propiedad del nombre del extensor (ver figura 10) y categoriza-
52
ID=”DragOverlayExtender1” runat= ”server”
Conclusiones
AjaxControlToolkit/
SOLO PROGRAMADORES nº 145
<asp:DragOverlayExtender
TargetControlID=”WebPartZone1” />
<carpeta deinstalación>/ bin/Debug/AjaxControlToolkit.dll
da bajo “Extenders”. Pero como siempre, no hay mejor explicación que un buen ejemplo: vayamos a ello... Voy a utilizar el extensor “Resizable ControlExtender”, que habilita a un panel el poder ser cambiado de tamaño, simplemente arrastrando sus bordes con el puntero del ratón. Antes que nada, es necesario adicionar este elemento a la página, ya sea escribiendo su definición o dibujándola en el formulario (listado 10). La propiedad “TargetControlId” es común a todos los extensores y es donde se configura el nombre del elemento a extender. Aquí se trata de un panel con una caja de texto contenida. Para el caso que hagas uso de “UpdatePanel”, es obligatorio que el extensor y el elemento a mejorar se encuentren dentro del mismo contenedor. Ahora tendrás que crear una hoja de estilo, la que se aplicará a “Panel1”. Mira el listado 11. El estilo exhibirá un pequeño cuadrado rojo al momento de arrastrar el borde del control. El resultado será que ahora el tamaño de “Textbox1” podrá ser personalizado (te recomiendo no obstante que le eches un vistazo a las siguientes propiedades, que por sus nombres hablan casi por si solas: “OnClientResize”, “MinimumWidth”, “MinimumHeight”, “MaximumWidth” y “MaximumHeight”). Por último, un extensor más a ver, el que hace posible que un panel sea arrastrado por la pantalla como si fuese una ventana de Windows. Te dejo con el código fuente y la figura 11, que exhibe la funcionalidad:
Figura 11. Moviendo los cuadros como ventanas de Windows.
Como siempre, me he quedado sin espacio, ya que pensaba mostrarte algunos ejemplos de AJAX CTP, sin embargo he incluido los mismos en el archivo del material adjunto. En la próxima y última entrega me explayaré sobre cómo crear un control desde cero, así como algunas alternativas para el caso que estés utilizando .NET 1.1. Hasta pronto y te deseo lo mejor para este año... http://digital.revistasprofesionales.com
59 archivadores sp
20/12/06
15:12
Página 1
Archivador de revistas + archivador de cd´s
por solo
3€
Consigue por sólo 3 euros un archivador de revistas valorado en 5,41 euros y un archivador de cd’s valorado en 4,20 euros. Haz tu pedido llamando al teléfono 91 304 87 64, por fax al 91 327 13 03 o por correo electrónico a rpsuscripciones@revistasprofesionales.com, indicando tus datos personales y la forma de pago (giro postal, domiciliación bancaria, tarjeta de crédito o contrareembolso*).
REVISTAS PROFESIONALES - C/ Valentín Beato, 42 - 3ª plta. - 28037 Madrid *en opción contrareembolso se cobrará un suplemento de 5 euros por gastos de envío En opción domiciliación bancaria, se ruega aporten los datos completos de la entidad bancaria (nombre, dirección y número de cuenta completo)
42-47 diseño.qxd
20/12/06
15:18
Página 54
DISEÑO
Sistemas SCM para la Gestión de la Configuración del Software (I) BORJA RUIZ ARROYO (Ingeniero Software en Códice Software) y FRANCISCO JOSÉ GARCÍA PEÑALVO (Profesor Titular de la Universidad de Salamanca)
A lo largo de esta serie de artículos se pretende introducir al lector en las herramientas de control de versiones (SCM), muy extendidas en los entornos de programación, dando una idea de su funcionamiento, así como una guía y consejos sobre cómo usarlas.
torios que se encuentren controlados, identificando para cada uno de ellos, cuándo se cambió, qué se cambió, quién lo hizo… En definitiva, permite tener una historia sobre todos ellos, pudiéndose obtener información sobre la misma o recuperar cualquiera de sus estados.
Elementos de un SCM Repositorio Es un almacén de datos. Se encarga de almacenar la historia de todos los ítems controlados, guardando las diferentes versiones de los mismos, así como información complementaria para facilitar su manejo y control por parte del usuario.
Introducción Espacio de trabajo En este primer artículo se explicará qué son estas herramientas y para qué sirven, introduciéndose los distintos elementos que las componen. Se mostrarán las ventajas del uso de este tipo de herramientas, así como algunas de las malas prácticas que permiten evitar, tratando de guiar al usuario para que pueda comenzar a trabajar con una.
¿Qué es un SCM? Es un sistema de gestión de la configuración de software. El término SCM es el acrónimo del nombre inglés Software Configuration Management. Pero, ¿qué es un sistema de gestión de la configuración de software, y para qué sirve?. Un SCM permite gestionar ficheros y directorios mediante un almacenamiento controlado, manteniendo su evolución a lo largo del tiempo. Un SCM sirve para almacenar ficheros y directorios de forma centralizada. Permite a una o más personas trabajar simultáneamente sobre los mismos, sin tener que preocuparse de si alguien más está trabajando sobre ellos, ni de cómo, pues es él el encargado de controlar todo eso. Mantiene el control sobre todos los cambios sufridos por cada uno de los ficheros o direc-
SOLO PROGRAMADORES nº 145
54
Muestra una vista local del repositorio, sobre la cual el usuario puede trabajar. Un espacio de trabajo se ubica en una ruta física del disco, en la cual se encuentra la copia local de los ítems controlados. Es sobre esta copia, sobre la cual el usuario introducirá los cambios. Los elementos que se muestran en el espacio de trabajo vienen determinados por el usuario mediante una serie de reglas. A través de estas reglas el usuario dice al sistema qué versión concreta desea ver para cada uno de los ítems. Estas reglas pueden especificarse de forma más o menos precisa dependiendo del sistema empleado.
Ítem Es cualquier fichero o directorio controlado por el SCM. Es importante distinguir que, el ítem, es la representación única del elemento en el sistema, mediante la cual podemos acceder a él. Pero el ítem no contiene los datos del mismo. Para guardar los datos contenidos por el elemento en cada momento se emplean las revisiones. Cuando un fichero o directorio es añadido al control de versiones, se le asocia a un ítem. Mientras que el fichero o el directorio cambiarán a lo largo del tiempo, pudiendo cambiar de nombre, de ubicación (ruta), de contenido o incluso borrarse, siempre estarán identificados http://digital.revistasprofesionales.com
42-47 diseño.qxd
20/12/06
15:18
Página 55
DISEÑO
Sistemas SCM para la Gestión de la Configuración del Software (I) por el mismo ítem, el cual permanecerá inmutable a lo largo del tiempo.
Revisión o versión El contenido de un ítem va cambiando a lo largo del tiempo. Para almacenar cada uno de estos estados se emplean las revisiones. Una revisión contendrá el contenido del ítem en un momento dado. En cualquier momento se puede recuperar cualquiera de estas versiones, permitiendo ver el ítem tal y como estaba en el instante en el que la versión fue creada. Una revisión puede tener dos estados: protegida o desprotegida. Cuando se crea mantiene un estado de desprotegida (checkout). Mientras está en este estado puede ser modificada por parte del usuario. Cuando el usuario confirma los cambios en el ítem, éste pasa a guardarse en el sistema, pasando la revisión al estado de protegida (checkin). Una vez que una revisión está en este estado no puede alterarse. Para modificarla será necesario desprotegerla creando una nueva revisión con el estado de desprotegida. Algunos sistemas son capaces de almacenar también las revisiones mientras están desprotegidas, conservando estos datos en el repositorio y no sólo localmente.
Figura 1. Evolución de un ítem en una rama.
Figura 2. Evolución de un ítem en varias ramas simultáneamente.
http://digital.revistasprofesionales.com
Rama Es uno de los conceptos más complejos dentro de un SCM, pero también es uno de los que les confiere una mayor potencia. Una rama es una línea temporal en la cual han ido evolucionando uno o más ítems. Esta línea temporal normalmente se denomina “línea de trabajo”. Un ítem va cambiando a lo largo del tiempo. Cada vez que lo modificamos partimos de un contenido inicial, que es la revisión que estamos viendo (revisión padre). Para crear una nueva revisión con el contenido modificado. Estos cambios que se van haciendo a lo largo del tiempo crean una línea temporal, en la que cada revisión viene seguida por una y precedida por otra. Todas estas revisiones, que representan cómo ha ido evolucionando un elemento a lo largo del tiempo, se encuentran contenidas dentro de una rama, tal y como puede verse en la figura 1. Si un ítem va a ser modificado de más de una manera simultáneamente (e independientemente), el elemento pasará de tener una línea temporal, a tener tantas como de formas distintas vaya a ser modificado. Para poder hacer esto se crearán tantas ramas como evoluciones vaya a tener el ítem, manteniendo en cada rama una línea temporal de los cambios del ítem, como se muestra en la figura 2. Al crear distintas ramas, el ítem puede ir evolucionando de formas diferentes, sin que la forma en la que se cambia su contenido en una rama afecte a las demás. Aunque la información contenida en una rama es independiente a la que está contenida en las demás, en ocasiones queremos propagar los cambios sufridos por uno o más ítems en una rama hacia otra. Para propagar los cambios entre las ramas se emplean los rebases y las integraciones, que se realizan a través de la operación de merge. Dada la complejidad de estas acciones se explicarán detenidamente en un próximo artículo. Una rama almacenará un conjunto de revisiones para uno o más ítems. Todas las revisiones de un mismo ítem dentro de la rama, tienen una relación lineal. Cada revisión mantiene un estado del ítem, que da lugar al siguiente estado del ítem después de que un usuario lo modifique y así sucesivamente. De ahí que la
rama contenga una línea temporal en la que ha evolucionado uno o más ítems. Es importante aclarar que toda revisión se encuentra necesariamente en una rama, y sólo en una.
Etiqueta Una etiqueta permite marcar una revisión concreta de uno o más ítems para poder referirnos a ella con mayor facilidad en cualquier momento. A todos los efectos, lo que hace es asociar un nombre con el que referirse a esa revisión concreta de cada ítem. Pero una etiqueta no puede ser aplicada a más de una revisión de un mismo ítem, de manera que permite recuperar fácilmente un estado para todos los ítems marcados por ella. El caso habitual es etiquetar todos los ítems del espacio de trabajo. De esta manera la etiqueta nos permitiría recuperar una configuración concreta de todo sistema. Normalmente, en entornos de desarrollo, se aplica una etiqueta a todo el sistema siempre que se realiza una release (una nueva versión del sistema que se está desarrollando).
Link Un link permite relacionar dos objetos del repositorio. Los links pueden ser creados por el usuario y en algunos casos por el propio sistema. Un usuario creará un link de cierto tipo (creando un tipo de relación), que luego usará para relacionar un par de objetos contenidos en el repositorio. Hay que entender que un link puede estar creado sin que ningún par de objetos estén relacionados por el mismo. Pero obligatoriamente para relacionar un par de objetos, es necesario haber creado un link que represente ese tipo de relación. Por ejemplo, podría crearse un link “implementa requisito”, mediante el cual se relacionarán las especificaciones de requisitos, con los ficheros de código que las implementan, para luego aplicar ese link a cada documento de requisitos con todos ficheros de código necesarios para implementarle. De los links creados por el sistema, el más importante es el de merge. Un link de merge relaciona dos revisiones del sistema. Indicando que una es el resultado de mezclar el contenido de su revisión padre, con el contenido de la del 55
SOLO PROGRAMADORES nº 145
42-47 diseño.qxd
20/12/06
15:18
Página 56
DISEÑO
origen del merge. Estos links se crean automáticamente en la operación de merge, indicando qué revisiones han sido mezcladas en el mismo. Hablaremos de la utilidad de los mismos en un próximo artículo.
Atributo Un atributo es una característica particular de algunos SCM. Permite asociar información adicional a los objetos del repositorio. Para ello, se definiría previamente un atributo, que sería la información o dato que se desea poder asociar a los objetos del repositorio. Al asociarlo con cada objeto se le da un valor concreto. Por ejemplo podemos crear un atributo que sea “error corregido”. Cuando corrijamos un error, podemos asociar a todos los ficheros involucrados en la corrección este atributo, dando como valor el identificador del error que corrigen. De forma que en cualquier momento, por medio de una búsqueda, podamos encontrar fácilmente cuáles fueron los ficheros que corrigieron ese error.
Ventajas del uso de un SCM El uso de un SCM aporta gran cantidad de ventajas. Un SCM es útil para almacenar aquellos documentos que son modificados con frecuencia, como guiones, traducciones, novelas, código fuente... Pero cuando resulta imprescindible, es en el momento que es necesario coordinar el trabajo de muchas personas sobre los mismos elementos. Por un lado se almacenan múltiples versiones de los elementos y no sólo sobre la que se está trabajando, pudiéndose recuperar una versión antigua en caso necesario (sin necesidad de guardar cada versión de forma independiente renombrándola). De esta manera, si algo se rompe o queda mal, se puede volver a una revisión anterior para seguir trabajando a partir de ésta. Incluso si alguien borra todo, sigue siendo posible recuperar los datos, al estar almacenados en el repositorio, pudiendo volver atrás y recuperar su contenido. Además, mientras se está trabajando pueden hacerse diferentes pruebas, pudiéndolas descartar o, sencillamente, no incluirlas en la versión final, sin preocuparse de deshacer todos los cambios incluidos en las mismas. Todo esto otorga una mayor comodidad y seguridad, a la hora de traba-
SOLO PROGRAMADORES nº 145
56
jar con los distintos elementos. Se puede saber quién introdujo cada cambio para cada elemento, lo cual confiere la trazabilidad necesaria para temas de calidad. También gracias a los links y los atributos, puede asociarse el código a los requisitos que implementan y a los errores que corrigen, algo necesario para certificaciones de calidad. Permite que varias personas trabajen sobre los mismos elementos sin necesidad de que sean ellos los que tengan que coordinarse, sin que los cambios que uno introduzca pisen los del otro, eliminándolos o alterándolos. Incluso pueden trabajar de forma paralela sobre el mismo elemento sin problemas, dado que será el sistema el encargado de combinar sus cambios. Cada persona trabaja con una revisión local del elemento para modificarla. Mientras el usuario la modifica, la revisión pasa a estar desprotegida, y todos los cambios que realiza sobre ella sólo son visibles para él, sin pasar a formar parte del sistema hasta que los confirma protegiendo la revisión. En caso de que quiera descartar esos cambios, no tiene más que deshacer la desprotección, volviendo a la versión existente del elemento antes de que empezase a modificarla. Un SCM se encarga de actualizar los elementos modificados, comparando la versión local con la última existente. De manera que no es el usuario el que tiene que preocuparse de ir comprobando todos los elementos, para ver cuáles son los que han cambiado y así sustituirlos por la versión correcta. Se puede aislar cada nueva tarea que haya que hacer sobre el sistema, pudiendo decidirse más tarde si ésta se incorpora o se tiene que descartar. Centralizando todos los cambios introducidos por esa tarea en una rama, luego pueden incorporarse al sistema mediante un merge de la rama, en el momento necesario. Esto da un mayor control sobre el sistema, pudiendo crear distintas versiones del mismo para probarlo, simplemente incorporando unos cambios u otros sobre las mismas. Si hay que hacer cambios en un sistema que puedan llegar a romperlo, se pueden hacer de forma aislada mientras los demás continúan trabajando sin que les afecte, mediante el uso de ramas. En el
momento que estos cambios estén acabados y probados, pueden incorporarse al sistema sin haber tenido que interrumpir el trabajo de los demás. Se puede recuperar el estado que tenía todo un sistema en cualquier momento mediante las etiquetas, en caso de que fuera necesario para realizar pruebas, algún arreglo o sacar una nueva copia del mismo. Todos los datos se guardan de forma centralizada, facilitando la tarea de realizar copias de seguridad, al no tener que ir buscando cada uno de los ficheros necesarios. Proporciona un acceso remoto a todos los elementos. Ya no es necesario tener una copia del sistema en todo momento, pues basta con conectarse al servidor para poder bajarse una versión actualizada desde cualquier parte, y luego seguir trabajando con ésta normalmente.
Errores y malas prácticas que podemos evitar con un SCM El no disponer de un sistema SCM no significa que no necesitemos sus prestaciones. En realidad, de manera inconsciente, en ausencia de un SCM intentamos “emular” sus funcionalidades de manera “manual”, lo cual nos conduce a prácticas poco aconsejables. Es una mala costumbre dejar partes de código comentadas por si luego van a ser usadas. Hacen crecer, de forma irreal, el proyecto, alterando las medidas que sobre él se toman. Puede llegar a olvidarse por qué se comento ese código, y dudar si es necesario volver a incluirlo o no. Un control de versiones permite, al guardar un historial del archivo, borrar todo este código comentando, al poder recuperarlo volviendo a la versión que lo tenía. Es usual ir guardando copias del código con distintas versiones del mismo. Estas copias se suelen ir dejando por todo el disco (bien en distintas carpetas o en ficheros comprimidos). Cuando más adelante se trata de buscar un cambio, una corrección o una nueva funcionalidad que hemos añadido, no sabemos en cuál de todas las copias se encuentra. Puede llegar a darse el caso que se sabe que se ha escrito un código, pero ser incapaces de encontrarlo. No se sabe cuándo se hizo un cambio, ni http://digital.revistasprofesionales.com
42-47 diseño.qxd
20/12/06
15:18
Página 57
DISEÑO
Sistemas SCM para la Gestión de la Configuración del Software (I)
por qué. Esto dificulta encontrarlo, o incluso saber por qué un cambio está ahí. Cuando se encuentra un error, no sabemos en qué versión está. Incluso no sabemos si en la versión actual continúa estando ese error o ya ha sido corregido por alguien en algún momento. Si dos desarrolladores hacen un cambio sobre el mismo fichero, pueden pisarse el cambio mutuamente al sustituir cada uno el fichero con su versión, sin saber que el otro también lo ha modificado y sustituido. Si a lo largo del desarrollo se llega a una versión que funciona peor o que gusta menos, no es fácil volver atrás.
Figura 3. Asistente del servidor, pantalla de configuración del modo de trabajo con usuarios.
Cómo comenzar a trabajar con un SCM Aunque todos lo sistemas de SCM poseen un comportamiento similar en la mayoría de los aspectos, al profundizar en ellos, se encuentran muchas diferencias, tanto en su funcionalidad como en la manera de realizar las operaciones. La forma de empezar a trabajar con todos los sistemas SCM es parecida (una vez instalados); por ello aunque los pasos a seguir que se describirán son genéricos para todos ellos, los ejemplos se harán con una versión demo de Plastic SCM, que puede ser descargada de http://www.codicesoftware.com/opdown loads.aspx. Plastic SCM es un nuevo sistema de control de versiones desarrollado por la empresa española Códice Software (http://www.codicesoftware. com/opfront.aspx). Para montar un sistema SCM, es necesario instalar un servidor y tantos clientes como personas quieran trabajar con él. Para ello usaremos el instalador de Plastic SCM; para la mayoría de los sistemas las opciones marcadas por defecto serán las más apropiadas, una vez que el usuario haya elegido el idioma. En el último punto de la instalación, se lanzarán los asistentes que se encargarán de guiar al usuario en la configuración del cliente y del servidor. El asistente del servidor, tras una pantalla de bienvenida y de haber definido el idioma, nos llevará a la pantalla de la figura 3, para configurar el modo de trabajo con usuarios. Junto a cada uno de los modos aparece una pequeña explicación del mismo. Para el ejemplo elegirehttp://digital.revistasprofesionales.com
Figura 4. Asistente del servidor, pantalla de configuración de la dirección del servidor.
Figura 5. Asistente del cliente, pantalla de configuración del modo de trabajo con usuarios.
Figura 6. Asistente del cliente, pantalla de configuración de la dirección del servidor.
mos los usuarios locales. En esta configuración, es necesario que en la máquina del servidor existan usuarios con los nombres de cada usuario que va a usar la herramienta (la parte del cliente). Como último paso, aparecerá la pantalla de la figura 4. Nos pedirán introducir la dirección del servidor: por defecto se dejará la que aparece. En el caso del cliente es muy parecido. En primer lugar aparecerá la pantalla de bienvenida, seguida de la de selección de idioma. Después, se solicita el modo de trabajo con usuarios, figura 5. Tendremos que elegir el mismo que se eligió en el servidor. Como último paso, figura 6, se solicita la dirección del servidor (la misma que aparecía en el asistente del servidor). Llegados a este punto ya tenemos la herramienta instalada y lista para comenzar a trabajar. El primer paso cuando se instala un SCM es crear un repositorio. En nuestro caso no es necesario, dado que se crea un repositorio por defecto a lo largo del proceso de instalación. Aun así existe la posibilidad de crear nuevos repositorios si se considera oportuno, por ejemplo:
Figura 7. Plastic GUI, permisos del elemento raíz del espacio de trabajo.
Figura 8. Plastic GUI, pantalla para la selección de un espacio de trabajo y la creación de uno nuevo.
57
SOLO PROGRAMADORES nº 145
42-47 diseño.qxd
20/12/06
15:18
Página 58
DISEÑO
Permitiendo mantener aislados los elementos controlados que no tienen relación entre sí (un repositorio por proyecto de desarrollo, uno para documentación…). Para distribuir la carga de trabajo y el almacenamiento. Por políticas de empresa. Nada más instalarlo y antes de empezar a trabajar con el sistema, es el momento apropiado para aplicar las directivas de seguridad. Casi todos los SCM tienen un sistema de seguridad incorporado que permite definir ciertos permisos sobre sus elementos. En el caso de Plastic se emplea un sistema de ACLs (Access Control List – Listas de Control de Acceso). Este sistema es el mismo que se emplea en otras herramientas y en sistemas operativos como Windows. Mediante este sistema se pueden especificar los permisos que tiene cada usuario (o grupo) en cada objeto del sistema, pudiendo definir los permisos para cada una de las operaciones disponibles en Plastic SCM de manera independiente para cada grupo o usuario, como puede verse en la figura 7. Todo objeto hereda sus permisos de su padre según una jerarquía de herencia, al igual que en un sistema operativo un fichero hereda los permisos del directorio que lo contiene. A cada objeto se le pueden aplicar nuevos permisos (que se añadirán a los heredados), romper su herencia, cambiar su esquema de herencia… Mediante este sistema, la política de seguridad puede llegar a complicarse tanto como haga falta, soportando cualquier necesidad, pero en general suele mantenerse una política bastante simple. El caso más común es dejar un sistema completamente abierto, tal y como se crea por defecto, o completamente cerrado. En el primer caso, todo el mundo puede realizar cualquier operación, denegando ciertas operaciones cuando sea necesario. En el segundo caso, nadie puede hacer nada salvo que se le haya otorgado expresamente el permiso para hacerlo. En la mayor parte de los entornos, se puede mantener el sistema con la política de seguridad por defecto. Una vez que se ha instalado el sistema y definida la política de seguridad para que un usuario pueda empezar a traba-
SOLO PROGRAMADORES nº 145
58
Figura 9. Plastic GUI, vista del contenido de los elementos privados contenidos en el espacio de trabajo.
Figura 10. Plastic GUI, desprotección del elemento raíz.
Figura 11. Plastic GUI, se añaden todos los elementos privados al control de versiones.
Figura 12. Plastic GUI, vista “Ver COs” mostrando todos los elementos recién añadidos.
Figura 13. Plastic GUI, protección de todos los elementos desprotegidos desde la vista “Ver COs”.
jar, es necesario que cree un espacio de trabajo. Un espacio de trabajo se crea en una ruta del disco y con un nombre con el que se le referencia, pudiendo a partir de ese momento mantener bajo control cualquier elemento contenido en esa ruta. En el caso de Plastic SCM, nada más arrancar la interfaz gráfica se pide elegir un espacio de trabajo. Si se hubiese pulsado el botón “obtener” nos mostraría todos los disponibles para que se seleccione uno; como aun no hay ninguno, se crea uno nuevo como se ve en la figura 8. El directorio en el que se crea el espacio de trabajo pasa a ser un elemento especial del repositorio, el elemento raíz. Sobre él podremos ir añadiendo nuevos elementos. Es importante entender que aunque un elemento se encuentre físicamente contenido en el espacio de trabajo, no estará controlado salvo que alguien lo haya añadido. Mientras tanto será un elemento privado que puede ser manejado normalmente de forma local, como podemos ver en la figura 9. Para que un elemento pase a estar controlado, es necesario desproteger el directorio donde se encuentra y añadir el elemento al control de versiones. La operación de “añadir” deja al elemento desprotegido, para que pueda ser modificado. Siguiendo con el ejemplo, añadiremos todos los elementos privados que tenemos en el espacio de trabajo para que pasen a estar controlados. Para ello se desprotegerá el elemento raíz, con el botón derecho en este elemento y pulsando la opción desproteger (figura 10). Al desproteger un elemento, se pide el comentario que se asociará a la revisión desprotegida que se crea. Una vez tenemos la raíz desprotegida, añadiremos todos los elementos de forma recursiva. Para ello se seleccionan todos los que están en el directorio raíz y con el botón derecho, “añadir recursivamente” (figura 11). Marcando la opción “Ver COs”, se pueden ver todos los elementos desprotegidos en ese espacio de trabajo, que en este caso son todos ellos (figura 12). Seleccionaremos todos los elementos desprotegidos y confirmaremos la acción de añadir todos ellos al control de versiones, protegiéndoles (figura 13). También en este caso se http://digital.revistasprofesionales.com
42-47 diseño.qxd
20/12/06
15:18
Página 59
DISEÑO
Sistemas SCM para la Gestión de la Configuración del Software (I) pedirá el comentario para la revisión protegida. Generalmente, una persona es la encargada de añadir inicialmente todos los elementos que van a estar controlados, como puede ser el proyecto sobre el que se va a trabajar. Aunque luego será cada usuario el que vaya añadiendo los elementos que sean necesarios. Como cualquier otro elemento, para modificar un directorio es necesario que se encuentre desprotegido. Mientras el directorio está desprotegido, podremos alterar su contenido añadiendo nuevos elementos, renombrándolos o borrándolos. Todos estos cambios permanecen locales mientras el directorio siga desprotegido. En el momento en el que el directorio se proteja, los cambios pasarán a ser globales estando almacenados en el control de versiones. Si por el contrario queremos cancelarlos, lo único que hay que hacer es deshacer la desprotección y de esa manera recuperar el estado inicial del elemento. En el caso de Plastic SCM, si modificamos un directorio, por ejemplo renombrando un fichero, y este directorio no está desprotegido, se preguntará si se desea desproteger el directorio (figura 14). Es importante entender que al modificar el nombre de un elemento, no es el elemento el que estamos cambiando sino el directorio, pues son las entradas del directorio las que contienen el nombre de los elementos (figura 15). En el caso de los ficheros sucede lo mismo: antes de realizar algún cambio es necesario desprotegerlo (esta operación puede hacerse automáticamente si el editor está integrado con el “control de código fuente”). Una vez tenemos el fichero desprotegido, se puede modificar localmente, para luego confirmar sus cambios protegiéndolo, o descartarlos desprotegiéndolo. Se puede ver cómo se ha ido modificando un elemento a lo largo del tiempo, mediante el historial de revisiones (figura 16) o el árbol de revisiones (figura 17), ambas operaciones disponibles en el menú contextual del ítem. Se puede acceder a los datos de cualquiera de ellas fácilmente, simplemente pulsando en la opción abrir (figura 18). Pero un usuario no verá de forma automática los cambios de los demás, cuando http://digital.revistasprofesionales.com
Figura 14. Plastic GUI, solicitud de desprotección para el directorio que contiene el elemento a renombrar.
Figura 15. Plastic GUI, directorio desprotegido después de renombrar un elemento.
éstos los protejan. Para que pueda verlos es necesario que se actualice. Mientras un usuario no se actualice, trabajará sobre su versión local sin que ésta se vea afectada. Cada usuario puede decidir qué parte del sistema desea cargar localmente. Esto se define mediante una serie de reglas. Cada regla se define para un directorio, fichero, o patrón (*.cs). En el caso de un directorio puede definirse sólo a ese nivel o de forma recursiva para ese nivel y todo su contenido. Una regla especifica desde dónde se desean cargar esos elementos y dónde se desean dejar al modificase (al desprotegerlos). Por defecto, al crear un espacio de trabajo se le fija un selector, que trae la última revisión para todos los elementos contenidos en la rama principal del repositorio por defecto. Siempre que se crea un espacio de trabajo, se debe actualizar su contenido para obtener la última versión de los elementos que se encuentren en el servidor en ese momento.
Conclusiones
Figura 16. Plastic GUI, historial de “fichero.txt”.
Figura 17. Plastic GUI, árbol de revisiones de “fichero.txt”.
Figura 18. Plastic GUI, abrir una versión de “fichero.txt” desde el historial.
A lo largo de este artículo se han introducido las herramientas de SCM, explicando sus principales elementos. Se han expuesto algunas de las razones por las que su uso es aconsejado o incluso necesario en algunas circunstancias (como para conseguir algunos certificados de calidad). Tal y como se ha visto, proporcionan una importante seguridad a la hora de trabajar, gracias a tener una historia concreta sobre todos los elementos sobre la que poder buscar y recuperar cualquier información. Pero más importante aún es que permiten coordinar el trabajo de múltiples usuarios, evitando que puedan dañar el sistema o entorpecerse unos a otros. También se ha guiado al usuario para que pueda empezar a trabajar con una herramienta de SCM como es Plastic SCM. No obstante, éste era un primer artículo de una serie introductoria a las herramientas de SCM. En próximos artículos, se darán algunas pautas sobre el uso más eficiente de estas herramientas y algunos consejos prácticos. Además, se profundizará en su manejo, detallando algunas de las operaciones que poseen una mayor complejidad, como son los merges. 59
SOLO PROGRAMADORES nº 145
60 Libros.qxd
19/12/06
12:09
Página 60
LIBROS
Búsqueda de libros en Google Books DABNE
El interés de Google por indexar contenidos que no están en web supone un salto en la estrategia de la compañía, y un paso más en la accesibilidad a los bienes culturales. Al mismo tiempo, el hecho de que esta accesibilidad dependa de una empresa privada, suscita numerosas reticencias. Si hasta no hace mucho Google se había “conformado” con indexar toda la web, ahora la compañía ha iniciado una nueva estrategia al pretender incluir en sus índices contenidos que, en prinicpio, no están en Internet. Tal es el caso de Google Books, disponible en español en books.google.es. Salta a la vista que la funcionalidad de Google Books consiste en realizar búsquedas en libros. Teniendo su importancia, como todo lo que hace Google, esto no sería de gran trascendencia salvo si reparamos en el significado de la humilde preposición “en”. Efectivamente, la importante novedad consiste en que si bien hay servicios de búsqueda “sobre” libros, Google Books es el primero de búsqueda “en” libros. O, dicho, de otra manera, no es lo mismo buscar información en los metadados que describen un libro (título, autor, editorial...) que hacer búsquedas en su contenido. Por poner un ejemplo, estamos acostumbrados a que una búsqueda sobre “don quijote de la mancha” devuelva referencias a libros cuyo título incluye estas palabras. Pero al realizar esta misma búsqueda en Google Books lo que vamos a obtener son libros en cuyo contenido tienen relevancia estas palabras, es decir, encontraremos libros que hablen sobre esta obra de Cervantes.
De dónde ¿De dónde puede Google obtener el contenido de los libros? Google Books obtiene los libros a
SOLO PROGRAMADORES nº 145
60
partir de dos programas: uno dedicado a bibliotecas y otro dedicado a editoriales. En el caso de las editoriales, estas deben firmar un contrato con Google y suministrarles un ejemplar de cada una de las obras a indexar. Se sobreentiende que las editoriales ofrecen obras sobre las que tienen derechos y, en función de estos derechos, deciden si Google Books va a ofrecer una vista de fragmentos de libro, una vista previa restringida, una vista completa o ningún tipo de vista. Por su parte, las bibliotecas pueden hacer lo propio, en este caso con obras de su fondo para las que hayan caducado los derechos de autor. Si bien la oportunidad para las editoriles es más o menos discutible, la decisión de las bibliotecas ciertamente está siendo muy discutida. A favor están los argumentos de ofrecer accesibilidad a bienes culturales que son de dominio público. En contra está el hecho de que esos bienes tengan que salir no solo de la biblioteca sino también de España, pues Google digitaliza los libros en EE UU. Este traslado puede acarrear deterioros o pérdidas en obras valiosas cuya conservación es responsabilidad de la biblioteca que las custodia, por ejemplo por el simple hecho de tener que desencuadernarlas para el escaneo. Además, también en contra, está el hecho de que todo este patrimonio quede en manos de una compañía privada, que en un futuro puede restringir el acceso, hacerlo de pago, etc. Por eso, son pocas las bibliotecas españolas que ven con buenos ojos esta oportunidad, a pesar de las presiones de los usuarios para que sus fondos sean accesibles on line sin restricciones. ¿No debería ser, un servicio de accesibilidad a la cultura como este, gestionado por instancias públicas? El caso es que la de la Universidad Complutente de Madrid es la pimera biblioteca no anglosajona, y la única en España, que ha firmado con Google un acuerdo de no exclusividad para la indexación de obras de dominio público (más información en http:// www.ucm.es/BUCM/biblioteca/11979.php).
Cómo Dejando al margen este debate, que centró mucho interés en el reciente simposio “Bibliotecas y Objetos Digitales” (www.bibliotecasdigitales.es), celebrado en Madrid el pasado otoño, mencionar que una vez Google ha negociado el derecho a acceder al contenido de
un libro, bien sea a través de una biblioteca o de una editorial, el libro se escanea, se convierte a texto y se indexan sus palabras clave. Pero, además, el libro va a tener asociados una serie de servicios, en función de la localización de usuario, tales como las bibliotecas cercanas en donde el libro está en consula o préstamo, o las librerías que lo venden por el modo tradicional o por comercio electrónico. Además, una vez hemos realizado una consulta en Google Books y hemos llegado a un libro, podemos realizar nuevas consultas en el contenido de ese mismo libro. Y, por supuesto, también pueden realizarse las clásicas consultas por autor, título, editorial...
Pros y contras Google argumenta que su negocio está en la publicidad, y que de ninguna manera se plantea ni se planteará restringir el acceso a Google Books ni hacerlo de pago, pues lo que le interesa es máxima visibilidad para mayores ingresos en publicidad. No se puede menospreciar la democratización que supone el hecho de que Google se interese por contenidos que no están en web (artículos, libros...) y los incluya en sus buscadores, pero tampoco hay que obviar las consecuencias que en un futuro puede tener el hecho de que esta democratización de la información esté en manos de una empresa privada, aunque esta empresa siga las prácticas de la Web 2.0. Incluso aunque el servicio sea gratuito, ¿se primarán más unas ediciones que otras? ¿Tendrá Google un control sobre los perfiles de sus usuarios?... Son estas incertidumbres las que están frenando la expansión de Google Books que, a pesar de ello, es una iniciativa que no tiene parangón, ni en lo público ni en lo privado.
Sobre Dabne Dabne Tecnologías de la información (www.dabne.net) ofrece su experiencia en el diseño e implementación de archivos y bibliotecas digitales, análisis de los documentos, digitalización del material y creación de la estructura, de los procedimientos de gestión y de las interfaces de acceso.
http://digital.revistasprofesionales.com
61 atii.qxd
20/12/06
15:20
Pรกgina 66
64-66 Dudas.qxd
20/12/06
15:22
Página 62
DUDAS
Preguntas y respuestas ADOLFO ALADRO GARCÍA
Estoy desarrollando una aplicación que emplea XML en Java. La aplicación a veces falla y creo que se debe en algunos casos a que los datos no están bien. Me gustaría poder sacar el XML por el “System.err” o por el “System.out”, pero no tengo claro cómo hacerlo. De hecho hasta el momento la aplicación lo único que hace es leer los ficheros XML, usando el método “parse” de la clase “DocumentBuilder”, pero no tengo nada claro cómo escribir ficheros XML (en la clase “DocumentBuilder” no hay ningún método). Supongo que ambas cosas son el mismo problema. La clase “DocumentBuilder” se utiliza principalmente para obtener objetos “Document”, que representan a un documento XML, a partir de un fichero o construyéndolos desde cero empleando los típicos métodos “createElement”, “appendChild”, etc. Por el contrario, “DocumentBuilder” no implementa la funcionalidad que permite salvar un objeto “Document” en un fichero XML. Para ello la alternativa más sencilla es emplear las clases del paquete estándar “javax.xml.transform”. En primer lugar debes obtener una instancia de la clase “TransformerFactory” empleando el método estático “newInstance”:
transforma el documento XML convirtiéndolo en una cadena de caracteres. El proceso es el que se describe seguidamente. Se crea un “StringWriter” para almacenar la cadena de caracteres correspondiente al documento XML representado por un objeto de la clase “Document”. El objeto de tipo “StringWriter” se pasa al constructor de la clase “StreamResult”: StringWriter sw = new StringWriter(); StreamResult streamResult = new StreamResult(sw);
Con lo anterior ya se tiene preparada la salida del transformador. A continuación se prepara la entrada, y para ello se crea una instancia de “DOMSource” a partir del objeto “Document”. DOMSource domSource = new DOMSource(doc);
Finalmente, el método “transform” de la clase “Transformer” se encarga de realizar la transformación: transPlainText.transform(domSource, streamResult);
TransformerFactory transFactory =
La cadena de caracteres correspondiente al documento XML se obtiene después de la llamada anterior haciendo “sw.toString()”. Hay algunos parámetros de configuración del objeto “Transformer” que pueden modificarse si se requiere. Por ejemplo:
TransformerFactory.newInstance();
transPlainText.setOutputProperty(OutputKey s.ENCODING, “iso-8859-1”);
El siguiente paso consiste en obtener un objeto de la clase “Transformer”. En realidad este tipo de objetos se utilizan normalmente cuando se quiere aplicar una hoja XSL a una fuente de datos XML con el fin de obtener una página HTML u otro XML, por ejemplo. En otras palabras, se emplean para transformar, como su propio nombre indica, orígenes de datos XML “en otra cosa”. Convertir un documento XML almacenado en forma de objeto “Document” en una cadena de caracteres, para salvarla en un fichero o para mostrarla por el “System.err”, es precisamente eso: transformar un origen de datos XML. Transformer transPlainText =
BufferedReader br = new BufferedReader
transFactory.newTransformer();
(new FileReader(new File (“C:/transformer.xsl”))); StreamSource streamSrc = new StreamSource(br);
Al emplear el método “newTransformer” sin parámetros, se crea un “transformador” que
SOLO PROGRAMADORES nº 145
62
En la documentación de la clase “OutputKeys” se pueden ver todos ellos. Obsérvese que con el método anterior la transformación del documento XML en una cadena de caracteres se hace empleando el transformador por defecto que proporciona la clase “Transformer”. En algunos casos este transformador no es suficiente, o simplemente puede ser más interesante transformar los documentos XML de forma personalizada. En esos casos el transformador puede construirse a partir de una hoja XSL:
http://digital.revistasprofesionales.com
64-66 Dudas.qxd
20/12/06
15:22
Página 63
DUDAS
Preguntas y Respuestas
LISTADO 1
Hoja XSL para la transformación de XML
<?xml version=”1.0” encoding=”iso-8859-1”?> <xsl:stylesheet version=”1.0” xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”> <xsl:template match=”node() | @*”> <xsl:copy> <xsl:apply-templates select=”@* | node()”/> </xsl:copy> </xsl:template> <xsl:template match=”node()[name()=’#cdata-section’]”> <xsl:call-template name=”cdata-start”/> <xsl:value-of select=”.” disable-output-escaping=”yes”/> <xsl:call-template name=”cdata-end”/> </xsl:template> <xsl:template name=”cdata-start”> <xsl:text disable-output-escaping=”yes”><![CDATA[<]]></xsl:text> <xsl:text disable-output-escaping=”yes”><![CDATA[![CDATA[]]></xsl:text> </xsl:template> <xsl:template name=”cdata-end”> <xsl:text disable-output-escaping=”yes”><![CDATA[]]]]></xsl:text> <xsl:text disable-output-escaping=”yes”><![CDATA[>]]></xsl:text> </xsl:template> </xsl:stylesheet>
El fichero “transformer.xsl” es el responsable de hacer la transformación y se utiliza para obtener una nueva instancia de la clase “Transformer” mediante la clase “StreamSource”. El transformador se obtiene ahora: transPlainText =
(es necesario crear un objeto ActiveX) mientras que IE7 sí, con lo que se puede hacer:
Por último, también se puede explorar la cabecera http llamada User-Agent. En el servidor es la única opción. Los navegadores mandan esta cabecera, entre otras muchas, en cada llamada que realizan al servidor. Ahora bien, la detección no es tan sencilla como parece. Hay tantos valores de la cabecera User-Agent como distintos navegadores, sistemas operativos y versiones de los mismos. En el site de Microsoft existen dos buenos artículos al respecto que podrán ayudarte a mejorar tus desarrollos: Detecting Internet Explorer More Effectively: msdn.microsoft.com/workshop/author/ dhtml/overview/browserdetection.asp Understanding User-Agent Strings: msdn.microsoft.com/workshop/author/ dhtml/overview/aboutuseragent.asp
if (window.XMLHttpRequest) { // IE 7 } else { // IE6
transFactory.newTransformer(streamSrc); }
El resto del proceso es similar. El código del listado 1 ilustra un ejemplo de una hoja XSL que transforma un documento XML en una copia de sí mismo teniendo en cuenta las secciones CDATA. Controlando el método de salida, esa copia de sí mismo podría venir dada en forma de cadena de caracteres.
El script anterior también sirve para diferenciar Mozilla, Firefox y Opera 9 de IE6, ya que los primeros soportan también de forma nativa el objeto “XMLHttpRequest”. Otro método consiste en emplear código condicional: <script type=”text/javascript” >var bIsIE7 = false;</script>
Está a punto de salir Internet Explorer 7. He probado algunas versiones preliminares y he comprobado que se producen varios errores en mis páginas Web. ¿Cuál es la mejor forma de detectar con un script que el navegador es IE7? ¿Y si esa detección quiero hacerla en el servidor? Según han ido apareciendo versión beta y release candidate de Internet Explorer 7 (IE7), han ido apareciendo distintos métodos para detectar el navegador con scripts de JavaScript. Una de las formas de hacerlo es comprobando si el navegador soporta el objeto “XMLHttpRequest” (el objeto por excelencia de la tecnología AJAX) de forma nativa. Las versiones anteriores de IE7 no lo soportan http://digital.revistasprofesionales.com
<!–[if IE 7]>
Hoja XSL que transforma un documento XML en una copia de sí mismo.
<script type=”text/javascript”>bIsIE7 = true;</script> <![endif]–>
Este código sólo es interpretado por Internet Explorer y con la condición empleada en el ejemplo anterior, sólo se establecería la variable “bIsIE7” a “true” en el caso de tratarse de IE7. También se puede comprobar la propiedad “maxHeight” del objeto “style”. Los navegadores modernos, IE7 entre ellos, sí la soportan: if (typeof document.body.style.maxHeight != “undefined”) { // IE 7 } else { // IE6 }
Site de Microsoft dedicado a Internet Explorer 7.
63
SOLO PROGRAMADORES nº 145
65 Video.qxd
20/12/06
15:23
Página 64
VIDEO-TUTORIAL
Bolera virtual JORGE RUBIRA
Si te gusta jugar a los bolos, y te gusta la programación en Java, estás de enhorabuena. Con el vídeo-tutorial de este mes aprenderemos a programar una bolera con la tecnología Java y el entorno de desarrollo Eclipse. Una de bolos En esta edición, tocamos nuevamente la programación gráfica con Java, esta vez
para recrear una bolera virtual. En este vídeo-tutorial, de aproximadamente 45 minutos de duración, aprenderemos las técnicas más clásicas en este tipo de programación, como puedan ser el doble buffer o la detección de colisiones, así como el mantener dos vistas sincronizadas, una con la “proyección 2D” otra con la “proyección 3D”. Sin duda, un lujo que puede considerarse un auténtico regalo de reyes.
¿Cómo obtener el vídeo-tutorial? El material que conforma este vídeo-tutorial consiste en un archivo de vídeo y el código fuente del proyecto. Tanto los lectores de la edición en papel como los lectores de la edición digital podrán descargar el vídeo de la página web de Sólo Programadores, haciendo clic en el enlace “Fuentes” correspondiente que aparece en la página principal del número 145 (no es necesario entrar en la Zona Privada para descargar el material). El formato del vídeo es WMV y el tamaño de la descarga es de 46 MB aproximadamente.
¿Tienes sugerencias para el próximo vídeo-tutorial? Nos interesa saber cómo podemos mejorar los vídeos y sus contenidos, de modo que si tenéis cualquier sugerencia para futuros vídeos, no dudéis en transmitirla a Jorge Rubira, el autor: encuestavideos@ gmail.com.
SOLO PROGRAMADORES nº 145
64
http://digital.revistasprofesionales.com
27 Anuncio CD-UTIL
20/12/06
15:26
Página 65
¿AÚN NO LOS TIENES?
PÍDELOS YA…
Si no lo encuentras o está agotado, solicítalo en el teléfono 91 304 87 64 - Fax 91 327 13 03 E-mail:rpsuscripciones@revistasprofesionales.com - www.revistasprofesionales.com Revistas Profesionales S.L. - C/ Valentín Beato, 42 - 3ª. 28037 Madrid
62 cd.qxd
20/12/06
15:25
Página 66
CD-ROM
Contenido del CD-ROM Fuentes Mobile Web Controls de ASP.NET Gracias a los Mobile Web Controls de ASP.NET podemos crear páginas web accesibles desde multitud de dispositivos móviles, sin que tenga que importarnos la naturaleza y diversidad de los mismos. Como material complementario a este artículo, los autores han preparado una serie de ejemplos que ilustrarán con extrema claridad todo lo expuesto en las páginas del artículo.
Mecanismos de cache en ASP.NET 2.0 (I) El framework .NET ofrece avanzados mecanismos para la gestión de memorias cache. En los ejemplos que acompañan a este artículo, el lector descubrirá cómo sacar el máximo partido a estas funcionalidades ofrecidas por la propia plataforma de desarrollo.
Programación
JavaScript Orientado a Objetos (I) El código que acompaña a esta primera entrega es muy sencillo. Simplemente consta del código necesario para declarar un objeto "Cookie" mediante la palabra reservada "function". En las próximas entregas profundizaremos en los conceptos relativos a la programación profesional con JavaScript.
Extensiones AJAX para ASP.NET (II) El lector encontrará, en este punto, una espectacular batería de ejemplos relativos al uso de AJAX desde Visual Studio y mediante la tecnología ASP.NET. En la próxima y última entrega analizaremos aún con más profundidad este nuevo paradigma de programación web; sin embargo, el material ofrecido aquí es más que suficiente hasta el mes que viene.
SOLO PROGRAMADORES nº 145
66
Tecnologías Java Aprovechando el proceso de "liberación" experimentado por la plataforma Java (en el número anterior de Sólo Programadores ya se matizaron las implicaciones de esta "liberación"), hemos querido ofrecer aquí todos los recursos necesarios para desarrollar aplicaciones y servicios con esta tecnología. Por un lado, hemos incluido el SDK de la plataforma, que incluye todas las herramientas necesarias por línea de comando. Por otro lado, hemos incluido el código del SDK. Y, por último, las principales ediciones del entorno de desarrollo netBeans. A continuación exponemos una relación de los paquetes incluidos: jdk-6-windows-i586.exe: Versión 6 del JDK de Java para plataformas de 32 bits.
jdk-6-windows-amd64.exe: Versión 6 del JDK de Java para plataformas de 64 bits. jdk-6-rc-src-b104-jrl0 1 _ n o v _ 2 0 0 6 . j a r : Códigofuente del JDK de Java, versión 6. netbeans-5_5-windows.exe: Plataforma de desarrollo netBeans en su versión 5.5. netbeans-ent_pack-5_5w i n d o w s . e x e : Extensión de netBeans para la programación de aplicaciones empresariales SOA. netbeans-mobility-5_5w i n . e x e : Extensión de netBeans para la programación de aplicaciones para dispositivos móviles. netbeans-visualweb-5_5windows.exe: Extensión de netBeans para la programación de aplicaciones web.
http://digital.revistasprofesionales.com
Interior contra.qxd
20/6/06
08:29
Pรกgina 1
CONTRA.qxd
19/10/06
09:55
Pรกgina 1