Issuu on Google+

C IN D CL -R UY OE M

Portada SoloP 163:Portada SoloP 163

11/8/08

12:01

LA PRIMERA REVISTA DE PROGRAMACIÓN EN CASTELLANO

Precio: 6 € (España) (IVA incluido)

DE REGALO Solo Programadores número 161 en formato pdf

Página 1

AÑO XIV. 2.ª ÉPOCA

• Nº 163 •

UNA PUBLICACIÓN DE:

REVISTAS PROFESIONALES S.L.

Curso de Programación Java Os presentamos una serie de artículos orientados a introducir al lector en el lenguaje de programación Java. Este lenguaje de programación creado por Sun Microsystems a mediados de la década de los 90 es el lenguaje de programación más popular en la actualidad.

JAVAHISPANO Actualidad Java REDES Cross-browser XSLT/XPath en aplicaciones Web con AJAX (I) Java a vista de pájaro Cross-browser lector de RSS con AJAX (I) MIDDLEWARE Curso de programación Java (I) Programación con múltiples hilos (III) Microsoft ASP.NET MVC (paradigmna de modelo, controlador y vista) (II) VIDEOS JAVACUP Vídeos de las finales de JavaCup 2008

Noticias, CD-ROM


Anuncio 4D:Anuncio 4D

11/8/08

11:40

Pรกgina 1


03 Editorial 163:03 Editorial 163

Número 163 Edita: REVISTAS PROFESIONALES S.L. solop@revistasprofesionales.com C/ Valentin Beato 42, 3ª 28037 - Madrid www.revistasprofesionales.com •••••••••••••••••••••••••••••••••• Editor Agustín Buelta •••••••••••••••••••••••••••••••••• Coordinación Técnica-Redacción Ricardo Álvarez •••••••••••••••••••••••••••••••••• Colaboradores Abraham Otero, Juan Martos, Jorge Rubira, Guillem Alsina, Adolfo Aladro, Aitor Almeida, David Roldán, Gastón Hillar, Javier Holguera, Erich Bulher. •••••••••••••••••••••••••••••••••• Maquetación Alfonso Sabán / Raúl Clavijo •••••••••••••••••••••••••••••••••• Departamento de Publicidad Felipe Ribagorda Tel.: 91 304 87 64 Delegación en Barcelona C/ Rocafort, 241/243, 5º 1ª Mariano Sánchez Tel.: 93 322 12 38 •••••••••••••••••••••••••••••••••• Dpto. Suscripciones Tel: 91 304 87 64 Fax: 91 327 13 03 ••••••••••••••••••••••••••••••••••• Impresión L.M.S. Solución Gráfica ideasimpresion@telefonica.net ••••••••••••••••••••••••••••••••••• Distribución

Coedis S.L. C/ Alcorcón nº 9 - 28850 Torrejón de Ardoz (Madrid) Teléfono 91 676 96 62 DISTRIBUCION EN MEXICO DIMSA - C/ Mariano Escobedo, 218 Col. Anáhuac. 11320 México, D.F. DISTRIBUCION EN ARGENTINA 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. Cualquier forma de reproducción, distribución, comunicación pública o transformación de esta obra solo puede ser realizada con la autorización de sus titulares, salvo excepción prevista por la ley. Diríjase a CEDRO (Centro Español de Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o escanear algún fragmento de esta obra. Depósito legal: M-26827-1994 PRINTED IN SPAIN P.V.P. 6 euros

11/8/08

11:48

Página 3

EDITORIAL Primero fueron los ordenadores con un procesador cada vez más rápido. Después los ordenadores con varios núcleos. ¿Qué será lo próximo?. Pues parece que los tiros van hacia ordenadores sin disco duro, al menos en un principio pensando en los portátiles. El nuevo Gdium de Emtec es un equipo ultraportátil que carece de sistema de almacenamiento (disco duro). Habitualmente, en este tipo de ordenadores, se sustituye el tradicional disco duro por memoria de estado sólido, pero el Gdium utiliza la opción de arrancar desde un dispositivo USB que almacena no solamente los datos que el usuario pueda generar, sino también el propio sistema. De esta forma, desconectando la llave y "pinchándola" en otro ordenador, tenemos a nuestra disposición todos los archivos e incluso podemos arrancar el mismo sistema operativo que lleva instalado y trabajar de esta forma exactamente con el mismo entorno que tenemos en el portátil. De nuevo, ¿qué será lo próximo?.

SUMARIO MIDDLEWARE 14 30 50

Curso de programación Java (I) Programación con múltiples hilos (III) Microsoft ASP.NET MVC (paradigmna de modelo, controlador y vista) (II)

REDES 24 42 44

Cross-browser XSLT/XPath en aplicaciones Web con AJAX (I) Java a vista de pájaro Cross-browser lector de RSS con AJAX (I)

ACTUALIDAD 60

Reportaje sobre el OpenJavaDay 2008

VIDEOS JAVACUP 64

Vídeos de las finales de JavaCup 2008

Y ADEMÁS. . . 04 12 66

Noticias javaHispano Contenido del CD-Rom


noticias:NOTICIAS

11/8/08

11:31

Página 4

NOTICIAS

¡Ahora si! Apple denuncia a Psystar La esperada (y por algunos temida) reacción legal de la compañía de Cupertino se produce después de semanas de incertidumbre y desconcierto por su tardanza. Desde que los clones no autorizados de los Apple Mac fabricados por Psystar salieron a la luz[1] se esperaba algún tipo de reacción por parte de la compañía de Steve Jobs que, para asombro de la mayoría no se ha producido hasta ahora.

emula la EFI de una computadora Apple Mac, permitiendo instalar el sistema operativo desde el DVD original sin ninguna manipulación de por medio. No han trascendido detalles de la denuncia, solamente algunas filtraciones, y los sitios web de las dos compañías implicadas tampoco reflejan la situación. No obstante, puedo aventurarme a especular que la instalación del Mac OS X modificado pese a la inclusión en el paquete de compra de una licencia del Mac OS X original, vertebrará el caso. [1] http://www.imatica.org/bloges/2008/04/ 15048622008.html [2] http://www.psystar.com/ [3] http://blogs.zdnet.com/BTL/?p=9326 [4] http://arstechnica.com/news.ars/post/ 20080715-apple-finally-sues-unlicensedmacintosh-cloner-psystar.html [5] http://www.imatica.org/bloges/2008/06/ 190613672008.html

Intel presenta la plataforma Centrino 2 para máquinas portátiles

Dejando de lado la producción de un hardware compatible con el Mac OS X (algo técnicamente posible), Psystar[2] utiliza como medio de instalación en sus máquinas una copia hackeada del DVD de instalación de Apple, algo que según muchos viola a todas luces la licencia de uso del sistema operativo de la compañía de la manzana mordida. Según informan varios rotativos online como ZDNet[3] y Ars Technica[4], Apple habría presentado una querella contra Psystar el pasado 3 de Julio por infracción de derechos de propiedad intelectual y de copyright de imagen de marca. La demanda ha sido interpuesta en California, estado norteamericano que acoge la sede de Apple, mientras que la de Psystar se encuentra en Florida. Gracias a las imágenes de DVD hackeadas del Mac OS X que corren por Internet, muchos usuarios avanzados han podido construir a piezas máquinas compatibles con Mac OS X, aunque el funcionamiento del sistema operativo puede dar lugar a dudas, pues siempre se tratará de una versión manipulada que puede fallar en cualquier momento (pese a que un buen número de estos usuarios informan de instalaciones altamente estables en máquinas no Apple). Esta manipulación del sistema es un enfoque diferente al que ha utilizado EFiX[5], un sistema de hardware que consiste en un pequeño dispositivo que se conecta vía USB y que SOLO PROGRAMADORES nº 163

4

En una decidida apuesta por potenciar el segmento portátil, Intel ha presentado la nueva familia de chips para máquinas tanto empresariales como domésticas, dando a conocer sus planes de futuro inmediato sobre tecnologías móviles de aquí a finales de año. En el marco de un sector móvil cada vez más importante, la multinacional californiana ha dado a conocer la quinta generación de su plataforma de procesadores Centrino para computadoras portátiles. Bautizada como Centrino 2, la familia dispondrá inicialmente de cinco nuevos modelos de procesador Core2 Duo enfocados tanto al mercado profesional (familia vPro) como de consumo. Las mejoras de esta nueva generación con respecto a la inmediatamente anterior son generalizadas, incluyendo una gestión mejorada de la batería y un mayor ahorro de energía, además de soporte para el borrador de la tecnología de conexión sin hilos 802.11n (la nueva generación del WiFi, aún en proceso de aprobación).

En el apartado gráfico encontramos una nueva tecnología de conmutación que nos permite exprimir al máximo la potencia de la tarjeta gráfica cuando las aplicaciones lo requieran (por ejemplo en juegos 3D o cuando hagamos un renderizado), o consumir lo mínimo y necesario cuando queramos alargar la vida de la batería y estemos utilizando aplicaciones que no necesitan de un gran rendimiento gráfico (por ejemplo un procesador de textos o cualquier otra aplicación de escritorio). Intel aprovechó la ocasión para presentar el microprocesador Core2 Extreme de altas prestaciones, ideal para los amantes de los videojuegos o que necesiten de un alto poder de cálculo en movilidad, alcanzando una velocidad de 3.06 GHz. También presentó el chipset Mobile Intel 45 Express y la tecnología inalámbrica WiFi Link 5000, que ofrece teóricamente hasta cinco veces más velocidad y el doble de alcance respecto a la antigua tecnología 802.11a/g y m con una velocidad de hasta 450 Mbps. No obstante, el futuro a medio plazo de las comunicaciones inalámbricas pasa por el estándar WiMAX, para el cual Intel va a empezar a proporcionar más adelante en los Estados Unidos un módulo de conexión híbrido WiFi/WiMAX para portátiles. Pero esto es solo el principio de lo que promete ser una alud de presentaciones; la multinacional norteamericana ya ha avanzado que los próximos tres meses verán la luz ocho nuevos procesadores, incluyendo una pastilla que va a ser la primera del mercado para máquinas portátiles en incorporar cuatro núcleos. [1] http://www.intel.com/pressroom/archive/ releases/20080715comp_sm.htm?iid=pr1_rel easepri_20080715m_sm www.revistasprofesionales.com


noticias:NOTICIAS

11/8/08

11:31

Página 5

NOTICIAS

Microsoft adquiere la compañía especializada en búsquedas semánticas Powerset Con esta operación, la compañía de Redmond espera fortalecer su buscador Live frente a la competencia, especialmente Google y Yahoo!. Microsoft ha anunciado[1] la adquisición de Powerset[2], una compañía especializada en búsquedas semánticas. Cuando utilizamos un buscador de Internet como Google, Yahoo! o el Live.com de Microsoft, debemos expresar nuestros términos de búsqueda con palabras clave que aparecerán en los textos que nos devolverá como resultado la herramienta de búsqueda. Así, si queremos saber quien descubrió América, deberemos introducir un juego de palabras en la caja de texto del buscador como el siguiente: América, descubridor, 1492. En cambio, con la búsqueda semántica, la herramienta “entiende” lo que le está preguntando el usuario de forma natural, como si se lo preguntase a otra persona. De hecho, no es que el programa “entienda” realmente al internauta, ni que haya una persona "al otro lado" de la pantalla conectada al buscador para acometer nuestras búsquedas, simplemente es que el programa tiene la capacidad mediante una serie de algoritmos (lo que al fin y al cabo no dejan de ser puras matemáticas) de analizar la semántica de la frase (de ahí el nombre "búsqueda semántica") para traducir los términos a algo que los servidores de bases de datos puedan entender. Así, nuestra anterior búsqueda sobre el descubrimiento podría quedar en un ¿quién descubrió América?, que correctamente analizado por el software de la empresa que proporciona el servicio de búsqueda (como por ejemplo, qué tiempo verbal utiliza) se traducirá en una serie

www.revistasprofesionales.com

de términos entendibles por la computadora para buscar en la base de datos de páginas. Por el momento, el primer producto de Powerset puede ser disfrutado por los usuarios es la herramienta de búsqueda que integra la popular Wikipedia, aunque su adquisición por parte de la multinacional de Redmond hace poner en duda la continuidad de esta relación entre ambas entidades. Según lo anunciado por Microsoft[1], Powerset se integrará en Live.com, por lo que el buscador de la compañía de Steve Ballmer pronto contará con búsqueda semántica para sus usuarios.

¿Matando dos pájaros de un tiro? La integración de esta capacidad en el motor de búsqueda de la compañía de Redmond puede obedecer a dos razones básicas, tres si contamos el mero hecho de mejorar su producto: por una parte, se ofrece un atractivo más a los accionistas de Yahoo!, que pueden ver cómo la herramienta de búsquedas online de Microsoft crece, se amplía y madura, pudiendo situarse como digna competidora del motor de búsqueda de Google. Por otra parte, y si las negociaciones y los intentos de adquisición de Yahoo! acabasen fracasando totalmente, Microsoft va a disponer de una arma para intentar plantarle cara a Google ella sola. [1] http://blogs.msdn.com/livesearch/archive/ 2008/07/01/powerset-joins-live-search.aspx [2] http://www.powerset.com/

Nintendo promete revolucionar aún más la Wii con un nuevo dispositivo Permite un movimiento 1:1 de forma que lo que hacemos en nuestro mundo físico se traslada tal cual al videojuego, y ha sido presentado en sociedad en el certamen E3 de Los Angeles, uno de los principales en el mundo de los videojuegos. Espoleada por el gran éxito que está teniendo la Wii entre los usuarios y que ha permitido a la compañía nipona volver a la "pole position" de la carrera de los videojuegos, Nintendo ha presentado en el marco del E3[1] un nuevo accesorio que promete revolucionar aún más a los jugadores habituales gracias al mando inalámbrico de la compañía que es, precisamente, lo que ha causado furor de esta videoconsola. Y es que la potencia gráfica y de procesamiento de la máquina dejan que desear frente a gigantes cómo la Xbox360 de Microsoft o la PS3 de Sony, mucho mejores en este aspecto, pero lo que de verdad ha cautivado a las masas de usuarios ha sido el mando de juego, sin hilos y que permite introducirse realmente en el desarrollo del videojuego. Así, en un

juego de tenis, el mando se toma y utiliza como si fuera la raqueta, mientras que para el Mario Kart existe un pequeño aparato que permite utilizarlo como si fuera el volante de un coche. El nuevo dispositivo presentado y que recibe el nombre de Wii MotionPlus[2] se acopla al mando de la Wii y refina la capacidad de los sensores, transmitiendo el movimiento al juego en una relación 1:1. esto significa que si movemos nuestro brazo medio metro hacia adelante, nuestro personaje en el juego moverá su brazo medio metro hacia adelante. Por el momento, la multinacional japonesa no ha desvelado más detalles técnicos, el precio o cómo será su distribución, pero sin lugar a dudas esto va a agradar y mucho a los actuales usuarios de esta innovadora videoconsola. [1] http://www.e3expo.com/ [2] http://www.nintendo.com/whatsnew/detail/ eMMuRj_N6vntHPDycCJAKWhEO9zBvyPH

Yahoo! rechaza nueva propuesta de adquisición parcial de Microsoft En esta ocasión, la compañía de Redmond iba de la mano del financiero Carl Icahn, poseedor de un paquete de acciones de la compañía del buscador y que aboga decididamente por la venta a Microsoft, a favor de la que está luchando activamente contra la opinión de la directiva. Pese al silencio que Microsoft y Carl Icahn han mantenido al respecto, Yahoo! ha hecho público un comunicado[1] indicando que había rechazado una nueva oferta, hecha conjuntamente por Microsoft y Carl Icahn. El financiero de Nueva York ya había negociado con la compañía de Steve Ballmer en el pasado[2], y Microsoft parece darle un apoyo muy poco encubierto para que éste a su vez pueda desbancar a la actual cúpula directiva del gigante de Internet en la próxima junta general de accionistas. La substitución de Jerry Yang y compañía por un equipo escogido por Carl Icahn haría que la venta -total o parcial- de

5

SOLO PROGRAMADORES nº 163


noticias:NOTICIAS

11/8/08

11:31

Página 6

NOTICIAS

Yahoo! a Microsoft se negociara con una actitud más proclive a la compañía de Redmond. Los términos exactos de la oferta conjunta Icahn-Microsoft no han sido revelados, pero lo que sí se sabe por la nota de Yahoo! es que consistía en adquirir solamente la unidad de búsquedas de la compañía de Internet, separándola del resto del negocio. Sería, probablemente variando solamente los términos económicos, la misma oferta que Microsoft ya hizo anteriormente. A ella Yahoo! se opone, aludiendo que sin la unidad de búsquedas, su modelo de negocio queda incompleto. No obstante, la compañía pionera en Internet se muestra abierta a estudiar una oferta de adquisición global, siempre y cuando ésta sea a un precio que estime adecuado, los 33 dólares por acción que pidió ya hace un tiempo y que Microsoft consideró excesivos. Yahoo! da una serie de argumentos en contra de la operación propuesta, como por ejemplo que su actual volumen de negocio sumado al acuerdo firmado recientemente con Google en el campo publicitario tienen mayor valor que la oferta presentada por Microsoft e Icahn. En la nota de Yahoo![1] también se da un "repaso" a Carl Icahn, acusándole por boca de Roy Bostock, presidente de Yahoo!, de desconocer el funcionamiento de la compañía o de minusvalorarla. En la junta general de accionistas de Yahoo!, se prevé un duro enfrentamiento entre la actual directiva encabezada por Jerry Yang y aquellos que pretenden forzar la venta total o parcial a Microsoft, encabezados por Carl Icahn, quien cuenta con el apoyo y beneplácito no explícito (aunque muy claro) de la compañía de Redmond. [1] http://yhoo.client.shareholder.com/press/ releasedetail.cfm?ReleaseID=321697 [2] http://www.microsoft.com/presspass/press/ 2008/jul08/07-07statement.mspx

Éxito total del nuevo iPod 3G Apple anuncia que ha vendido en todo el mundo un millón de ejemplares del nuevo teléfono solamente en el primer fin de semana de su salida al mercado. A estas alturas, pocos dudan del fenómeno de masas que ha supuesto el iPhone de Apple, y poco se puede añadir al tema. El nuevo iPhone 3G parece haber llegado para hacer lo impensable: batir las marcas del primer iPhone dejando el listón más alto si cabe. Y es que si el anterior modelo tardó 74 días en llegar a la marca del millón de ejemplares vendidos[1], el nuevo iPhone 3G solamente ha tardado un fin de semana[2] en llegar a esta mágica cifra. Claro que el primer iPhone se presentó inicialmente sólo en los Estados SOLO PROGRAMADORES nº 163

6

Un escritorio Windows de 360 grados

Unidos, mientras que este nuevo modelo ha estado desde su lanzamiento disponible en más de 20 países como España, México, Reino Unido, Japón o Australia además de en los Estados Unidos. Un mayor número de compradores potenciales que le da una ventaja frente al anterior modelo. El nuevo iPhone habrá seducido sin lugar a dudas a muchos nuevos clientes, pero tampoco dudamos que buena parte de sus usuarios actuales se han decantado por actualizar su iPhone en cuanto ha salido el nuevo a la venta. En algunos países como España, el hecho de que el terminal de Apple se haya hecho esperar (aunque los más impacientes han logrado conseguirlo gracias a la “importación paralela”) también ha generado un deseo mayor entre el público, acrecentado por los elogios y las críticas favorables de la mayor parte de la prensa especializada. Frente a la anterior generación de iPhone, el nuevo modelo cuenta con compatibilidad 3G, GPS integrado, y la versión 2.0 del firmware que incluye compatibilidad con Microsoft Exchange ActiveSync y la capacidad de ejecutar las más de 800 aplicaciones de terceras partes ya disponibles en la nueva App Store. Y precisamente la App Store[3] tampoco es ajena a este éxito: desde su estreno, los usuarios han descargado hasta 10 millones de aplicaciones del repositorio en línea de Apple para el iPhone y el iPod Touch*. Actualmente encontramos unos 800 programas en este servicio, de los cuales una cuarta parte se ofrece gratuitamente. * En este caso, el usuario debe adquirir la actualización a la versión 2.0 del firmware del aparato. [1] http://www.apple.com/pr/library/2007/09/ 10iphone.html [2] http://www.apple.com/pr/library/2008/07/ 14iphone.html [3] http://www.apple.com/iphone/appstore/

360desktop[1] nos permite unir los extremos de un escritorio Windows alargado, creando la ilusión de trabajar en un entorno circular. Algunos se contentan con el escritorio que tienen; otros montan un sistema con dos o tres monitores y un tercer grupo utiliza un software que permite al sistema operativo de Microsoft emular a los sistemas Unix y disponer de varios escritorios virtuales. Pero 360desktop hace algo diferente: nos propone un escritorio que nos envuelve completamente. Este software[1] no necesita de un monitor o una tarjeta gráfica especiales. No es que el escritorio resultante nos envuelva de una forma física, sino virtual. De hecho, no es nada más que un truco consistente en "alargar" virtualmente el escritorio de Windows a una longitud tal que juntando los dos extremos tengamos un espacio delimitado por una circunferencia. Esto quiere decir que el escritorio puede tener una representación en 360 grados.

Los usuarios que aprecian este tipo de herramientas son aquellos que deben trabajar con un gran número de aplicaciones simultáneamente o bien con aplicaciones que disponen de un gran número de paletas de herramientas para trabajar sobre un documento. En este caso, todo el espacio (ni que sea virtual) es poco para mantener en sitios diferentes sobre el escritorio todo aquello que necesitamos. De hecho, lo que hace 360desktop es situar varios escritorios virtuales "pegados" uno al lado del otro, con los que se sitúan a los extremos también unidos. De esta forma, el escritorio virtual da sensación de continuidad, de formar un círculo. 360desktop es un software gratuito que se financia a través de la publicidad generada con temas creados por terceras partes para el escritorio y que incluyen elementos como por ejemplo fondos de pantalla de 360 grados o widgets personalizados. La descarga puede ser llevada a cabo desde el mismo sitio web del programa[1]. El principal atractivo de los temas de escritorio para este software es la posibilidad de añawww.revistasprofesionales.com


noticias:NOTICIAS

11/8/08

11:31

Página 7

NOTICIAS

dir contenido interactivo de forma que, por ejemplo, podamos integrar la reproducción de una película DivX en el fondo de nuestro escritorio o en una sección de él. [1] http://www.360desktop.com/

Lively, la respuesta de Google a Second Life Funciona utilizando una metáfora de "habitaciones" que, además, pueden empotrarse en una página web para ofrecer un chat 3D a los internautas que la visiten. Los entornos en tres dimensiones para interrelacionarse a través de Internet están de moda. Primero fueron los juegos online, pero después llegó Second Life y demostró que además del juego, este tipo de entornos también pueden tener un enfoque serio. Second Life desató una auténtica fiebre gracias no solamente a sus grandes posibilidades técnicas, sino también al hecho de que la propiedad intelectual de todo lo creado en el mundo virtual queda en manos de sus creadores con excepción del entorno en si mismo, que ha sido creado y es mantenido por la compañía Linden Labs que, como es obvio, necesita generar ingresos para seguir manteniendo dicho mundo. Las grandes compañías buscaron en seguida contar con presencia en Second Life, y algunas del sector informático estudiaron la posibilidad de establecer además sus propios entornos de interacción 3D* como fue el caso de Sun Microsystems con Wonderland[1], una aproximación al concepto de entorno diseñado y creado por Linden Labs pero orientado a los negocios. Ahora es Google quien con Lively[2] busca también hacer la competencia a Second Life. Cabe decir que la propuesta de Google parece menos elaborada a nivel gráfico y de funcionalidades que la de Linden Labs, al menos por lo que he podido ver en un breve testeo. No veo la posibilidad de construir objetos, solamente de administrar la vista que tenemos del sitio en el que estamos. Por el momento, Lively se encuentra disponible como cliente independiente para Windows XP/Vista utilizando los navegadores Internet Explorer o Firefox, ya que el entorno se ejecuta dentro de la ventana del navegador pese a que podemos separarlo de ésta a una ventana independiente. La metáfora de uso del entorno es similar a la de Second Life: si en este entorno tenemos islas a las que podemos ir accediendo, el entorno de Lively se ordena en habitaciones (rooms en inglés) temáticas. Una desventaja es que para acceder de una isla a otra tendremos que abrir una nueva ventana, contando con que podemos tener dos accesos simultáneos por lo que he podido ver. El entorno de Lively se me antoja aún bastante desierto, pese a que los usuarios interesados www.revistasprofesionales.com

disponen de un buen número de "habitaciones" con temas tan dispares como "odio a los Ewoks" (unos famosos personajes de la saga de películas "La Guerra de las Galaxias"), "Fashion" (moda), "Western" (el mítico "Far West" americano) o con temática para adultos... La descarga y uso de Lively son gratuitos, como en tantos otros productos de la compañía del buscador. Y también como en tantos otros, es posible "empotrar" una habitación de Lively en nuestro sitio web, de forma que podemos crear una suerte de chat 3D para los internautas que recalen en nuestro website. Además, en una habitación de Lively pueden reproducirse vídeos de YouTube, ver fotografías o incluso ejecutar gádgets de Google que también podemos utilizar en el escritorio de nuestra computadora. * los tipifico cómo 3D y no como realidad virtual ya que el concepto de esta última tecnología es que sea inmersiva, es decir, que el usuario solamente vea esa realidad simulada que "substituye" a todo el resto de cosas, además de poder interaccionar con ella. Si bien en los entornos como Second Life podemos interactuar con el medio, no es totalmente inmersiva ya que accedemos a ella mediante nuestra computadora, teniendo aún bien presente la "realidad real". [1] https://lg3d-wonderland.dev.java.net/ [2] http://www.lively.com/

LiveDVD de Linux permite jugar sin tener que configurar el ordenador Gracias a la tecnología que permite crear CD's y DVD's de GNU/Linux que se autoejecutan sin tener que instalar el sistema a disco duro, podemos disfrutar de una gran colección de videojuegos que no nos obligarán a tener que configurar nuestra máquina para obtener el máximo rendimiento de la tarjeta gráfica y otros periféricos. Uno de los aspectos menos conocidos del sistema operativo creado por Linus Torvalds es el de los juegos, que no quiere decir que no dispongamos de una gran cantidad de ellos, ya sean comerciales (incluso un gran éxito cómo Quake 3 Arena) o libres. La mayoría de las distribuciones incluyen algún juego tipo solitario o buscaminas, como en Windows, y un clon libre de Civilization que ha llegado a ser muy popular (FreeCiv). Pero la propuesta de live.linuXgamers.net[1] es diferente y se resume en el eslogan "boot 'n play" (arranca y juega). Este proyecto nació de forma casual, como demostración para una feria o evento de que en Linux también se puede jugar y con una mayor facilidad gracias a la tecnología que permite ejecutar el sistema directamente desde en CD o DVD en formato Live, por lo que no deberemos preocuparnos por instalar a disco y configurar el sistema. Inicialmente, los participantes se

dividieron en dos grupos: uno que buscaba una distribución Live existente en la que basarse para añadirle juegos, y otro que se dedicaba a la creación de una nueva distro Live partiendo de cero. Finalmente, el primer grupo cerró las puertas al considerar que ninguna de las distribuciones probadas era apta para la tarea que querían llevar a cabo, pero el segundo grupo sí consiguió llegar a buen puerto basándose en archELinux, una variante del proyecto ArchLinux. Finalmente, el "invento" tuvo tanto éxito que se decidió que lo que estaba llamado a ser flor de un día continuase como proyecto. Algunos de los juegos que se incluyen en la última versión lanzada -la 0.93- de live.linuXgamers.net[1] son:  OpenArena: una especie de clon libre de Quake III Arena, con los mismos modos de juego y un aspecto gráfico parecido.  Boswars: juego de estrategia en tiempo real ambientado en el futuro y con unos gráficos bastante buenos.  Vegastrike: aventuras espaciales en un universo lleno de facciones enfrentadas y en el que podremos ir avanzando en las diversas misiones propuestas, obteniendo ganancias y financiando con ellas las ampliaciones de nuestra nave.  BzFlag: batallas de tanques online con el objetivo de capturar una bandera. Un juego muy popular en los ambientes de software libre.  Glest: juego de estrategia en tiempo real ambientado en una edad antigua mítica, en la que tecnología y magia se mezclan. Los requisitos mínimos de hardware para arrancar y utilizar el Live DVD y los distintos juegos que disponemos en él consisten en un PC x86 con 512 MB. de RAM y tarjeta gráfica con aceleración 3D. A partir de aquí, y según el videojuego que queramos ejecutar, varía ligeramente la configuración óptima de la máquina. Para sacar el máximo partido a las tarjetas gráficas NVIDIA y ATI, las preferidas de los jugones y las que ofrecen mayor rendimiento, live.linuXgamers.net incluye los drivers propietarios para ambas familias aunque no preinstalados, por lo que deberá ser el mismo usuario quien los instale. Esto, según los mismos responsables de la distribución, es un proceso muy simple. El estado de los diferentes juegos (las partidas) puede ser salvado a una memoria USB, por lo que podremos jugar las partidas que queramos sin tener que reiniciarlas otra vez al rearrancar la máquina. También cabe señalar que en el DVD solamente se incluyen juegos, sin ninguna otra utilidad de productividad habitual en cualquier distribución GNU/Linux como pueden ser una suite ofimática o un programa para grabar CD's y DVD's. live.linuX-gamers.net está concebido única y exclusivamente para jugar. [1] http://live.linux-gamers.net/ 7

SOLO PROGRAMADORES nº 163


noticias:NOTICIAS

11/8/08

11:32

Página 8

NOTICIAS

Los grupos del Parlamento Europeo a favor de un paquete de medidas para controlar más los contenidos de Internet La aprobación definitiva deberá ser realizada por el Parlamento Europeo en sesión plenaria este Septiembre. Los movimientos de defensa de la libertad en la Red ya se están movilizando para mostrar su protesta y rechazo ante las enmiendas aprobadas. Popularmente se las conoce cómo "enmiendas-torpedo" por considerar que torpedean de una forma metafórica las bases libertarias que han sentado la actual Internet, y constituyen una serie de añadidos en forma legal de enmienda a la Directiva Europea sobre Telecomunicaciones que dejan un margen de actuación a los gobiernos de los distintos países miembros para que regulen ciertos aspectos de los protocolos de comunicaciones o software utilizado, y de los contenidos publicados. Algunos de estos gobiernos, como el de Francia o el de Estonia, son partidarios de controlar más estrictamente lo que se publica en la Red por diferentes motivos. Por el momento, todos los grupos que integran las comisiones de la Unión Europea relacionadas directamente o vinculadas de alguna forma con el sector TIC se han manifestado partidarios de aceptar las enmiendas propuestas, lo que deberá ser ratificado por el Parlamento Europeo a la vuelta del parón veraniego en el que entramos. Las enmiendas propuestas son:  Enmienda H1: permitir a los gobiernos establecer restricciones para evitar el contenido ilícito en Internet, dejando también libertad para tomar decisiones sobre la calidad del servicio.  Enmienda H2: prevé la creación de mecanismos de cooperación entre los proveedores de servicios de Internet (ISP's) y los productores de contenidos.  Enmienda H3: mediante esta propuesta, los proveedores de servicio quedarán obligados a controlar las actividades de los internautas y a advertirles por correo electrónico de las posibles actividades ilícitas que llevan a cabo. Desde FFII (Foundation for a Free Information Infrastructure), una organización sin ánimo de lucro dedicada al establecimiento de un mercado de telecomunicaciones libre, se han criticado duramente[1] estas enmiendas, afirmando que el resultado de su aprobación definitiva sería una "Internet soviética", refiriéndose al férreo control que en la antigua Unión Soviética poseía el estado sobre cualquier aspecto de la vida cotidiana. Lo cierto es que esta es una regulación marco, y que deberá ser completada por cada uno de los estados, siendo adecuada a sus propias SOLO PROGRAMADORES nº 163

8

legislaciones, pero con las enmiendas propuestas queda más cerrada que antes. Aún queda todo el periodo veraniego por delante antes de que el Parlamento Europeo vuelva a reunirse para discutir sobre las enmiendas aprobadas por los grupos, un periodo que va a ser aprovechado por las organizaciones que se oponen a estas medidas para organizar campañas ciudadanas de presión que consigan dar la vuelta a la postura de los diferentes grupos del Parlamento. [1] http://press.ffii.org/Press_releases/European_Parliament_rushes_towards_Soviet_Internet

Primera alpha de Ubuntu 8.10 La adopción de las últimas novedades implantadas en Debian junto a un instalador para medios USB y Compiz Fusion 0.8, las novedades más destacables de una versión de desarrollo que ya está lista para ser descargada y probada. Canonical ha empezado ya a construir el camino que llevará a la publicación este próximo Octubre de la siguiente versión mayor de Ubuntu, cuyo numeral es el 8.10 y el nombre propio Intrepid Ibex, correspondiendo como siempre a un animal[1] africano. La novedad más destacable es la importación de novedades desde el proyecto Debian. No olvidemos que esta última es el "alma mater" de Ubuntu, la distribución en la que se han basado los programadores de Canonical para crear su producto y que, de cuando en cuando, hay que volver "al nido" para reunir ambos proyectos y que Ubuntu pueda nutrirse de las novedades de Debian.



Disminución del tiempo que se tarda entre validar el nombre de usuario y contraseña hasta disponer ante nosotros de un escritorio utilizable  Posible introducción de una imagen de DVD  Ligeros retoques al sistema de gestión de permisos PolicyKit que tan buenas críticas ha despertado en la versión anterior de la distro  Posibilidad de encriptar el directorio home de cada usuario  Simplificación de los menús del sistema  Inclusión de Compiz Fusion 0.8, versión del compositor avanzado de ventanas que estará lista a lo largo de los próximos seis meses  En la versión servidora del sistema se incluyen ClamAV como antivirus y SpamAssassin como software anti-spammer Cabe recordar que por el momento, esta alpha 1 es una versión muy temprana del sistema, por lo que estas y otras especificaciones pueden aún variar en gran medida. Esta primera alpha de Ubuntu 8.10 "Intrepid Ibex" ya se encuentra disponible para descarga[2] en los servidores de Canonical, aunque al ser una versión de desarrollo previa al lanzamiento de la definitiva, se desaconseja encarecidamente su instalación en entornos de producción. Además de descargar la imagen de CD para instalación alternativa (el Live CD y el instalador gráfico se esperan para la alpha 2), también podemos actualizarnos a esta versión a través de la línea de comandos con la instrucción "update-manager -d". [1] http://en.wikipedia.org/wiki/Ibex [2] http://www.ubuntu.com/testing/intrepid/ alpha1 [3] https://blueprints.launchpad.net/ubuntu/ intrepid

Adobe facilita la indexación del contenido de las animaciones Flash

No han trascendido más novedades de forma oficial, aunque si echamos un vistazo a la lista de actualización de paquetes[3] podemos extrapolar que algunas de las futuras incorporaciones a Ubuntu 8.10 serán:  Soporte mejorado para máquinas virtuales  Mayor soporte para computadoras portátiles y dispositivos para conexión 3G  Mejora en la descarga e instalación de los plug-ins de Flash (tanto la versión libre como la comercial de Adobe), y en el funcionamiento de estos en el navegador web  Inclusión de una utilidad para la creación de imágenes de instalación a través de dispositivos USB

Google se erige como el primer motor de búsqueda que aprovecha los recientes desarrollos de la compañía creadora del formato de animaciones y aplicaciones RIA más popular actualmente, permitiendo que a partir de ahora el famoso buscador indexe correctamente los textos presentes en las animaciones Flash. Tradicionalmente, los sitios web realizados íntegramente en Flash se han dejado solamente para contenidos muy específicos como juegos online y, normalmente, la página que contenía las animaciones Flash tenía además otros elementos en HTML "normal" o en otras tecnologías similares. El motivo es simple: al ser Flash un formato binario, su indexación y posterior búsqueda en las herramientas como Google, Yahoo! o Windows Live Search es muy dificultosa. www.revistasprofesionales.com


noticias:NOTICIAS

11/8/08

11:32

Página 9

NOTICIAS

No obstante, es comprensible el interés de Adobe por facilitar este uso de los contenidos Flash por parte de los motores de búsqueda dada su popularidad y uso, ya que muchos diseñadores de sitios web simplemente se niegan a utilizar su formato de animación, y otro tanto pasa con los expertos en posicionamiento, que ven muchas dificultades en posicionar adecuadamente un sitio realizado a base de Flash. Es por ello que Adobe ha estado trabajando codo con codo con los principales jugadores del mercado de las búsquedas para permitir que el formato Flash sea más amigable a las herramientas de indexación, y ha anunciado[1] la consecución de este hito tan esperado entre la comunidad de programadores y diseñadores. La idea de Adobe, que ha trabajado con Google y Yahoo!, es la de automatizar al máximo la indexación de los contenidos existentes en Flash sin obligar a los diseñadores a cambiar todo lo que ya estaba hecho. El primero en incorporar esta tecnología a su motor de búsqueda será Google[2], que ya lo ha anunciado[3] al mundo. El contenido de las animaciones Flash que va a ver mejorada su indexación será el textual, como por ejemplo las palabras que constan en los botones de sitios web que han sido hechos en Flash. En general, cualquier texto que los usuarios vean en una animación Flash va a ser indexado correctamente por Google a partir de ahora. Las direcciones de sitios web que constan en forma de enlace dentro de las animaciones Flash también serán exploradas e indexadas por los motores de búsqueda. Lo único que por el momento quedará fuera del alcance de los crawlers, los robots de búsqueda e indexación de las principales empresas, son las imágenes y las animaciones. Google, por ejemplo, no incluirá las imágenes presentes en un fichero Flash en su sección de búsqueda de imágenes, ni las animaciones en su sección de vídeos junto a los contenidos de YouTube o de Google Video. www.revistasprofesionales.com

Esto ha podido ser llevado a cabo gracias a las facilidades[4] que Adobe ha ofrecido en forma de librerías a los desarrolladores de motores de búsqueda para que estos programas puedan "entender" el contenido que se les da en un fichero Flash. No quiero finalizar sin recordar nuevamente a los desarrolladores que estén leyendo esta noticia que no están obligados a modificar los contenidos que hayan desarrollado en Flash para facilitar la tarea de los robots indexadores, sino que estos ya han "aprendido" cómo están construidos los ficheros Flash por dentro para poder indexarlos. Es de suponer que un próximo paso de esta iniciativa podría apuntar hacia lo que ha quedado pendiente por esta vez, es decir, las imágenes y las animaciones. [1] http://www.adobe.com/aboutadobe/press room/pressreleases/200806/070108AdobeRic hMediaSearch.html [2] http://googleblog.blogspot.com/2008/06/ google-learns-to-crawl-flash.html [3] http://googlewebmastercentral.blogspot. com/2008/06/improved-flash-indexing.html [4] http://www.adobe.com/devnet/flashplayer/ articles/swf_searchability.html

Windows XP llega al final de su ciclo de vida El histórico sistema operativo lanzado en 2001 por la compañía de Redmond ha visto prorrogado varias veces su final a petición popular, pero esta vez sí, Microsoft ya ha dejado de venderlo pese a que aún mantendrá su soporte técnico. No obstante, los principales integradores ya han encontrado alguna argucia para continuar suministrándolo a sus clientes. A partir de este pasado 30 de Junio ya no tenemos posibilidad oficialmente reconocida por Microsoft de comprar una copia de Windows XP, ya sea preinstalada en una computadora, o bien en una caja OEM para instalación. Las campanas ya venían doblando por el veterano sistema operativo de Microsoft desde hacía tiempo, aunque el relativo fracaso comercial de Vista (gran éxito de ventas en máquinas preinstaladas, pero al que los usuarios de XP no están migrando masivamente) unido a las críticas que

este último ha despertado, han postergado la jubilación de Windows XP varias veces. El empeño de usuarios, vendedores e integradores/fabricantes por continuar adquiriendo dicho sistema también ha sido otro de los factores que han disuadido varias veces a Microsoft y han retrasado el momento final hasta hoy. No obstante, e incluso después de que la compañía de Steve Ballmer ya haya anunciado el finiquitado de la disponibilidad comercial de Windows XP, casi todos los grandes fabricantes e integradores, continúan ofreciendo la posibilidad de adquirir máquinas con este sistema operativo preinstalado, aprovechando las opciones del llamado "downgrade", mediante el cual y adquiriendo una versión superior del sistema (en este caso, Vista), puede instalarse una versión anterior. Es por ejemplo el caso de Lenovo[1], que permite aún adquirir equipos con Windows XP preinstalado pese a que la licencia sea de Windows Vista. Que no se pueda adquirir en las tiendas no significa que se haya quedado sin soporte técnico. Los usuarios podrán seguir disfrutando de este soporte hasta el 8 de Abril del 2014, aunque se considera que a partir de Abril del año que viene, Windows XP estará en periodo de "Soporte Extendido". Windows XP fue lanzado el 25 de Octubre de 2001 como el sucesor a Windows 2000 y ME (Millenium Edition) que unificaba las ramas profesional y doméstica del sistema operativo de Microsoft en una sola línea y que "mataba" definitivamente la tecnología de 16 bits que continuaba existiendo en Windows ME como remanente del antiguo MS-DOS que había sobrevivido en Windows 95, además de unificar el núcleo del sistema en la rama NT. Pese a un inicio de ventas no muy espectacular, a partir del lanzamiento del Service Pack 1 en Septiembre de 2002 ganó en estabilidad y seguridad, dos de los puntos más criticados del sistema, ganando también con ello una mayor confianza de los usuarios y despegando como el sistema operativo más utilizado en el mundo. La última actualización ha venido con el tercer Service Pack, lanzado este pasado Abril. Entre ambos, queda un Service Pack 2 que finiquitó muchas de las críticas que se habían lanzado entonces contra el sistema, y un reguero de agujeros de seguridad que lo han hecho blanco de numerosas polémicas a lo largo de su dilatada vida. [1] http://partner.lenovo.co.uk/lpn_mcw.nsf/ 0/2DED6F64E72348288025746E003CBFB7?o pen&lang=ES&cntry=ES

Estadísticas muestran cómo los sistemas operativos se reparten el pastel Lo más destacado es la subida de Windows Vista en un porcentaje casi idéntico al que baja Windows XP durante el último año, el especta9

SOLO PROGRAMADORES nº 163


noticias:NOTICIAS

11/8/08

11:32

Página 10

NOTICIAS

cular aumento de Apple y un Linux que pese a seguir siendo minoritario, casi duplica su presencia en el mercado. Los presentes resultados se basan en el estudio[1] continuado que lleva a cabo Net Applications en su servicio Global Market Share Statistics, con recogidas de datos constantes a través de Internet y que monitoriza varios aspectos como los sistemas operativos más utilizados, el navegador web, o los buscadores de Internet. Evidentemente, la plataforma más utilizada es la de Microsoft, que entre tres versiones de Windows copa el 89,95% de todas las computadoras de escritorio del mundo. Respecto a la misma situación de mercado pero hace un año, debe destacarse que si bien Microsoft baja, tampoco lo hace mucho: en Agosto de 2007 disfrutaba de una posición dominante con las diferentes versiones de Windows instaladas en el 90,81% de todas las desktop, lo que representa un descenso de menos de un punto porcentual del total. Dentro del mismo segmento de Microsoft, nos encontramos con que Windows XP desciende aproximadamente nueve puntos porcentuales, y las instalaciones del ya obsoleto Windows 2000 también bajan, pasando del 3,68% del total al 2,11%. Si unimos ambas diferencias da aproximadamente los mismos puntos porcentuales que sube Windows Vista, que pasa del 6,29% del mercado al 16,14%, un crecimiento probable y seguramente inferior al que Microsoft esperaba y deseaba. Las máquinas Mac OS sobre plataforma PowerPC experimentan un ligero descenso, del 3,35% al 2,69%, y las que sí suben cómo la espuma son las nuevas Macintosh basadas en procesadores Intel, en las cuales además del Mac OS X puede ejecutarse también el Windows de Microsoft: pasan del 2,83% de Agosto del 2007 al 5,25% de este pasado Junio. Casi duplicando su cuota de mercado, es sin lugar a dudas el sistema operativo que experimenta una mayor subida en términos de puntos porcentuales totales. GNU/Linux también obtiene un buen resultado pese a que se queda en un 0,80% del total de los escritorios del mundo. No obstante, cabe señalar que hace un año solamente detentaba un 0,47% del total. Entre el grupo restante de sistemas operativos (un 1,81% del total frente al 2,54 de hace un año) podemos contar a versiones antiguas de Windows como las 95, 98, NT 4 o ME, sistemas BSD como FreeBSD, PC-BSD u OpenBSD, Unix como Solaris/OpenSolaris y plataformas alternativas como eCommStation, QNX o los diferentes "sabores" de BeOS. Algunas conclusiones interesantes son que, pese a las alegrías de la comunidad del software libre y los "maqueros" por el descenso continuado de Windows, este se hace de forma muy lenta, detentando aún el sistema de Microsoft nueve SOLO PROGRAMADORES nº 163

10

de cada diez computadoras de escritorio que hay en el mundo. No obstante, lo que supone una ligera bajada para Microsoft supone una gran subida para los principales "outsiders" de la compañía de Redmond, Apple y Linux. También podemos ver cómo los sistemas operativos "alternativos" ven cada día más limitado su mercado, engullidos probablemente por un Linux y un Mac OS que no paran de crecer. [1] http://marketshare.hitslink.com/report. aspx?qprid=11

La ICANN estudia liberalizar el sistema de sufijos de dominio Con una serie de medidas de control que eviten las malas prácticas y la ciberocupación de dominios, cualquier empresa u organización podrá proponer la utilización de un sufijo de dominio propio. La ICANN (Internet Corporation for Assigned Names and Numbers), entidad que gestiona varios aspectos del funcionamiento de Internet como los sufijos de dominio, ha celebrado estos últimos días en París su 32 reunión, en la cual se han tomado importantes decisiones. Una de ellas, precisamente, alude a los sufijos de dominio antes mencionados. Estos elementos constituyen un núcleo cerrado, que no supera la trentena, y que podemos ver como la última parte de cada dirección web. Por ejemplo, en la dirección www.imatica.org, el sufijo de dominio sería la última parte, el .org . Existen dos tipos de sufijo de dominio, el nacional (correspondiente a los países reconocidos internacionalmente, como el .es para España o el .fr para Francia) y el genérico o top-level domain en inglés, que son dominios que pueden ser adquiridos y utilizados en cualquier parte del mundo. Inicialmente era un grupo muy reducido de sufijos: .com, .org o .net eran los más populares y que posteriormente aumentaron hasta el número actual. No obstante, estos sufijos han sido siempre directamente controlados por la ICANN, que ha decidido en cada momento (aunque mediante un proceso de propuestas abiertas y votaciones por parte de su consejo) cómo se ampliaban dichos dominios. Pero la reunión de París ha finalizado con una resolución[1] inesperada e interesante: la aprobación de la propuesta para estudiar la completa liberalización del sistema de sufijos de dominios a corto/medio plazo. Esta liberalización rompería con el monopolio de la ICANN en la decisión sobre cuáles deben ser los únicos sufijos de dominio utilizables, y dejaría en manos de los usuarios finales la posibilidad de solicitar el sufijo que deseen para su dominio. A pesar de todo, esta admisión dependerá de los términos exactos de los que conste la posibilidad de proponer un sufijo de dominio y que este sea aprobado, contratado y utilizado. Se ha

apuntado a que las propuestas deberán ser enviadas a la ICANN por los grupos de interés que quieran promoverlo para su estudio y aprobación. Así, la ICANN podría evitar que sufijos cómo el .xxx propuesto por la poderosa industria de la pornografía y cuya aprobación ha sido impedida por la organización varias veces, puedan ser utilizados. En definitiva, liberalización sí, pero con cierto control. Además, el órgano que decida la aprobación de los nuevos sufijos también estará sujeto a un código deontológico y/o moral que prohibirá el uso de expresiones obscenas u otros, estando aún por definir. También habrá mecanismos de control ante la posibilidad de la ciberocupación: es decir, una persona contrata un dominio con un sufijo conocido para luego pedir una cantidad de dinero al poseedor de la marca registrada a cambio de devolvérselo. Para evitar estas prácticas abusivas existirá un periodo abierto de objeciones, similar al mecanismo empleado con los registros de marcas. Por el momento se ha fijado principios del 2009 como el periodo para poner en marcha las pruebas piloto de estos nuevos sufijos liberalizados. Las primeras críticas a favor y en contra ya se han dejado oír en Internet mediante opiniones de profesionales del sector y usuarios, algo a lo que estoy seguro la ICANN estará muy atenta las próximas semanas para recoger el "feedback" y ver cómo reacciona la comunidad internauta. No olvidemos que por el momento nos encontramos tan solo con una proposición que puede tirar adelante o no. [1] http://www.icann.org/en/announcements/ announcement-4-26jun08-en.htm

Xandros adquiere Linspire Fue el ex-CEO de Linspire, Kevin Carmony, quien reveló la operación unos días antes de que se hiciera oficial. De forma totalmente sorprendente y antes de que fuera anunciado oficialmente, ha saltado a las portadas de los principales medios especializados la noticia de que Xandros, empresa dedicada a la producción de distribuciones Linux de pago para escritorios y servidores y proyectos a medida como el sistema operativo del Asus Eee PC, adquirirá a Linspire, compañía también del mundo Linux, productora de una distribución de pago y mecenas del proyecto Freespire, una versión gratuita de su producto. Ha sido el anterior CEO de Linspire, Kevin Carmony[3], quien no sin una manifiesta acritud contra la actual dirección de la compañía, el que

www.revistasprofesionales.com


noticias:NOTICIAS

11/8/08

11:32

Página 11

NOTICIAS

ha desvelado la noticia[1] un par de días antes de que se produjera la publicación de la nota de prensa oficial[2] anunciándolo, lo que llevó a Linspire y Xandros a admitirlo extraoficialmente. En un post de su blog titulado "Xandros adquiere los activos de Linspire en una venta secreta", Carmony se quejaba de que el presidente de Linspire, Michael Robertson, había llevado a cabo la operación sin consultar a los accionistas, algo que dejando de lado las leyes a las que están sometidas las empresas, considera inmoral. Carmony renunció a su puesto de CEO de Linspire en Abril de 2006, por unas supuestas discrepancias con Robertson que nunca habían sido admitidas oficialmente desde Linspire pero que ahora se muestran en toda su crudeza. Pese a su dimisión, Carmony continuó poseyendo un paquete de acciones de Linspire gracias al cual le llegó un memorando de la compañía a los accionistas explicando la operación. Durante este último año, la negativa de Robertson a convocar una junta general de accionistas le han valido numerosas críticas entre las que se encontraba la de Carmony. En los posts de su blog que siguen al que destapó la operación, el ex-CEO ataca duramente al actual equipo directivo, llegando a preguntarle qué ha hecho con los activos y la buena situación financiera que él había dejado a su salida. En la nota de prensa oficial conjunta[2] distribuida por ambas compañías, se enfatiza especialmente en las oportunidades que los productos de ambas y sus mercados combinados aportarán a la nueva compañía resultante. Por un lado se destaca el papel de liderazgo de Xandros en el mercado junto al sistema de instalación de software CNR de Linspire, se pone énfasis en los nuevos dispositivos móviles y se destaca especialmente el Asus Eee PC cómo la demostración palpable que la situación actual del mercado supone una oportunidad sin parangón para GNU/Linux. Más información: Weblog de Kevin Carmony http://kevincarmony.blogspot.com/ [3] http://kevincarmony.com/ [1] http://kevincarmony.blogspot.com/2008/ 06/xandros-acquires-linspire-assets-in.html [2] http://www.linspire.com/lindows_news_ pressreleases_archives.php?id=242

Bill Gates se jubila El fundador de la compañía de Redmond ha sido y es todo un icono en el mundo de la informática moderna. www.revistasprofesionales.com

Genio avanzado a su tiempo para unos, demonio con ansias de poder para otros, el mayor filántropo del mundo o un arribista que no ha dudado en mentir y manipular para monopolizar el sector informático. Bill Gates[1] es sin duda alguna esa clase de grandes hombres capaces de dejar a un lado sus luces y sus sombras para grabar su nombre en la historia de la humanidad con letras de fuego. Hace ya dos años que anunció que se jubilaría, siguiendo la costumbre estadounidense de retirarse pronto si se ha tenido éxito en lo empresarial para disfrutar plenamente de lo conseguido, pero pocos se habían (nos habíamos) hecho a la idea.

Repasando una biografía Si tomásemos aleatoriamente de la calle a un centenar de personas y les preguntásemos el nombre propio que más les suena del mundo de la informática, probablemente la respuesta "Bill Gates" se escucharía en más del 90% de las ocasiones. Y, realmente, para bien o para mal, el fundador y presidente de Microsoft ha sido junto a Steve Jobs, su propia empresa y Apple, una de las caras visibles y reconocibles del sector. Y también, según algunas listas y la "vox populi", la mayor fortuna del mundo. William Henry Gates tercero nació el 28 de octubre de 1955 en Seattle, estado de Washington (no confundir con la capital del país, que se encuentra geográficamente al lado opuesto), al noroeste del país. De familia acomodada, a la temprana edad de trece años se despierta en él el interés por la informática por medio de la computadora de su escuela, a la que tiene acceso para programar. A partir de esa época, él y su amigo Paul Allen (con quien más adelante cofundaría Microsoft) empiezan a interesarse cada día más por el mundo de la informática en general y de la programación en particular, realizando pequeños trabajos para diversas compañías, lo que marcará sus vidas de tal forma que Gates dejará de lado el destino profesional que su familia le tenía reservado (la abogacía) para ingresar en Harvard estudiando informática junto a su amigo Paul Allen. Será allí donde conocerá a Steve Ballmer, aunque no acabará sus estudios para embarcarse en una nueva aventura: la fundación de una empresa de software llamada Microsoft. Sin lugar a dudas, uno de los hitos históricos no solo en la trayectoria personal de Gates o en la de su compañía, sino en toda la historia de la informática, fue el momento en el que firmó contrato con IBM para proporcionar a esta compañía el sistema operativo con el cual deberían funcionar sus computadoras PC. Al no considerar el software como un negocio viable, IBM firmó un contrato que dejaba las manos libres a la joven compañía de Gates y Allen para imponer el modelo de licencia de los

programas que creyeran conveniente, así como a vender tanto el sistema operativo como las aplicaciones a terceras partes. Al tener la patente del PC una serie de errores que permitían la copia del hardware, fabricantes como Compaq pudieron crear clónicos que funcionaban a nivel de hardware exactamente igual que la máquina de IBM, pero a los cuales les faltaba una pieza imprescindible para ser compatibles con el sistema microinformático de Big Blue (apodo "cariñoso" que recibe IBM): el software. Al poseer Microsoft todos los derechos sobre el sistema operativo, las compañías fabricantes de PC's clónicos no tuvieron más remedio que entenderse con la joven compañía, que puso de esta forma los cimientos para el dominio casi absoluto que ostenta hoy en día en el mundo de la informática y que se reforzó a partir de la aparición de Windows 95, sistema con el que prácticamente eliminó al resto de competidores a excepción de dos: por un lado Apple, que ha continuado anclada a una cuota de mercado reducida pero fiel, y por otro a GNU/Linux, el sistema operativo libre del cual en varias ocasiones Gates ha hablado despectivamente. Volviendo al personaje, mucha gente desconoce que está casado desde 1994 con Melinda Gates, una antigua directiva de Microsoft con la que tiene tres hijos. Su principal centro de interés ahora que se jubila van a ser sus actividades filantrópicas, que canaliza a través de la Fundación Bill&Melinda Gates[2]. El fundador de Microsoft está considerado como uno de los principales filántropos del mundo. El legado que nos deja Bill Gates es difícil de sopesar de forma objetiva, ya que su persona despierta sentimientos encontrados, admiración y odio a partes iguales de la misma forma que la compañía que ayudó a crear y a encumbrar y a los productos que esta ha ido lanzando al mercado. Un ser humano, en definitiva, al que ha tocado estar en el sitio y el momento adecuados y moverse de la forma acertada para que su nombre pase a la historia con letras propias. Y pese a todo, apostaría (y no soy dado a hacerlo) a que William Henry Gates tercero no va a jubilarse del todo, que va a continuar influyendo sobre Microsoft de algún modo, más o menos importante, más o menos visible. No en vano, nos guste o no, la informática moderna ha sido tallada y moldeada en gran parte según sus ideas. [1] http://www.microsoft.com/presspass/exec/ billg/default.aspx [2] http://www.gatesfoundation.org/default.htm Autor: Guillem Alsina - guillem@imatica.org 11

SOLO PROGRAMADORES nº 163


Javahispano:Javahispano

11/8/08

13:01

Página 12

JAVAHISPANO

Actualidad Java de la mano de javaHispano Jalbum 8.0 Recientemente se ha anunciado la versión 8.0 de Jalbum, una aplicación de escritorio completamente implementada en Java que permite transformar un conjunto de fotografías en un álbum web. Esta aplicación, que acumula varios millones de descargas, tiene una gran cantidad de opciones de configuración y soporta múltiples estilos, todos ellos configurables. Las novedades de la versión 8.0 son varias herramientas para la manipulación de las imágenes (de las que se publicarán en la web, los originales nunca se modifican), mejora del soporte para drag and drop de fotografías entre directorios, soporte para dar puntuación a cada fotografía y poder listar las fotografías por puntuación (similar al funcionamiento de iTunes) y soporte para RSS. Además, ahora también se ofrece la posibilidad de albergar tus fotografías en su servidor (te dan 30 MB de espacio gratuitamente, si quieres más tienes que pagar). Parece que finalmente han encontrado un modelo de negocio para obtener beneficio a través de esta popular aplicación gratuita.

Samsung y Sony fabricarán televisores con Java en el 2009 Samsung y, más recientemente, Sony han anunciado que construirán televisores con soporte para Tru2Way. Esta tecnología pretende proporcionar una experiencia más interactiva a los televidentes. En esta experiencia se incluyen guías de contenido y anuncios interactivos, juegos, chatear y t-commerce (el nombre que le han dado al e-commerce que se realizará a través del televisor). Una de las ventajas que traerá Tru2Way es que hace que desaparezca el "set top box" de la televisión por cable; el televisor será capaz de conectarse directamente a una red de la cual se descargará todo el contenido. Estos nuevos televisores estarán a la venta a principios del 2009. Tru2Way se basa en un conjunto de especificaciones Java llamado "OpenCable Platform". Por tanto, el comenzar a incorporar Tru2Way en los televisores es sinónimo de incorporar a Java en ellos. Parece que Java va a volver al dominio en el que nació, y en el que fracasó miserablemente, aunque en aquel momento todavía no se llamaba Java sino "*7": la televisión digital por cable.

Oracle anuncia la nueva familia de servidores de aplicaciones Oracle Weblogic Oracle ha anunciado su nueva familia de servidores de aplicaciones Java EE resultado de la adquisición de BEA. Como era previsible, el servidor JEE oficial de la compañía ha dejado de ser el Oracle Application Server (OAS) y su lugar ha sido ocupado por Weblogic Server, el antiguo servidor de BEA Systems. También han anunciado dos nuevos productos enfocados a arquitecturas distribuidas. Por un lado, Oracle Weblogic Suite, que combina WebLogic Server con Weblogic Operations Control, Coherence para hacer cache de los recursos y la antigua máquina virtual de BEA JRockit. Por otro lado está Oracle WebLogic Application Grid, que combina Weblogic Server con Coherence Grid Edition y con RealTime JRockit. En cuanto a IDEs se refiere, se dará prioridad al desarrollo de Weblogic Workshop; no obstante JDeveloper, al menos inicialmente, también se continuará desarrollando. Con estos movimientos ha terminado la reorganización de productos dentro de Oracle tras la adquisición de BEA Systems a principios de este año. El resultado es un conjunto de productos que, gracias a la excelente tecnología heredada de BEA y a la estratégica posición de Oracle en el mercado, con toda probabilidad se convertirán en la solución dominante dentro del mundo Java EE.

SOLO PROGRAMADORES nº 163

12

www.revistasprofesionales.com


Javahispano:Javahispano

11/8/08

13:01

Página 13

JAVAHISPANO

Actualidad Java de la mano de javaHispano

Liberado Compass 2.0 Shay Banon, el líder del proyecto Compass, ha anunciado recientemente la versión 2.0 de este motor opensource de búsquedas de indexación basado en Lucene y distribuido bajo licencia Apache v2.0. El objetivo de Compass es simplificar el uso de Lucene para realizar índices de objetos de dominio y poder hacer búsquedas de ellos de forma rápida. En palabras de su creador "Compass es a Lucene, lo que Hibernate es a JDBC". El API de la librería es bastante simple y se basa en anotaciones, de forma similar a como se trabaja con un ORM. Las novedades de esta versión son una mayor simplicidad para integrarse con un ORM; integración con grids de datos distribuidos y con soluciones como GigaSpaces, Terracota y Coherence; la capacidad de realizar búsquedas en un grid de datos, permitiendo reflejar los cambios que ocurran en un grid automáticamente en el índice de Lucene; y mejoras en el rendimiento. La actualización desde Compass 1.2 es sencilla, aunque es necesario regenerar el índice de Lucene.

Versión 2.0 de barcode4j El proyecto barcode4j ha anunciado recientemente la versión 2.0 de su generador de código de barras. El generador tiene soporte para generar códigos de barras en una y dos dimensiones, permite exportar los códigos a SVG, EPS, Bitmaps y Java2D y proporciona un Servlet con soporte para generar códigos de barras en formatos SVG, EPS y bitmap. También posee una interfaz de línea de comandos y puede integrarse con Apache Xalan y Apache FOP y con SAXON XSLT. Barcode4j está implementado al 100% en Java y se distribuye bajo licencia Apache, por lo que puede emplearse en aplicaciones comerciales de código cerrado.

OPINIÓN

¿Problemas con Generics o de Generics? Desde la vista de usuario son grandes las ventajas de consumir una librería desarrollada sobre Generics a una que no lo hace, entre las que se encuentra una mayor limpieza en el código (lo que lleva a una mejora sustancial a la hora de comprender el mismo) y la posibilidad de trasladar errores de tipo en tiempo de ejecución (ClassCastException) a tiempo de compilación. Collection lo demuestra, por ejemplo al poder utilizar un Map adaptado a nuestras necesidades con solo indicar los tipos de la llave y del contenido.

Los problemas aparecen para muchos desarrolladores al pararse enfrente, al implementar librerías mediante Generics, llegando varios a pensar que la razón por la cual no consiguen materializar sus soluciones es porque realmente hay algo extraño detrás de la implementación misma de Generics dentro de la JVM. Sin embargo, se pueden observar dos factores en común en casi todos los problemas:  Se busca en Generics algo para lo cual no fue diseñado  Falta de un análisis inicial de como Generics dará un valor agregado al usuario final Generics simplemente pretende (además de proveer las ventajas para el usuario ya comentadas) permitirle al desarrollador abstraer de tipos su API, de forma que sea el usuario quien decida los que más le convengan. La utilización lleva aparejado un estudio de las ventajas que realmente traerá al usuario y de ser este positivo, no hay duda que el tiempo a utilizar para la adaptación del API será tiempo realmente bien invertido. Luis Enrique Funes, lefunes.wordpress.com (le.funes@gmail.com)

Sobre el autor Abraham Otero (abraham.otero@javahispano.org) es responsable de calidad y miembro de la junta de javaHispano. www.revistasprofesionales.com

13

SOLO PROGRAMADORES nº 163


14-23 Curso java I:MIDDLEWARE(Programacion multiple)

24/7/08

12:59

Página 14

MIDDLEWARE

Curso de programación Java (I) ABRAHAM OTERO QUINTANA Abraham@javaHispano.org

En la entrega anterior ofrecimos una detallada introducción a las necesidades del uso de múltiples hilos (threads) en Visual Basic; C# y Java; así como a los conceptos fundamentales y los principales enemigos y problemas con los cuales nos encontraremos en este largo pero apasionante camino. En esta ocasión, vamos a comenzar a generar código y ejemplos concretos para estos tres lenguajes de programación para evitar los obstáculos explicados y conseguir tener el control de múltiples hilos de ejecución acorde a la cantidad de núcleos de procesamiento disponibles. El índice TIOBE trata de reflejar el “estado de salud” de los distintos lenguajes de programación. El índice reparte 100 puntos entre todos los lenguajes de programación existentes; el número de puntos que se lleva cada lenguaje depende del número de ofertas de trabajo que para dicho lenguaje haya en portales como Monster y similares, del número de res-

puestas que varios buscadores de Internet (entre ellos Google y Yahoo) devuelven al realizar consultas relacionadas con el lenguaje, del número de libros editados y vendidos sobre dicho lenguaje... y otras métricas similares. Como se puede ver en la figura 1, Java lidera dicho índice; y lo lleva liderando desde principios del 2001, con la excepción de unos pocos meses en torno a 2005, momento en el que fue temporalmente sobrepasado por C. Otro de los méritos que puede atribuirse es el liderar el ranking de Sourceforge de número de proyectos desarrollados en un determinado lenguaje. En abril del 2005 superó al actual tercer lenguaje de programación, C, y en noviembre del 2005 superó al actual segundo, C++. (ver Figura 1) Java, al igual que su rival más directo (.NET), es mucho más que un simple lenguaje de programación, como podría ser el caso de C o C++. Es una plataforma de desarrollo de aplicaciones completa que proporciona contenedores web y lenguajes de script para la creación de páginas web dinámicas; soporte para componentes transaccionales distribuidos; mapeadores objetos relacionales para encargarse de la persistencia de la aplicación; colas de mensajería para el procesamiento asíncrono de tareas; soporte para desarrollo de aplicaciones para tarjetas inteligentes y otros dispositivos empotrados; soporte para desarrollo de aplicaciones para terminales móviles; un toolkit gráfico con soporte para animaciones 2D y 3D; soporte para el desarrollo de aplicaciones que se ejecutarán empotradas en un navegador; y un largo etcétera. La plataforma se divide en tres grandes bloques. Uno de ellos, J a v a S E (anteriormente conocido

FIGURA 1: Ranking del índice TIOBE con los 11 lenguajes de programación más populares.

SOLO PROGRAMADORES nº 163

14

www.revistasprofesionales.com


14-23 Curso java I:MIDDLEWARE(Programacion multiple)

24/7/08

12:59

Página 15

MIDDLEWARE

Curso de programación Java (I)

FIGURA 2: Con el lenguaje de programación Java es posible programar todos estos dispositivos. como J2SE) es lo más parecido a un lenguaje de programación estándar. Proporciona una sintaxis para un lenguaje de programación, un entorno de ejecución para las aplicaciones creadas en dicho lenguaje y un extenso conjunto de librerías en las cuales se pueden apoyar dichas aplicaciones. Java SE será el objetivo de esta serie de artículos y es el punto por el que, habitualmente, los desarrolladores que quieren aprender Java se acercan a la plataforma. J a v a M E (anteriormente conocido como J2ME) es una edición de Java orientada a programación de dispositivos móviles y empotrados. En esta categoría encajan desde las tarjetas inteligentes (como las que se emplean en los DNI electrónicos, en las tarjetas prepago o en las SIM de los teléfonos móviles) hasta terminales móviles de última generación, pasando por los reproductores del formato de video de alta definición BlueRay, o software de control de coches. Java ME proporciona un subconjunto de las librerías y de las características del lenguaje de Java SE. Este subconjunto puede variar dependiendo de para qué dispositivos estemos programando; si estamos programando para terminales móviles de última generación están disponibles prácticamente todas las características de Java SE. Sin embargo, si estamos programando para tarjetas inteligentes el conjunto de librerías está considerablemente reducido, y el lenguaje de programación soporta menos características; por ejemplo, no soporta tipos de datos reales ya que estos dispositivos sólo tienen hardware para realizar aritmética de enteros. Java ME es muy popular en la actualidad en dispositivos móviles, aunque a menudo pase desapercibido. Para que el lector se haga una idea de la presencia de esta tecnología, simplemente mencionar que se han manufacturado 3.500.000.000 de tarjetas inteligentes basadas en la tecnología Java, y más de 1.400.000.000 de teléfonos móviles con soporte para aplicaciones Java ME. Con toda probabilidad, tu teléfono móvil es capaz de ejecutar aplicaciones Java ME. Y, por cierto, la inmensa mayoría de los juegos y aplicaciones www.revistasprofesionales.com

para terminales móviles que ves anunciados en televisión y en revistas están desarrollados en Java ME. Si Java ME puede considerarse como un subconjunto de Java SE, J a v a E E (anteriormente conocido como J2EE) puede considerarse como un superconjunto. En este caso, no se extiende ni se modifica de ningún modo el lenguaje de programación. Se añade un conjunto amplio de librerías y una serie de contenedores de aplicaciones (contenedores web y de EJB). Estos contenedores proporcionan servicios, de un modo automático y transparente para el programador, a las aplicaciones que contienen, servicios como transaccionalidad, persistencia, autenticación, autorización, etcétera. Nuevamente, muchas de las web que visitas diariamente están hechas en Java: la web del Real Madrid, el propio GMail, o las web de los ministerios del gobierno español son algunos ejemplos. (ver Figura 2).

El objetivo de esta serie de artículos: Java SE Una vez terminada la revisión a vista de pájaro de las distintas partes que integran la plataforma, es momento de explicar exactamente qué vamos a abordar en esta serie de artículos. Nuestro objetivo será Java SE: presentaremos el lenguaje de programación Java e introduciremos las partes más esenciales de su librería estándar. Los artículos están escritos suponiendo que el lector conoce algún lenguaje de programación y, por tanto, domina los conceptos básicos de la programación estructurada: el concepto de variable, estructuras de control de flujo, el concepto de función o procedimiento, etcétera. Esta serie de artículos no es, por tanto, un sustituto de un curso básico de programación. Aunque no será imprescindible para seguir los artículos, si será aconsejable poseer conocimientos básicos de orientación a objetos: el concepto de método, de objeto, de clase, de paso de mensajes... serán expuestos con mucha brevedad. Nos centraremos más en presentar el soporte que Java proporciona para

la programación orientada a objetos, más que en presentar la programación orientada a objetos en sí misma.

1.1 Java, el lenguaje Ya hemos introducido, a vista de pájaro, lo que podríamos denominar “plataforma Java”. En esta sección presentaremos brevemente cuáles son las principales características del lenguaje de programación Java. Java es un lenguaje sencillo de aprender. Su sintaxis es la de C++ “simplificada”. Los creadores de Java partieron de la sintaxis de C++ y trataron de eliminar todo lo que resultase complicado o fuese fuente de errores en este lenguaje. La herencia múltiple, la aritmética de punteros, la gestión de memoria dinámica (que en Java se realiza de modo transparente para el programador gracias al recogedor de basura) son ejemplos de puntos complicados del lenguaje C++ que en Java se han eliminado o simplificado. Esta decisión de diseño, intencionada, tenía como objetivo atraer a desarrolladores con conocimientos de C++ al nuevo lenguaje de programación, objetivo que fue alcanzado. Java es completamente independiente de la máquina y el sistema operativo en el que se ejecuta. El código generado por el compilador Java es independiente de la arquitectura: podría ejecutarse en un entorno UNIX, Mac o Windows; en un procesador Sparc, x86, PowerPC, ARM, ... tanto de 32 como de 64 bits. El motivo de esto es que el que realmente ejecuta el código generado por el compilador no es el procesador del ordenador directamente, sino que se ejecuta mediante una máquina virtual, que es la que genera código máquina adecuado para cada arquitectura. Además, Java es portable a nivel de código fuente. El párrafo anterior, aborda la portabilidad de Java a nivel de binario: un mismo programa compilado puede ejecutarse en distintas arquitecturas. Pero además en el lenguaje Java no hay aspectos dependientes de la implementación, todas las implementaciones de Java siguen los mismos estándares en cuanto a tamaño y almacenamiento de los datos, y en 15

SOLO PROGRAMADORES nº 163


14-23 Curso java I:MIDDLEWARE(Programacion multiple)

24/7/08

12:59

Página 16

MIDDLEWARE

cuanto al modelo de memoria que ven las aplicaciones. Esto no ocurre así en otros lenguajes como C o C++. En estos dos lenguajes, por ejemplo, un entero puede tener un tamaño de 16, 32 o más bits, siendo la única limitación que el entero

Figura 3: En la imagen se muestra al Duke, la mascota de Java. Y ¡él también se distribuye bajo una licencia libre!

int

sea mayor o igual que un Short

y menor o igual que un long int

Así mismo, dependiendo de la implementación los datos pueden almacenarse en formato little endian o en big endian. Java lo hace siempre en el mismo formato. Java es un lenguaje de programación robusto y seguro. Estas características surgen en buena medida de ser un lenguaje que no es ejecutado directamente por la CPU, sino que es ejecutado por la máquina virtual. Esta máquina virtual puede controlar los permisos que se le otorgan a una determinada aplicación y garantizar que dichos permisos no son violados. Por ejemplo, Java proporciona soporte para la creación de Applets. Estos son programas diseñados para ser ejecutados de modo automático cuando un usuario visita una página web. Si el Applet no estuviese restringido en lo que puede hacer al ejecutarse, podría comprometer nuestra máquina. Sin embargo, Java garantiza que ningún Applet puede escribir o leer de nuestro disco o mandar información del usuario que accede a la página a través de la red (como, por ejemplo, la dirección de correo electrónico). En general no le permite realizar cualquier acción que pudiera dañar la máquina o violar la intimidad del que visita la página web. Java es un lenguaje de alto rendimiento. Sí, de alto rendimiento. Actualmente la velocidad de ejecución del código Java es semejante a la de C++, hay ciertas pruebas estándares de comparación (benchmarks) en las que Java gana a C++ y viceversa. Esto es así gracias al uso de compiladores just in time, compiladores que traducen los bytecodes de Java en código máquina para una determinada CPU, código que no precisa de la máquina virtual para ser ejecutado, y guardan el resultado de dicha conversión, volviéndolo a llamar en caso de volverlo a necesitar, con lo que se evita la sobrecarga de trabajo asociada a la interpretación del bytecode. Además, estos compiladores realizan optimizaciones que se basan en infor-

SOLO PROGRAMADORES nº 163

16

mación que sólo está disponible en tiempo de ejecución y que, por tanto, son imposibles de realizar en tiempo de compilación. No obstante, por norma general el programa Java consume bastante más memoria que un programa C++ equivalente, ya que no sólo ha de cargar en memoria los recursos necesarios para la ejecución del programa, sino que además debe simular un sistema operativo y hardware virtuales (la máquina virtual). Sin embargo, dado el bajo precio de la memoria RAM en la actualidad y la gran cantidad de memoria que suele haber disponible, el mayor consumo de memoria a menudo es irrelevante. Por último, en la línea del alto rendimiento, mencionar que Java posee soporte nativo para threads, lo que hace que escribir aplicaciones Java que tomen ventaja de procesadores de varios núcleos (lo más habitual en la actualidad es que al menos dispongamos de dos núcleos en una máquina) sea mucho más sencillo que en otros lenguajes de programación.

2 El kit de desarrollo Java, JDK Para desarrollar aplicaciones Java es necesario un “Java Development Kit“ o JDK. Existen múltiples JDKs, desarrollados por compañías diferentes, o desarrollados como proyectos de software libre. Yo recomiendo al lector que emplee el que distribuye de modo gratuito Sun

Microsystems, que se puede descargar desde http:// java.sun.com/j2se. La implementación de Java de Sun suele ser la más actualizada y, además, ¡es software libre!. No obstante, el lector podría emplear cualquier otro JDK. La portabilidad del lenguaje garantiza que todos funcionarán del mismo modo. (ver Figura 3) Varios ejemplos de esta serie de artículos requerirán que se emplee un JDK 5 o superior. Java, como lenguaje, ha sufrido dos revisiones mayores en su historia. La primera fue la versión 1.2, en 1998. En la actualidad prácticamente nadie emplea JDKs anteriores al 1.2, por lo que no merece la pena hacer énfasis en las características del lenguaje antes de ese momento. La segunda, realizada en 2004, fue Java 5 (1.5 si se hubiese seguido con la numeración antigua, pero Sun decidió saltar de 1.4 a 5). Todavía existe bastante código escrito en Java 1.4.X y todavía existen muchos servidores de aplicaciones en producción que no soportan Java 5. Por ello cuando describamos una característica que sólo está presente en Java 5 avisaremos al lector. En cualquier caso, no existe ningún motivo para que el lector se descargue un JDK antiguo; lo más razonable es que se descargue la última versión (Java 6 en el momento de escribir este artículo). Es de consenso que el entorno JDK no es el más adecuado para el desarrollo de aplicaciones Java, debido a funcionar única y exclusivamente mediante comandos de consola. Hoy www.revistasprofesionales.com


14-23 Curso java I:MIDDLEWARE(Programacion multiple)

24/7/08

12:59

Página 17

MIDDLEWARE

Curso de programación Java (I) en día la programación se suele ayudar de entornos visuales, como Eclipse y Netbeans, que facilitan enormemente la tarea. Mi preferencia personal hace que tienda a recomendar Netbeans, especialmente para un programador novato ya que este entorno de desarrollo requiere mucha menos configuración que Eclipse. Además, en artículos posteriores de esta serie se proporcionarán tutoriales flash cuyo objetivo es ayudar al usuario a comenzar a trabajar con Netbeans. En cualquier caso, ambos son excelentes entornos de desarrollo, completamente gratuitos y se distribuyen bajo licencia libre. Pueden descargarse desde http://netbeans.org y http:// eclipse.org. Aunque espero que para seguir esta serie de artículos el elector emplee alguno de estos entornos de desarrollo, siempre está bien comprender qué sucede cuando hacemos un clic sobre el botón de “Play“. En esta sección mostraremos cuáles son los componentes básicos del JDK y cómo emplearlos desde consola. Recomiendo al lector que para este primer artículo evite emplear un IDE y que trabaje con el JDK en la consola, para familiarizarse con él. A partir de ahora supongo que el lector tiene un JDK instalado en su equipo. La descarga desde la página de Sun es un instalador estándar. Podemos aceptar todas las opciones por defecto. Una vez instalado, nuestro equipo podrá ejecutar aplicaciones Java. Sin embargo, por defecto, el kit de desarrollo no estará accesible desde la consola de comandos. Para solucionar esto debemos incluir en la variable de entorno PATH

el nombre del directorio de instalación del JDK. Para ello hacemos un clic derecho sobre el icono de “Mi PC” y seleccionamos “Propiedades”. En la ventana que aparecerá vamos a la lengüeta de “Opciones avanzadas” y seleccionamos el botón “Variables de entorno”. Si ya existe una variable llamada PATH

la seleccionamos y le damos al botón de “Modificar”. Si no, creamos dicha variable mediante el botón “Nueva”. El valor de dicha variable debe ser el directorio “bin” que se encuentra dentro del directorio de instalación del JDK. Si hemos instalado la última versión del JDK de Sun (la 6) en una máquina Windows y hemos aceptado todas las opciones por defecto este directorio será “C:\Archivos de programa\Java\jdk1.6.0\ bin”. Si en nuestro equipo ya estaba definida la variable www.revistasprofesionales.com

Típico programa de “hola mundo” desarrollado en Java.

LISTADO 1

//código Ejemplo1.java del CD import java.util.*; /**Programa “hola mundo” que muestra la fecha actual. * @author Abraham Otero * @version 1.0 */ public class HolaMundo { /**El punto de entrada de la aplicación * @param args array de cadenas de caracteres * @return no devuelve nada */ public static void main(String[] args) { //Esta línea imprime por consola la cadena de caracteres “Hola es:” System.out.println(“Hola es: “); //Esta sentencia imprime la fecha actual del equipo System.out.println(new Date()); } } ****Listado 2 <HTML> <TITLE>Mi Applet </TITLE> <BODY> <APPLET CODE = “applet.class” WIDTH =300 HEIGHT = 300> </APPLET> </BODY> </HTML> ****Listado 3 //código Ejemplo2.java del CD int i = 9,k; float j = 47.9F; System.out.println(“i: “+i k = (int)j; //empleo de un System.out.println(“j: “ + j = k;//no necesita cast System.out.println(“j: “ +

+ “ j: “ +j); cast; k pasa a valer 47 j + “ k: “ +k); j + “ k: “ +k);

PATH

vamos al final de la línea de su definición, añadimos un “;” y a continuación colocamos la ruta del directorio mencionado anteriormente.

2.1 Compilando nuestra aplicación: el comando javac Ha llegado ya el momento (¡Por fin!) de comenzar a escribir algo de código fuente. Todavía no hemos explicado absolutamente nada de la sintaxis de Java; comenzaremos con ello en breve. Sin embargo, este primer programa, que mostramos en el listado 1, es muy simple de entender y no creo que lector tenga problemas comprendiendo lo que hace. (ver Listado 1) La primera sentencia, import java.util.*;

son comentarios y, por tanto, serán ignorados por el compilador. Estos comentarios están en una sintaxis especial que es interpretada por una de las herramientas del JDK que veremos un poco más adelante. También es posible crear comentarios rodeando una o varias líneas con /*

y */

todo lo que se encuentre después de /*

y hasta */

será un comentario. Por último, el tercer tipo de comentario que soporta Java es //

importa el contenido de una librería, de la cual tomaremos un objeto que representa una fecha. Todas las sentencias comprendidas entre un /**

y un */

En este caso el comentario comienza en las dos barras y termina con el final de la línea. La línea public class HelloDate {

define una clase. Java es un lenguaje de programación orientado a objetos y en él 17

SOLO PROGRAMADORES nº 163


14-23 Curso java I:MIDDLEWARE(Programacion multiple)

24/7/08

12:59

Página 18

MIDDLEWARE

todo, a excepción de los tipos de datos primitivos, son objetos. Por lo de ahora simplemente recomiendo al lector que ignore esta línea; las clases y los objetos serán abordados más en profundidad en el tercer artículo de la serie. La línea public static void main(String[] args) {

define el Main

el punto de entrada, del programa. La primera sentencia que se encuentre dentro del bloque de código que comienza con la apertura de llave del

Cd

, nos situaremos en el directorio donde hemos guardado el archivo HolaMundo. java. A continuación tecleamos: javac HolaMundo.java Javac

es el nombre del compilador de Java (su nombre viene de Java Compiler). Si hemos tecleado correctamente el código del ejemplo, el comando se ejecutará sin mostrar ningún mensaje por la consola y en el directorio aparecerá un archivo con nombre HolaMundo.class

Main

será la primera sentencia que se ejecute. En este caso la sentencia es System.out.println(“Hola es: “);

En artículos posteriores explicaremos más en detalle el porqué de una sintaxis tan engorrosa como System.out.println

Por lo de la hora el lector lo único que necesita saber es que esa sentencia permite imprimir por la consola el texto que se le pase entre paréntesis, rodeado de comillas. La última sentencia ejecutable del Main

crea un objeto de tipo Date

hemos compilado nuestro código con éxito. Si hay algún error en el código, el compilador nos advertirá de ello mostrando el correspondiente mensaje de error. Si nuestra consola no reconociese el comando Javac

, o bien no hemos instalado todavía el JDK, o bien no hemos modificado adecuadamente la variable de entorno PATH.

2.2 Lanzando la máquina virtual: el comando java Los ficheros .class contienen b y t e c o d e , una especie de “ensamblador” de la plataforma Java. Este ensamblador puede ser interpretado por cualquier máquina virtual Java. La máquina virtual estará accesible desde nuestro PATH

, esto es, crea un objeto de tipo fecha y lo muestra por consola. Este es el momento en el que debemos coger un editor de texto cualquiera (el Bloc de notas de Windows es perfectamente válido) y teclear el código anterior. Deberemos guardarlo en un archivo con nombre HolaMundo.java

En Java una clase pública obligatoriamente tiene que guardarse en un archivo con el mismo nombre que la clase. Para compilar nuestro primer programa necesitamos abrir una consola (en Windows, esto puede hacerse desde el menú de inicio, seleccionando la entrada a “Ejecutar” y tecleando en la ventana que aparece Cmd

una vez hayamos instalado el JDK, sin necesidad de haber modificado ninguna variable de entorno. El comando para invocarla es Java

Para indicarle a la máquina virtual que debe comenzar la ejecución de un determinado programa, el cual debe haber sido compilado con antelación, después del comando Java

SOLO PROGRAMADORES nº 163

18

2.3 Generando documentación de nuestro código fuente Una de las cosas que Java ha traído al mundo de la programación es la cultura de que todo código fuente debe tener una documentación asociada. Quizás haya sido por el hecho de que desde el día cero Java proporcionaba herramientas para generar documentación de modo semiautomático a partir de un código fuente con comentarios. O quizás fuese por el énfasis que los evangelistas del lenguaje hacían sobre este aspecto. Pero una de las cosas que todavía en la actualidad es muy envidiada por los desarrolladores de otros lenguajes es la documentación de nuestras librerías y la cultura de documentar el código fuente que existe dentro de la plataforma Java. El JDK de Sun nos proporciona una herramienta que extrae los comentarios que comienzan por /**

de un código fuente (los que comienzan por /*

y por //

son ignorados). En dichos comentarios puede emplearse una sintaxis especial que es interpretada por la herramienta. A partir de los comentarios, y con el soporte de dicha sintaxis si el programador la ha empleado, la herramienta genera una página HTML con documentación del código fuente. El código que estamos usando de ejemplo posee varios de estos comentarios, y emplea la sintaxis especial. En los artículos que siguen a éste iremos presentando más detalles sobre dicha sintaxis. Aquí simplemente pretendemos mostrar cómo se emplea la herramienta, cuyo nombre es Javadoc

debemos teclear el nombre de la clase que contiene el Main

de nuestro programa. En nuestro caso el comando será: java HolaMundo

Empleando el comando

No es necesario aquí suministrar la extensión del fichero, ya que siempre ha de ser un fichero .class. El resultado de la ejecución se muestra en la figura 4.

Para generar documentación sobre nuestro código de ejemplo debemos teclear el comando: javadoc HolaMundo.java

Este comando nos genera un montón de páginas HTML, no una sola. Habitualmente, www.revistasprofesionales.com


14-23 Curso java I:MIDDLEWARE(Programacion multiple)

24/7/08

12:59

Página 19

MIDDLEWARE

Curso de programación Java (I)

FIGURA 4: Resultado de compilar y ejecutar el código “HolaMundo”.

suele emplearse para documentar programas complejos donde tiene sentido estructurar la documentación generada en distintas páginas web. La que nos interesa es la que tiene por nombre “index.html”. Podemos ver su contenido en la figura 5. Como el lector podrá observar, los comentarios que introdujimos en el código fuente han sido extraídos por la herramienta e interpretados de modo adecuado para generar la documentación.

2.4 El visor de Applets : el comando appletviewer Todavía tardaremos varios números en explicar qué es un Applet. Pero, presentaremos aquí la última herramienta del JDK que emplearemos en esta serie de artículos: Appletviewer

Se trata de un comando que verifica el comportamiento de un Applet, es decir, de una aplicación Java diseñada para ejecutarse dentro de un navegador web. La entrada del comando ha de ser una página web que contenga una referencia al applet que deseamos probar. Su sintaxis es: appletviewer mipagina.html

El comando ignora todo el contenido de la página web que no sean applets, y se limita a ejecutar éstos. Un ejemplo de página www.revistasprofesionales.com

Documentación que genera el comando javadoc para nuestro ejemplo.

19

SOLO PROGRAMADORES nº 163


14-23 Curso java I:MIDDLEWARE(Programacion multiple)

24/7/08

12:59

Página 20

MIDDLEWARE

Página web con una etiqueta que empotra un Applet en el documento HTML

LISTADO 2 <HTML>

<TITLE>Mi Applet </TITLE> <BODY> <APPLET CODE = "applet.class" WIDTH =300 HEIGHT = 300> </APPLET> </BODY> </HTML>

float f = 2.3;

no comprenden por qué el compilador da un error; estamos asignando un número double

, 2.3

, a una variable de tipo Float

web “mínima” para poder probar un applet llamado applet.class

sería el mostrado en el listado 2. En el CD que acompaña esta revista lector podrá encontrar un archivo con nombre Appplet.class

hay cuatro tipos de enteros, como se muestra en la tabla 1. Esta tabla también nos muestra el rango (valores mínimos y máximos) de cada tipo y el espacio que ocupan en memoria, medido en bytes. Para indicar que un literal entero es de tipo long debemos añadirle una

23

es un

Applet.html

int

Puede copiar ambos al directorio de trabajo y probar con ellos el comando

y el número 23L

appletviewer

es un También puede abrir la página web con su navegador web favorito y podrá comprobar como, si ya ha instalado el JDK, puede ver el Applet en el navegador.

3 Tipos de datos primitivos En este apartado presentaremos los tipos de datos primitivos que existen en Java. Aquellos lectores que estén familiarizados con C, o C++, no encontrarán prácticamente nada nuevo en este apartado: los tipos son casi idénticos a los de estos lenguajes, salvo que aquí todos los enteros son signed siempre. En Java toda variable declarada ha de tener su tipo, y además antes de poder emplearla hemos de inicializarla a un valor, si no el compilador se quejará y no generará los archivos .class. Esto no es necesario, por ejemplo, en C, siendo fuente de muchos errores el emplear en operaciones variables que nos hemos olvidado de inicializar. A continuación pasamos a describir los distintos tipos de datos primitivos que existen en Java.

3.3 Caracteres En Java hay un único tipo de carácter: char

Cada carácter en Java está codificado en un formato denominado Unicode. Unicode es una extensión de ASCII, ya que éste último sólo tenía capacidad para representar 256 símbolos distintos. Para poder representar todos los alfabetos (chino, japonés, ruso...) y una mayor cantidad de símbolos se creó el formato Unicode. En Java, al igual que en C, se distingue la representación de los datos

L

al final: el número , junto con una página web con nombre

En esta operación puede perderse información y el compilador nos avisa.

long

Char

3.2 Reales Almacenan números reales, es decir, números con parte decimal. Como se muestra en la tabla 2, hay dos tipos diferentes de número real; se diferencian tanto en la precisión (el número de cifras decimales que son capaces de representar) como en el rango de valores que permiten representar. Si queremos indicar que un literal real es de tipo

frente a las cadenas de caracteres. Los Char

van entre comillas simples: char ch = ‘a’;

, mientras que las cadenas de caracteres usan comillas dobles.

Float

3.4 Datos lógicos: boolean

debemos añadir una

Se trata de un tipo de dato que solo puede tomar dos valores:

F

después de él:

true

2.3F

Y

, sino por defecto será

False

double

Esto suele ser una causa habitual de quebraderos de cabeza para los programadores Java novatos que, cuando escriben una sentencia del tipo

, que representan los valores lógicos cierto y falso, respectivamente. Por ejemplo, la sentencia bolean b = true;

TABLA 1: tipo de datos enteros en Java 3.1 Enteros Almacenan, como su propio nombre indica, números enteros; esto es, números sin parte decimal. Cabe destacar, como ya se indicó anteriormente, que por razones de portabilidad todos los datos en Java tienen el mismo tamaño y formato en todas las plataformas. En Java

SOLO PROGRAMADORES nº 163

20

Tipo byte short int long

Tamaño (bytes) 1 2 4 8

Ran go -128 a 127 -32768 a 32767 -2147483648 a 2147483647 -9223372036854775808 a 9223372036854775807 www.revistasprofesionales.com


14-23 Curso java I:MIDDLEWARE(Programacion multiple)

24/7/08

12:59

Página 21

MIDDLEWARE

Curso de programación Java (I)

TABLA 2: tipos de datos reales en Java Tipo float

Tamañ o (byte s) 4

double

8

Ran go - 3.40282347E+38 a + 3.40282347E+38 - 179769313486231570E+308 a + 179769313486231570E+308

Si cualquier operando es Long

y no hay datos reales todos se convertirán en long

Si cualquier operando es int

inicia la variable b

al valor lógico que representa una condición que se cumple, esto es, una condición cierta. Es un tipo de dato bastante útil a la hora de realizar chequeos sobre condiciones. En C no hay un dato equivalente y para suplir su ausencia muchas veces se emplean enteros con valor 1 si la variable lógica toma el valor lógico cierto y 0 si la variable toma el valor lógico falso.

4 Definición de variables Al igual que en C, y a diferencia de Fortran, Java requiere que se declaren los tipos de todas las variables empleadas. La sintaxis de declaración es la misma que C:

y cualquier carácter que sea una letra en algún idioma. En Java, al igual que en todo lenguaje de programación, hay una serie de palabras reservadas que no pueden ser empleadas como nombres de variables (

y no hay datos reales ni Long

todos se convertirán en int

If

, Int

,

En cualquier otro caso el resultado será también un int

Char

, Else

, Goto

...); alguna de éstas son empleadas en la sintaxis del lenguaje, otras, como Goto

Java sólo tiene dos tipos de operadores para operar números enteros: uno que aplica para operar datos de tipo Long

, y otro que emplea para operar datos de tipo Int

int i;

Sin embargo, y a diferencia que en C, se requiere inicializar todas las variables antes de usarlas, si no el compilador genera un error y aborta la compilación. Se puede declarar e inicializar valor a una variable en una misma línea: int i = 0;

En Java, después de cada línea de código siempre debe ir un “;“. Declaración e inicialización pueden hacerse en líneas diferentes: int i ; i = 0;

Es posible declarar e iniciar varias variables en una línea: int i=3, j,k=2;

no se emplean en la actualidad pero se han reservado por motivos de compatibilidad; por si se decide emplear en el futuro.

byte

5 Reglas de conversión entre distintos tipos numéricos

A-Z

con un byte

Las normas de conversión entre tipos numéricos son las habituales en un lenguaje de programación: si en una operación se involucran varios datos numéricos de distintos tipos todos ellos se convierten al tipo de dato que permite una mayor precisión y rango de representación numérica; así, por ejemplo: Si cualquier operando es double

todos se convertirán en Doublé

Los caracteres aceptados en el nombre de una variable son los comprendidos entre

(esto también sucede con la mayor parte de las CPU actuales). De este modo cuando operemos un

Si cualquier operando es Float

,

, un short

con un short

o un Short

con un Byte

Java empleará para dicha operación el operador de los datos tipo int

a-z

,

y no hay ningún double

_

todos se convertirán a

, $

www.revistasprofesionales.com

, por lo que el resultado de dicha operación será un Int

Float

siempre. 21

SOLO PROGRAMADORES nº 163


14-23 Curso java I:MIDDLEWARE(Programacion multiple)

24/7/08

12:59

Página 22

MIDDLEWARE

Estas conversiones son importantes a la hora de determinar en qué tipo de variable guardamos el resultado de la operación; ésta ha de tener un rango de representación mayor o igual al rango de representación de la variable con mayor rango de representación involucrada en la operación. Si es de rango superior no habrá problemas. Si no respetamos esta regla, el compilador generará un error. Es posible convertir un dato de jerarquía “superior” a uno con jerarquía “inferior”, arriesgándonos a perder información en el cambio. Este tipo de operación (almacenar el contenido de una variable de jerarquía superior en una de jerarquía inferior) se denomina cast o molde. Para llevar a cabo un cast debemos poner delante de la variable cuyo tipo queremos cambiar, entre paréntesis, el tipo de la variable al cual queremos realizar el cambio; por ejemplo, la siguiente sentencia realiza un cast de

Este código muestra un ejemplo de cast.

LISTADO 3 //código Ejemplo2.java del CD int i = 9,k; float j = 47.9F; System.out.println(“i: “+i k = (int)j; //empleo de un System.out.println(“j: “ + j = k;//no necesita cast System.out.println(“j: “ +

LISTADO 4

+ “ j: “ +j); cast; k pasa a valer 47 j + “ k: “ +k); j + “ k: “ +k);

Operadores de preincremento y postdecremento.

//código Ejemplo3.java del CD int i = 1; System.out.println("i : " + i); System.out.println("++i : " + ++i); // Pre-incremento, primero //incrementa y luego imprime por consola System.out.println("i++ : " + i++); // Post-incremento, primero imprime //“2” por consola y luego incrementa i. System.out.println("i : " + i);//i por lo tanto vale 3 System.out.println("--i : " + --i); // Pre-decremento, primero //decrementa i y luego lo imprime por consola System.out.println("i-- : " + i--); // Post-decremento, primero imprime //i por consola y luego de decrementa. System.out.println( "i : " + i);//Ahora i vale 1

para suma, resta, producto y división. El operador

Doublé

a

/

Int int i = (int)3.4;

En el listado 2 mostramos un código Java donde se hace uso de un cast. Como podremos comprobar al ejecutar el programa, al realizar un cast la variable de mayor rango es truncada para ser almacenada en la de menor rango; es decir, 3.9999 al transformarse a entero mediante un cast da como resultado 3. Para comprender el código del listado 3 es importante tener en cuenta que en Java cuando “se suma” un valor numérico a una cadena de caracteres lo que sucede es que se crea una nueva cadena de caracteres igual a la cadena de caracteres original concatenada con el valor; es decir

++a

representa la división de enteros si ambos operandos son enteros. El módulo de la división de dos enteros puede obtenerse mediante el operador %

Por ejemplo, 7/4= 1; 7% 4=3

Además, existen los operadores decremento e incremento: —

y ++

, respectivamente. La operación que realizan son incrementar y decrementar en una unidad a la variable a la que se aplican. Su

“Edad: “+ 23

da como resultado “Edad: 23”

Tabla 3: operadores relacionales

6 Operadores En este apartado veremos los operadores aritméticos, relacionales y lógicos con los que cuenta Java.

6.1 Operadores aritméticos Los operadores aritméticos de Java son + , - , * , /

SOLO PROGRAMADORES nº 163

22

acción es distinta según se apliquen antes (preincremento,

Op erad or == != < > <= >=

Op er a c ió n q ue r ea li za Test de igualdad Test de desigualdad Menor que Mayor que Menor o igual que Mayor o igual que

) o después (postincremento a++

) de la variable. En el caso del operador preincremento, si la variable sobre la que se aplica forma parte de una expresión primero se incrementará el valor de la variable, y a continuación se evaluará la expresión. En el caso del operador postincremento, si la variable sobre la que se aplica forma parte de una expresión, primero se evaluará la expresión y a continuación se incrementará el valor de la variable. Los operadores de predecremento y postdecremento tienen un comportamiento análogo. El listado 4 ilustra estos distintos escenarios.

6.2 Operadores relacionales Los operadores relacionales son operadores que comprueban si se cumple una determinada relación, de igualdad, desigualdad, mayor que... entre dos valores numéricos. El resultado de la aplicación de cualquier operador relacional es siempre un bolean

, es decir, la expresión que surge de comparar dos variables o literales mediante un operador relacional sólo puede tomar dos valores: www.revistasprofesionales.com


14-23 Curso java I:MIDDLEWARE(Programacion multiple)

24/7/08

13:00

Página 23

MIDDLEWARE

Curso de programación Java (I) Uso de operadores relacionales en Java.

LISTADO 5

//código Ejemplo4.java del CD Random rand = new Random(); //el método nextInt() del objeto Random creado genera un número aleatorio entero. //El módulo entre 100 de un entero aleatorio será un entero aleatorio entre 0 y 100. int i = rand.nextInt() % 100; int j = rand.nextInt() % 100; System.out.println("i = " + i); System.out.println("j = " + j); System.out.println("i > j es " + (i > j)); System.out.println("i < j es " + (i < j)); System.out.println("i >= j es " + (i >= j)); System.out.println("i <= j es " + (i <= j)); System.out.println("i == j es " + (i == j)); System.out.println("i != j es " + (i != j));

LISTADO 6 i j i i i i i i

Posible resultado de la ejecución del código del listado 4

= 85 = 4 > j es true < j es false >= j es true <= j es false == j es false != j es true rand.nextInt()

true

y False

En la tabla 3 se muestran los operadores relacionales disponibles en Java, y el listado 5 muestra su uso. En este listado se generan números aleatorios empleando un objeto de tipo Random

genera un número aleatorio entero. El resultado de una posible ejecución de este programa se muestra en el listado 6.

6.3 Operadores lógicos Estos operadores se aplican sobre valores lógicos, es decir, sobre datos de tipo boolean

en el tercer artículo de esta serie veremos cómo crear objetos desde Java. Para comprender el código el lector lo único que necesita saber es que el comando

En Java hay tres operadores lógicos: la negación, el AND (Y) lógico y el OR (O) lógico. Estos operadores se muestran en

Tabla 4: Operadores lógicos Op erado r ! && ||

Op erac ión qu e re aliza Not lógico And lógico Or lógico

la tabla 4. El código del listado 7 imprime la tabla de verdad de operadores lógicos AND y OR, y muestra el efecto del operador de negación.

7 Conclusiones En este primer artículo de la serie hemos presentado qué es la plataforma Java y cuál es el papel que Java, el lenguaje de programación, juega en ella. Hemos visto cuáles son las características de Java como lenguaje de programación, y hemos aprendido a manejar las herramientas básicas del kit de desarrollo Java. También hemos visto cuáles son los tipos de datos primitivos con los que cuenta Java, cómo definir variables, y los operadores aritméticos, relacionales y lógicos definidos dentro del lenguaje. Todavía nos queda mucho por andar; en el siguiente artículo de la serie presentaremos otros tipos de datos que se emplean muy comúnmente en el lenguaje, aunque esta vez no son primitivos: Strings, enumeraciones y arrays. Haremos un repaso rápido de la librería matemática que proporciona Java, y mostraremos las estructuras de control de flujo (bucles y condicionales) con las que cuenta el lenguaje. Os espero a todos el mes que viene.

LISTADO 7 boolean variableLogica = false, variableLogica2; variableLogica2 = !variableLogica; System.out.println("variableLogica: "+ variableLogica + ", variableLogica2: "+variableLogica2); System.out.println("variableLogica&&variableLogica2: " + (variableLogica&&variableLogica2)); System.out.println("variableLogica||variableLogica2: " + (variableLogica||variableLogica2)); System.out.println("\n\nTabla de verdad del operador &&:\n"); System.out.println("false && false: " + (false && false)); System.out.println("false && true: " + (false && true)); System.out.println("true && false: " + (true && false)); System.out.println("true && true: " + (true && true)); System.out.println("\n\nTabla de verdad del operador ||:\n"); System.out.println("false || false: "+ (false || false)); System.out.println("false || true: " + (false || true)); System.out.println("true || false: " + (true || false)); System.out.println("true || true: " + (true || true));

www.revistasprofesionales.com

23

SOLO PROGRAMADORES nº 163


24-28 REDES CROSS BROWER.qxd:REDES-RSS Java 1

24/7/08

13:10

Página 24

REDES

Aplicaciones Web con AJAX Las hojas XSLT representan probablemente la forma más natural de tratar documentos XML. En la actualidad Mozilla Firefox e Internet Explorer soportan el procesamiento con hojas XSLT. Si bien las implementaciones de ambos navegadores son muy diferentes, es posible crear en Javascript los objetos necesarios para incorporar a las aplicaciones Web con AJAX esta tecnología de una forma sencilla e independiente del navegador.

ADOLFO ALADRO GARCÍA

La mejor forma de acercarse a utilización de hojas XSLT en aplicaciones Web con AJAX es con un ejemplo claro y completo. En este sentido el propósito de este artículo es construir una página HTML que sea capaz de cargar un documento XML y una hoja XSLT de forma que ésta última se utilice para transformar los datos XML, con la consecuente actualización de la propia página HTML. En el servidor se encontrarán los siguientes ficheros: cross-browser-xsltxpath.htm, la página HTML; cross-browser-xsltxpath.js, el fichero con el código Javascript que implementa las llamadas AJAX, el procesamiento

con hojas XSLT, etc.; los ficheros madonna-confessions-on-a-dance-floor.xml y madonna-hardcandy.xml, que son simplemente documentos XML de ejemplo; y finalmente la hoja XSLT record.xslt con la que se transformarán los documentos XML en el navegador para actualizar la página HTML. El código de esta hoja XSLT es muy simple: <?xml version=”1.0” encoding=”ISO-8859-1”?> <xsl:stylesheet version=”1.0” xmlns:xsl=”http://www.w3.org/1999/XSL/ Transform”> <xsl:output method=”html” indent=”no”/> <xsl:template match=”record”> <h1> <xsl:value-of select=”artist” disable-output-escaping=”yes”/> </h1> <h2> <xsl:value-of select=”title” disable-output-escaping=”yes”/> </h2> ··· </xsl:template> <xsl:template match=”song”> ··· </xsl:template> </xsl:stylesheet>

Se recorre el documento XML original y se genera una pequeña sección de código HTML.

Código fuente de la página HTML de la aplicación.

SOLO PROGRAMADORES nº 163

24

www.revistasprofesionales.com


24-28 REDES CROSS BROWER.qxd:REDES-RSS Java 1

24/7/08

13:10

Página 25

REDES

Aplicaciones Web con AJAX for (var i=0; i<arrMSXML.length && oXmlHttpRequest == null; i++) { try { oXmlHttpRequest = new ActiveXObject(arrMSXML[i]); } catch (e) { oXmlHttpRequest = null; }

Definición del objeto HttpRequestFactory en el fichero cross-browser-xslt-xpath.js.

El grueso de la implementación lógicamente reside en el fichero Javascript. El objetivo es crear un código orientado a objetos, moderno y reutilizable. Así se crearán tres objetos: HttpRequestFactory, responsable de encapsular la lógica de las llamadas AJAX; XSLTProcessorFactory, responsable de la lógica correspondiente a las transformaciones con XSLT; y Transformer, el objeto que utilizando los dos anteriores está destinado a ser utilizado en la página HTML para realizar la carga de datos XML y las transformaciones.

EL OBJETO HttpRequestFactory

www.revistasprofesionales.com

for (var i=0; i<HttpRequestFactory. arrXmlHttpRequestCreators.length && HttpRequestFactory.XmlHttpRequest

return oXmlHttpRequest;

Creator==null; i++) {

La segunda función devuelve un objeto XmlHttpRequest válido en aquellos casos en los que el navegador implementa de forma nativa dicho objeto. El código es mucho más sencillo:

oXmlHttpRequestCreator = HttpRequestFactory.arrXmlHttp RequestCreators[i]; try { oXmlHttpRequest = oXmlHttpRequestCreator();

return new XMLHttpRequest();

} catch (e) {

La propiedad XmlHttpRequestCreator guardará la función del array arrXmlHttp RequestCreators que haya resultado ser válida para obtener el objeto XmlHttpRequest. Inicialmente su valor es null: HttpRequestFactory.XmlHttpRequest

oXmlHttpRequest = null; } if (oXmlHttpRequest!=null) { HttpRequestFactory.XmlHttpRequest Creator = oXmlHttpRequestCreator; }

Creator = null; }

Esto es así porque la inicialización no se produce inmediatamente después de que se cargue el script en la página sino la primera vez que se llama al método newHttpRequest: if (HttpRequestFactory.XmlHttp RequestCreator==null) { ··· } else {

Usando el método anterior se pueden crear objetos XmlHttpRequest para los dos navegadores principales, Mozilla Firefox e Internet Explorer, sin necesidad de detectar el navegador. Simplemente se ejecutan las funciones, utilizando siempre bloques try…catch, y la que funciona es la que se fija como la función válida en la propiedad XmlHttpRequestCreator del objeto HttpRequestFactory.

oXmlHttpRequest = HttpRequestFactory.XmlHttp

EL OBJETO XSLTProcessorFactory

RequestCreator(); } return oXmlHttpRequest;

La implementación de la funcionalidad XSLT/XPath se hace empleando el mismo mecanismo en el caso anterior. El objeto XSLTProcessorFactory cuenta con la propiedad arrXSLTProcessorCreators, que es un array de funciones para crear objetos XSLTProcessor para Mozilla Firefox e Internet Explorer. Todas las funciones se definen de forma que reciben como parámetro de entrada el objeto DOM correspondiente a la hoja XSLT. Las hojas XSLT son documentos XML y como tales se cargan en el navegador utilizando un objeto XmlHttpRequest común.

XSLT EN INTERNET EXPLORER

var oXmlHttpRequest = null; var arrMSXML = [“Msxml2.XMLHTTP.4.0”, ···];

var oXmlHttpRequestCreator=null;

}

var oXmlHttpRequest=null;

El objeto HttpRequestFactory encapsula la funcionalidad asociada a las llamadas AJAX, las llamadas HTTP asíncronas. Las diferencias entre Firefox e Internet Explorer se gestionan de forma transparente al programador. Cuenta con dos propiedades y un método. La propiedad arrXmlHttpRequestCreators es un array de funciones. Estas funciones se encargan de obtener el objeto XmlHttpRequest de diferentes maneras. Cada una de ellas funciona para un navegador dado. Así la primera de ellas contempla el caso en que el navegador implementa el objeto XmlHttpRequest mediante un objeto ActiveX, que es lo que ocurre con las versiones antiguas de Internet Explorer. Para ello se crea un array con los nombres de las distintas versiones que existen del objeto XmlHttpRequest. El array se recorre de forma que por cada iteración del bucle se intenta crear una instancia dentro de un bloque try...catch. Finalmente la función devuelve la instancia del objeto, si es que ha sido posible crearlo, o null en otro caso:

Cuando HttpRequestFactory.XmlHttpRequest Creator es null se recorre el array de funciones hasta que una de ellas consigue lograr crear un objeto XmlHttpRequest válido para el navegador:

Documento XML de ejemplo que se carga dinámicamente en la página HTML.

La primera de las funciones es válida para Internet Explorer y su esqueleto es el que se muestra seguidamente: 25

SOLO PROGRAMADORES nº 163


24-28 REDES CROSS BROWER.qxd:REDES-RSS Java 1

24/7/08

13:10

Página 26

REDES

Hoja XSLT con la que se transforman en el navegador los documentos XML. var oXSLTProcessor = null; try { ···

XSLTProcessor proporcionado por Internet Explorer la transformación se realiza asignando a la propiedad input el objeto correspondiente al documento XML. Después se llama al método transform y finalmente el resultado, una cadena de texto con código HTML, se encuentra en la propiedad output. La página HTML se actualiza asignando un nuevo valor a la propiedad innerHTML del elemento en cuestión, el parámetro oOutputElement. Volviendo al código del bloque try…catch central, en Internet Explorer la forma de crear un objeto XSLTProcessor es un poco sofisticada. Partiendo del código XML correspondiente a la hoja XSLT, que se ha cargado utilizando una típica llamada AJAX, es necesario crear primeramente una especie particular de objeto DOM implementada por Internet Explorer que se denomina FreeThreadedDOM. var oXSLTFreeThreadedDOM = null;

} catch (e) { oXSLTProcessor = null;

var arrMSXMLFreeThreadedDOM = [“Msxml2.FreeThreadedDOMDocument.4.0”

} if (oXSLTProcessor!=null) { return { oXSLTProcessor: oXSLTProcessor,

,···];

ActiveXObject(arrMSXMLFreeThreaded

} catch (e) { oXSLTFreeThreadedDOM = null; }

} } };

26

try { oXSLTemplate = new ActiveXObject(arrMSXMLXSLTemplate [i]); } catch (e) { oXSLTemplate = null; } }

Finalmente el objeto XSLTProcessor se obtiene asignando la propiedad stylesheet del objeto XSLTemplate y ejecutando el método createProcessor del mismo: if (oXSLTemplate!=null) {

oXSLTemplate.createProcessor();

try {

this.oXSLTProcessor.output;

SOLO PROGRAMADORES nº 163

&& oXSLTemplate==null; i++) {

oXSLTProcessor =

oOutputElement.innerHTML =

En el código central del bloque try…catch, que se estudiará más adelante, se intenta crear una instancia de un objeto de tipo XSLTProcessor. Este objeto se emplea para realizar las transformaciones de datos XML con hojas XSLT. Si el objeto se puede crear, es decir, si la variable local oXSLTProcessor es distinta de null, entonces la función devuelve un objeto que se crea dinámicamente utilizando JSON. El objeto consta de una propiedad, el propio objeto XSLTProcessor, y un método, transform, que es el que realmente realiza la transformación. Éste recibe dos parámetros: oXMLDom es el objeto DOM correspondiente al origen de datos XML; oOutputElement es el elemento HTML de la página que va a actualizarse con la transformación. Con el objeto

i<arrMSXMLXSLTemplate.length

&& oXSLTFreeThreadedDOM==null; i++) {

this.oXSLTProcessor.transform();

}

for (var i=0;

oXSLTFreeThreadedDOM;

DOM[i]);

return null;

[“Msxml2.XSLTemplate.4.0”, ···];

i<arrMSXMLFreeThreadedDOM.length

oXSLTFreeThreadedDOM = new

} else {

var arrMSXMLXSLTemplate =

oXSLTemplate.stylesheet =

oOutputElement) {

oXMLDom;

var oXSLTemplate = null;

for (var i=0;

transform: function(oXMLDom,

this.oXSLTProcessor.input =

los nombres de los objetos y se recorre hasta que es posible crear una instancia:

Una vez creado el objeto se carga con el código XML de la hoja XSLT usando el método loadXML y estableciendo el valor de la propiedad async a false para que loadXML se ejecute de forma síncrona. Obsérvese que loadXML recibe como parámetro una cadena de texto. En Internet Explorer la cadena de texto correspondiente al código XML de un objeto DOM se obtiene accediendo a la propiedad xml:

}

Ésta no es la única forma de utilizar hojas XSLT en Internet Explorer pero sí es la que garantiza que se puede utilizar el mismo objeto para transformar distintos documentos XML. Es decir, la idea que subyace en esta implementación es que en la aplicación Web se carga e interpreta una sola vez la hoja XSLT, y posteriormente se hacen llamadas AJAX para acceder a distintos documentos XML que se transforman con el mismo objeto.

XSLT EN MOZILLA FIREFOX Mozilla Firefox implementa de forma nativa el objeto XSLTProcessor por lo que la función

if (oXSLTFreeThreadedDOM!=null) { oXSLTFreeThreadedDOM.async = false; oXSLTFreeThreadedDOM.loadXML (oXSLTDom.xml); ··· }

El siguiente paso consiste en obtener un objeto XSLTemplate. El mecanismo empleado es el mismo que ya se ha visto en los casos anteriores: se construye un array con

Aplicación en Mozilla Firefox.

www.revistasprofesionales.com


24-28 REDES CROSS BROWER.qxd:REDES-RSS Java 1

24/7/08

13:10

Página 27

REDES

Aplicaciones Web con AJAX correspondiente resulta más sencilla. Simplemente se utiliza el constructor del objeto y después con el método importStylesheet se asigna la hoja XSLT:

} catch (e) { oXSLTProcessor = null; } if (oXSLTProcessor!=null) {

var oXSLTProcessor = null;

XSLTProcessorFactory.XSLTProcessor

try {

Creator = oXSLTProcessorCreator;

oXSLTProcessor = new

}

XSLTProcessor();

}

oXSLTProcessor.importStylesheet

EL OBJETO Transformer

(oXSLTDom); } catch (e) { oXSLTProcessor = null;

Aplicación en Internet Explorer.

} if (oXSLTProcessor!=null) { ··· } else { return null; }

El objeto devuelto, que al igual que en la función para Internet Explorer se crea usando notación JSON, cuenta con la propiedad oXSLTProcessor y con el método transform. La transformación se lleva a cabo con el método transformToFragment, que devuelve un fragmento de código HTML en forma de objeto del DOM correspondiente a la página HTML. El segundo parámetro de transformToFragment es el objeto document correspondiente al DOM de la página porque el fragmento resultante tiene que crearse precisamente sobre la página para que pueda utilizarse en la página. El elemento HTML que recibe la transformación se “vacía” asignando la cadena vacía a su propiedad innerHTML y se actualiza con appendChild: return {

EL MÉTODO newXSLTProcessor

oOutputElement) { var oFrag = this.oXSLTProcessor.transformTo

function Transformer(sXsltUrl) { this.sXsltUrl = sXsltUrl;

El método newXLSTProcessor se encarga de crear una nueva instancia de un objeto que sirva para utilizar las hojas XSLT con independencia del navegador. Si la propiedad XSLTProcessorCreator es null significa que es la primera vez que se ejecuta y que por lo tanto es necesario encontrar cuál de las funciones definidas en el array arrXSLTProcessorCreators es la que vale; en otro caso simplemente se ejecuta dicha función: var oXSLTProcessor=null; if (XSLTProcessorFactory.XSLTProcessor Creator==null) { ··· } else { oXSLTProcessor = XSLTProcessorFactory. XSLTProcessorCreator(oXSLTDom); } return oXSLTProcessor;

oXSLTProcessor: oXSLTProcessor, transform: function(oXMLDom,

El objeto Transformer se define tal y como sigue:

La búsqueda de la funcion es muy simple. Se recorre el array y se ejecutan una a una las funciones hasta que una devuelve un valor distinto de null. Entonces se actualiza el valor de XSLTProcessorCreator:

Fragment(oXMLDom, document);

this.oReadyStateListener = null; this.oXSLTProcessor = null; this.oOutputElement = null; };

Transformer.prototype = { ··· }

El constructor recibe como parámetro la URL de la hoja XSLT y establece una propiedad con este valor, y otras tres propiedades más: oReadyStateListener, que almacenará la función que el objeto Tranformer ejecuta cuando está listo para empezar a hacer transformaciones; oXSLTProcessor, el objeto devuelto por el método newXSLTProcessor del objeto XSLTProcessorFactory; y oOutputElement, que es el elemento de la página HTML que se actualizará con la transformación. Obsérvese que el propósito del objeto Transformer es que con la misma hoja XSLT se puedan hacer transformaciones de varios documentos XML. Los métodos del objeto Transformer se establecen utilizando la propiedad prototype: load: function() {···},

var oXSLTProcessorCreator=null;

setReadyStateListener:

for (var i=0;

function(oReadyStateListener) {···},

i<XSLTProcessorFactory.arrXSLT

fireReadyStateListener: function()

ProcessorCreators.length &&

{···},

XSLTProcessorFactory.XSLTProcessor

xsltDataListener: function(oXSLTDom)

Creator==null; i++) {

{···},

oXSLTProcessorCreator =

loadAndTransform: function(sXmlUrl,

XSLTProcessorFactory.arrXSLT

oOutputElement) {···},

ProcessorCreators[i];

xmlDataListener: function(oXmlAsDom)

oOutputElement.innerHTML = “”; oOutputElement.appendChild(oFrag); } };

El objetivo final de las dos funciones que se han estudiado es proporcionar un objeto que sirva para realizar las transformaciones con XSLT y que soporte las diferencias entre los navegadores de forma transparente. De ahí que se haya encapsulado la funcionalidad correspondiente a la transformación dentro de un objeto JSON. www.revistasprofesionales.com

try {

{···}

oXSLTProcessor = oXSLTProcessorCreator(oXSLTDom);

El método load carga de forma asíncrona la hoja XSLT utilizando una llamada AJAX. 27

SOLO PROGRAMADORES nº 163


24-28 REDES CROSS BROWER.qxd:REDES-RSS Java 1

24/7/08

13:10

Página 28

REDES

Cuando la carga ha concluido se llamada al método xsltDataListener pasando el objeto DOM correspondiente a la hoja XSLT (No debe olvidarse que una hoja XSLT es un documento XML). El método xsltDataListener obtiene un nuevo objeto XSLTProcessor utilizando newXSLTProcessor:

HTML cuyo identificador es con. Finalmente al ejecutar load se desencadena la carga de la hoja XSLT y con ella todas las demás tareas: var oTransformer = null; window.onload = function() { oTransformer = new Transformer(“record.xslt”);

this.oXSLTProcessor =

oTransformer.setReadyStateListener

XSLTProcessorFactory.newXSLTProcessor (

(oXSLTDom); this.fireReadyStateListener();

Además llama al método fireReady StateListener para “avisar” de que ya está listo para hacer transformaciones. La función que recibe este aviso se ha establecido con el método setReadyListener. El método loadAnd Transform recibe dos parámetros: el primero es la URL del documento XML que se quiere cargar y transformar; el segundo es el elemento dentro de la página HTML que se actualizará con dicha transformación. La ejecución de este método es asíncrona. O dicho con mayor precisión, la carga del documento XML es asíncrona: this.oOutputElement = oOutputElement; var oSelf = this;

Visión de la carga asíncrona de los distintos documentos implicados en la aplicación Web.

function() { oTransformer.loadAndTransform (“madonna-hard-candy.xml”,

parámetros y no se quisiera mandarlos en la propia URL). El segundo es la URL del documento XML. Finalmente el tercer parámetro es true, lo que indica que la llamada es asíncrona, o lo que es lo mismo, que la ejecución del código no se bloquea al ejecutar el método send, que es el que marca el comienzo de la llamada propiamente dicha. El método setRequestHeader se emplea para establecer las cabeceras HTTP de la llamada. Cuando la carga ha terminado con éxito se llama al método xmlDataListener que es el que realmente realiza la transformación actualizando así la página:

document.getElementById(“con”)); } ); oTransformer.load(); }

Dentro de la página encontramos enlaces como el que sigue: <a href=”#” onclick=”oTransformer.loadAnd Transform(‘madonna-confessions -on-a-dance-floor.xml’, document. getElementById(‘con’)); return

var oXmlHttpRequest =

this.oXSLTProcessor.transform(oXmlAsD

false;”>Madonna - Confessions On A

HttpRequestFactory.newHttpRequest();

om, this.oOutputElement);

Dance Floor</a>

oXmlHttpRequest.onreadystatechange = function() { if (oXmlHttpRequest.readyState == 4) { if (oXmlHttpRequest.status == 200) { oSelf.xmlDataListener(oXmlHttpRequest .responseXML); } } }; oXmlHttpRequest.open(“GET”, sXmlUrl, true); oXmlHttpRequest.setRequestHeader (“Cache-Control”, “no-cache”); oXmlHttpRequest.setRequestHeader (“Pragma”, “no-cache”); oXmlHttpRequest.send(null);

La propiedad onreadystatechange del objeto XmlHttpRequest guarda la función que dicho objeto ejecuta durante la carga asíncrona del documento XML. El documento XML está listo cuando el valor de readyState es 4 y el de status es 200, que es el código típico de las llamadas HTTP que concluyen con éxito. El método open recibe tres parámetros. El primero es el método de la llamada, que en este caso es GET (Podría utilizarse POST si la carga de datos requiriera

SOLO PROGRAMADORES nº 163

28

Observando la implementación del objeto Transformer se pueden ver mejor las ventajas de las implementaciones de HttpRequest Factory y de XSLTProcessorFactory. En el objeto Transformer no hay ni una sola línea de código que trate la diferencia entre Internet Explorer y Mozilla Firefox. La lógica necesaria para hacerlo ha sido encapsulada por los objetos HttpRequestFactory y de XSLTProcessor Factory. Si dentro de un tiempo surgieran nuevas versiones de los navegadores, con mejoras o diferencias en la implementación de las llamadas AJAX y las transformaciones con hojas XSLT, simplemente habría que actualizar estos objetos, pero el objeto Transformer seguiría siendo válido.

LA PÁGINA HTML En la página HTML el código Javascript necesario es mínimo. En el evento onload de la página se crea una instancia del objeto Transformer con la URL de la hoja XSLT. Antes de proceder a la carga “real” de la hoja XSLT se establece la función a la que el objeto Transformer avisa cuando está listo. Esta función lo único que hacer es llamar a loadAndTransform para cargar un documento XML y actualizar el elemento de la página

Cuando el usuario hace clic en el enlace anterior, se utiliza el mismo objeto Transformer para cargar un nuevo documento XML de forma asíncrona y actualizar la página con la misma hoja XSLT. La gran ventaja de esta solución es la reutilización del transformador para tratar diferentes documentos XML, lo que redunda sin duda en beneficio del rendimiento de la aplicación.

CONCLUSIÓN El tratamiento de documentos XML en el navegador con hojas XSLT tiene muchas ventajas. La primera es que la carga que antaño tenía que soportar el servidor se distribuye al moverla al navegador. Además la tecnología XSLT trata los documentos XML de una forma más eficiente y natural. La programación orientada a objetos con Javascript ayuda a independizar las aplicaciones de las diferencias entre los navegadores. En la siguiente entrega se estudiará cómo utilizar expresiones XPath para formular queries contra los documentos XML cargados dinámicamente. Es la otra parte de la tecnología XSLT/XPath que puede implementarse en el navegador, aportando valor las aplicaciones Web con AJAX. www.revistasprofesionales.com


Suscripcion papel:Suscripcion papel

11/8/08

11:57

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 Europa: 78 euros (gastos de envío incluidos) Opción D: Suscripción anual con 25% descuento Resto de paises: 102 euros (gastos de envío incluidos)

FORMAS DE PAGO PARA ESPAÑA  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 FORMA DE PAGO EXTRANJERO:  Tarjeta de crédito

Suscríbase en www.revistasprofesionales.com 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-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Página 30

MIDDLEWARE

Programación con Múltiples Hilos (Threads) en Visual Basic; C# y Java (III) MG. LIC. GASTÓN C. HILLAR gaston_hillar@hasa.com.ar

En la entrega anterior desarrollamos ejemplos concretos para dividir procesos en múltiples hilos de ejecución según la cantidad de núcleos disponibles, en forma totalmente dinámica y a partir de un único código fuente en Visual Basic y C#. En esta ocasión vamos a hacer esto mismo en el lenguaje de programación Java. Luego, avanzaremos con otros ejemplos en los tres lenguajes para su aplicación con bases de datos u otro tipo de colecciones de datos y aplicaremos patrones para solucionar los problemas más frecuentes. El turno de Java Todos los conceptos explicados en la entrega anterior para los hilos de ejecución en .Net también se aplican al lenguaje de programación Java, por lo tanto, no los vamos a repetir en su totalidad. Vamos a comenzar con un ejemplo muy simple, para luego complicar las cosas y ver lo aprendido en acción con un caso concreto. Por un momento, en esta ocasión dejaremos de lado .Net y nos centraremos en Java. En Java estándar no tenemos un componente del tipo BackgroundWorker, aunque son tantos los entornos de desarrollo disponibles en la actualidad, que en algunas implementaciones encontramos esta clase de wrappers que nos simplifican el trabajo. Sin embargo, como no nos enfocamos en un entorno de desarrollo en particular,

SOLO PROGRAMADORES nº 163

30

vamos a tomar lo que estará disponible en todos los casos. La base del funcionamiento de los hilos de ejecución en Java se centra en la clase Thread y en la interfaz Runnable (Ejecutable). La clase Thread y la interfaz Runnable tienen una gran complejidad, por lo cual, vamos a tomar el mismo enfoque que aplicamos para .Net, simplificar su comprensión para su aplicación en el 80% de los casos más requeridos en la mayoría de los sistemas informáticos modernos y dejar de lado el 20% de los casos más específicos y complejos que requieren de otro enfoque. Vamos a retomar el código de ejemplo que habíamos utilizado en la primera entrega para demostrar la ineficiencia del código lineal ante las arquitecturas de multiprocesamiento (repasar el Listado 1 correspondiente a Java de la primera entrega). Dividiremos ese bloque de código de un ciclo que se ejecutaba 36 millones de veces en 4 implementaciones de la interfaz Runnable que contendrán código similar, pero, cada uno ejecutando un ciclo de 90 millones de veces (90 x 4 = 360), totalizando 360 millones, para que nos de tiempo a visualizar el avance, debido a que el optimizador de Java no ejecutará las líneas de código de las variables que no utilizamos después y por el tipo de código que estamos empleando en el ejemplo, costaría visualizar el progreso del uso de cada núcleo de procesamiento. Ejecutándolo en un ordenador con cuatro núcleos de ejecución (luego veremos cómo podemos conseguir optimizar en forma dinámica este comportamiento similar a como hicimos en .Net, pero nuevamente vamos a ir por partes, porque el tema requiere de la máxima atención), obtendremos resultados similares a los explicados para .Net, es decir, un uso cercano al 100% de la capacidad de procesamiento instalada. Vamos a generar un JFrame como el que se muestra en la Figura 1, con los siguientes controles:  4 JButton (Botones), encargados de iniciar la ejecución de cada Thread. www.revistasprofesionales.com


30-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Página 31

MIDDLEWARE

Programación con Múltiples Hilos (Threads) en Visual Basic; C# y Java (III)

Figura 1. Un JFrame para empezar a experimentar con varios hilos de ejecución simultáneos en Java (preferentemente Java 5 o 6).

LISTADO 1 Lenguaje de Programación Java: import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class FrmPrincipal extends javax.swing.JFrame { private javax.swing.Timer tmrBarrasDeProceso; public java.lang.Thread Thread1; public java.lang.Thread Thread2; public java.lang.Thread Thread3; public java.lang.Thread Thread4; public java.lang.Thread ThreadHiloTimer; private long pitProgreso1; private long pitProgreso2; private long pitProgreso3; private long pitProgreso4; Runnable hiloEjecutable1 = new Runnable() { public void run() { long i; String s; char miChar; for (i=1; i<=90000000; i++) { miChar = (char) (i % 255); s = Character.toString(miChar); pitProgreso1 = i; } } }; Runnable hiloEjecutable2 = new Runnable() { public void run() { long i; String s; char miChar; for (i=1; i<=90000000; i++) { miChar = (char) (i % 255); s = Character.toString(miChar); pitProgreso2 = i; } } }; Runnable hiloEjecutable3 = new Runnable() { public void run() { long i; String s; char miChar; for (i=1; i<=90000000; i++) { miChar = (char) (i % 255); s = Character.toString(miChar);

www.revistasprofesionales.com



4 JLabel (Etiquetas) acompañando a 4 JProgressBar (Barras de progreso), que serán las encargadas de mostrar cómo avanza el procesamiento de cada hilo independiente. En el Listado 1 presentamos el código completo del ejemplo para Java, el cual explicaremos en detalle a continuación. Lo primero que hace el código del Listado 1 es declarar 4 variables del tipo Thread: Thread1; Thread2; Thread3 y Thread4. Por otro lado se define el código que ejecutará cada uno de los 4 hilos de ejecución, en las definiciones de Runnable que especifican el contenido del método run(), hiloEjecutable1 a hiloEjecutable4. Además, cada una de las implementaciones del método run() se encarga de registrar el progreso del proceso almacenando el valor de la variable i en la variable de instancia del JFrame pitProgreson, donde n será de 1 a 4 dependiendo del número de hiloEjecutable del cual está programado el método. De este modo, al igual que hacíamos con el BackgroundWorker en .Net, se logra desacoplar al hilo de ejecución de la problemática de tener que competir por la modificación de la interfaz con el usuario, es decir, por el cambio de alguna propiedad de un control visual Swing. De eso se encarga el temporizador (javax.swing.Timer) tmrBarrasDeProceso, el cual se crea con el ActionListener tareaBarrasDeProceso, con la definición del método actionPerformed, el cual hace lo siguiente, verifica si se está ejecutando código correspondiente al hilo de ejecución de cada Thread consultando el resultado del llamado a la función isAlive (Está vivo). Si el resultado es True (verdadero), quiere decir que hay código ejecutándose en ese hilo de ejecución, entonces, llama al méto31

SOLO PROGRAMADORES nº 163


30-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Página 32

MIDDLEWARE

LISTADO 1 pitProgreso3 = i; } } }; Runnable hiloEjecutable4 = new Runnable() { public void run() { long i; String s; char miChar; for (i=1; i<=90000000; i++) { miChar = (char) (i % 255); s = Character.toString(miChar); pitProgreso4 = i; } } }; ActionListener tareaBarrasDeProceso = new ActionListener() { public void actionPerformed(ActionEvent e) { if (Thread1.isAlive()) { jProgressBar1.setValue((int) (((double) pitProgreso1 90000000) * 100)); } if (Thread2.isAlive()) { jProgressBar2.setValue((int) (((double) pitProgreso2 90000000) * 100)); } if (Thread3.isAlive()) { jProgressBar3.setValue((int) (((double) pitProgreso3 90000000) * 100)); } if (Thread4.isAlive()) { jProgressBar4.setValue((int) (((double) pitProgreso4 90000000) * 100)); } } };

/

/

/

/

public FrmPrincipal() { initComponents(); //Creamos un nuevo Timer con un delay (retardo) de 100 milisegundos //es decir, de 1 segundo y le especificamos el ActionListener tareaTmrDestello tmrBarrasDeProceso = new javax.swing.Timer(100, tareaBarrasDeProceso); //Una vez creado el Timer, le pedimos que inicie el disparo de eventos //llamando al método start() tmrBarrasDeProceso.start(); Thread1 Thread2 Thread3 Thread4

= = = =

new new new new

Thread(hiloEjecutable1); Thread(hiloEjecutable2); Thread(hiloEjecutable3); Thread(hiloEjecutable4);

} private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { Thread1.start(); } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { Thread2.start(); } private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { Thread3.start(); } private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { Thread4.start(); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() {

SOLO PROGRAMADORES nº 163

32

do setValue del JProgressBar pasándole como parámetro el valor porcentual de progreso dividiendo al valor de la variable pitProgreso por 90000000 y multiplicándola por cien. Como Java está pensado para la programación concurrente desde sus inicios, en muchas ocasiones resulta más simple y directo que .Net en cuanto al acceso a variables y a la modificación de la interfaz con el usuario. En el constructor del JFrame se crean los 4 hilos de ejecución (Thread) pasándole como parámetro la implementación de Runnable que quedará asociada a esta instancia de la clase Thread y del cual disparará el método Run() y por ende, el código programado en éste. Sin embargo, no comienzan su ejecución en ese punto. Cada JButton (Botón) se encarga de arrancar el hilo de ejecución correspondiente a través del llamado al método start(), lo cual iniciará el hilo independiente del principal en forma asincrónica. Una de las grandes diferencias que notaremos con respecto a la ejecución no basada en múltiples hilos de ejecución es que una vez que se llama a este método, obtenemos el control del flujo de ejecución inmediatamente, pues, se disparó un hilo de ejecución asincrónico con respecto al hilo de ejecución principal. Además de que a nivel programación se siguen ejecutando instrucciones después de ésta, el usuario retiene el control de la interfaz con el usuario y puede seguir presionando botones, inclusive cerrar la ventana (lo cual finalizaría todos los hilos en ejecución). Como en todos los ejemplos presentados, para simplificarlos, el código no es perfecto, pues deberíamos tener en cuenta que si vuelve a presionar el botón se detenga la ejecución del Thread si no estaba frenado, pero, la idea es presentar un primer ejemplo sencillo en Java, como lo hemos hecho en las entregas anteriores. La primera experiencia para ejecutar la aplicación consiste en tener la ventana y un monitor de actividades del microprocesador, ambos visibles e ir presionando de uno en uno los botones para ir viendo cómo al dispararse cada hilo, en vez de reducirse la carga total del procesador, se va distribuyendo cada nuevo hilo en un núcleo de procesamiento e inclusive, no se disminuye el rendimiento de los otros hilos que ya se están ejecutando. Para ello está preparado el ejemplo con las JProgressBar (Barras de progreso), pues nos permiten www.revistasprofesionales.com


30-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Página 33

MIDDLEWARE

Programación con Múltiples Hilos (Threads) en Visual Basic; C# y Java (III) LISTADO 1 new FrmPrincipal().setVisible(true); } }); } // Declaración de variables private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; private javax.swing.JButton jButton4; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JProgressBar jProgressBar1; private javax.swing.JProgressBar jProgressBar2; private javax.swing.JProgressBar jProgressBar3; private javax.swing.JProgressBar jProgressBar4; // Fin de la declaración de variables }

Listado 1. Código de ejemplo de un lazo ahora presentado en 4 hilos de ejecución independientes a través de la implementación de la interfaz Runnable en Java.

visualmente detectar una caída en el rendimiento. Al igual que propusimos para .Net, como ejercicio para comparar las diferencias, vale la pena preparar esta misma solución pero utilizando Timers (Temporizadores) del tipo javax.swing.Timer en vez de instancias de la clase Thread con sus implementaciones de Runnable y visualizar la diferencia, pues como los temporizadores se ejecutan en el mismo hilo de ejecución veremos cómo se cae el rendimiento visualmente observando la velocidad de incremento de las JProgressBar (Barras de progreso). Otra vez, como Java está pensado para la programación concurrente desde su primera versión, tiene un manejo muy bien logrado de los múltiples hilos. Es conveniente ejecutar la aplicación varias veces e ir presionando los botones para comprender claramente el funcionamiento de los diferentes hilos de ejecución y sus diferencias con el ejemplo que habíamos presentado en la primera entrega. En la Figura 2 se presenta el monitoreo de la actividad de un microprocesador con cuatro núcleos ante la actividad completa de los 4 hilos de ejecución. El aprovechamiento del microprocesador oscilará entre un 98% y un 100% si utilizamos JRE 6 en la mayoría de los sistemas operativos en los cuales está disponible. Superamos el 25% que obteníamos en el primer ejemplo para Java y vemos que el esfuerzo tiene sentido. (Figura 2).

Depurando múltiples hilos en Java

Resultado de la ejecución de cuatro hilos simultáneos del ejemplo.

www.revistasprofesionales.com

Java trabaja con muchos hilos de ejecución, que a su vez se agrupan en ThreadGroups (Grupos de hilos), conformando una jerarquía en forma de árbol. Como nació preparado para la concurrencia, cualquier entorno de desarrollo de Java está preparado para ayudarnos en la depuración de aplicaciones con múltiples hilos. Estando en una sesión de depuración, después de presionar los cuatro JButton (Botones) para que arranquen los hilos de ejecución, si detenemos la ejecución del código, podremos visualizar una lista de hilos en alguna ventana que ofrezca el entorno de desarrollo. Por ejemplo, en NetBeans IDE 6.0, por tomar un entorno, seleccionando Window, Debugging, Threads (Ventana, Depuración, Hilos de ejecución (threads)), aparecerá una ventana 33

SOLO PROGRAMADORES nº 163


30-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Página 34

MIDDLEWARE

Figura 3. Visualizando los múltiples hilos de ejecución que está ejecutando la aplicación y la instrucción actual del hilo en el entorno de desarrollo NetBeans IDE 6.0.

que nos muestra todos los hilos de ejecución (threads), lo que es fundamental para poder saber dónde estamos parados (ver la Figura 3). Como explicamos anteriormente, Java trabaja con muchos hilos de ejecución, por lo que vamos a encontrar una gran cantidad listados en la ventana. Dentro de system (sistema) y main (principal), hay cuatro hilos de ejecución con los nombres Thread2 hasta Thread-5, los cuales corresponden a la ejecución de cada método Run de la implementación de la interfaz Runnable asociada a cada una de las 4 instancias de la clase Thread. Haciendo doble click en el nombre de cada hilo, nos mostrará la parte de código que se está ejecutando actualmente, como se ve en la Figura 3 y podremos inspeccionar valores de las variables. De esta manera, es posible verificar el estado de la aplicación en un momento determinado, algo que con la depuración tradicional no se podría conseguir, debido a que posiblemente el hilo de ejecución principal no esté ejecutando ninguna instrucción, como sucede en este ejemplo. Podemos saber si un hilo está en espera o durmiendo y trabajar con puntos de interrupción y observaciones (watches) en el código de los hilos. Al igual que recomendábamos en .Net, puede ser de gran ayuda enviar resultados a un archivo o a la salida de Consola, utilizando System.out.println, con información de qué tareas se han llevado a cabo.

Múltiples hilos dinámicos en Java LISTADO 2 Lenguaje de Programación Java: package javaejemplothreads2; public class Circulo { private double _radio; private double _diametro; public double getDiametro() { return _diametro; } public double getRadio() { return _radio; } public void setRadio(double nuevoRadio) { _radio = nuevoRadio; } public void calcularDiametro() { _diametro = Math.PI * Math.pow(_radio, 2); } }

Código de ejemplo de la clase Circulo en Java.

SOLO PROGRAMADORES nº 163

34

Si lo hicimos para .Net, sería muy injusto no presentar el caso para Java (así ninguno de los tres lenguajes de programación se pondrá celoso). El objetivo es el conocido, dividir los procesos críticos dinámicamente según la cantidad de núcleos de procesamiento disponibles y en base a ello generar tantos hilos de ejecución como sean necesarios. En esta ocasión, el objetivo es crear 24.000.000 (24 millones) de instancias de la clase Circulo, asignarle un valor a su radio y calcular el diámetro, guardarlos en múltiples arreglos del tipo Vector (tantas como núcleos de procesamiento disponibles existan) y luego, finalmente, juntarlas en un arreglo que contenga a las 24 millones de instancias de la clase Circulo, lo cual servirá para, entre www.revistasprofesionales.com


30-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Página 35

MIDDLEWARE

Programación con Múltiples Hilos (Threads) en Visual Basic; C# y Java (III) LISTADO 3 Lenguaje de Programación Java: package javaejemplothreads2; import java.util.Vector; public class Main { private private private private

static static static static

java.lang.Thread java.lang.Thread java.lang.Thread java.lang.Thread

private private private private private

static static static static static

Vector Vector Vector Vector Vector

t1; t2; t3; t4;

vecCirculos1; vecCirculos2; vecCirculos3; vecCirculos4; vecFinal;

static Runnable hiloEjecutable1 = new Runnable() { public void run() { long i; Circulo loCirculo; vecCirculos1 = new Vector(6000000); for (i = 1; i <= 6000000; i++) { loCirculo = new Circulo(); loCirculo.setRadio((i * 2) % 255); loCirculo.calcularDiametro(); vecCirculos1.add(loCirculo); }

otras cosas, mostrarla en una rejilla, tabla o cualquier otra tarea. Utilizamos arreglos del tipo Vector en vez de ArrayList, debido a que el primero es una lista sincronizada (synchronized), mejor preparada para trabajar con múltiples hilos de ejecución. En el Listado 2 presentamos el código de la clase Circulo, en el Listado 3 el de la aplicación preparada para 4 hilos de ejecución fijos y en el Listado 4 esa misma aplicación, pero que automáticamente determina la cantidad de núcleos disponibles y divide la tarea en tantos como existan para conseguir el mejor rendimiento posible en Java y con cualquier sistema operativo. Debido a que se trata de ejemplos que tienen un gran consumo de memoria, tenemos que especificarle los siguiente parámetros para la JVM (Java Virtual Machine – Máquina virtual de Java): -Xms256M -Xmx1200M

} }; static Runnable hiloEjecutable2 = new Runnable() { public void run() { long i; Circulo loCirculo; vecCirculos2 = new Vector(6000000); for (i = 1; i <= 6000000; i++) { loCirculo = new Circulo(); loCirculo.setRadio((i * 3) % 255); loCirculo.calcularDiametro(); vecCirculos2.add(loCirculo); } } }; static Runnable hiloEjecutable3 = new Runnable() { public void run() { long i; Circulo loCirculo; vecCirculos3 = new Vector(6000000); for (i = 1; i <= 6000000; i++) { loCirculo = new Circulo(); loCirculo.setRadio((i * 4) % 255); loCirculo.calcularDiametro(); vecCirculos3.add(loCirculo); } } }; static Runnable hiloEjecutable4 = new Runnable() { public void run() { long i; Circulo loCirculo; vecCirculos4 = new Vector(6000000); for (i = 1; i <= 6000000; i++) { loCirculo = new Circulo(); loCirculo.setRadio((i * 5) % 255); loCirculo.calcularDiametro(); vecCirculos4.add(loCirculo); } } }; public static void main(String[] args) throws InterruptedException { t1 = new Thread(hiloEjecutable1);

www.revistasprofesionales.com

De esta manera, ampliamos el espacio de la zona de intercambio con un mínimo de 256 MiB y un máximo de 1200 MiB. Si ejecutamos los ejemplos desde la línea de comandos, fuera del entorno de desarrollo, también debemos especificar estos parámetros, pues si no, es muy probable que se corte la ejecución rápidamente y nos de la falsa imagen de que solamente está utilizando entre un 25% y un 30% de la capacidad de procesamiento. Por ejemplo, si el fichero final se llama JavaEjemplo Threads2.jar, deberíamos utilizar la siguiente línea: java -jar -Xms256M -Xmx1200M JavaEjemploThreads2.jar

Si tenemos menos de 2 GiB de memoria física instalada en el ordenador en el cual ejecutemos el ejemplo, es conveniente modificar el código para que en vez de 6.000.000 (6 millones) de círculos en cada hilo y 24.000.000 (24 millones) de círculos en total sean 2.000.000 (2 millones) y 8.000.000 (8 millones) respectivamente. Pues, sino tendremos problemas de memoria insuficiente. Lo primero que hace el código del Listado 3 es declarar 4 variables del tipo java.lang.Thread: t1; t2; t3 y t4, así como 5 variables del tipo Vector: vecCirculos1; vecCirculos2; vecCirculos3 y vecCirculos4 por un lado y vecFinal, que contendrá la lista de círculos que será la sumatoria del 35

SOLO PROGRAMADORES nº 163


30-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Página 36

MIDDLEWARE

Lenguaje de Programación Java:

LISTADO 3 t2 = new Thread(hiloEjecutable2); t3 = new Thread(hiloEjecutable3); t4 = new Thread(hiloEjecutable4); t1.start(); Thread.sleep(0); t2.start(); Thread.sleep(0); t3.start(); Thread.sleep(0); t4.start(); Thread.sleep(0); t1.join(); t2.join(); t3.join(); t4.join(); vecFinal = new Vector(24000000); vecFinal.addAll(vecCirculos1); vecCirculos1 = null; vecFinal.addAll(vecCirculos2); vecCirculos2 = null; vecFinal.addAll(vecCirculos3); vecCirculos3 = null; vecFinal.addAll(vecCirculos4); vecCirculos4 = null; } }

Listado 3. Código de ejemplo de uso de 4 implementaciones de la interfaz Runnable asociadas a 4 instancias de la clase Thread en forma estática para resolver un proceso en Java.

LISTADO 4 Lenguaje de Programación Java: package javaejemplothreads3; import java.util.Vector; public class Main { private static int miTotalDeCirculos = 24000000; private static int miCantidadDeProcesadores = Runtime.getRuntime().availableProcessors(); private static java.lang.Thread[] threadsArray; private static Vector[] vecCirculos; private static Vector vecFinal; static Runnable hiloEjecutable = new Runnable() { public void run() { long i; int miNumeroThread = new Integer(Thread.currentThread().getName()); long miCantidadDeCirculos = miTotalDeCirculos / miCantidadDeProcesadores; int miMultiplicador = miNumeroThread + 1; Circulo loCirculo; vecCirculos[miNumeroThread] = new Vector((int) miCantidadDeCirculos); for (i = 1; i <= miCantidadDeCirculos; i++) { loCirculo = new Circulo(); loCirculo.setRadio((i * miMultiplicador) % 255); loCirculo.calcularDiametro(); vecCirculos[miNumeroThread].add(loCirculo); }

SOLO PROGRAMADORES nº 163

36

contenido de los 4 Vector generados por hilos de ejecución independientes. De esto se trata el proceso unificador de los resultados de múltiples hilos, como hicimos anteriormente en Visual Basic y en C#. Por otro lado se define el código que ejecutará cada uno de los 4 hilos de ejecución, en implementaciones independientes de la interfaz Runnable hiloEjecutable1 a hiloEjecutable4, con definiciones del método run(). En el procedimiento main, creamos las 4 instancias de la clase Thread pasándole como parámetro la implementación de la interfaz Runnable, de la cual deben ejecutar el método run() cuando arranquen, es decir, la tarea que llevarán a cabo. Ahora que ya tenemos creadas las instancias de la clase Thread, tenemos que indicarle que inicien su ejecución a cada una de ellas, llamando al método start() y una pausa de 0 milisegundos en el hilo de ejecución principal con Thread.sleep(0). Después, le indicamos a las 4 instancias de la clase Thread que se combinen con el hilo de ejecución principal mediante la llamada el método join(), de esta manera, una vez que finalicen sus ejecuciones, se seguirá con la ejecución de las instrucciones posteriores a estas llamadas, que, en este caso, se trata del agregado de los 4 Vector conformados a vecFinal a través del método addAll (que recibe como parámetro un Vector origen de la lista a incorporar). De ese modo, una vez que los 4 hilos de ejecución en paralelo e independientes completen cada uno de ellos su Vector con los 6.000.000 (seis millones) de círculos, se agregarán uno a uno para conformar una gran colección de 24 millones de círculos. Para evitar un exceso en el consumo de memoria, ponemos en null a cada Vector una vez que se agregó a vecFinal. Las llamadas a los métodos join serían equivalentes a las porciones de código que se muestran en el Listado 5, en el caso de Java, similar a como lo eran en Visual Basic y C#. Mientras alguno de los hilos esté ejecutando código, algo que sabemos llamando al método isAlive(), que nos devuelve un valor booleano. Si es true (verdadero), quiere decir que el hilo de ejecución todavía está en funcionamiento. Tengamos en cuenta que en Java también la llamada al método sleep (Dormir) suspende la ejecución de un hilo www.revistasprofesionales.com


30-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Página 37

MIDDLEWARE

Programación con Múltiples Hilos (Threads) en Visual Basic; C# y Java (III) LISTADO 4

Lenguaje de Programación Java:

} }; public static void main(String[] args) throws InterruptedException { threadsArray = new Thread[miCantidadDeProcesadores]; vecCirculos = new Vector[miCantidadDeProcesadores]; int miNumeroThread; for (miNumeroThread = 0; miNumeroThread < miCantidadDeProcesadores; miNumeroThread++) { threadsArray[miNumeroThread] = new Thread(hiloEjecutable); threadsArray[miNumeroThread].setName(String.valueOf(miNumeroThread)); threadsArray[miNumeroThread].start(); Thread.sleep(0); } for (miNumeroThread = 0; miNumeroThread < miCantidadDeProcesadores; miNumeroThread++) { threadsArray[miNumeroThread].join(); } vecFinal = new Vector(miTotalDeCirculos); for (miNumeroThread = 0; miNumeroThread < miCantidadDeProcesadores; miNumeroThread++) { vecFinal.addAll(vecCirculos[miNumeroThread]); vecCirculos[miNumeroThread] = null; } } }

Listado 4. Código de ejemplo de uso de implementaciones de la interfaz Runnable e instancias de la clase Thread dinámicas según la cantidad de núcleos de procesamiento disponibles para resolver un proceso en Java.

LISTADO 5

Lenguaje de Programación Java:

Lenguaje de Programación Java: while (t1.isAlive() || t2.isAlive() || t3.isAlive() || t4.isAlive()) { // Mientras esté en ejecución alguno de los 4 hilos, hago una pausa en el hilo principal // de 500 milisegundos Thread.sleep(500); }

Listado 5. Código de ejemplo equivalente (o similar) a las llamadas a los métodos join de las instancias de la clase Thread en Java.

por la cantidad de milisegundos especificada, pero sin consumir ciclos de reloj. El aprovechamiento del microprocesador de este ejemplo superará el 75% en los ordenadores equipados con múltiples hilos de ejecución en cualquiera de los sistemas operativos en los cuales está disponible Java. Un excelente ejercicio para los investigadores es ejecutar estos ejemplos en diferentes sistemas operativos, nos pueden sorprender las grandes diferencias que se presentan, debido a la actividad diferencial del planificador. Por mencionar un caso, en el sistema operativo FreeBSD 7.0 en su versión de 64 bits, el multiprocesamiento con Java tiene un rendimiento superlativo. www.revistasprofesionales.com

Como vemos, teniendo estos ejemplos en mano, no es tan complejo lanzar varios hilos de ejecución y poseer el control de éstos en Java, un lenguaje que no olvidemos que nos abre las puertas a múltiples plataformas y a una gran independencia del hardware. Ahora nos queda avanzar hacia nuestro objetivo de hacerlo en forma dinámica, por lo cual, ahora que vimos cómo se utilizan las implementaciones de la interfaz Runnable en combinación con las instancias de la clase Thread, lo haremos para que, tomando el ejemplo como base, el código resuelva en forma dinámica en cuántos hilos debe dividir el trabajo (en la primera entrega habíamos explicado cómo

detectar la cantidad de núcleos disponibles en Java). Y, con un mismo ejecutable (.jar), sin modificar nada del código, lo podamos ejecutar consiguiendo la mejor eficiencia posible en equipos con 1; 2; 3; 4; 6; 8; 16 o más núcleos de ejecución. La misma base sirve para ejecutar en un dispositivo móvil monoprocesador hasta un superordenador con 64 núcleos disponibles en múltiples procesadores físicos. En el Listado 4 se presenta un ejemplo de generalización del código del Listado 3. Tomamos el mismo enfoque empleado en .Net, pues utilizamos la propiedad Name (asignada mediante el método setName y obtenida mediante getName()) de cada instancia de Thread para fácilmente conseguir pasar un valor al método run de la implementación del a interfaz Runnable que está ejecutando un hilo de ejecución (algo que de por sí es complejo). Se definen varias variables de clase para determinar la cantidad total de círculos a crear (miTotalDeCirculos), la cantidad de núcleos de procesamiento disponibles (miCantidadDeProcesadores), un arreglo (array) de instancias de java.lang.Thread (threadsArray), un arreglo de Vector vecCirculos, para que cada hilo de ejecución almacene en una de las instancias de ese arreglo la lista de círculos que genera y, finalmente, el Vector que unirá a todos los generados, vecFinal. Todo dinámico, para que se optimice automáticamente según la cantidad de núcleos de ejecución disponibles. La implementación de la interfaz Runnable se utilizará para todas las instancias de la clase Thread que se generen, es decir, para todos los hilos. Entonces, necesitamos que sepa qué número de hilo es para que agregue los círculos en la colección correspondiente del arreglo de instancias de Vector vecCirculos. El método run de la implementación de la interfaz Runnable se ejecuta en forma asincrónica y no tenemos acceso directo a sus variables, por lo cual, aplicamos la misma solución explicada para .Net. Le indicamos el número de hilo de ejecución en la propiedad Name (Nombre) de la instancia de la clase Thread que creamos, por lo cual, dentro del método lo puede saber obteniendo el hilo actual, es decir, sabiendo quién es en ese momento, porque el método es común a todos los hilos, por lo tanto, es información que estará disponible en tiempo de ejecución, totalmente 37

SOLO PROGRAMADORES nº 163


30-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Página 38

MIDDLEWARE

LISTADO 6 Lenguaje de Programación Visual Basic: Public Class clsInformacionGrupo ' Comienzo y final (inclusive en ambos) Private priComienzo As Long Private priFinal As Long Public Shared Function GenerarGrupos(ByVal priTotalElementos As Long, ByVal priTotalPartes As Integer) As clsInformacionGrupo() ' Comienza siempre en el elemento 0 Dim liTamañoSegmento As Long Dim laInformacionGrupo() As clsInformacionGrupo Dim i As Integer Dim liTotalCubierto As Long liTamañoSegmento = (priTotalElementos / priTotalPartes) ReDim laInformacionGrupo(priTotalPartes - 1) For i = 0 To (priTotalPartes - 1) laInformacionGrupo(i) = New clsInformacionGrupo laInformacionGrupo(i).priComienzo = liTotalCubierto laInformacionGrupo(i).priFinal = liTotalCubierto + (liTamañoSegmento - 1) If (laInformacionGrupo(i).priFinal > (priTotalElementos - 1)) Then laInformacionGrupo(i).priFinal = priTotalElementos End If liTotalCubierto += liTamañoSegmento If (liTotalCubierto >= priTotalElementos) Then Exit For End If Next Return laInformacionGrupo End Function Public Property piComienzo() As Long Get piComienzo = priComienzo End Get Set(ByVal value As Long) priComienzo = value End Set End Property Public Property piFinal() As Long Get piFinal = priFinal End Get Set(ByVal value As Long) priFinal = value End Set End Property End Class Lenguaje de Programación C#: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EjemploEstadisticaMultithreadingCSharp { class clsInformacionGrupo { // Comienzo y final (inclusive en ambos) private long _comienzo; private long _final; public static clsInformacionGrupo[] generarGrupos(long priTotalElementos , int priTotalPartes) { // Comienza siempre en el elemento 0 long liTamañoSegmento; clsInformacionGrupo[] laInformacionGrupo; int i; long liTotalCubierto = 0; liTamañoSegmento = (long) (priTotalElementos / priTotalPartes); laInformacionGrupo = new clsInformacionGrupo[priTotalPartes]; for (i = 0; i < priTotalPartes; i++) { laInformacionGrupo[i] = new clsInformacionGrupo();

SOLO PROGRAMADORES nº 163

38

dinámica. Esto se consigue llamando a Thread. CurrentThread() y más precisamente a Thread.CurrentThread().getName() para saber el nombre del hilo que está representando. Con esa string se genera una instancia de Integer y se consigue el preciado número, que se almacena en la variable local miNumeroThread. Allí se resuelve uno de los enormes problemas de los múltiples hilos de ejecución y de la segmentación totalmente dinámica del procesamiento en Java, debido a la gran dificultad que presenta el desacople del método run de la interfaz Runnable. En base a este número también se determina el multiplicador que antes estaba fijo. Se utiliza la cantidad de núcleos para determinar en forma dinámica la cantidad de círculos que debe generar cada hilo, se crea el Vector prefijando esa capacidad y se procede al ciclo que no requiere mayores explicaciones. En el procedimiento Main, dimensionamos los arreglos threadsArray y vecCirculos según la cantidad de procesadores. Luego, creamos cada una de las instancias de la clase Thread, asignándole la implementación de la interfaz Runnable hiloEjecutable, le asignamos el nombre para cumplir con los objetivos explicados, llamamos al método start() y se hace una pausa de 0 milisegundos en el hilo de ejecución principal con Thread.sleep(0). Luego, en otro lazo diferente, pues ya deben estar creadas todas las instancias de la clase Thread antes de llamar a los join(), le indicamos a todas las instancias de la clase Thread que se combinen con el hilo de ejecución principal mediante la llamada al método join(), de esta manera, una vez que finalicen sus ejecuciones, se seguirá con la ejecución de las instrucciones posteriores a estas llamadas. En este caso, se trata del agregado de todos los Vector conformados a colFinal a través de un lazo que hace n llamadas al método addAll. De ese modo, una vez que los n hilos de ejecución en paralelo e independientes completen cada uno de ellos su Vector correspondiente con los x círculos, se agregarán uno a uno para conformar una gran lista de 24 millones de círculos, o del valor que hayamos especificado para la variable miTotalDeCirculos. Ahora el sistema es totalmente dinámico y nos permite experimentar inclusive en múltiples plataformas. www.revistasprofesionales.com


30-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Página 39

MIDDLEWARE

Programación con Múltiples Hilos (Threads) en Visual Basic; C# y Java (III) LISTADO 6 laInformacionGrupo[i]._comienzo = liTotalCubierto; laInformacionGrupo[i]._final = liTotalCubierto + (liTamañoSegmento - 1); if (laInformacionGrupo[i]._final > (priTotalElementos - 1)) { laInformacionGrupo[i]._final = priTotalElementos; } liTotalCubierto += liTamañoSegmento; if (liTotalCubierto >= priTotalElementos) { break; } } return laInformacionGrupo; } public long piComienzo { get { return _comienzo; } set { _comienzo = value; } } public long piFinal { get { return _final; } set { _final = value; } } } } Lenguaje de Programación Java: package javaejemplothreads4; public class ClsInformacionGrupo { // Comienzo y final (inclusive en ambos) private long _comienzo; private long _final; public static ClsInformacionGrupo[] generarGrupos(long priTotalElementos , int priTotalPartes) { // Comienza siempre en el elemento 0 long liTamañoSegmento; ClsInformacionGrupo[] laInformacionGrupo; int i; long liTotalCubierto = 0; liTamañoSegmento = (long) (priTotalElementos / priTotalPartes); laInformacionGrupo = new ClsInformacionGrupo[priTotalPartes]; for (i = 0; i < priTotalPartes; i++) { laInformacionGrupo[i] = new ClsInformacionGrupo(); laInformacionGrupo[i]._comienzo = liTotalCubierto; laInformacionGrupo[i]._final = liTotalCubierto + (liTamañoSegmento - 1); if (laInformacionGrupo[i]._final > (priTotalElementos - 1)) { laInformacionGrupo[i]._final = priTotalElementos; } liTotalCubierto += liTamañoSegmento; if (liTotalCubierto >= priTotalElementos) { break; } } return laInformacionGrupo;

www.revistasprofesionales.com

Iteraciones distribuidas Una de las operaciones clásicas que suelen demorar tiempo e impacientar a los usuarios de los sistemas informáticos son las iteraciones sobre datos para realizar una serie de procesamientos sobre éstos y luego presentarlos en pantalla. Generalmente, esto está asociado a la adquisición de los datos por parte de una fuente de datos como ser un motor de base de datos, un servidor de aplicaciones, un archivo de texto, XML, etc. A partir de allí se genera un arreglo, matriz, colección o cualquier otra forma de organización de los datos, para así ir recorriendo y realizando un procesamiento determinado, como ser obtener un máximo, un mínimo, promedios, porcentajes, etc. Si se lleva a cabo en forma lineal, se desperdicia la capacidad de procesamiento de los múltiples núcleos. Ahora bien, hacerlo en paralelo puede resultar un tanto complejo, especialmente por las interdependencias existentes entre los diferentes bloques para los cálculos que se deben realizar. Dejemos de lado la existencia de extensiones de paralelismo en .Net y Java, así como LINQ, que en este caso de ejemplo serían soluciones muy apropiadas, pero, vamos a hacerlo con múltiples hilos dinámicos para tener un mayor control y para ver cómo reorganizamos un algoritmo lineal en uno distribuido en bloques paralelos, aplicando a esta altura todo lo que hemos aprendido en estas entregas para Visual Basic, C# y Java. Desde una fuente de datos con un volumen intenso, queremos mostrar en una tabla, los siguientes datos:  Razón social.  Ventas netas (cantidad).  Monto de ventas.  Porcentaje del total. Y la siguiente información de resumen: Montos:  Monto total.  Promedio.  Promedio del valor x unidad.  Máximo.  Mínimo. Cantidades:  Cantidad total.  Promedio.  Máximo.  Mínimo. 39

SOLO PROGRAMADORES nº 163


30-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Página 40

MIDDLEWARE

LISTADO 6 } public long getComienzo() { return _comienzo; } public void setComienzo(long nuevoComienzo) { _comienzo = nuevoComienzo; } public long getFinal() { return _final; } public void setFinal(long nuevoFinal) { _final = nuevoFinal; } }

Listado 6. Código de la clase ClsInformacionGrupo que sirve para generar datos de comienzo y de final de un segmento para cada hilo en el cual se divide el trabajo con datos de origen.

LISTADO 7 Lenguaje de Programación Visual Basic: Dim miCantidadDeProcesadores As Integer = Environment.ProcessorCount Dim laoGrupos As clsInformacionGrupo() laoGrupos = clsInformacionGrupo.GenerarGrupos(5000, miCantidadDeProcesadores) Lenguaje de Programación C#: int miCantidadDeProcesadores = Environment.ProcessorCount; clsInformacionGrupo[] laoGrupos; laoGrupos = clsInformacionGrupo.generarGrupos(5000, miCantidadDeProcesadores); Lenguaje de Programación Java: int miCantidadDeProcesadores = Runtime.getRuntime().availableProcessors(); ClsInformacionGrupo[] laoGrupos; laoGrupos = ClsInformacionGrupo.generarGrupos(5000, miCantidadDeProcesadores);

Listado 7. Códigos de ejemplo de uso de la clase ClsInformacionGrupo para generar los datos de comienzo y de final para tantos segmentos como núcleos de procesamiento tenga el ordenador.

Aplicando un algoritmo lineal se puede decir que es un tema trivial, casi un juego de niños, pero, dividiendo el trabajo en bloques dinámicos, conviene asentar un patrón de solución para luego poder aplicarlo a casos similares. El primer problema con el que nos encontramos es cómo hacemos para segmentar el trabajo de acuerdo a la cantidad de núcleos disponibles para que cada hilo se encargue de un segmento de datos determinado. A diferencia de los ejemplos en los cuales hemos trabajado hasta ahora, en estos casos, es necesario que cada hilo sepa qué porción exacta de los datos (desde un comienzo hasta un final) debe tomar para trabajar. Esto requiere aplicar un algoritmo que presentamos en el Listado 6 para facilitar las cosas, con código en los tres lenguajes de programación.

SOLO PROGRAMADORES nº 163

40

Llamando al método de clase Generar Grupos obtenemos un arreglo conformado por la cantidad de procesos en los cuales queremos dividir, con sus posiciones de comienzo y de final. De ese modo, utilizando la técnica de guardar el número de hilo en la propiedad Name del Thread (algo que ya hemos explicado en detalle), accedemos a ese arreglo y el hilo sabrá desde qué elemento hasta cual de la colección debe realizar el procesamiento. Podemos generar subclases que hereden de ClsInformacion Grupo para que el hilo pueda guardar totalizadores, promedios parciales y otra información que luego se requiera procesar al final para obtener una estadística completa. Por ejemplo, si guardamos el total, el total definitivo será la suma de todos los totales almacenados en cada una de las instancias de ClsInformacionGrupo. Siempre tenemos que aplicar el nuevo par-

adigma del paralelismo y del trabajo segmentado para poder desarrollar soluciones creativas con estos nuevos esquemas de trabajo. En el Listado 7 vemos cómo se utiliza en los tres lenguajes de programación. Por ejemplo, si llamado al método los parámetros GenerarGrupos con 5000 para priCantidad Elementos y 4 para priTotalPartes (la cantidad de núcleos de procesamiento disponibles), el resultado será un arreglo con los siguientes elementos y sus valores:  Elemento 0. Comienzo = 0; Final = 1249.  Elemento 1. Comienzo = 1250; Final = 2499.  Elemento 2. Comienzo = 2500; Final = 3749.  Elemento 3. Comienzo = 3750; Final = 4999.

Cada cual atiende su juego La cantidad de elementos va a surgir de la fuente de datos que utilicemos para alimentar al proceso. Para tener la mayor flexibilidad posible, lo ideal es que en cada proceso crítico podamos especificar la cantidad de procesadores a utilizar. A partir de la llamada a un método, se pueden obtener el total de elementos a procesar, generar el arreglo con los segmentos (ClsInformacionGrupo) y con sus posiciones de comienzo y de final y que cada hilo de ejecución obtenga su información para recorrer ese segmento del total de datos, generar sus resultados y luego procesarlos al final. Es importante hacer una pausa en este punto, pues, los totales serán la sumatoria de todos los totales obtenidos para cada segmento, el mínimo será el menor de todos los mínimos conseguidos, el máximo será el mayor de todos los máximos y el promedio será el promedio de todos los promedios (valgan todas las redundancias). Entonces, para generar este tipo de procesos, podemos inclusive ayudarnos por los code snippets (porciones de código que definen un algoritmo rápidamente) para generar este comportamiento:  Generar una colección, matriz o arreglo con los datos a procesar que se pueda subdividir en porciones para el acceso (a través de números de elementos o alguna otra forma de acceso puntual). www.revistasprofesionales.com


30-41 Programacion multiples hilos:MIDDLEWARE(Programacion multiple)

24/7/08

13:04

Programación con Múltiples Hilos (Threads) en Visual Basic; C# y Java (I)  











Obtener la cantidad total de elementos de esa colección, matriz o arreglo. Obtener o determinar la cantidad de núcleos de procesamiento disponible o bien la cantidad de hilos en los cuales se va a dividir el proceso. Generar el arreglo con la información de grupos (una subclase de ClsInformacionGrupo), obteniendo así el punto de comienzo y el de final de procesamiento para cada hilo de ejecución. Dimensionar o crear un arreglo con capacidad para tantas instancias de la clase Thread (según el lenguaje de programación) como partes en las que se dividirá el proceso. Dimensionar o crear un arreglo con capacidad para tantas instancias de clases que almacenen información específica procesada o generada a partir de los datos como partes en las que se dividirá el proceso. Generar y lanzar los hilos de ejecución, estableciendo la propiedad Name (Nombre) del hilo con un número que la identifique y que le brinde el acceso al elemento de los arreglos con su información de comienzo y de fin. Si se quiere que el método sea sincrónico, es decir, que devuelva el control

cuando termina, se debe llamar a los métodos Join() o join() (según el lenguaje de programación) de la clase Thread. Sino, se puede ofrecer otro método para saber si las tareas han terminado. Las combinaciones son muchas y se pueden lograr utilizando como base todos los ejemplos presentados en estas entregas. A todo esto tenemos que agregarle la implementación de la interfaz Runnable en el caso de Java y del método que hará de hilo de ejecución en el caso de Visual Basic y C#, el cual deberá tomar la información de grupo (ClsInformacionGrupo) para saber desde qué posición de comienzo y fin debe recorrer el origen de datos para llevar a cabo el procesamiento necesario y generar los resultados deseados.

Conclusión La programación basada en múltiples hilos de ejecución ha sido siempre compleja. En estas tres entregas hemos conseguido un objetivo, el de hacer más ameno el trabajo con múltiples hilos, para aquéllos que son mortales y que no tienen decenas de años para experimentar. Hemos presentado los patrones más utilizados para optimizar los procesos más

Página 41

MIDDLEWARE

críticos. Aunque, por supuesto, han quedado una gran cantidad de temas relacionados con los múltiples hilos de ejecución sin tocar, los cuales pueden generarnos inconvenientes en determinada clase de aplicaciones, como ser los bloqueos producto de la concurrencia indebida, las prioridades de los hilos de ejecución, las formas de asesorar al planificador de la máquina virtual o del sistema operativo, entre otras cosas. Sin embargo, conseguimos un buen punto de partida para que la programación basada en múltiples hilos en forma dinámica deje de ser un tema tabú a través de ejemplos sencillos pero tomados de la experiencia de haber trabajado varios años en estas problemáticas del multiprocesamiento en Visual Basic, C# y Java. Igualmente, muchos de los conceptos se pueden aplicar a otros lenguajes de programación que soporten la programación concurrente y los múltiples hilos. Por lo cual, también servirán de base para elaborar soluciones más eficientes para la arquitectura de hardware moderna presente en los ordenadores. Ya no quedan excusas para tener muchos hilos ejecutándose en paralelo y para aprovechar al máximo posible esos núcleos de ejecución tan desperdiciados por el software actual.


REDES TECNOLOGICAS:REDES TECNOLOGICAS

11/8/08

11:52

Página 42

REDES

Tecnologías JAVA a vista de pájaro En este artículo se da una visión general de las múltiples tecnologías JAVA que siente las bases para la comprensión de una colección de artículos en la que tendremos ocasión de profundizar en todas y cada una de las tecnologías que aquí se citan.

el éxito que Java, más que un lenguaje de programación, es una verdadera plataforma de desarrollo, habida cuenta de la gran cantidad de utilidades, librerías y proyectos que han nacido para y en torno a él. El objetivo de este artículo es presentar una visión general de esta plataforma y dibujar la línea que seguiremos en los siguientes números, y cuyo fin no es otro que explicar con cierto nivel de detalle y desde un punto de vista eminentemente práctico, los entresijos de plataforma de desarrollo, así como que el lector sea consciente de las ventajas y los inconvenientes que conlleva su elección para un proyecto concreto.

Introducción

Ediciones de la plataforma

Desde que a mediados de los años 90 Sun Microsystems lanzara el lenguaje de programación JAVA, las aplicaciones que con él se pueden desarrollar han ido creciendo en riqueza, complejidad y flexibilidad. Java, gracias a su lema “Write Once, Run Anywhere”, se ha convertido en la tecnología dominante para el desarrollo de aplicaciones corporativas. De hecho, tal ha sido

La plataforma JAVA está integrada por toda una sopa de letras de siglas que todavía se complica más si añadimos librerías y extensiones. No obstante, en la actualidad es posible distinguir cuatro grandes distribuciones de JAVA, que son (ver Figura 1):  J2SE (Java 2 Stantard Edition), orientada al desarrollo de aplicaciones de usuario final.

DAVID ROLDÁN MARTÍNEZ Dr. Ingeniero en Telecomunicación, Analista-Programador del ASIC de la Universidad Politécnica de Valencia

Figura 1. Ediciones de la plataforma JAVA.

SOLO PROGRAMADORES nº 163

42

www.revistasprofesionales.com


REDES TECNOLOGICAS:REDES TECNOLOGICAS

11/8/08

11:52

Página 43

REDES

Tecnologías JAVA a vista de pájaro

Figura 3. Arquitectura de Java ME.

Figura 2. Arquitectura de Java EE.  



J2EE (Java 2 Enterprise Edition), para el entorno empresarial. J2ME (Java 2 Micro Edition), que permite el desarrollo de aplicaciones para pequeños dispositivos como teléfonos móviles, PDA, etc. JavaCard, para aplicaciones basadas en tarjetas inteligentes.





Recolección de basura o GC (Garbage Collector). El recolector de basura de JAVA libera, periódicamente, la memoria ocupada por los objetos que llevan un tiempo sin utilizarse. Manejo de seguridad, cargado de clases y verificadores de bytecode para proteger el sistema de aplicaciones “maliciosas”.

Java Standard Edition Java Enterprise Edition Define las características básicas de la plataforma, tanto para aplicaciones de usuario final (desktop applications) como para aplicaciones de servidor (server applications). La edición estándar se compone de los siguientes elementos:  Maquina virtual de java o JVM (Java Virtual Machine). Una de las características principales de JAVA es su portabilidad, que es posible gracias a que se trata de un código interpretado. En efecto, el código escrito en JAVA, al ser compilado, genera un código intermedio denominado bytecode. Estos bytecodes son interpretados por la JVM y traducidos a instrucciones del sistema operativo concreto sobre el que se esté ejecutando la JVM. De este modo las aplicaciones JAVA son independientes de la plataforma, ya que funcionan sobre la JVM. Eso sí, la JVM es diferente para cada sistema operativo. www.revistasprofesionales.com

Java EE amplía Java SE con el fin de dar soporte al desarrollo de aplicaciones corporativas, con necesidades muy diferentes a las de una aplicación de escritorio tradicional. Así, incluye gestión de transacciones, conexión a bases de datos, manejo de XML, servicios web, etc. De hecho, Java EE engloba dentro de sí misma un conjunto de API relacionadas entre sí (ver Figura 2). Es, con mucho, la distribución más compleja de JAVA y la que mayor número de tecnologías distintas engloba.

facilita el intercambio de aplicaciones desarrolladas por terceros (principalmente, juegos) de manera independiente al sistema operativo del terminal. La máquina virtual en Java ME es una simplificación de la JVM que recibe el nombre de KVM. Sobre la KVM, se construyen un conjunto de clases genéricas que se agrupan en dos perfiles, dependiendo de las prestaciones del dispositivo (ver Figura 3). Por ejemplo, en teléfonos móviles, la combinación más empleada es la configuración CLDC (Connected Limited Device Configuration) y el perfil MIDP (Mobile Information Device Profile).

JavaCard Se trata de una plataforma similar a Java ME, pero ejecutada en una smart card. Básicamente, una smart card o tarjeta inteligente es un ordenador embebido en un pequeño chip y que tiene capacidad para almacenar y procesar datos. Aplicaciones típicas de la JavaCard son la firma digital o las tarjetas monedero.

Java Micro Edition Java ME es la distribución de JAVA para dispositivos móviles y portátiles, con prestaciones inferiores a las de un ordenador convencional (Java SE y JAVA EE). El gran éxito de Java SE ME ha debido a que, gracias a la independencia de la plataforma,

Figura 4. Arquitectura de JavaCard. David Roldán Martínez Dr. Ingeniero en Telecomunicación

43

SOLO PROGRAMADORES nº 163


44-49 RSS Con Ajax:REDES-RSS Java 1

24/7/08

13:14

Página 44

REDES

Cross-browser lector de RSS con AJAX (I) La utilización de RSS en el lado del cliente representa una oportunidad excelente para enriquecer las páginas Web de un portal o servicio con información procedente de otras diversas fuentes. Gracias a AJAX ahora es posible hacerlo de manera sencilla y con una programación orientada a objetos razonablemente robusta, limpia y mantenible.

ADOLFO ALADRO GARCÍA

RSS Las siglas RSS significan Really Simple Syndication. Esta tecnología permite acceder o subscribirse a fuentes de información utilizando XML, de una forma simple y rápida. En este sentido también

puede decirse que permiten intercambiar datos en Internet entre distintos portales y servicios de un modo estandarizado. En la actualidad existen tres formatos distintos de RSS, todos ellos basados en la tecnología XML: RSS 0.91, RSS 1.0 y RSS 2.0. Atom es un formato totalmente distintos de los anteriores, aunque su propósito es el mismo. Las diferencias entre unas versiones y otras pueden estudiarse en distintos sitios en Internet (en.wikipedia.org/ wiki/RSS_(file_format)). Desde el punto de vista del desarrollo de un lector RSS con AJAX la versión utilizada no altera la metodología de trabajo, por lo que para simplificar basta con ceñir el estudio a un formato. La aplicación puede extenderse posteriormente sin muchas dificultades para que funcione con todos los formatos. El formato elegido para esta serie de artículos será RSS 2.0.

EL FORMATO RSS 2.0 En la URL feeds.technorati.com/search/ madonna?authority=a4&language=es, ofrecida por el ser-

Página principal de la Wikipedia donde se analizan los distintos formatos de RSS (en.wikipedia.org/wiki/RSS_(file_format)).

SOLO PROGRAMADORES nº 163

44

www.revistasprofesionales.com


44-49 RSS Con Ajax:REDES-RSS Java 1

24/7/08

13:14

Página 45

REDES

Cross-browser lector de RSS con AJAX (I) vicio Technorati, puede verse un fichero RSS 2.0 de ejemplo. Seguidamente se muestra un resumen de dicho fichero XML que ilustra su estructura general: <?xml version=”1.0” encoding=”utf-8”?> <rss version=”2.0” xmlns:tapi=” http://api.technorati.com/dtd/ tapi-002.xml”> <channel> <title>Technorati Search for: madonna</title> <link>http://technorati.com/search/ madonna</link> <description>Technorati search for madonna</description> ··· <item>···</item> ··· <item>···</item> </channel> </rss>

La primera línea es la declaración XML. Los archivos RSS son ficheros XML sin más y como tales pueden manejarse (Esto se aplica a tecnologías como XSL/XPath, tal y como podrá verse más adelante). El elemento raíz del documento XML se denomina <rss> y el atributo <version> indica la versión utilizada. Dependiendo del elemento rss se encuentra el elemento <channel>. El canal (channel) debe contener como mínimo tres elementos: <title>, <link> y <description>. Estos indican respectivamente el título del canal, el enlace al canal y la descripción al mismo. Un canal puede tener varios elementos <item>. Cada uno de ellos representa una noticia. Así un canal es un conjunto de noticias, normalmente ordenado por fecha. Una noticia (item) tiene tres campos obligatorios: los elementos <title>, <link> y <description>, que se corresponden respectivamente con el título, en enlace y la descripción de la noticia:

Resultado de leer RSS en el navegador con Firefox.

OTROS ELEMENTOS OPCIONALES Los elementos que hemos visto hasta el momento son los básicos. En realidad en la especificación RSS 2.0 aparecen muchos otros que completan la información. Un ejemplo es el elemento <pubDate>, que puede aparecer tanto dentro del elemento <channel> como del elemento <item>: <pubDate>Mon, 25 Feb 2008 00:42:30 -0800</pubDate>

Indica la fecha de publicación siguiendo la especificación RFC822 (asg.web.cmu.edu/rfc/ rfc822.html). Otro el elemento es <comments>, que puede aparecer dentro del elemento <item>, conteniendo un enlace a los comentarios de la noticia: <comments>http://technorati.com/ search/chickenbaby.hautetfort.com/

<item>

archive/2006/12/09/teasing-

<title>No es Marilyn, pero se le

suite.html</comments>

da una carne</title>

LECTURA DE RSS DESDE Javascript

<link>http://cineypolitica.blogspot.com/ 2008/02/no-es-marilyn-pero-se-le-dauna-carne.html</link> <description>

No es Marilyn, pero

se le da una carne···</description> ··· </item>

www.revistasprofesionales.com

Los documentos XML de los RSS son accesibles siempre mediante una URL. Por lo tanto para leerlos es necesario utilizar AJAX, la tecnología que resumidamente se puede decir que sirve específicamente para esa tarea: realizar llamadas HTTP de forma asíncrona.

Sin embargo en el desarrollo de un lector de RSS en el navegador hay muchos otros aspectos a considerar más allá de la mera llamada HTTP para acceder al RSS. El más importante de ellos es cómo convertir el documento XML devuelto por el servidor de RSS en código HTML con el que actualizar dinámicamente los contenidos de una página. Existen diversas aproximaciones. La primera consiste simplemente en utilizar el DOM, tanto del propio documento XML como del documento correspondiente a la página HTML en el navegador, para acceder a la información recibida y generar los elementos HTML necesarios. No es desde luego la mejor forma como en sucesivas entregas se verá, pero ciertamente es un método que conviene conocer ya que en algunos casos concretos puede ser indispensable. Además permite estudiar a fondo cómo se manejan documentos XML en el navegador y cómo se pueden manejar los elementos de HTML de una página desde un script.

LA PÁGINA HTML Para el ejemplo simple de esta primera entrega la página HTML va a ser muy sencilla. Seguidamente se muestra un esquema: 45

SOLO PROGRAMADORES nº 163


44-49 RSS Con Ajax:REDES-RSS Java 1

24/7/08

13:14

Página 46

REDES

Resultado de leer RSS en el navegador con Internet Explorer. <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtm l1-strict.dtd”> <html xmlns=”http://www.w3.org/ 1999/xhtml”> <head> <title>SPP - RSS</title> <style type=”text/css”>···</style> <script type=”text/javascript”

carga de todos los elementos de página. Entonces se crea un objeto RSS con la URL correspondiente y se llama al método load. Éste se encarga de realizar la llamada HTTP, procesar el documento XML que obtiene y finalmente actualizar el contenido del <div> cuyo id es con con la presentación correspondiente al RSS. El elemento <style> contiene el código CSS necesario para que la presentación se muestre con el diseño adecuado.

src=”js/rss.js”></script> <script type=”text/javascript”> window.onload = function() { var oRSS = new RSS(“http:// www.revistasprofesionales.com/rss2.xml”); oRSS.load(); } </script> </head> <body> <div id=”con”></div> </body> </html>

Toda la funcionalidad está recogida en un fichero, rss.js, concretamente en un objeto denominado RSS y que más adelante se estudiará. El evento onload marca la

SOLO PROGRAMADORES nº 163

46

asume que le navegador implementa de forma nativa el objeto XMLHttpRequest. Éste último se aplica a Internet Explorer a partir de la versión 7 y a Firefox, por citar los dos casos más populares. if (window.ActiveXObject && !window.XMLHttpRequest) { ··· } else { ··· }

EL OBJETO XMLHttpRequest En el fichero rss.js se ha creado una función muy simple, CreateXmlHttpRequest, que permite obtener un objeto XMLHttpRequest cubriendo la mayor parte de los navegadores. Al principio del código se encuentra una sentencia condicional que diferencia entre dos grandes casos. Para ello se comprueba la implementación del objeto window propio del DOM que soporta el navegador. Si el objeto window tiene la propiedad ActiveXObject y en cambio no cuenta con la propiedad XMLHttpRequest se intenta obtener el objeto usando los objetos ActiveXObject. Este caso se da principalmente con las versiones de Internet Explorer anteriores a la 7. En otro caso se

Cuando hay que obtener el objeto XMLHttpRequest usando ActiveX, es conveniente hacerlo de forma que siempre se obtenga la última versión disponible, ya que en el navegador pueden estar instaladas varias. Para ello se crea un array con todos los nombres del objeto en cuestión, haciendo referencia a su versión, y se recorre desde la versión más moderna a la más antigua: var arrMSXML = new Array (“MSXML2.XMLHTTP.5.0”, “MSXML2.XMLHTTP.4.0”, “MSXML2.XMLHTTP.3.0”, “MSXML2.XMLHTTP”, “MICROSOFT.XMLHTTP”); var iArrMSXMLLength = arrMSXML.length; for (var i=0; oXmlHttpReq==null

www.revistasprofesionales.com


44-49 RSS Con Ajax:REDES-RSS Java 1

24/7/08

13:14

Página 47

REDES

Cross-browser lector de RSS con AJAX (I) && i<iArrMSXMLLength; i++) { ··· }

En cada iteración del bucle se intenta crear una instancia del objeto en cuestión dentro de un bloque try...catch. Si se tiene éxito la variable oXmlHttpReq se establece correctamente y el bucle termina. En otro caso se pasa a intentarlo con una versión inferior del mismo objeto: try { oXmlHttpReq = new ActiveXObject(arrMSXML[i]); } catch (e) { oXmlHttpReq = null; }

Cuando el navegador implementa de forma nativa el objeto XMLHttpRequest la solución es mucho más sencilla ya que simplemente hay que crear una instancia de dicho objeto con el operador new: try { oXmlHttpReq = new XMLHttpRequest(); } catch (e) { oXmlHttpReq = null; }

EL OBJETO RSS En Javascript se ha creado un objeto nuevo, RSS, para todo el tratamiento de las llamadas y el posterior procesamiento de los XML obtenidos: function RSS(sUrl) { this.sUrl = sUrl;

Código HTML que se ha generado dinámicamente a partir del documento XML del RSS usando el DOM del navegador.

te en crear una variable que guarda una referencia al propio objeto: load: function() { var oSelf = this;

};

··· RSS.prototype = { ··· };

El objeto se define en primer lugar usando la palabra reservada function, haciendo las veces de constructor –en terminología de lenguaje de programación orientado a objetos-, y en segundo asignando a la propiedad prototype un objeto que contiene los métodos del objeto. El parámetro sUrl es la URL del RSS.

sante de este código es que dentro de esa función es preciso utilizar la variable oSelf siempre que se quiera hacer referencia a la instancia del objeto RSS responsable precisamente de la ejecución de esa llamada HTTP:

} this.oXmlHttpReq.onreadystatechange =

Esta referencia será necesaria para poder usar los métodos de esa instancia del objeto RSS en los bloques de código que se ejecutan de manera asíncrona, que es precisamente lo que sucede cuando se utiliza el objeto XMLHttpRequest. El método load crea una instancia del objeto XMLHttpRequest y al mismo tiempo define una nueva propiedad de esa instancia del objeto RSS: this.oXmlHttpReq =

function() { if (oSelf.oXmlHttpReq.readyState == 4) { if (oSelf.oXmlHttpReq.status == 200) { oSelf.xmlDataListener(oSelf.oXml HttpReq.responseXML); } } };

CreateXmlHttpRequest();

EL MÉTODO load El método load es el responsable de iniciar la descarga del RSS y, una vez terminada, ejecutar los métodos que procesan el documento XML y dan lugar a la actualización de la página HTML con la presentación. El primer paso del método consiswww.revistasprofesionales.com

Antes de hacer propiamente la llamada HTTP hay que configurar el manejador del evento que gestiona las respuestas del servidor, readystatechange. El manejador es una nueva función que se crea dinámicamente. La parte más intere-

Cuando la propiedad readyState del objeto XMLHttpRequest vale 4 y la propiedad status es igual a 200, significa que la llamada ha terminado y por lo tanto se puede acceder al XML devuelto, que está en forma de objeto DOM en la propiedad responseXML. Entonces simplemente se llama a otro 47

SOLO PROGRAMADORES nº 163


44-49 RSS Con Ajax:REDES-RSS Java 1

24/7/08

13:14

Página 48

REDES

método del objeto RSS, denominado xmlDataListener, que se el que se encarga de procesar los datos recibidos. Obsérvese que en el procesamiento de la respuesta del servidor pueden darse otros muchos casos, como por ejemplo que la conexión no se haya podido llevar a cabo o que el código correspondiente a la respuesta del servidor en vez de ser 200 sea 404 (No encontrado), 301 (Una redirección) o cualquier otra. La llamada propiamente dicha se hace justo después de establecer el valor de onreadystatechange. Con el método open se abre la conexión. El primer parámetro determina el método de la llamada HTTP, en este caso GET (No se pasan parámetros que no estén en la propia URL). El segundo es la URL. Por último el tercer parámetro es true lo que indica que la llamada es asíncrona. this.oXmlHttpReq.open(“GET”, this.sUrl, true);

Seguidamente se establecen las cabeceras HTTP de la llamada. En este primer ejemplo simplemente se indica al servidor que se no se utilice caché: this.oXmlHttpReq.setRequestHeader (“Cache-Control”, “no-cache”); this.oXmlHttpReq.setRequestHeader (“Pragma”, “no-cache”);

Finalmente la llamada al método send marca el inicio de la llamada. El parámetro que recibe es null porque el método es GET y no hay datos que pasar. Como la llamada es asíncrona la ejecución del script no se interrumpe justo al ejecutar send sino que continua: this.oXmlHttpReq.send(null);

EL MÉTODO xmlDataListener El método xmlDataListener recibe como parámetro el objeto DOM correspondiente al XML devuelto por la llamada HTTP: xmlDataListener: function(oDoc) {···}

Documentación del método createDocumentFragment del DOM estándar del navegador (developer.mozilla.org/en/docs/DOM:document.createDocumentFragment).

consiste en obtener el nodo del XML recibido correspondiente al elemento <channel> del RSS. Para ello se accede a la raíz del documento XML, el elemento <rss>, mediante a la propiedad document Element. El primer descendiente de este nodo, la propiedad firstChild, es el canal. Seguidamente se llama al método channelNodeHandler que se encarga de procesar esa sección del XML. El tercer paso es el más sencillo. Cuando channel NodeHandler ha terminado el objeto DocumentFragment contiene toda la presentación y, usando el DOM del navegador, se establece el DocumentFragment como descendiente de aquel elemento dentro de la página HTML que hará de contendor: this.oDocFrag =

forma de representa una sección o rama dentro del árbol de elementos del DOM, es decir, es simplemente una colección que permite manejar a todos los elementos como uno solo.

EL MÉTODO channelNodeHandler El método channelNodeHandler recibe como parámetro el nodo correspondiente a elemento <channel> del RSS. Al comienzo de la ejecución define tres variables que inicializa a null y que se corresponden con el título, el enlace y la descripción del canal: channelNodeHandler: function(eChannel) { var sChannelTitle=null, sChannelLink=null, sChannelDescription=null;

document.createDocumentFragment();

Su tarea se resume en tres pasos. El primero consiste en construir un objeto de tipo DocumentFragment. Éste recogerá la actualización de la página en forma de elementos de HTML. Desde el punto de vista del rendimiento de la aplicación en el navegador resulta mucho más óptimo actualizar el DOM correspondiente a la página HTML de una sola vez mediante un DocumentFragment. El segundo paso

SOLO PROGRAMADORES nº 163

48

this.channelNodeHandler(oDoc.document Element.firstChild); document.getElementById(“con”). appendChild(this.oDocFrag);

Los elementos DocumentFragment se utilizan en el DOM del navegador de la misma forma que cualquier otro elemento. En realidad un DocumentFragment, como su propio nombre indica, es una

··· }

Si el elemento tiene descendientes el método hasChildNodes devuelve true. En ese caso la propiedad childNodes es un array con todos esos nodos. Obsérvese que algunos de esos nodos descendientes del nodo <channel> serán elementos del propio canal como el título o la descripción, y otros serán elementos <item>: www.revistasprofesionales.com


44-49 RSS Con Ajax:REDES-RSS Java 1

24/7/08

13:14

Página 49

REDES

RSS con Java (I) if (eChannel.hasChildNodes()) {

oDiv.appendChild(oA);

var oChildNodes =

oA.href = sChannelLink;

eChannel.childNodes;

oA.appendChild(document.createText

var iChildNodesLength =

Node(sChannelTitle));

oChildNodes.length;

var oP = document.createElement(“p”);

for (var i=0; i<iChildNodesLength; i++) { ··· } }

En cada iteración del bucle anterior se comprueba el nombre del nodo accediendo a la propiedad nodeName. Si el nodo se corresponde con un elemento <item> entonces se llama al método itemNodeHandler del objeto RSS, que es el responsable de procesar esos elementos. En otro caso se actualiza la variable que corresponda en cada caso: var oNode = oChildNodes[i]; if (oNode.nodeName == “item”) { this.itemNodeHandler(oNode); } else if (oNode.nodeName == “title”) { sChannelTitle =

oDiv.appendChild(oP); oP.appendChild(document.createText Node(sChannelDescription)); }

if (sItemTitle!=null

El área correspondiente al título, el enlace y la descripción de un canal está contenida dentro de un elemento <div> de la página. Este elemento <div> se inserta dentro del objeto DocumentFragment antes del primer nodo del mismo con el método estándar insertBefore. La razón es que cuando se ejecuta este código ya se ha llamado tantas veces como fuera necesario al método itemNodeHandler, o lo que es mismo, el objeto Document Fragment ya tiene la presentación correspondiente a los elementos <item> del RSS. Lógicamente el título, el enlace y la descripción del canal tienen que aparecer la página antes.

oNode.firstChild.nodeValue; } else if (oNode.nodeName == “link”) { sChannelLink = oNode.firstChild.nodeValue;

El método itemNodeHandler es similar al anterior: itemNodeHandler: function(eItem) {

“description”) {

var sItemTitle=null, sItemLink=null, sItemDescription=null, sItemPubDate=null; ···

oNode.firstChild.nodeValue; }

}

La cadena de texto contenida en un elemento, por ejemplo en <title>, es en sí misma un nodo desde el punto de vista del DOM de XML. De ahí que si oNode representa al elemento <title> el contenido no de obtiene accediendo directamente a la propiedad nodeValue de ese nodo, sino que primero es necesario acceder al nodo hijo (la cadena de texto). El último paso de channelNodeHandler consiste en crear el HTML de la presentación: if (sChannelTitle!=null && sChannelLink!=null && sChannelDescription!=null) { var oDiv = document.createElement(“div”); oDiv.className = “channel”; this.oDocFrag.insertBefore (oDiv, this.oDocFrag.firstChild); var oA = document.createElement(“a”);

www.revistasprofesionales.com

&& sItemLink!=null && sItemDescription!=null) { var oDiv = document.createElement(“div”); this.oDocFrag.appendChild(oDiv); ··· }

Esto es así porque en este caso sí que se está generando la presentación en el orden adecuado. Los elementos <item> se suceden tal y como aparecen en el documento XML original. La segunda diferencia tiene que ver con el procesamiento del elemento <pubDate>, en el caso de aparecer: if (sItemPubDate!=null) {

EL MÉTODO itemNodeHandler

} else if (oNode.nodeName ==

sChannelDescription =

En lo que respecta a la generación de la presentación hay dos diferencias con respecto a lo que se hace cuando se procesan los canales. La más reseñable es que el elemento <div> correspondiente a cada elemento <item> del RSS se incluye en el DocumentFragment directamente con appendChild en vez de usando insert Before:

document.createElement(“p”); oP.className = “date”; oDiv.appendChild(oP); oP.appendChild(document.create TextNode(new Date(sItemPubDate). toString())); }

Procesa los nodos correspondientes a los elementos <item> del RSS, accediendo al título, enlace y descripción, de forma equivalente a lo que se hace en channelNodeHandler con la salvedad de que en este caso también se contempla el caso de que pueda aparecer un elemento <pubDate>: if (oNode.nodeName == “title”) { sItemTitle = oNode.firstChild.nodeValue; } else if (oNode.nodeName == “link”) { sItemLink = oNode.firstChild.nodeValue; } else if (oNode.nodeName == “description”) { sItemDescription = oNode.firstChild.nodeValue; } else if (oNode.nodeName == “pubDate”) { sItemPubDate = oNode.firstChild.nodeValue; }

var oP =

La fecha puede pasarse directamente como parámetro del constructor del objeto Date de Javascript. Además se emplea el atributo className del elemento <p> creado para poder diferenciar luego la fecha en la presentación con el código CSS responsable del diseño de la presentación.

CONCLUSIÓN La solución empleada en esta primera entrega tiene una función didáctica más que real, ya que normalmente no se genera una presentación a partir de un documento XML usando el DOM. Lo más normal es utilizar otras tecnologías como XPath o XSLT. Además en sucesivas entregas analizaremos algunos problemas clásicos de las llamadas HTTP que afectan a la lectura de RSS desde distintos dominios. 49

SOLO PROGRAMADORES nº 163


50-57

MVCII:MIDDLEWARE(Programacion multiple)

24/7/08

13:06

Página 50

MIDDLEWARE

Microsoft ASP.NET MVC (paradigmna de modelo, controlador y vista) (II) El paradigma de modelo, controlador y vista de Microsoft ASP.NET (MVC) es una implementación para .NET, que ofrece una solución diferente para la construcción de aplicaciones Web. En esta segunda entrega veremos algunas características avanzadas de la infraestructura, con el fin de que comprender este en su totalidad.

Básicamente, el paradigma de modelo, controlador y vistas ofrece una aproximación diferente para el desarrollo de aplicaciones Web. Si bien esta viene siendo usado por empresas de código abierto desde hace ya bastante tiempo (ej. Monorail), es la primera vez que Microsoft accede a este terreno. En la nueva infraestructura, se dejan de lado los formularios Web para dar paso a un nuevo tipo de páginas dinámicas llamadas “vistas”. El “nuevo” modelo se basa en la separación física de la aplicación en 3 partes; cada una de las cuales tienen un role específico (figura 1).

El paradigma de modelo, controlador y vista de Microsoft ASP.NET (MVC) es una implementación para .NET, que ofrece una solución diferente para la construcción de aplicaciones Web. En esta segunda entrega veremos algunas características avanzadas de la infraestructura, con el fin de que comprender este en su totalidad.

Separar las distintas funcionalidades así como hacer que los elementos sean reusables y fáciles de mantener es el objetivo principal de MVC. Veamos entonces los 3 distintos grupos y su interacción (figura 2):  M od elo Este es el sitio donde se almacena el código que obtiene la información de la base de datos. La clase “Socios” con su método “obtener” debería ir allí, así como también los componentes que llevan adelante la lógica de negocio (por ejemplo, “calcularDeuda Socio”).  Vi s ta s Este es el sitio donde las interfaces gráficas deberán ser depositadas. Las mismas no tienen contacto directo con las clases del modelo (base de datos o lógica de negocios). En sí, alguien (controlador) ejecuta la lógica de negocio y obtiene la información, pasándola posteriormente a la vista (página).  Co ntrol ado r El controlador recibe una acción del usuario y decide qué página (vista) mostrar. El proceso implica invocar la lógica de negocios adecuada, obtener los datos, e inyectar la información en la vista, que será finalmente retornada al usuario.

ERICH BÜHLER

Introducción En la entrega anterior me encargué de explicarte como funciona ASP.NET MVC , así como también el porqué de su existencia. Ahora, haré una breve reseña de lo ya visto para luego sumergirme en otras características de la implementación.

Figura1.

SOLO PROGRAMADORES nº 163

50

Separación de presentación, negocio y datos

www.revistasprofesionales.com


50-57

MVCII:MIDDLEWARE(Programacion multiple)

24/7/08

13:07

Página 51

MIDDLEWARE

Microsoft ASP.NET MVC (paradigmna de modelo, controlador y vista) (II) Esto ayuda a mejorar la calidad final del producto, aunque no obstante, debo dejar un voto negativo para Microsoft ya no se instala la opción si tienes una versión inferior a Visual Studio Professional. Según mi criterio, este tipo de proyecto debería estar disponible en todas las ediciones, ya que forma parte de un elemento indispensable para cualquier aplicación seria. Figura 2.

Mejorando la calidad del producto Una de las ventajas del desacoplamiento físico de las diferentes capas es la posibilidad de realizar la verificación de las mismas (testing) en forma independiente. Esto es especialmente un problema en las aplicaciones ASP.NET, donde parte de la lógica reside dentro del formulario Web. Es así que cuando se crea un proyecto ASP.NET MVC, se brinda también la posibilidad de agregar otro donde escribir sus pruebas (“test”) (figura 3).

REST como forma de organizar los recursos Como característica adicional, el paradigma emplea la arquitectura llamada REST (Representational State Transfer o estado figurativo de transferencia), que básicamente indica cómo se organizan los recursos en una solución Web y como se accederá a los mismos.. “ E n R E S T, e n v e z d e h a c e r s e r e f e r e n cia a un a p á g ina m e di a nt e su n om b r e , do c u m e n t o , s e r v i c i o W e b, e t c ., s e or g a ni z a en u na e st r uc t u r a ló gi ca d e sub-c arp etas”

Esta es la primera diferencia importante con ASP.NET. REST trata entonces de organizar los recursos de una aplicación Web de forma “natural”. En vez de hacerse referencia a una página mediante su nombre, documento, servicio Web, etc., se organiza en una estructura lógica de sub-carpetas. Cada una de estas representa un elemento en particular, que puede ser obtenido si se escribe la dirección Web correcta. La tabla 1 te muestra algunos ejemplos en la modalidad estándar y su contrapartida en REST. Como puedes apreciar, la página que lista los socios se llama ListaSocios.aspx en el mundo ASP.NET estándar, y será traída al explorador en el mundo REST mediante la URL http://servidor.com/Socios/Listar/. Básicamente cuando se indica este conjunto de carpetas, se usará un “controlador” llamado “Socios” en el servidor, que conoce que “Lista” se corresponde con la página ListaSocios.aspx. /<Controlador>/<Acción>/ /Socios/Listar/

“La primera d el arch ivo tras qu e la aun qu e esto

ca rp et a es el no m br e d e c o n t r o l a d o r, m i e n seg und a es la acc ió n, p ued e ser c on figu rado ”

Este controlador es en realidad una clase en el servidor, que contiene las directivas de hacia dónde se deberá ir, que lógica de negocios ejecutar, y qué se tendrá que retornar. En la tercera fila de la tabla (donde se especifica servidor.com/Socios/ Mostrar/ 3/), se utiliza un nuevo elemento, que es en realidad el parámetro a pasar al controlador. /<Controlador>/<Acción>/<Parámetro>/ /Socios/Mostrar/3/

Figura 3.

TABLA 1 A p r o x im a c i ó n A S P. N E T http://servidor.com/PrincipalSocios.aspx http://servidor.com/ListaSocios.aspx http://servidor.com/DetalleSocio.aspx&Id=3 http://servidor.com/ModificarSocio.aspx&Id=1 http://servidor.com/EliminarSocio.aspx&Id=15 http://servidor.com/Socio22.doc

A ho r a e n A S P. N E T M V C ( R E S T ) http://servidor.com/Socios/Principal/ http://servidor.com/Socios/Listar/ http://servidor.com/Socios/Mostrar/3/ http://servidor.com/Socios/Mostrar/1/ http://servidor.com/Socios/Modificar/1/ http://servidor.com/Socios/Mostrar/15/ http://servidor.com/Socios/Eliminar/15/ http://servidor.com/Socios/Detalle/ Documentos/22/

D e sc ri p c i ó n Obtiene el recurso principal asignado al socio. Lista todos los socios. Obtiene los detalles del socio con identificador igual a 3. Modifica el socio con el identificador 1. Elimina al socio con el identificador 15. Obtiene el documento de Microsoft Word relacio nado al socio 22.

Tabla 1: Algunos ejemplos de organización de recursos mediante ASP.NET y su contrapartida en REST (estado figurativo de transferencia).

www.revistasprofesionales.com

51

SOLO PROGRAMADORES nº 163


50-57

MVCII:MIDDLEWARE(Programacion multiple)

24/7/08

13:07

Página 52

MIDDLEWARE

Es importante que sepas que ASP.NET MVC no puede ser instalado en la edición “express” de Visual Web Developer 2008. Si todo sale bien, deberías encontrar el siguiente nuevo proyecto al abrir Visual studio. “ A S P. N E T M V C p o r a h o r a f u n c i o n a e n las v ersio nes n o ´ ex pres s´ d e V is ua l S t ud io , ni la a r uit e ct u ra d e ‘ testin g’ en Vis ual Stud io Stand ard” La instalación agrega algunos nuevos tipos de proyecto, que utilizarán detrás de escena los siguientes tres ensamblados: System.Web.Abstractions System.Web.Mvc

Figura 4.

Se podría a su vez indicar más parámetros simplemente usando la notación de URL extendido, como se muestra a continuación, y de hecho, se cuenta con un conjunto de controles que facilitan el paso de valores (veremos esto en breve). /Socios/Mostrar?empleado=3& localidad=chelsea&pais=uk

Por dónde comenzar... Antes de seguir, te recomiendo que bajes y la instales, así como también verifiques que tienes Visual Studio 2008; lo que implica implícitamente la existencia de .NET 3.5 en tu sistema. Ve entonces al siguiente hipervínculo para obtener el paquete: (ver Figura 4) http://www.asp.net/downloads/ 3.5-extensions/

Figura 6.

Figura 7.

LISTADO 1 public class SociosController : Controller { public ActionResult Listar() { ViewData["Título"] = "Lista Socios"; ViewData["Mensaje"] = "Esta página lista los socios..."; return View("ListaSocios"); } public ActionResult Mostrar(int? númeroSocio) { ViewData["Título"] = "Exhibe la información de un socio"; ViewData["Mensaje"] = "Esta página muestra un socio..."; ViewData["númeroSocio"] = númeroSocio; return View("MuestraSocio"); } }

Figura 5.

SOLO PROGRAMADORES nº 163

52

www.revistasprofesionales.com


50-57

MVCII:MIDDLEWARE(Programacion multiple)

24/7/08

13:07

Página 53

MIDDLEWARE

Microsoft ASP.NET MVC (paradigmna de modelo, controlador y vista) (II) LISTADO 2 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MuestraSocio.aspx.cs" Inherits="MvcApplication1.Views.Socios.MuestraSocio" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> </head> <body> <div> <div> <h1><%=Html.Encode(ViewData["Título"]) %></h1> <br /> <br /> <h2><%=Html.Encode(ViewData["Mensaje"]) %></h2> <br /> <h2><%=Html.Encode(ViewData["númeroSocio"])%></h2> </div> </body> </html>

System.Web.Routing Podrás encontrar los mismos dentro de la siguiente ruta: <unidad>:\<archivos de programa>\Microsoft ASP.NET\ASP.NET MVC\Assemblies

Se guardan dentro de una carpeta y no en la caché de ensamblados global, con la idea de que puedan ser fácilmente adicionados a un proyecto existente.

Archivos de Controlador en Microsoft ASP.NET MVC Cuando se crea en Visual Studio una aplicación Web de ASP.NET MVC, la plantilla adiciona automáticamente distintas carpetas, que contienen los diferentes archivos (controladores, vistas y el modelo), así como un pequeño ejemplo de uso (figura 5). Como te comenté anteriormente, cada una almacena un tipo de funcionalidad en particular. Imagina entonces que deseas crear una aplicación que ofrezca una pági-

Figura 8.

www.revistasprofesionales.com

na de socios, a la que puedas pasar un parámetro llamado “listar”. Para ello, deberías pensar primero en una línea URL como la siguiente: http://<nombre del servidor>/socios/listar

Cada vez que se reciba este requerimiento en el servidor, se buscará dentro de la carpeta que contiene los controladores (aquí llamada “Controllers”; ver figura 6) para ver si existe una clase llamada “Socios Controller.cs” (de no estar allí se emitirá un error). “M VC e xtrae el texto q ue se enc uen tra a c o ntinu aci ón d el no mbre de l serv ido r (S o cio s) y adic io na la p ala b r a C o n t r o l l e r. c s ” Lo que básicamente hace MVC es extraer el texto que está a continuación del nombre del servidor (Socios) y adicionar la palabra “Controller.cs”. Para que todo funcione correctamente, la clase tiene que heredar sus características de “Controllers”; que es en definitiva quien brinda la infraestructura necesaria para que se intercepten las invocaciones Web. Veamos ahora una clase de controlador (listado 1).

LISTADO 3 public class socio { public string Título{get;set;} public string Mensaje{get;set;} public int NúmeroSocio{get;set;} }

LISTADO 4 namespace MvcApplication1.Views.Socios { public partial class MuestraSocio : ViewPage<socio> { } }

LISTADO 5 <%@ Import Namespace="MvcApplication1.Socios" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> </head> <body> <div> <div> <h1><%= ViewData.Título %></h1> <br /> <br /> <h2><%=ViewData.Mensaje%></h2> <br /> <h2><%=ViewData.NúmeroSocio%></h2> </div> </div> </body> </html>

53

SOLO PROGRAMADORES nº 163


50-57

MVCII:MIDDLEWARE(Programacion multiple)

24/7/08

13:07

Página 54

MIDDLEWARE

En este caso se tendrán disponibles las dos siguientes acciones para un socio:

LISTADO 6 socio soc = new socio();

/Socios/Listar/ /Socios/Mostrar/

//ViewData["Título"] = "Exhibe socio"; soc.Título = "Exhibe socio";

“MVC no util iza las técnicas clásicas d e r een ví o d e da t o s a l a mi s m a p a ntalla, por lo que los controles A S P. N E T n o p u e d e n s e r u t i l i z a d o s ” La instrucción View es quien finalmente efectúa la acción mágica; debe especificar el nombre del archivo de vista a retornar, el cual tiene que estar situado dentro de una carpeta con igual nombre que el controlador pero sin la palabra “Controller”. Si este último se omite, buscará automáticamente una vista con el nombre del método. (figura 7).

Archivos de vista en Microsoft ASP.NET MVC Si bien las vistas son los “formularios Web” del mundo MVC, no tienen acceso directo al modelo (capas de negocio y datos). Es entonces el controlador quien debe inyectar la información si se quiere que esta esté disponible. Una vista gana sus cualidades de una clase llamada ViewPage, que ofrece un basto conjunto de propiedades. El listado 2 presenta un pequeño ejemplo, que muestra cómo usar la información pasada desde el controlador (observa el resultado en la figura 8). “ L a c lase H t ml est á cont enida en S y st e m. Web. M v c . V i e wPa g e y s u p ri nci p al ob jet i vo es a yuda r c on tareas relacionadas a la interfaz g ráfica” Se cuenta además con una página maestra (masterpage) y una carpeta de vistas compartidas (shared), que hacen posible la reutilización de elementos. Por su parte, la clase Html ofrece un conjunto elevado de métodos, que ayudan con la creación de los distintos controles o tareas relacionadas con la interfaz gráfica. Como puedes ver, ViewData funciona como una “bolsa” donde el controlador deposita la información que la vista tendrá disponible. La idea es que se pongan allí los datos obtenidos de los objetos de negocio o base de datos para luego ser pasados a la vista, que podrá decidir cuál de ellos exhibir y dónde. Finalmente, una

SOLO PROGRAMADORES nº 163

54

//ViewData["Mensaje"] = "Esta página lista los socios..."; soc.Mensaje = "Exhibe la información de un socio"; //ViewData["númeroSocio"] = id; soc.NúmeroSocio = id==null ? 0:Convert.ToInt16(id); return View("MuestraSocio",soc);

LISTADO 7 public ActionResult Listar() { IEnumerable<Socio> socios = (from s in cd.Socios orderby s.Nombre select s); return View("ListaSocios", socios); }

LISTADO 8 <div> <table style="width:100%;"> <tr style="background-color:Lime"> <td> <b>Nombre</b></td> <td> <b>Apellido</b></td> <td> <b>Fecha de nacimiento</b></td> <td> <b>Tipo de mensualidad</b></td> </tr> <% foreach (var c in ViewData.Socios) { %> <tr> <td><%=c.Nombre %></td> <td><%=c.Apellido %></td> <td><%=c.FechaNacimiento %></td> <td><%=c.TipodeMensualidad %></td> </tr> <%} %> </table> </div>

Figura 9.

www.revistasprofesionales.com


50-57

MVCII:MIDDLEWARE(Programacion multiple)

24/7/08

13:07

Página 55

MIDDLEWARE

Microsoft ASP.NET MVC (paradigmna de modelo, controlador y vista) (II)

TABLA 2 Mé todo ActionLink Button Checkbox DropdownList Form Image Listbox SubmitButton

D e sc ri p c i ó n Escribe un elemento que permita al usuario ir a otra vista. El resultado HTML es un hipervínculo estándar. Botón estándar HTML Elemento estándar HTML. Lista HTML con algunas características adicionales para facilitar la gestión de datos. Hace posible gestionar formularios HTML. dentro de MVC. Representa un control de imagen estándar HTML. Elemento estándar HTML, pero con algunas facilidades para la utilización de datos. Permite enviar el contenido de un formulario a otra vista.

Tabla 2: Alguno de los métodos de la clase HTML.

característica interesante radica en la posibilidad de indicar el tipo de dato para ViewData, con el fin de utilizar un tipo definido en vez de la colección genérica.

LISTADO 9 Formulario <%using (Html.Form("Socios", "Guarda")) { %> Nombre: <%=Html.TextBox("Nombre","Juan Perez") %> Dirección <%=Html.TextBox("Dirección","Calle de las orcas 23") %>

Vista con tipos definidos El elemento ViewData es de forma predeterminado un objeto genérico, no obstante, es posible indicarle al compilador que se desea usar un tipo específico. Ello dará como resultado que se tengan los métodos y propiedades de la clase original mediante intellisense, así como también su posterior validación. Para lograr esto hay que llevar adelante dos pasos:

<%=Html.SubmitButton("Guardar") %> <%} %>

LISTADO 10 <form action="/Socios/Guarda" method="post" > Nombre: <input type="text" name="Nombre" id="Nombre" value="Juan Perez" /> Dirección <input type="text" name="Dirección" id="Dirección" value="Calle de las orcas 23" /> <input type="submit"

value="Guardar"

name="Guardar"

id="Guardar"

/> </form>

Figura 10. 

Definir la vista del tipo deseado mediante la utilización de tipos genéricos  Emplear la nueva clase en vez de hacer uso de su opción genérica. Veamos entonces un ejemplo de esto último, que creo que te ayudará a entender mejor de qué se trata. He creado una clase llamada “socio”, que contiene la siguiente estructura: (ver Listado 3) Una vez ella definida, tendrás que ir al código detrás de escena de la vista en cuestión para indicar que se desea que ésta sea de un tipo específico. Presta atención al listado 4. Finalmente se tiene que importar en el espacio de nombres donde la clase personalizada se encuentra y por último hacer uso de sus diferentes miembros (listado 5).

LISTADO 11 public class SociosController : Controller { public ActionResult Guarda() { //Guarda los cambios en el socio... //<A ser implementado> //Retorna a la página principal return View("Muestra"); } }

LISTADO 12 [TestMethod] public void TestMethod1() { SociosController controller = new SociosController(); // Ejecuta la vista ViewResult result = controller.Muestra() as ViewResult; // Verifica que se estén recibiendo los valores esperados. ViewDataDictionary viewData = result.ViewData as ViewDataDictionary; Assert.AreEqual("Erich", viewData["Nombre"]); Assert.AreEqual("Buhler", viewData["Apellido"]);

Figura 11.

www.revistasprofesionales.com

}

55

SOLO PROGRAMADORES nº 163


50-57

MVCII:MIDDLEWARE(Programacion multiple)

24/7/08

13:07

Página 56

MIDDLEWARE

Por supuesto que deberás también pasar en el controlador dicha clase, como se muestra a continuación: (ver Lstado 6) Es entonces cuando al especificar el objeto ViewData de un tipo específico brinda las siguientes ventajas:  No se utilizan cadenas de texto (por ejemplo ViewData[“Título”]), que no pueden ser verificadas por el compilador.  No hay que convertir los valores contenidos por ViewData ya que se conservan los tipos originales.  Se obtiene Intellisense, lo que hace que sea mucho más fácil escribir el código  Se pueden emplear las herramientas de Visual Studio para llevar adelante las técnicas de optimización (refactoring) de código.

LISTADO 13 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "PrimerControlador", // Nombre de este controlador "{controller}/{action}/{id}", // Formato de URL new { controller = "Socios", action = "Mostrar", id = "200" } // Valores predeterminados ); }

LISTADO 14 routes.MapRoute( "PrimerControlador", "gimnasio/{controller}/{action}/{id}", new { controller = "Socios", action = "Mostrar", id = "200" } );

Por ejemplo, la siguiente línea creará un hipevínculo que redireccionará el usuario a la acción “Muestra” del controlador de socios (figura 10). Hipervinculo: <%= Html.ActionLink(“Va a mostrar socio”,

Figura 12.

Vistas y colecciones

Formularios y controles

Debido a que las vistas tienen acceso a los objetos pasados dentro de ViewData, también se pueden gestionar colecciones, lo que es de mucha utilidad. El siguiente ejemplo utiliza Linq a SQL para obtener y ordenar los socios por nombre, para luego transferirlos a la vista correspondiente (listado 7). Por supuesto que deberás cambiar el tipo de datos de la vista a un elemento que soporte la interfaz “IEnumerable”, ya que ahora se estará pasando una colección de socios en vez de uno solo.

Todo en ASP.NET se basa en el re-envío de la información al mismo formulario Web, esto es, mediante las técnicas “post”. No obstante, como vimos anteriormente, ASP.NET MVC no funciona de esta forma y todo se reduce a redirigir el flujo a un nuevo controlador y acción.

public partial class Lista : ViewPage<IEnumerable<Socio>>

Por último, en la interfaz gráfica se debe usar la estructura foreach para acceder a los diferentes elementos de la colección y así desplegarlos en una tabla (listado 8, Figura 9).

SOLO PROGRAMADORES nº 163

56

“En M VC tod o e ven to d el usu ario inv oc ará una ac ció n en e l c o ntrol ad o r, e n v e z d e l l a m a r s e l a m i s m a pág in a” Por eso no es posible emplear los elementos estándares ASP.NET, que en un principio da la sensación de que algo anda mal. Para solucionar este inconveniente, se ofrece una clase estática llamada “Html” que contiene varios métodos, que ayudan a escribir los elementos de la interfaz gráfica. Observa la tabla 2.

También es usual emplear un formulario dentro de una vista, por lo que el método “Form”, es el que te ayudará en este caso. El miembro se utiliza principalmente cuando se desea pasar información entre acciones, y se usa en general en conjunto con el método SubmitButton (listado 9). Aquí se incluye la instrucción “using”, que en realidad delimita los puntos entre los que se quiere incluir las etiquetas de formulario. El

Figura 13.

www.revistasprofesionales.com


50-57

MVCII:MIDDLEWARE(Programacion multiple)

24/7/08

13:07

Página 57

MIDDLEWARE

Programación con Múltiples Hilos (Threads) en Visual Basic; C# y Java (I)

TABLA 3 Ru ta /{controller}/{tabla}/{action}/{id}

/{controller}-{action}/{id} {zona}/{mes}/{controller}-{action}/{id} tienda/{controller}_{action}/{id} /{controller}/{action}/{*parametros}

D e sc ri p c i ó n Aquí el valor “tabla” es un segmento variable (donde se puede especificar cualquier valor) mientras que controller, action y id son el nombre del controlador, acción e identificador esperados. Algunos ejemplos: /socios/socio/Mostrar/101 /ventas/productos/listar/13-1-2008/ /socios-listar/200/ /europa/08/socios_mostrar/5 ienda/Socios_mostrar/5 Aquí se indica que tras el nombre de controlador y acción es posible pasar un número variable de parámetros; por ejemplo: /Socios/mostrar/a/b/c

Otros ejemplos de direccionamiento.

LISTADO 15 public void Page_Load(object sender, System.EventArgs e) { Response.Redirect("~/Socios"); }

Figura 14.

resultado final generado es similar al del listado 10 y figura 11: Como puedes apreciar, el botón de guardar envía los datos a la acción “Guarda” del controlador “Socios”, por lo que detrás de escenas tendrás también que implementar dicha función (listado 11). Por último comentar que ahora es posible tener varios formularios en una misma página, cosa que era prácticamente imposible en ASP.NET.

Tu aplicación a prueba de balas Una de las ventajas de MVC es que se pueden probar cada una de las distintas capas, con el fin de asegurarse de que todo funciona correctamente. Para ello, cuando se crea un proyecto Web de ASP.NET MVC, se te sugerirá la creación de uno adicional de “testing”. Esto te permitirá escribir las diferentes pruebas para las distintas vistas, con el fin de verificar que todo funciona como debería. (ver Figura 12). En teoría, deberías escribir el “test” primero, ingresando los valores que esperas que la vista reciba, para luego ir a ésta e implementar su funcionalidad. De esta forma, si vas al proyecto de Test que se adiciona automáticamente y haces clic derecho podrás agregar www.revistasprofesionales.com

una nueva unidad de test para el controlador a verificar (por ejemplo el de socios). (ver Figura 13) Una vez adicionado el archivo, tendrás que escribir una nueva función, que verifique cual es la información esperada. El listado 12 muestra una función que prueba que los valores esperados son los correctos. Aquí se emplea AreEqual para comparar el valor retornado por la vista con el que creemos será inyectado por el controlador. Como puedes ver, adicionar un “test” a una solución Web MVC es algo realmente sencillo; todo se remite a crear una instancia de la vista para luego verificar los valores recibidos.

Especificando vistas y parámetros predeterminados Mencioné anteriormente que la composición de la dirección URL para acceder a una vista debía estar en el siguiente formato: /<Controlador>/<Acción>/<Parámetro>/ ****fin código

Esto es así ya que dentro del archivo Global.asax existe un procedimiento llamado “RegisterRouter” que establece el criterio la primera vez que se ejecuta el proyecto (listado 13). Las llaves indican un segmento de texto variable donde el usuario puede ingresar cualquier información, que será posteriormente adicionada a la ruta y buscada en la

carpeta de controladores. Como ves, es también posible especificar un valor predeterminado. En este caso, si se recibe “/<Nombre del servidor>/Socios/” se irá a “/<Nombre del servidor>/Socios/Mostrar/ 200”. No obstante, la aproximación es aún más flexible, ya que cualquier texto que se escriba fuera de las llaves será considerado una constante. La siguiente línea (listado y figura 14) hará la vista accesible de una forma diferente: La tabla 3 muestra algunos ejemplos adicionales con posibles opciones de direccionamiento. Presta particular atención a la última fila de la tabla, que exhibe cómo contar con un número variable de parámetros. Como ves, MVC es muy flexible y permite modificar los puntos de acceso sin cambiar la distribución física de la aplicación. Existen también algunas opciones avanzadas, tal como la de indicar restricciones a la dirección URL, sin embargo, dejaré esto de lado ya que se incluye un ejemplo en la ayuda del producto. Una cosa más a la hora de ejecutar tu aplicación Web es que dentro del archivo predeterminado (default.aspx), hay una línea de código que efectúa el pasaje al controlador inicial (listado 15). Es importante que modifiques ésta si deseas que se vaya a una vista distinta al ejecutar la aplicación. Hasta aquí llego con la entrega de Microsoft ASP.NET MVC; espero que haya sido de tu agrado y me despido hasta después del verano, donde estaré tratando otro conjunto de nuevas tecnologías de Microsoft. Como siempre me puedes escribir a tuscomentariosmeimportan@ Hotmail.com. Mientras tanto, ¡disfruta del sol y del buen clima! 57

SOLO PROGRAMADORES nº 163


AGPM Computers:AGPM Computers

11/8/08

11:59

Pรกgina 1


sorteo:sorteo

11/8/08

11:30

Página 1

YA“NOVEDADES TENEMOS GANADOR DEL LIBRO DE VISUAL BASIC 9.0” El ganador es: Antonio Juan Moreno Vega Agradecemos a Antonio y a todos los lectores que han dedicado parte de su valioso tiempo a informarnos de sus opiniones, las ideas, propuestas, consejos y, cómo no, quejas que servirán para continuar con la mejora de la publicación. Para todos aquellos que deseen la adquisición del libro, volvemos a incluir los datos principales del mismo. Novedades de Visual Basic 9.0 contiene toda la información sobre la nueva versión del compilador de Visual Basic que se incluye en Visual Studio 2008. Novedades que se desglosan en tres partes, en la primera se cuenta todo lo referente al entorno de desarrollo, qué novedades se incorporan y cómo aprovecharlas desde el punto de vista del programador de Visual Basic. En la segunda se explican con todo lujo de detalles, todas las novedades del lenguaje, desde las nuevas instrucciones y opciones del compilador, hasta las novedades "necesarias" para trabajar con la nueva tecnología de las consultas LINQ; tema que se cubre a fondo en la tercera parte del libro, centrándose principalmente en las instrucciones de consulta incluidas en el compilador para dar soporte a las diferentes tecnologías relacionadas con LINQ: LINQ to Objects, LINQ to XML, LINQ to DataSet y LINQ to SQL. Guillermo “Guille” Som Es conocido en Internet por su portal dedicado exclusivamente a la programación, principalmente con Visual Basic y todo lo relacionado con punto NET, (http://www.elGuille.info/). Desde noviembre de 1997 es reconocido por Microsoft como MVP (Most Valuable Professional) de Visual Basic. Es orador internacional de Ineta con la que imparte charlas en muchos países de Latinoamérica y es mentor de Solid Quality Mentors, la empresa líder en consultoría y formación. Ha publicado dos libros con Anaya Multimedia: Manual Imprescindible de Visual Basic .NET y Visual Basic 2005. Ficha del libro: Título: Novedades de Visual Basic 9.0 Autor: Guillermo "Guille" Som Número de páginas: 204 Formato: PDF, DIN A4 ISBN: 978-84-936417-0-2 Editorial: Solid Quality™ Press

Precio recomendado: 15,00 euros + 4% IVA (existen cupones de descuento) Fecha publicación: Marzo 2008 Materia: Lenguajes de programación Nivel: Medio / Avanzado Tipo: Aprendizaje / Referencia


OpenJavaDay:OpenJavaDay

11/8/08

11:54

Página 60

ACTUALIDAD

Reportaje sobre el OpenJavaDay 2008 JAVIER HOLGUERA BLANCO (javier.holguera@gmail.com) Licenciado en Ingeniería Informática, Analista/ Programador para GMV

El OpenJavaDay 2008, celebrado en la facultad de matemáticas de la Universidad Complutense de Madrid durante el 26 y 27 de junio, continuó con el estilo impuesto por el OpenJavaDay 2007: una conferencia creada por y para desarrolladores, y más cercana a la comunidad. Buena prueba de esto es el hecho de que en esta ocasión javaHispano no participó en la conferencia en calidad de invitado, sino que la asociación sin ánimo de lucro fue coorganizadora del evento junto con Sun Microsystems Ibérica.

Este año, tres cuartas partes de la agenda estuvieron a nuestro cargo, y los ponentes fueron escogidos de entre miembros de la comunidad de javaHispano. Quizás hubo menos ponentes de renombre internacional, pero no por ello disminuyó la calidad de las charlas. Es más, el contenido técnico aumentó de un modo claro, junto con su carácter práctico, y se consiguió establecer desde el principio una auténtica comunicación bidireccional con los asistentes, que eran a la vez espectadores y protagonistas del evento.

El primer día El jueves por la mañana el OpenJavaDay 2008 arrancó con una charla con poco contenido técnico: "Sun, impulsando las Comunidades Abiertas y la Social Media". La charla, presentada por Manuel Martínez y Joan Carles Agustí, reflexionaba sobre el impacto que está teniendo en las empresas el fenómeno de la "Social Media" a través de aplicaciones como LinkedIn, Plaxo, Facebook, Twitter, Digg, Flickr... y como Sun, a través de su apoyo al software libre y a través de la liberación de la inmensa mayoría del software de la empresa contribuye a este fenómeno. Se hizo énfasis de modo especial en el papel que la reciente compra de MySQL, base de datos empleada en la mayor parte de las aplicaciones mencionadas

SOLO PROGRAMADORES nº 163

60

anteriormente, está jugando dentro de esta estrategia en la compañía. Terminada con la única excepción del día a la norma de charlas con elevado contenido técnico, Álvaro López hizo una exposición sobre el servidor web Cherokee. Álvaro ha colaborado con múltiples proyectos de software libre desde el principio de su carrera. El más exitoso hasta la fecha probablemente sea el que fundó en 2001: Cherokee HTTP Server. Se trata de un servidor web multiplataforma, desarrollado en C y que cuenta con una arquitectura altamente modular. El objetivo a largo plazo de este proyecto, que actualmente se encuentra en su versión 0.8, es convertirse en el sucesor del venerable Apache. Tras muchos años de existencia, este servidor web acumula una serie de decisiones de diseño que no son las más adecuadas en la actualidad, decisiones que cada vez impactan de un modo más negativo el rendimiento y la usabilidad del servidor. Cherokee, con una arquitectura que ha aprendido de los aciertos y errores cometidos en Apache, trata de resolver las deficiencias de su antecesor. Dos son las principales ventajas de Cherokee respecto a Apache en la actualidad: un mayor rendimiento (es entre un 20% y un 25% más rápido) y una mayor facilidad de administración. Cherokee cuenta con una consola web de administración desde la cual se puede configurar absolutamente todo. Con Cherokee nunca es necesario conectarse por SSH al servidor y modificar crípticos ficheros de configuración del directorio ect usando el editor Vi. A continuación subió al escenario el único evangelista honorario de NetBeans de origen hispano, Francisco Morero Peyrona. Este gurú del desarrollo de software, cuya carrera en informática comenzó una década antes de que naciese Java, impartió una ponencia sobre Software Quality Assurance. Durante ella describió los problemas con los que se ha encontrado en los últimos dos años trabajando como arquitecto software para Sun Microsystems en el campo del Quality Assurance, y cómo ha resuelto estos problemas. Uno de los principales retos a los que se enfrentó fue la falta de una trazabilidad en los procesos de Quality Assurance entre el diseño y el desarrollo. En los proyectos de gran envergadura es habitual que se comience con el diseño del sistema en UML o algún lenguaje similar. Una vez el sistema ha sido diseñado, estos diagramas se pasan a los desarrolladores que tienen como misión implementar el diseño. Pero ¿qué www.revistasprofesionales.com


OpenJavaDay:OpenJavaDay

11/8/08

11:54

Página 61

ACTUALIDAD

Reportaje sobre el OpenJavaDay 2008 mecanismos, más allá de la inspección visual, existen para garantizar que el diseño que se le ha pasado a los desarrolladores es realmente lo que han implementado?. Si bien no tiene que ser necesariamente malo que los desarrolladores hayan cambiado el diseño, para garantizar la calidad del software debe ser posible al menos saber qué cambios se han hecho y porqué. Francisco no consiguió encontrar ninguna herramienta que resolviese este problema. Así que optó por crearse una: la herramienta toma como entrada por un lado el Diseño UML del sistema, y por otro crea el árbol abstracto de sintaxis del código fuente generado por los desarrolladores. Ambas representaciones pueden ser comparadas de modo automático para buscar divergencias entre la implementación y el diseño. Las buenas noticias para todos aquellos que tengan este problema es que Sun Microsystems va a permitir a Francisco que, a lo largo de este año, libere la herramienta (cuyo nombre es CATI) que ha creado para resolver el problema de la trazabilidad centre diseño e implementación. Después del descanso de media mañana, Alfredo Casado hizo una presentación sobre Java Content Repository. Esta especificación pretende ser un punto de unión entre las diferentes y dispares APIs de la gestión de contenidos (CMS) para acceso a repositorios de diversos tipos (WebDAV, File, HTTP, FTP, etc). La presentación cubrió tanto la versión 1.0 como la 2.0 de esta especificación. En la última versión se proponen mejoras relativas a la gestión del repositorio (nuevos tipos de datos, permisos, etc.), una mayor estandarización de tipos de datos para mejorar la interoperabilidad entre distintas implementaciones, federación entre repositorios y espacios de trabajo, y otras mejoras en protocolos e interfaces de consulta.

A continuación Álvaro Sánchez Mariscal hizo una presentación sobre Struts 2.0. Álvaro es el presidente de Salenda, una de las empresas patrocinadoras de la JavaCup 2008. Struts 2.0 Supone un salto cualitativo respecto al venerable Struts 1.0, quien en sus mejores tiempos fue un estándar de facto para el desarrollo web en Java. El framework surgió de la creación de lo que inicialmente iba a ser la evolución de Struts 1.0 con el proyecto WebWork. De este framework Struts 2.0 ha heredado la mayor parte de las decisiones de arquitectura y diseño, mientras que de Struts 1.0 no ha heredado mucho más que el soporte de la fundación Apache y el nombre, que no es poco. La mañana terminó con una excelente charla de Ignacio Coloma, uno de los weblogers hispanos con más renombre internacional dentro del mundo Java. La empresa de Ignacio, Extrema Sistemas, está especializada en el desarrollo de soluciones de capa web con Java. La experiencia que Ignacio tiene con múltiples framework web Java me resultó, simplemente, increíble. Y dicha experiencia no es sólo a nivel de usuario; Ignacio es el líder del proyecto Loom, un framework Java que acaba de anunciar su versión 1.0, y entre su currículo también puede apuntarse el haber creado un implementación completa de JSF "from scratch". La presentación de Ignacio, por sí sola, no resulta demasiado útil: se apoya mucho en imágenes y tiene muy poco texto. Las buenas noticias son que, además de la presentación, en la web del OpenJavaDay 2008 (http://www.javahispano.org/ openjavaday) también puedes encontrar un video completo de la ponencia, por lo que los que no pudisteis asistir al evento todavía tenéis la oportunidad de ver la presentación que hizo Ignacio (y las del resto de los ponentes).

La tarde del primer día comenzó con una charla a cargo de Curro Rueda. Curro es el creador de TagsMe, un motor de aplicaciones móviles cuyo propósito es permitir crear aplicaciones compatibles con los principales modelos de terminales móviles, eliminando así la necesidad de tener diferentes versiones de la aplicación para diferentes fabricantes/modelos/resoluciones de pantalla. La plataforma TagsMe proporciona un lenguaje XML para la definición de pantallas, un simple lenguaje de script similar a Java, un motor que interpreta los ficheros TagsMe en tiempo de ejecución y un entorno de desarrollo basado en NetBeans. Con TagsMe es posible empaquetar toda la aplicación dentro de un único jar o descargarse e interpretar en tiempo de ejecución los ficheros XML desde un servidor web. Sin embargo, Curro no fue al OpenJavaDay a hablar de su producto. Fue a hablar de lo que había aprendido desarrollando su producto: su presentación se titulaba “Desarrollo Java ME SIN necesidad de portabilidad”. En ella comenta con detalle los retos de crear una aplicación Java ME que funcione en cualquier terminal móvil, y se dan múltiples consejos para conseguirlo. Desde qué formatos de imágenes son realmente soportados por todos los terminales y cómo optimizarlas, hasta algoritmos para interpretar adecuadamente las pulsaciones de las teclas de los distintos modelos de teclados. La presentación es todo un tesoro para aquellos desarrolladores Java ME que tengan que enfrentarse con la tarea de crear aplicaciones que deban ejecutarse en múltiples modelos de terminal móvil. La última presentación del día estuvo a cargo de Nacho Brito, el fundador del portal groovy.org.es. Este portal está dedicado al lenguaje de programación Groovy y el framework Grails. Grails es un framework web libre desarrollado

Francisco Morero explicando el problema de la falta de trazabilidad centre diseño e implementación en los procesos de Software Quality Assurance. A la derecha, una de las transparencias de la charla sobre "Social Media" que inauguró el evento. www.revistasprofesionales.com

61

SOLO PROGRAMADORES nº 163


OpenJavaDay:OpenJavaDay

11/8/08

11:54

Página 62

ACTUALIDAD

por Codehaus que puede considerarse un clon de Ruby on Rails. Ha sido construido empleando Groovy, un lenguaje de script para la máquina virtual creado también por Codehaus. Grails proporciona una integración simple con el resto de la plataforma Java, lo que permite construir la capa de presentación web empleando Groovy y mantener el resto de la aplicación corriendo en servidores J2EE. Se basa en otros framework existentes como Spring, Hibernate y SiteMesh. El framework soporta tanto JSP como Groovy Servers Pages (GSP). La presentación de Nacho, que incluía una demostración práctica, fue una excelente introducción a este framework. Tras la presentación de Grails, a las seis de la tarde, llegó el momento de los talleres, una de las novedades del OpenJavaDay de este año. Para obtener el máximo aprovechamiento de estos talleres los asistentes debían traer su propio portátil con el software que se iba a emplear en el taller correctamente instalado y configurado. Para ello, la semana anterior al OpenJavaDay se publicaron a través de la web del evento instrucciones detalladas de qué software era necesario para aprovechar adecuadamente cada uno de los talleres y dónde conseguirlo. El jueves por la tarde se celebraron tres seminarios: uno a cargo del mexicano Erick Camacho y del catalán Sergi i Graupera sobre Spring; otro a cargo del argentino Alejandro Scandroli sobre el framework web Trails; y el tercero a cargo de los sevillanos Sergio Raposo y Alejandro Alves, los webmaster de OpenCmsHispano, sobre el gestor de contenidos OpenCms.

El segundo día La mañana del segundo día arrancó con una charla a cargo de Ibon Urrutia, uno de los miembros del Dream Team de NetBeans. El

Dream Team de NetBeans es un conjunto de evangelistas de NetBeans que no tienen ninguna relación contractual con Sun, sino que se dedican de modo voluntario a promocionar este entorno de desarrollo. Ibon, como no podía ser de otro modo, hizo una presentación relacionada con NetBeans. Más concretamente, hizo una introducción a Netbeans Rich Client Platform, una plataforma para la construcción de aplicaciones de escritorio sobre la cual se construye el propio NetBeans. La mañana continuó con una charla de José María Corsino, responsable de desarrollo de Kynetia, sobre aplicaciones RIA. En su presentación José María analizó cómo las distintas arquitecturas de software del lado del servidor y las distintas alternativas del mercado se reflejan en la experiencia del usuario de la aplicación web. Para ello se apoyó en su experiencia como responsable de desarrollo de una Pyme española. La presentación resulta muy útil para aprender a partir de los aciertos, y de los errores, cometidos por el grupo de desarrolladores que lidera José María. Tras el descanso de media mañana Francisco Morero volvió a subir al escenario. Supuestamente, debía habernos hecho una presentación corporativa de Sun sobre "Infraestructuras Abiertas para un Mundo Abierto". Sin embargo, dada la enorme participación del público, sintió que podía emplear mejor sus 45 minutos y, tras volar sobre las transparencias de la presentación, se dedicó a responder cualquier tipo de pregunta que quisiera hacer el público; y cuando digo cualquier tipo de pregunta es cualquier tipo: entre las preguntas que le hicieron están desde que cómo llegó a trabajar en Sun o a obtener su título de evangelista honorario de NetBeans, hasta cuáles eran las diferencias entre la GPL

Curro Rueda explicando el algoritmo que permite interpretar adecuadamente las pulsaciones de teclado en distintos terminales móviles. SOLO PROGRAMADORES nº 163

62

3.0 y la 2.0. Su "presentación" fue un excelente ejemplo de lo cordial, interactivo y bidireccional que resultó todo el evento donde el público fue tan protagonista como los propios ponentes. Después de la charla de Francisco subió al escenario Antonio María Sánchez para hacer una presentación sobre Maven, presentación con un carácter considerablemente práctico. Para cerrar la mañana, presentamos el final de la JavaCup 2008. Este concurso, organizado por la revista Sólo Programadores, Sun Microsystems Ibérica y javaHispano, consiste en un torneo virtual de fútbol Java donde cada equipo es una clase Java que implementa una interfaz predefinida. El concurso contó con el patrocinio de las empresas Kynetia, en calidad de patrocinador de oro; Isthmus Inc. y Everis como patrocinadores de plata; y Salenda como patrocinador de bronce. A través del sistema de proyección de la sala, se presentó en directo el resultado del partido de la final entre el equipo de Omar Masmoudi, 1A, y el de Iván Gadea Sáenz, Laponia. El ganador fue el primero, que obtuvo un premio de 1500 €. Iván se quedó con el segundo premio, 1000 €. El tercer puesto de la competición fue para Galderic Punti con su equipo Potrosa, quien recibió 500 €, y el cuarto lugar para Joan Crosas con su equipo Chucky; el cuarto premio eran 250 €. Además, los cuatro finalistas fueron obsequiados con una suscripción anual gratuita a la revista que tienes ahora mismo entre tus manos. La tarde del viernes comenzó con una de las mejores sesiones del evento: una mesa redonda sobre frameworks web. En ella participaban Ignacio Coloma (fundador de Loom), Javier Paniza (fundador de OpenXava), Nacho Brito (el webmaster de groovy.org.es), Alejandro Scandroli (líder de Trails), José

Javier Paniza durante el taller sobre OpenXava. Para los talleres cada asistente debía traer su propio portátil. www.revistasprofesionales.com


OpenJavaDay:OpenJavaDay

11/8/08

11:54

Página 63

ACTUALIDAD

Reportaje sobre el OpenJavaDay 2008

Foto del cartel del evento donde aparecían los organizadores y colaboradores. Como puede observarse, Sólo Programadores era uno de los medios asociados. A la derecha: El final de la JavaCup 2008 se presentó en directo durante la mañana del viernes.

María Arranz (el fundador de isNat) y Alfredo Casado que, junto con Nacho, era el único de la mesa que no había creado su propio framework web. El moderador de la mesa redonda fue un servidor. Durante la comida los participantes en la mesa redonda me habían preguntado qué cuál iba a ser la agenda para la mesa. Yo les dije que sólo tenía una pregunta para arrancar el debate: dada la gran cantidad de framework web que existen actualmente en Java, demasiados para poder analizarlos todos y ver cuál es el más adecuado a tus necesidades, ¿cuál es la recomendación que le dais a alguien que llega el mundo de Java y tenga que desarrollar una aplicación web?. No tenía preparadas más preguntas ni puntos a tratar. Mi lógica era bastante simple: en todas y cada una de las presentaciones del OpenJavaDay me vi obligado a interrumpir el turno de preguntas cuando comenzábamos a retrasarnos demasiado respecto al horario previsto. En base a esto, estaba completamente convencido de que el debate que generaría esa pregunta y los distintos temas que saldrían a raíz de ella sería más que suficientes para toda la mesa redonda. La práctica demostró que tenía razón: después de una hora y media de mesa redonda me vi obligado a actuar una vez más de ogro y a interrumpir la diversión de todo el mundo para evitar retrasarnos demasiado respecto del horario previsto. Durante la mesa redonda tanto los ponentes como el público compartieron sus experiencias positivas y negativas con distintos framework web. Se resaltaron como factores más importantes a la hora de elegir un framework los requerimientos del cliente (que muchas veces impone un framework determinado), la curva de aprendizaje del framework, la experiencia del equipo de desarrollo y el elegir entre aquellas www.revistasprofesionales.com

opciones más maduras, con una comunidad más fuerte detrás, para tener garantizada la continuidad de la solución. Una de las cosas que me llamó bastante la atención fue el consenso casi unánime entre los participantes en la mesa redonda de que JSF es una de las peores tecnologías para el desarrollo web actualmente existentes dentro de la plataforma Java. Sin embargo, todo el mundo estaba de acuerdo en que dado el enorme apoyo empresarial que tiene, es la apuesta de futuro más segura y su continuidad está garantizada. Tras la mesa redonda, celebramos la "clausura oficial" del evento, y lo pongo entre comillas porque realmente todavía quedaban tres talleres. Sin embargo, para permitir que cada taller terminase cuando los asistentes y el ponente lo creyesen oportuno, preferimos celebrar el acto de clausura antes de celebrar los talleres. En este acto regalamos un ipod, cortesía de Sun, al primer asistente que supiese cuál es el lema de javaHispano. Tras varios intentos fallidos, finalmente un asistente proporcionó la respuesta correcta: "Tu lenguaje, tu comunidad". Después de la clausura, aproximadamente a las seis de la tarde, comenzó la segunda ronda de seminarios. David Bonilla impartió uno sobre administración y despliegue de aplicaciones en Glasfish; Javier Paniza sobre su framework web OpenXava, y José María Arranz hizo lo propio con el suyo, ItsNat. Valga como testimonio de la pasión y el interés de los asistentes del evento el hecho de que a las 8:30 de la tarde, un viernes, me vi obligado una vez más a enfundarme en mi traje de ogro y a recorrer cada una de las tres aulas donde se estaban celebrando los talleres para informarles de que la facultad de matemáticas cerraría las puertas a las nueve y que tenían que ir pensando en abandonar las aulas para que los bedeles pudiesen cerrarlas.

Unas notas finales Si una cosa va a quedar en mi memoria del OpenJavaDay 2008 es la auténtica sensación de comunidad que había en el evento, que acabó desembocando en una comunicación completamente bidireccional entre público y ponentes. Las interminables rondas de preguntas, el hecho de que los asistentes no tenían reparos en interrumpir las charlas para completar/apoyar/dar otros puntos de vista sobre lo que el ponente estaba diciendo en ese momento, y las conversaciones en los pasillos fueron algo que nunca había visto en un evento tecnológico a la escala que lo vi en el OpenJavaDay 2008. Quiero aprovechar estas líneas para agradecer enormemente a todos los ponentes el hecho de haber preparado sus presentaciones y talleres a cambio de nada más que de satisfacción personal. Y a todos los asistentes su activa participación en el evento. A los lectores de la revista, decirles que las transparencias de las presentaciones, y los videos, están disponibles en la web del OpenJavaDay 2008 (http://www.javahispano.org/ openjavaday). Una vez nos echaron de la facultad de matemáticas, para mí el OpenJavaDay continuó entre cañas y tapas por varios bares del centro de Madrid, acompañado por varios de esos amigos que he conocido a través de Internet y que sólo veo una o dos veces al año. La pena es que, en muchos casos, sé que voy a tener que esperar un año completo para volver a toparme con ellos. Y es que en los eventos como el OpenJavaDay, por más interesantes y didácticas que sean las charlas, por más buenos que sean los ponentes y por más novedades que se presenten, lo mejor, al menos para mí, es la oportunidad que nos brinda a las comunidades para que, aunque sólo sea una vez al año, podamos reunirnos y hablar cara a cara. 63

SOLO PROGRAMADORES nº 163


Video:Video

11/8/08

11:29

Página 64

VIDEO-TUTORIAL

Vídeos JavaCup 2008 Al igual que el pasado año, una vez finalizado JavaCup 2008 y conocidos los finalistas y vencedor, incluimos en esta sección los vídeos correspondientes a las fases finales de la competición.

JavaCup 2008

¿Cómo obtener los vídeos? Al igual que con el material que habitualmente conforma el vídeo-tutorial, los lectores de la edición en papel encontrarán los vídeos en el CDROM, mientras que los lectores de la edición digital los encontrarán en nuestra Web. Recordamos a los lectores de la edición digital que la nueva dirección es www.revistasprofesionales.com.

¿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º 163

64

www.revistasprofesionales.com


63 atrasados:atrasados

11/8/08

13:00

Página 1

NÚMEROS ATRASADOS 162 - Julio 2008

161 - Junio 2008

Con el crecimiento de las aplicaciones para teléfonos móviles, se ha abierto un nuevo camino para la aparición de los códigos maliciosos más avanzados. Una de las prestaciones más espectaculares para los que vivimos la transición entre los entornos de caracteres a gráficos fue la posibilidad de “Arrastrar” y “Soltar”. Segundo y último artículo dedicado a Scrum. En esta ocasión, vamos a comenzar a generar código y ejemplos concretos para conseguir tener el control de múltiples hilos de ejecución acorde a la cantidad de núcleos de procesamiento disponibles. En este último artículo veremos qué librerías ofrece J2ME Polish para desarrollar nuestras aplicaciones. Los documentos RSS pueden servirse de forma optimizada sacando provecho de todos los recursos que ofrece el propio protocolo HTTP, empezando por la compresión de datos que transfieren al cliente.

Los documentos RSS pueden optimizarse sacando provecho de todos los recursos que ofrece el protocolo HTTP. En este último artículo veremos qué librerías ofrece J2ME Polish para desarrollar nuestras aplicaciones. En este artículo (Tecnologías Java a vista de pájaro) se da una visión de las múltiples tecnologías JAVA. “Programación con múltiples hilos”, vamos a comenzar a generar código y ejemplos concretos. “Scrum II”, el artículo se centra en sus eventos y en cómo roles y artefactos participan en ellos. Una de las prestaciones más espectaculares para los que vivimos la transición entre los entornos de caracteres a gráficos fue la posibilidad de “Arrastrar” y “Soltar”. Los teléfonos móviles son cada vez más complejos y potentes cuya vulnerabilidad aumenta conforme lo hace su tecnología.

160 - Mayo 2008

159 - Abril 2008 Paseo por The Evolution Show organizado por Microsoft para presentar sus últimos productos. Solución a problemas habituales desarrollando en J2ME pero que pueden mitigarse con J2ME Polish. Cómo generar un entorno de aprendizaje virtual a través del cual alumnos y profesores puedan interaccionar. Nuevas extensiones de Microsoft para ejecución paralela en .NET. Tratamos el Desarrollo de aplicaciones para redes sociales con OpenSocial de Google. Analizamos Java Media Framework (JMF) un software que permite crear aplicaciones Java. 1 CD incluído.

Veremos cómo acceder a los mecanismos de almacenamiento y haremos un repaso rápido a algunas librerías opcionales de Android. RSS se ha convertido en una tarea común en el desarrollado de aplicaciones Web, estudiaremos cómo hacerlo con Java. En este segundo artículo, seguiremos estudiando las capacidades de J2ME Polish. Exploramos las tecnologías que constituyen lo que se denomina como “web semántica con minúsculas”. JavaCup 2008, segunda edición torneo de fútbol virtual Java. Hibernate y la sencillez de la capa de persistencia en JAVA. Con Java Media Framework (JMF) resulta muy fácil crear aplicaciones de vídeo y audio. 1 CDROM incluido. Incluye Solop 158 en PDF.

158 - Marzo 2008 Desvelamos las principales novedades de Visual Basic 2008. Análisis sobre la versión final del Service Pack 1 de Windows Vista. Análisis de Microsoft Visual Studio 2008, con la edición Express. Profundizaremos algo más en los tipos de aplicaciones que pueden hacerse con Android y las APIs disponibles. Descripción de PyS60 versión de Python ideada para dispositivos móviles con sistema operativo Symbian y de tipo Serie 60. Análisis de LINQ para SQL. Creación y gestión de componentes, así como la publicación de nuestras bases de datos en la web. Ponemos en práctica mediante la framework Jena las tecnologías semánticas revisadas en la primera parte. 1 DVD 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,...)


CDROM:CDROM

11/8/08

11:46

Página 66

CD-ROM

Contenido del CD-ROM Fuentes Cross-Browser XSLT/XPath en Web Ajax 1

Las hojas XSLT representan probablemente la forma más natural de tratar documentos XML. En la actualidad Mozilla Firefox e Internet Explorer soportan el procesamiento con hojas XSLT.

Curso Java I

JavaCup 2008 una solución diferente para la construcción de aplicaciones Web. En esta segunda entrega veremos algunas características avanzadas de la infraestructura, con el fin de que puedas comprender este en su totalidad.

Cross-Browser RSS con Ajax I

Este artículo será el primero de una serie orientada a introducir al lector en el lenguaje de programación Java. Este lenguaje de programación creado por Sun Microsystems a mediados de la década de los 90 es el lenguaje de programación más popular en la actualidad. Así lo demuestra el índice TIOBE.

La utilización de RSS en el lado del cliente representa una oportunidad excelente para enriquecer las páginas Web de un portal o servicio con información procedente de otras diversas fuentes. Gracias a AJAX ahora es posible hacerlo de manera sencilla y con una programación orientada a objetos razonablemente robusta, limpia y mantenible.

Al igual que hicimos el año pasado, incluimos los videos de las finales de Javacup 2008. Organizados en los siguientes directorios: 01 - Cuartos 02 - Semifinales 03 – Tercero Y Cuarto 04 - Final

JDK 6 update 6 with NetBeans 6.1

Además …

Incluimos este entorno de desarrollo para la realización del curso de Java.

Solo Programadores 161 en formato pdf.

ASP.NET MVC II El paradigma de modelo, controlador y vista de Microsoft ASP.NET (MVC) es una implementación para .NET, la que ofrece

SOLO PROGRAMADORES nº 163

66

www.revistasprofesionales.com


simo 210x280.fh11 14/4/08 16:33 P gina 1

SIMO EMPRESA

ESTILO DE VIDA DIGITAL

SIMO DEL CONOCIMIENTO DOCU MENTACION DIGITAL

SIMO WEB 2.0

VIVERO

OCIO DIGITAL 11-16 NOVIEMBRE / November 2008 FERIA DE MADRID

www.simovirtual.com

SIMO SUMA LINEA IFEMA IFEMA CALL CENTRE LLAMADAS DESDE ESPAÑA CALLS FROM SPAIN INFOIFEMA 902 22 15 15 LLAMADAS INTERNACIONALES INTERNATIONAL CALLS (34) 91 722 30 00 FAX

(34) 91 722 58 07

IFEMA

Feria de Madrid 28042 Madrid España. Spain

simo@ifema.es


ISV-BYTE-DOTNENT_210X280_D.indd 1

1/8/08 15:13:12

RECUERDE: ESTOS SUPERPODERES WEB, TAN DESLUMBRANTES, SÓLO DEBEN UTILIZARSE PARA HACER EL BIEN.

y herramientas en desafiatodoslosretos.com

visibilidad y subir aún más el listón. Más consejos

herramientas AJAX en Visual Studio® para tener más

Crea aplicaciones web más ricas utilizando las


Solo Programadores #163