Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

122

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 57

 

  S   D   O
   I 6ª ENTREGA DEL COLECCIONABLE
    T
   A    I
   U
   R    L
   G    C
   N
   I
   D
   C

Precio: 6  € (Españ
(España)
a) (IVA incluido) • AÑ
incluido) AÑO
O XI.
XI. 2.
2.ªª ÉPOCA • Nº 122 •
ÉPOCA UNA PUBLICACIÓN DE: REVISTAS PROF
ROFESI
ESIONALES S. L .
ONALES

 Y ADEMÁS…
 ACTUALIDAD
Windows Longhorn:
la evolución de .NET

MIDDLEWARE
 XAML, un cambio radical
en la programación de IGUs

Eclipse Visual Editor

REDES
Los CMS Open Source
 y el API de Portlets

Programa un filtro en
tu aplicación web

DISEÑO
Borland y el ciclo de vida:
la diferencia entre el éxito y el fracaso

Construye aplicacion
aplicaciones
es
multiplataforma con C++ y ACE

CANAL PANDA
Nuevos peligros para
la seguridad corporativa
00122

Noticias, javaHispano, Preguntas y Respuestas 8 413042 303299


EDITORIAL
Un mercado prometedor
 Número 122 - Marzo 2005
Edita: REVISTAS PROFESIONALES S.L. Pocas cosas reflejan tan bien el progreso de la tecnología como los teléfonos móviles.
móviles . En muy
solop@revistasprofesionales.com
pocos años, han pasado de ser simples teléfonos a auténticas plataformas de ocio.
C/ Valentin Beato 42, 3ª. 28037 - Madrid.
Curiosamente, continuamos llamando “teléfono móvil” a un dispositivo que, ciertamente, algún
http://www.revistasprofesionales.com
http://digital.revistasprofesionales.com día lo fue, pero no cabe duda de que hoy ese término ha quedado obsoleto. Los fabricantes de
Editor
estos “teléfonos” inundan el mercado con nuevos modelos, las operadoras de telecomunicacio-
Agustín Buelta nes nos abruman con agresivas campañas de publicidad y, todo ello, acaba en un consumo des-
•••••••••••••••••••••••••••••••••• mesurado de estos servicios. La última tecnología
t ecnología que se ha incorporado a los dispositivos
dispositi vos móvi-
Coordinación Técnica-Redac
Técnica-Redacciónción les es la que puede transformar nuestro terminal en una auténtica consola de videojuegos.
Carlos Laparra Ciertamente, este tipo de productos van destinados a los consumidores más jóvenes. Según
••••••••••••••••••••••••••••••••••
Maquetación
se desprende de los estudios realizados por las compañías del sector, 3 de cada 5 ciudadanos
Raúl Clavijo europeos de entre 15 y 35 años adquirieron algún contenido o servicio para ser consumido
•••••••••••••••••••••••••••••••••• desde su teléfono móvil en el año 2004. De este consumo, los juegos Java para móviles repre-
Asesoría de Publicidad sentan el 11%, frente al 29% que representan otro tipo de contenidos, como por ejemplo las
Felipe Ribagorda imágenes. De hecho, estos datos han sido respaldados por un estudio hecho por la consultora
Tel.: 91 304 87 64
Barcelona
Screen Digest, en el que se afirma que el 80% de los ingresos derivados de los juegos y sus des-
C/ Rocafort, 241/243, 5º 1ª cargas provienen de Japón y Corea. En este sentido, queda claro que América y Europa repre-
Mariano Sánchez sentan un mercado relativamente virgen, y por lo tanto con muchas posibilidades en el nacien-
Tel.: 93 322 12 38 te sector de los juegos en teléfonos móviles. Por este motivo hemos creído oportuno mostrar al
•••••••••••••••••••••••••••••••••• lector, con un curso completísimo, cómo desarrollar juegos de calidad comercial para una de
Suscripciones
Tel: 91 304 87 64
las plataformas con más cuota de mercado: Nokia.
Fax: 91 327 13 03
•••••••••••••••••••••••••••••••••••
Impresión
Ideas de Impresión
SUMARIO
•••••••••••••••••••••••••••••••••••
Distribución
Motorpress Ibérica ACTUALIDAD
10 Windows Longhorn: La evolución
Longhorn: evolución de .NET (I)

Distribución Mexico
DISPOSITIVOS MÓVILES
DIMSA - Angel Bosch
Bosch 16 Juegos de calidad comercial en J2ME (I)
angelbosch@infosel.net.mx
Distribución, números atrasados y suscripciones
Renacimiento, 180. Col. San Juan Tlihuaca MIDDLEWARE
Azcapotzalco. 02400 México D.F.
24  XAML (II)
36 Desarrollo visual de IGUs Java 
Distribución Argentina

REDES
Capital Federal: Distrimachisa
Interior: York Agency,
Agency, S. A.
Tel. (005411) 43 31 50 51
42  Sistemas de Gestión de Contenidos (y II)
••••••••••••••••••••••••••••••••••
La revista Sólo Programadores no tiene por qué 48  Servlets Filters (I)
estar de acuerdo con las opiniones escritas por sus
colaboradores en los artículos firmados. DISEÑO
El editor prohibe expresamente la reproducción
54  La diferencia entre el éxito y el fracaso 
total o parcial de los contenidos de la revista
sin su autorización escrita. 58  Diseño multiplataforma
multiplataforma para aplicacione
aplicacioness C++ (I)
Depósito legal: M-26827-1994
 Y además…
PRINTED IN SPAIN
COPYRIGHT
COPYRIG HT 30-02-20
30-02-2005
05
P.V.P. 6,00 Euros 04  Noticias 
Precio en Canarias, Ceuta y Melilla:
06  javaHispano:
 javaHispano: NetBeans 4.0, db4objects,
db4objects, APIs Java
Java y más 
6,15 Euros
08  Canal Panda: Los sistemas móviles, un peligro para la seguridad corporativa 
32  Contenido del CD-ROM 
Asociación Española de Editoriales 64 Preguntas y respuestas 
de Publicaciones Periódicas
EDITORIAL
Un mercado prometedor
 Número 122 - Marzo 2005
Edita: REVISTAS PROFESIONALES S.L. Pocas cosas reflejan tan bien el progreso de la tecnología como los teléfonos móviles.
móviles . En muy
solop@revistasprofesionales.com
pocos años, han pasado de ser simples teléfonos a auténticas plataformas de ocio.
C/ Valentin Beato 42, 3ª. 28037 - Madrid.
Curiosamente, continuamos llamando “teléfono móvil” a un dispositivo que, ciertamente, algún
http://www.revistasprofesionales.com
http://digital.revistasprofesionales.com día lo fue, pero no cabe duda de que hoy ese término ha quedado obsoleto. Los fabricantes de
Editor
estos “teléfonos” inundan el mercado con nuevos modelos, las operadoras de telecomunicacio-
Agustín Buelta nes nos abruman con agresivas campañas de publicidad y, todo ello, acaba en un consumo des-
•••••••••••••••••••••••••••••••••• mesurado de estos servicios. La última tecnología
t ecnología que se ha incorporado a los dispositivos
dispositi vos móvi-
Coordinación Técnica-Redac
Técnica-Redacciónción les es la que puede transformar nuestro terminal en una auténtica consola de videojuegos.
Carlos Laparra Ciertamente, este tipo de productos van destinados a los consumidores más jóvenes. Según
••••••••••••••••••••••••••••••••••
Maquetación
se desprende de los estudios realizados por las compañías del sector, 3 de cada 5 ciudadanos
Raúl Clavijo europeos de entre 15 y 35 años adquirieron algún contenido o servicio para ser consumido
•••••••••••••••••••••••••••••••••• desde su teléfono móvil en el año 2004. De este consumo, los juegos Java para móviles repre-
Asesoría de Publicidad sentan el 11%, frente al 29% que representan otro tipo de contenidos, como por ejemplo las
Felipe Ribagorda imágenes. De hecho, estos datos han sido respaldados por un estudio hecho por la consultora
Tel.: 91 304 87 64
Barcelona
Screen Digest, en el que se afirma que el 80% de los ingresos derivados de los juegos y sus des-
C/ Rocafort, 241/243, 5º 1ª cargas provienen de Japón y Corea. En este sentido, queda claro que América y Europa repre-
Mariano Sánchez sentan un mercado relativamente virgen, y por lo tanto con muchas posibilidades en el nacien-
Tel.: 93 322 12 38 te sector de los juegos en teléfonos móviles. Por este motivo hemos creído oportuno mostrar al
•••••••••••••••••••••••••••••••••• lector, con un curso completísimo, cómo desarrollar juegos de calidad comercial para una de
Suscripciones
Tel: 91 304 87 64
las plataformas con más cuota de mercado: Nokia.
Fax: 91 327 13 03
•••••••••••••••••••••••••••••••••••
Impresión
Ideas de Impresión
SUMARIO
•••••••••••••••••••••••••••••••••••
Distribución
Motorpress Ibérica ACTUALIDAD
10 Windows Longhorn: La evolución
Longhorn: evolución de .NET (I)

Distribución Mexico
DISPOSITIVOS MÓVILES
DIMSA - Angel Bosch
Bosch 16 Juegos de calidad comercial en J2ME (I)
angelbosch@infosel.net.mx
Distribución, números atrasados y suscripciones
Renacimiento, 180. Col. San Juan Tlihuaca MIDDLEWARE
Azcapotzalco. 02400 México D.F.
24  XAML (II)
36 Desarrollo visual de IGUs Java 
Distribución Argentina

REDES
Capital Federal: Distrimachisa
Interior: York Agency,
Agency, S. A.
Tel. (005411) 43 31 50 51
42  Sistemas de Gestión de Contenidos (y II)
••••••••••••••••••••••••••••••••••
La revista Sólo Programadores no tiene por qué 48  Servlets Filters (I)
estar de acuerdo con las opiniones escritas por sus
colaboradores en los artículos firmados. DISEÑO
El editor prohibe expresamente la reproducción
54  La diferencia entre el éxito y el fracaso 
total o parcial de los contenidos de la revista
sin su autorización escrita. 58  Diseño multiplataforma
multiplataforma para aplicacione
aplicacioness C++ (I)
Depósito legal: M-26827-1994
 Y además…
PRINTED IN SPAIN
COPYRIGHT
COPYRIG HT 30-02-20
30-02-2005
05
P.V.P. 6,00 Euros 04  Noticias 
Precio en Canarias, Ceuta y Melilla:
06  javaHispano:
 javaHispano: NetBeans 4.0, db4objects,
db4objects, APIs Java
Java y más 
6,15 Euros
08  Canal Panda: Los sistemas móviles, un peligro para la seguridad corporativa 
32  Contenido del CD-ROM 
Asociación Española de Editoriales 64 Preguntas y respuestas 
de Publicaciones Periódicas
NOTICIAS

MICROSOFT un programa espía. Esta manera de ocul-


tarse en el interior de programas no sos-
Microsoft entra en la lucha contra el software espía pechosos posibilita que se instalen en el
PC, al mismo tiempo que el usuario insta-
la la aplicación que acaba de descargar. Un
spyware oculto en un sistema puede per-
mitir elaborar el perfil de un usuario mos-
Microsoft ha anunciado recientemente la trando, por ejemplo, sus preferencias en
adquisición de GIANT Company Software, el cuanto a tipo de páginas web que visita,
proveedor de algunos de los mejores productos tiempo que navega, su equipo de fútbol
diseñados para impedir la instalación de spyware en los equipos, y la favorito, etc. Estos y otros datos permiten
empresa que ha desarrollado diversas e innovadoras soluciones para identificar a cada internauta, sobre todo con propósitos comerciales.
garantizar la seguridad en Internet. Microsoft, para poner solución a esta problemática, utilizará la tecno-
Pero… ¿Qué es el spyware? ¿Por qué luchar contra él? El creciente inte- logía y propiedad intelectual que aporta GIANT para proporcionar a los
rés (por parte de usuarios maliciosos y de compañías de ética dudosa) usuarios del sistema operativo Microsoft Windows unas nuevas herra-
en conocer los hábitos de navegación de los internautas ha propiciado mientas para proteger sus sistemas frente a las amenazas que repre-
la proliferación del spyware. Se denomina spyware (o programa espía) sentan el spyware y otro software malicioso.
a las aplicaciones diseñadas para conseguir datos de los usuarios sin Microsoft va a poner a disposición de sus clientes en los próximos días la
que éstos se percaten ni de su presencia, ni de las acciones que llevan versión beta de una herramienta basada en el AntiSpyware de GIANT para
a cabo. Suelen llegar a los ordenadores a través de programas freewa- eliminar, proteger y detectar spyware. Esta próxima versión beta analiza-
re, shareware, o demos de cualquier tipo que aparentemente no tienen rá el PC del usuario para localizar cualquier spyware u otro software mali-
ninguna peligrosidad. Que una descarga contenga o no spyware no cioso, y eliminarlos posteriormente. La solución será configurable para
depende tanto de si el archivo a descargar es fiable o no, sino de dónde bloquear la instalación en el sistema de spyware conocido o cualquier otro
se descarga. De hecho, puede darse el caso de que aplicaciones cono- software malicioso. Esta herramienta estará disponible para el sistema
cidas y libres de toda sospecha hayan sido manipuladas para contener operativo Microsoft Windows 2000 y versiones posteriores.

BEA SYSTEMS

BEA habilita la descarga de WebLogic 9.0


BEA Systems desveló hace unas
semanas la última versión de BEA
WebLogic Server 9.0. Su nombre… cidad para ayudar a las compañías a desplegar rápidamente un alto
“Diablo”. volumen de aplicaciones bajo Arquitecturas Orientadas a Servicios (SOA)
Mejorada con importantes caracte- con el mínimo impacto en su negocio.
rísticas, Diablo es la piedra angular En línea con la tradicional trayectoria de WebLogic, Diablo soporta los
de la recién lanzada solución BEA últimos estándares de la industria como J2EE 1.4 y los últimos están-
WebLogic Platform 9.0, la última generación de componentes de soft- dares de servicios web, ayudando a los desarrolladores a crear de
ware integrado que está diseñada para conectar sistemas dispares y forma rápida aplicaciones interoperables y portátiles.
hacer rodar las aplicaciones sobre las que están construidos los nego- Diablo está disponible para su descarga en la dirección
cios de las grandes compañías. Lo que hace único a Diablo es su capa- http://www.bea.com/diablo.

SUN MICROSYSTEMS ción de la tecnología Java. Actualmente, existe una gran cantidad de
aplicaciones móviles basadas en Java disponibles para su descarga,
Bankinter innova con J2ME que suponen un mercado valorado en unos 3.000 millones de dólares.
Esta cifra podría llegar a 15.000 millones de dólares en 2007-2008,
Java continúa en según las previsiones de Sun Microsystems.
su proceso de Prueba del buen rendimiento de Java en los terminarles móviles es el
consolidación innovador servicio ofrecido recientemente por Bankinter denominado
como la platafor- Broker Bankinter y basado enteramente en la plataforma J2ME.
ma número uno El nuevo servicio Broker Bankinter, único y pionero en el mercado espa-
para servicios ñol, permite a los usuarios la utilización del teléfono móvil como canal
inalámbricos de para realizar operaciones bursátiles en tiempo real. En una primera fase,
datos. Según fuentes de Sun, ya existen unos 300 modelos distin- el servicio cubre el área de servicios de broker, que incluye la consulta de
tos de teléfonos móviles con Java integrado, fabricados por firmas mercados de valores a escala nacional e internacional (índices, valora-
como LG, Motorola, Nokia, Samsung, Sharp, Siemens o Sony ciones, alertas, etc.) y la gestión de carteras con consultas y ejecución de
Ericsson. Sun calcula que el 60 por ciento de todos los teléfonos órdenes de compraventa a través del teclado del teléfono móvil.
móviles que se comercializan a escala global ya llevan la tecnología Sun Microsystems también ha aportado a este innovador proyecto los
Java integrada. servicios de consultoría, la dirección del proyecto y el desarrollo de
Asimismo, más de 90 operadores de comunicaciones móviles (entre todas las aplicaciones J2ME, aspecto, este último, que se ha realizado
los que figuran Telefónica Móviles y Vodafone) han conseguido incre- siguiendo los estándares de la tecnología Java y bajo un exhaustivo
mentar su ARPU (ingresos medios por usuario) gracias a la implanta- control de calidad por parte de Bankinter.

SOLO PROGRAMADORES nº 122 4 http://digital.revistasprofesionales.com


NOTICIAS

IBM El objetivo de IBM es que


esta cesión se convierta en
IBM cede 500 patentes a la comunidad Open Source la base de un conjunto de
patentes comunes de todo
Los desarrolladores de software libre el sector de las tecnologías
podrán acceder libremente a tecnología de la información.
IBM gracias a la cesión de 500 patentes Aunque la propiedad intelectual es uno de los pilares de la innovación,
por parte de la Compañía. IBM cree que los avances tecnológicos dependen a menudo de la capacidad para
se trata de la mayor cesión de patentes colaborar y compartir el conocimiento. La nueva política de propiedad
de la historia y representa un giro en el intelectual de IBM está dirigida tanto a proteger los derechos sobre la
modo en el que la empresa gestiona su invención como a acelerar la expansión de una infraestructura global
propiedad intelectual. basada en software de código abierto.
La cesión es válida para todo individuo, comunidad o empresa que tra- Pese a este tipo de iniciativas, IBM sigue siendo, y con diferencia, la
baje en el desarrollo de software o que utilice software de código compañía con más patentes registradas en la Oficina de Patentes y
abierto de acuerdo con la definición actual o futura de la iniciativa Marcas de Estados Unidos. Gracias a una inversión en I+D de 5.000
Open Source. dólares, IBM consiguió en 2004 3.248 patentes.

EMC supere las SMP (varias máquinas multiprocesador funcionando con


memoria compartida) tradicionales y a menor coste.
Dell, EMC, Intel y Oracle se unen para facilitar el La fase inicial del proyecto MegaGrid se centra en el diseño, prueba y
Grid Computing documentación de las mejores prácticas efectivas de la industria, pos-
teriormente se definen unas infraestructuras Grid Computing efecti-
Para aquellos que no se hayan introdu- vas, teniendo en consideración criterios de coste y rendimiento. Cada
cido en el concepto de Grid Computing, patrocinador del proyecto MegaGrid invierte en recursos técnicos para
diremos que para solucionar la “incapa- desarrollar,, probar y validar las mejores prácticas de Grid Computing:
desarrollar
cidad” de un superordenador a la hora  Dell aporta una infraestructura completa de servidores en red com-

de resolver un problema de alto nivel de puesta por servidores PowerEdge basados en procesadores Intel.
computación, surgió el concepto de  EMC incorpora una infraestructura completa de almacenamien-

Computación Distribuida o Grid to en red.


Computing, que consiste en dividir el  Intel contribuye con su experiencia en la gestión de procesado-

problema en varios fragmentos y hacer res y servidores Intel, con herramientas de optimización y otros
así la computación en varios ordenadores organizados
organizados y conectados a recursos que facilitan la integración del diseño.
una infraestructura de telecomunicaciones distribuida.  Oracle proporciona su infraestructura de tecnología Oracle 10g

En este sentido, Dell, EMC, Intel y Oracle se han unido para desarro- y alberga el centro de desarrollo para el proyecto MegaGrid en
llar conjuntamente el proyecto MegaGrid, una iniciativa para des- su Global IT Data Center.
arrollar un modelo estándar de diseño e implantación de una infraes- La meta del proyecto MegaGrid es permitir a grandes organizaciones de
tructura Grid Computing. Las cuatro compañías combinan sus prin- cualquier segmento vertical de la industria obtener ventajas de las solu-
cipales tecnologías y recursos técnicos para ofrecer a sus clientes una ciones de Grid Computing, permitiendo que éstas puedan ofrecer servi-
solución corporativa Grid Computing integrada y completa que cios bajo demanda y, por lo tanto, mejorar así los niveles de servicio.

SUN MICROSYSTEMS mas de sobremesa, sistemas operativos, software de gestión, entornos


de almacenamiento para misión crítica y aplicaciones para informática
Sun y la Universidad Rey Juan Carlos entablan en red.
una alianza tecnológica Sun también cederá una licencia con fines didácticos de su software de
escritorio Java Desktop System, que podrá ser utilizado tanto por parte
El Rector de la Universidad Rey Juan de los estudiantes como por parte del
Carlos, Pedro González Trevijano personal docente y de administració
administraciónn
Sánchez y el director general de Sun de la entidad educativa. Esta solución
Microsystems Ibérica, Adolfo Hernández, incluye el entorno de escritorio com-
han firmado un acuerdo tecnológico de pleto, la suite de productividad ofimá-
colaboración que permite que la tica StarOffice 7, un innovador entor-
Universidad use gratuitamente los pro- no de ventanas, el popular navegador
ductos software de Sun para fines Mozilla y un sistema operativo Linux
docentes y entornos de investigación. integrado, además de aplicaciones de
El software cedido por Sun Microsystems correo electrónico, agenda y mensa-
a la Universidad Rey Juan Carlos incluye  jería instantánea.
servidores web y de directorio, servidores Además, como socio tecnológico de
de aplicaciones e integración, aplicaciones la universidad, Sun colaborará con la
de correo electrónico, calendario y cola-  El Rector de la Universidad Rey Juan Carlos, Pedro institución en otros aspectos rela-
boración, desarrollo de aplicaciones, González Trevijano Sánchez y el director general de  cionados con la mejora de la calidad
seguridad en red, aplicaciones para siste- Sun Microsystems Ibérica, Adolfo Hernández en un en los estudios de dicha universidad.
momento de la firma del acuerdo.

http://digital.revistasprofesionales.com 5 SOLO PROGRAMADORES nº 122


 JAVAHISPANO

 Actualidad Java
de la mano de javaHispano
eBay abandona Passport

Passport, creado por Microsoft, y Liberty Alliance, iniciativa fundada por Sun que cuenta con el res-
paldado de más de 150 empresas y está soportada por Java, son dos sistemas de identificación glo-
bales de la web que pretenden conseguir el “Single Singn On” (SSO); ésto es, que una vez identifica-
do un usuario éste no tenga que volver a introducir un par usuario/clave al entrar en otro portal.
eBay fue uno de los primeros adoptantes de la propuesta de Microsoft. Sin embargo los cambios intro-
ducidos por la empresa de Redmond en la arquitectura de Passport (probablemente un intento de solu-
cionar los agujeros de seguridad descubiertos recientemente), junto con el abandono de las tecnologí-
as de Microsoft para basar los servicios de eBay en la plataforma J2EE, han llevado al gigante de las
subastas a abandonar esta solución. El sistema Passport era una forma opcional no mayoritaria de
acceder a eBay, y esta decisión sólo afectará a los usuarios que se identificaban mediante este sistema.
eBay no es el primer gran servicio de la red que abandona la propuesta de Microsoft: Monster.com, portal de recursos humanos, también se
despidió de Passport a finales del año pasado. Esto, sin duda, hará ganar más peso a la solución competidora de Passport: Liberty Alliance.

La FSF aclara los términos de la licencia LGPL

La Free Software Foundation ha aclarado (http://www.gnu.org/licenses/lgpl-java.html) varias dudas acerca del uso de librerías LGPL desde
Java. Según la FSF cuando un código no libre se liga con una librería LGPL (y esto ocurre desde el momento que importe cualquiera de sus
clases o interfaces) el desarrollo debe permitir que los usuarios hagan reingeniería inversa para depurar problemas derivados del cambio de
la versión actual de la librería
librería por versiones futuras o modificaciones
modificaciones de ésta.
El desarrollo propietario no tiene obligación de distribuir el código fuente, ni de dar documentación acerca de él, pero sí de permitir la rein-
geniería inversa. Habitualmente las licencias comerciales tienen cláusulas que impiden esta práctica, por lo que es posible que actualmente
haya proyectos comerciales que violen la licencia LGPL sin saberlo.

NetBeans 4.0

Siguiendo el itinerario previsto ya está disponible la versión


4.0 del IDE NetBeans. Una de las novedades más impor-
tantes es que el modelo del proyecto está completamente
basado en Apache Ant, pudiendo compilar el proyecto
externamente sin necesidad de emplear previamente nin-
guna opción del tipo “exportar a Ant”.
Ant”. El soporte a la refac-
torización, al JDK 1.5 y al desarrollo de aplicaciones J2ME
MIDP 2.0 y CLDC 1.1 son otras novedades interesantes.
También hay mejoras en el desarrollo de aplicaciones
web, aunque será la versión 4.1 (planeada para abril de
este año) la que aportará un mayor cambio cualitativo en
este área, ya que incorporará soporte para EJBs, validación de formularios, configuración de servicios y
componentes web, así como un asistente para el despliegue de la aplicación.
Por último cabe destacar la integración de NetBeans con JFluid, una herramienta de profiling libre des-
arrollada dentro de proyecto NetBeans. JFluid permite monitorizar el heap y la actividad del Garbage
Collector, el consumo de CPU de la aplicación en conjunto o de un determinado fragmento de código y
monitorizar la actividad de los Threads.

SOLO PROGRAMADORES nº 122 6 http://digital.revistasprofesionales.com


 JAVAHISPANO
 javaHispano

db4objects disponible bajo licencia libre

db4o (http://www.db4o.com/) es una base de datos orien-


tada a dispositivos empotrados con requerimientos de
tiempo real. db4o permite almacenar de un modo sencillo
y eficiente objetos nativos Java y .NET; sus creadores ase-
guran que es la primera base de datos del mercado que
permite almacenar objetos de ambas plataformas.
Recientemente db4o ha pasado a distribuirse bajo una
doble licencia, libre y comercial, prueba de la apuesta de la
compañía por el Software Libre. A modo de curiosidad, los
coches de alta gama de BMW o el tren español AVE emple-
an esta base de datos, lo cual es una excelente prueba de
la validez de esta solución.

Repositorios on-line de APIs Java

Recientemente han surgido dos iniciativas que pretenden agrupar en un mismo portal un con-
 junto de APIs Java, creando de este modo un punto de acceso único a todas las APIs recopiladas,
y ofreciendo un valor añadido, como herramientas de búsqueda, agregar notas a la documenta-
ción, proponer preguntas y respuestas, añadir código de ejemplo…
El pionero fue JDocs (http://www.jdocs.com), una iniciativa de javalobby.org. En él se recopilan
más de 130 APIs oficiales de diferentes proyectos, como las de los kits de desarrollo de Sun, com-
mons-lang, commons-collections, Eclipse, Lucene, JGoodies…
Un poco más tarde apareció JSourcery (http://www.jsourcery.com), que incluye por lo de ahora
las APIs de todos los proyectos de Apache, el cliente de Bittorrent Azureus, y la del JDK 1.4.2. El
valor añadido de JSourcery sobre JDocs es que al navegar por el API podemos acceder directa-
mente a una versión HTML del código fuente de cada clase, método o constructor.

JLayer, accediendo a MP3 desde Java

JLayer es una librería libre 100% Java que permite tanto convertir audio a MP3 como reproducir archivos que se
encuentren en el segundo formato. La librería tiene dos versiones; por un lado JLayer, versión destinada a apli-
caciones de escritorio de la cual está disponible una versión estable. JLayer ha sido testado con el JDK 5.0, y es
muy eficiente.
Por otro lado está JLayerME-CDC que, como podemos deducir de su nombre, está orientado al desarrollo de aplicaciones
J2ME. Por ahora no hay una versión estable de JLayerME-CDC, aunque la versión actual ya es usable. La licencia es, en
ambos casos, LGPL.

JCrawler 1.0

sobre a aplicación web, medida en hits por segundo. JCrawler


empieza a navegar, partiendo de las URLs base, dirigido por una
serie de patrones de navegación típicos de los seres humanos.
JCrawler mantiene una carga constante sobre la aplicación, y
soporta redirects y cookies; esto, junto con el empleo de patrones
JCrawler es una herramienta para testar aplicaciones web que per- de navegación basados en comportamientos humanos, hace los
mite realizar test de estrés. La herramienta se configura indicando test altamente realistas. Su licencia es CPL, es decir, es libre, y ha
un conjunto de URLs de partida así como una carga a generar sido incluido en el CD-ROM que acompaña a la revista.

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

http://digital.revistasprofesionales.com 7 SOLO PROGRAMADORES nº 122


CANAL PANDA 

Los sistemas móviles, un peligro


para la seguridad corporativa
FERNANDO DE LA CUADRA

hotel. Acostumbrado al entorno de la oficina, los


niveles de seguridad quedan, generalmente, en
Las ventajas que ofrece el uso de segundo plano. Las consecuencias de su despre-
equipos móviles, como ordenadores ocupación pueden ser graves, ya que la ausencia
 portátiles o teléfonos de última de un firewall en el portátil permite que los hac-
kers puedan hacer del PC un terreno conquista-
generación son indiscutibles, sin do, y un antivirus sin actualizar puede ser la
embargo llevan consigo unos causa de que el ordenador se convierta en un
 problemas de seguridad que pueden zombi.
Los problemas que pueden plantearse son
convertirlos en una amenaza para muchos, ya que en este tipo de ordenadores la
nuestra red corporativa. información almacenada suele ser estratégica:
proyectos, ofertas comerciales, bases de datos
En los últimos años, el nivel de seguridad de las de clientes, etc. Se trata de material de gran
empresas ha mejorado mucho. Cada vez se vigi- valor, que no debe caer en manos de la com-
la más la conexión a Internet, la existencia de petencia ni en las de un hacker con pocos
herramientas de seguridad en las máquinas ins- escrúpulos.
taladas en la red, la formación de los usuarios, A todo esto hay que añadir un elemento más
etc. Sin embargo, al mismo tiempo que se avan- que sin duda debería preocupar a los adminis-
za en este sentido, nos encontramos que la tec- tradores de las redes corporativas: tarde o
nología también lo hace pero en una dirección temprano ese ordenador volverá a conectarse a
que puede, sin duda, la red corporativa, con todo aquello que haya
entrar en conflicto “recogido” de Internet en el tiempo que estuvo
con las políticas de ausente. Las herramientas de hacking, los tro-
seguridad clásicas: yanos, el spyware... todo ello podrá ser volcado
la movilidad. directamente a la red si no se toman las medi-
Hoy en día se consi- das oportunas. Sin duda existirán herramientas
dera cada vez más la que eviten la propagación de este tipo de códi-
necesidad de que gos en la empresa, pero hemos dejado una
muchos de los puerta abierta a una serie de elementos sin
empleados en las control.
empresas dispongan Otro problema que suele pasar desapercibido es la
de equipos informá- conexión de sistemas ajenos a la empresa. Cada
ticos móviles, desde vez más servicios se subcontratan dentro de las
ordenadores portá- grandes corporaciones, haciendo que mucho per-
tiles a teléfonos de sonal externo se conecte a la red con sus ordena-
última generación. dores portátiles para desempeñar sus tareas como
Todos estos equipos si de un empleado más se tratara.
están durante mu- Estos ordenadores suelen tener instalados ya
chos días fuera del entorno “seguro” de la ofi- algunos sistemas de seguridad, desde antivirus a
cina, sin que la política de seguridad estableci- firewalls, pero... ¿son suficientemente seguros
da en la compañía pueda ampararles ante posi- como para que cumplan las políticas de seguri-
bles ataques. dad? Los administradores de red tienen bastan-
A un comercial desplazado durante un tiempo tes problemas ya en su trabajo diario como para
fuera de la oficina lo que más suele preocuparle ir verificando uno a uno los ordenadores de cada
es cómo recibir su correo electrónico en el orde- uno de los subcontratados, situación que ade-
nador conectado a Internet en la habitación del más puede resultar embarazosa ya que las nor-

SOLO PROGRAMADORES nº 122 8 http://digital.revistasprofesionales.com


CANAL PANDA 
Los sistemas móviles, un peligro
para la seguridad corporativa

Es recomendable
mas sobre la intimidad de los ordenadores de los chequeo realizado deberá permitirse o dene-
trabajadores pueden ser muy distintas en cada garse el acceso, o incluso establecer un nivel comprobar
compañía. de seguridad en el equipo que se adapte a los
Todo esto desemboca en la necesidad de un requerimientos corporativos de seguridad. los niveles
control específico sobre las conexiones de sis- Sin embargo, en muchas ocasiones la conexión
temas móviles a la red corporativa. Previo a la de equipos externos está ya prevista, por lo que de seguridad
posibilidad de que un usuario rompa las políti- se redirige hacia determinados segmentos de
cas de seguridad, debe llevarse un control red o se establecen automáticamente permisos de un equipo
exhaustivo y automático de la situación de la y restricciones, sin que llegue a producirse un
seguridad de los ordenadores portátiles de per- conflicto de intereses entre políticas de seguri- ajeno antes
sonal externo, o de la empresa pero que hayan dad de distintas empresas.
estado desplazados. Como vemos, la conexión de equipos externos de conectarlo
Cuando un sistema se conecta a la red corpo- a la red fija de una empresa no está exenta de
rativa, hay que asegurarse de que el equipo es problemas, y debe controlarse con mucho cui- a nuestra red
seguro, entendiendo como seguro que cumple dado. Las herramientas de protección de estos
el nivel de seguridad indicado por el adminis- equipos van a convertirse, en un espacio muy
trador de la red. De esta forma, se impide la corto de tiempo, en un elemento básico a la
entrada de malware en la empresa a través de hora de implementar la política de seguridad
estas conexiones. En función del resultado del empresarial.

Sobre el autor
Fernando de la Cuadra (Fdelacuadra@pandasoftware.com) es editor técnico internacional de Panda Software
(http://www.pandasoftware.com).

Seguridad informática para empresas y particulares


Autores: Gonzalo Álvarez Marañón, Pedro Pablo legales de la LOPD y la LSSICE hasta cómo detec-
Pérez García tar una intrusión en el sistema, pasando por
Editorial: Mc Graw Hill temas como el anonimato y la privacidad, la pro-
Páginas: 440 tección de redes y equipos o las auditorías y los
Precio aproximado: 30 Euros análisis forenses.
ISBN: 84-481-4008-7 Aunque las publicaciones sobre seguridad son
Con la colaboración de Panda Software abundantes, el lector encontrará en Seguridad 
informática para empresas y particulares  una
Mientras que la práctica totalidad de libros sobre obra de nivel intermedio pensada desde el pri-
seguridad informática existentes en el mercado mer momento para su aplicación en empresas
abordan el tema desde un medianas y pequeñas que no necesitan com-
lenguaje técnico, orientado plejas arquitecturas de
principalmente a adminis- seguridad, pero que no
tradores de red o programa- por ello deben descui-
dores, Seguridad informáti- darla. Esta obra, escrita
ca para empresas y particu- en castellano, se adecua
lares está dirigido al profe- perfectamente al entorno
sional liberal y la PYME. de las PYME españolas,
Por eso, haciendo uso de cuya realidad conocen los
herramientas que vienen autores.
suministradas con el pro- Desde cómo protegerse del
pio sistema operativo o malware hasta qué hacer con
que son en su mayoría el spam, todos los problemas
gratuitas, con esta obra cotidianos relacionados con el
se puede aprender valor de la información son
desde cuáles son las abordados en este libro cuyo
medidas de seguridad objetivo es que, con muy poco
a implantar para cum- esfuerzo, se pueda alcanzar un
plir con las exigencias nivel de seguridad razonable.

http://digital.revistasprofesionales.com 9 SOLO PROGRAMADORES nº 122


 ACTUALIDAD

Windows Longhorn:
La evolución de .NET (I)
MARINO POSADAS (MVP Visual Developer – Visual C#)
garantizar su salida al mercado en tiempo y forma,
provocaban el anuncio por parte Jim Alchin,
Seguro que el lector más curioso se   Vicepresidente del Grupo de Plataformas de
estará preguntando qué novedades Microsoft, de que una parte del sistema (el subsis-
tema llamado WinFS) no vería la luz en verano de
traerá consigo la nueva versión de 2006, fecha para la que está prevista la salida ofi-
Windows. En esta serie de artículos cial, sino de forma parcial (ésto es, lo que afecta
únicamente al equipo local) y que (en ese momen-
analizaremos las novedades al
to) se distribuirá como una beta opcionalmente
respecto, que no son pocas, desde el instalable, que posiblemente estará lista en su ver-
 punto de vista del usuario pero sión final a comienzos de 2007.
Hablaremos de todo esto, y de cómo se estructura
también desde el punto de vista del y fundamenta el nuevo sistema (totalmente cons-
desarrollador. truido en .NET) y totalmente reescrito, cosa que no
sucedía desde Windows 3.0. Y es que, cuando
Introducción Microsoft abordó la construcción de la plataforma
.NET, no se trataba exclusivamente de una nueva
El lector, probablemente, ya habrá escuchado rumo- forma de construir aplicaciones Windows, sino del
res sobre una nueva versión del sistema operativo de abandono del modelo COM/DCOM/COM+ en favor
Microsoft. En realidad, sobre toda una revolución en de un nuevo modelo, que debía conllevar, inevita-
los sistemas operativos de la compañía de Redmond, blemente, cambios profundos en todos los sistemas
que, por primera vez, aborda la construcción de algo operativos (y en el resto de aplicaciones) que se
tan complejo partiendo desde cero, y con la inten- construyesen a partir de ese momento. Veamos
ción de que sea la continuación natural a sus esfuer- algunos de los porqués de tales cambios.
zos por conseguir una plataforma administrada
(cuyo código ejecutable es supervisado) y segura. El porqué de un cambio tan radical
Y todo esto, dentro de unos planes tan ambiciosos
que, a mediados del año pasado y, con objeto de La pregunta crucial es: ¿Cuál fue el “leit motiv” que
obligó a Microsoft a abandonar un trabajo mante-
nido desde finales de los 80 por algo totalmente
nuevo? Quizá la respuesta se encuentre en la segu-
ridad y (en buena medida) en las nuevas arquitec-
turas distribuidas (especialmente SOA: Services
Oriented Architecture). Pero lo que ahora vemos, no
es sino la consecuencia de unos cambios que
comenzaron en 1996, cuando Bill Gates decidió
dejar la gestión administrativa en manos de Steve
Ballmer, y retomar sus orígenes, como arquitecto
de software. En ese momento, comienza también la
creación (que no el diseño, que había empezado ya)
de lo que podía ser una nueva plataforma que
compitiese con J2EE, aprendiendo lo bueno de ésta,
mejorando rendimiento y productividad, e inte-
grando lo que (ya en ese momento) se preveía
como nuevo estándar universal: XML y los servicios
web. Como una de las primeras decisiones, se abor-
da el “fichaje” de Anders Hejlsberg (véase el cuadro
 El escritorio de Longhorn.

SOLO PROGRAMADORES nº 122 10 http://digital.revistasprofesionales.com


 ACTUALIDAD
 Windows Longhorn: La evolución de .NET (I)

Anders Hejlsberg
Hejlsberg es Distinguished Engineer en Microsoft y pasó 13 años en Borland como Arquitecto Jefe de Plataformas, en los que dirigió (entre
otros proyectos notables) la creación de Turbo Pascal y Delphi. En el campo de los lenguajes su último trabajo fue el diseño e implementación
del lenguaje C# (junto a Scott Wiltamuth y Peter Golde).

“Anders Hejlsberg”). Hejlsberg abandona C++”. El lector puede ver este e-mail en interceptados. Además, el sistema de tipos es
Borland tras 13 fructíferos años (en los que http://techupdate.zdnet.com/techupdate/sto- común a todos los lenguajes (CTS), y los ejecu-
crea Turbo Pascal y Delphi, entre otros pro- ries/main/0,14179,2133983,00.html. Hasta ese tables no dependen más que de sí mismos
ductos estrella) con una promesa de libertad punto, habían sido C/C++ y Java las fuentes de para la instalación y distribución, haciendo de
absoluta, la posibilidad de realizar todos los inspiración para la creación de lo que ahora la plataforma el marco ideal para el nuevo sis-
fichajes posteriores que fuese necesario, y la conocemos como C# (por cierto, lo del ‘#’, es tema. Por si esto fuera poco, en un mundo de
firme voluntad de crear una plataforma debido a que simboliza 4 signos ‘+’, como una arquitecturas distribuidas, el soporte nativo de
nueva que sustituyese a la ya vetusta COM continuación del trabajo de Bjarne Stroustrup en XML y la facilidad de producción y consumo
(ActiveX, para los amigos). el 67. Además, según nos confesaba en una de servicios web, ofrecen un valor añadido que
Pero, además, la nueva plataforma debía de entrevista posterior (la entrevista se realizó en el resulta crítico en el nuevo subsistema de
ser estándar. Microsoft quería demostrar que Tech-Ed de 2001 en Barcelona, y se encuentra comunicaciones que el sistema incluye (de
buena parte de las críticas recibidas en el publicada en la sección de artículos de nombre clave Indigo).
pasado por esta causa, se habían debido a http://www.elavefenix.net), otros lenguajes teóri- Como ya sabe el lector, .NET apareció hace ya
razones comerciales, simplemente, y nunca a cos sirvieron en ocasiones de fundamento, como 3 años. En el camino, otros personajes conoci-
razones técnicas o de incapacidad de crear es el caso de Haskell u Oberon). dos del mundo del desarrollo han sentido el
software que cumpliese con determinada nor- atractivo de esta nueva plataforma (y también
mativa. Así, desde el inicio, se implica directa- Los delegados y la seguridad de los beneficios económicos de la empresa
mente en la creación del estándar XML. Para que lo promociona), incorporándose a distin-
ello, incorpora a sus filas a una de las lumbre- Pero, no nos desviemos de nuestro camino tas áreas del desarrollo de .NET y Longhorn:
ras mundiales en lenguajes de marcas, el fran- hacia Longhorn. Antes de poder crear algo Don Box (autor del estándar XML-Schemas),
cés Jean Paoli, quien junto a Tim Bray, repre- tan ambicioso sobre lo que fundamentar Stan Lippman (co-autor junto a Stroustrup del
sentando a la línea Netscape-Sun-Oracle y incluso un nuevo sistema operativo, había lenguaje C++), Peter Drayton (especialista en
Sperberg-McQueen de la Universidad de problemas graves que resolver. CLR), Yousef Khalidi (arquitecto principal de
Chicago, en representación del mundo acadé- Al menos, así lo veía Hejlsberg, quien, en la Solaris 9 y Cluster 3.0, de Sun Microsystems) y
mico, conseguían a finales de 1999, la aproba- citada conversación veía el problema de la más recientemente, Blake Stone (arquitecto de
ción definitiva de lo que hoy es el nuevo para- siguiente forma (resumo la parte que es fun- JBuilder, de Borland), son algunos de los más
digma de la transferencia de información: damental aquí para la compresión): “El proble- significativos. Estas son (entonces) algunas de
sustituir las marcas binarias utilizadas hasta el ma de los errores del sistema operativo ha sido las principales causas y también de los princi-
momento, por las marcas (<,>) de texto plano, una de las cuestiones críticas a dilucidar a la pales protagonistas de la historia. Repasemos
de forma que todos los ordenadores hablen hora de la construcción de la nueva platafor- ahora la historia en sí.
un mismo lenguaje entre sí, independiente- ma. Más del 90% es a causa de los drivers y lo
mente de la plataforma. De hecho, el sistema único que podemos hacer con eso, es garanti- Las bases arquitectónicas de Longhorn
común de tipos (Common Type System) de zar un esfuerzo por nuestra parte y las compa-
.NET tiene mucho de inspiración en lo que ñías productoras de hardware en ese sentido. Con todo esto por delante, y una nueva ver-
(poco más adelante) se convertiría en el len- Pero, aún así, existe casi un 10% que es debido sión de la plataforma .NET (ahora se encuen-
guaje de metadatos de XML: XML-Schemas. a nuestro software. Los análisis que hicimos de  tra en la versión 2.0), comenzó el diseño del
Con tan buenos fundamentos y algún otro las pantallas azules (las llamadas “Blue  nuevo sistema con unos supuestos muy
fichaje no menos importante, (aunque quizá Screens of Death”) arrojaban unos resultados  ambiciosos. Para comenzar, se pretende que
menos espectacular) que comentamos más ade- sorprendentes. Casi la totalidad se debe única- Longhorn sea instalable en tantos equipos
lante, continúa el diseño de la plataforma y (al mente a dos problemas: punteros a función como sea posible (aún usando un grupo fun-
tiempo) la creación de un nuevo lenguaje que perdidos y problemas de casting (conversión de  cional reducido). Para ello, se han firmado
aprovechará todo lo nuevo que ésta pudiera tipos de datos). Por eso se me ocurrió el con- acuerdos de colaboración con los fabricantes
aportar, dentro de una sintaxis elegante, atracti- cepto de delegado, que, no sólo garantiza la de hardware, para intentar extender lo máxi-
va y poderosa. De hecho, durante el contencioso presencia de las funciones receptoras de una mo posible la Lista de Compatibilidad de
contra Sun Microsystems salió a colación un llamada, (evitando el problema de los punteros  Hardware (HCL), y garantizar (al menos, así se
famoso e-mail de Hejlsberg, dirigido a Bill Gates, a función), sino que obliga a que cualquier des- ha dicho), que incluso un Pentium II con 16
y otros arquitectos, en el que se comentaba: “ya tinatario de esa llamada a función tenga la MB de Ram pueda ser el equipo de destino.
tenemos casi perfilado el cuerpo de lo que va a ser  misma signatura que el delegado (en tiempo De hecho nuevos elementos de la interfaz de
el nuevo lenguaje. A falta de un nombre mejor, de compilación), terminando definitivamente  usuario como el denominado “Mi Hardware”,
vamos a llamarlo J++”. Y previamente, añadía: con los problemas de casting” . darán un acceso y posibilidad de configura-
“hemos conseguido un adecuado maridaje entre  Esta ejecución administrada supone, por ción sin precedentes al hardware instalado
la simplicidad sintáctica de Java y la potencia de  tanto, que los errores pueden ser siempre en el equipo.

http://digital.revistasprofesionales.com 11 SOLO PROGRAMADORES nº 122


 ACTUALIDAD

A todo este conjunto de subsistemas consti-


tuyentes de lo que será la nueva API de
Longhorn, se le denomina WinFX, y permiti-
rá la ejecución de aplicaciones por compati-
bilidad, tan atrás como hasta Win16.
Y otra característica notable: tanto Avalon
como Indigo, serán instalables “en retrospecti-
va”, esto es, se podrán implantar en sistemas
Windows XP y Windows 2003. (de hecho, ya
existe desde diciembre del año pasado una
versión “preview” de WinFX disponible para
pruebas de desarrolladores, y que utilizaremos
para mostrar algunas características de fun-
cionamiento en el próximo número).

El nuevo modelo de desarrollo


de aplicaciones y WinFX
Pero antes de que vayamos al código, vamos a
describir, de cara al usuario avanzado, toda esa
 El objetivo de Longhorn no sólo es soportar el mayor hardware posible, sino también arquitectura y las implicaciones que va a supo-
ofrecer opciones muy avanzadas de configuración del mismo.
ner, de forma que dispongamos de una imagen
En el otro lado de la balanza, el objetivo es que  Indigo: subsistema de comunicaciones, más o menos plástica de tales cambios.
el sistema pueda aprovechar al máximo las basado en la arquitectura SOA (también Con los anteriores supuestos, el abordaje del
altas prestaciones de los equipos actuales, y que llamada arquitectura orientada a servi- sistema se basa en un cambio completo de
esté preparado para aprovechar todo el hard- cios web). paradigma, que los “evangelistas” de Microsoft
ware disponible, ofreciendo al usuario lo que se  WinFS (Windows Future Storage): han definido como “Programa una vez y dis-
denomina una “nueva experiencia de usuario”, subsistema de almacenamiento. tribuye como y cuando quieras”. Así, se trata
cuya riqueza de posibilidades estará condicio-  Palladium: subsistema de seguridad. de un modelo totalmente orientado a objetos,
nada por la potencia del procesador y de la tar- Diseñado de acuerdo a la iniciativa donde un objeto Application suministra toda
 jeta gráfica que poseamos. Así, si disponemos Trustworthy Computing (Informática la infraestructura de ejecución y cuya “metá-
de una tarjera de 32MB y AGP4 podremos Fiable), a la que pertenecen en la actuali- fora de programación”, (por seguir su propia
acceder a lo que ellos denominan AERO. Un sis- dad, IBM, HP, Oracle, Sun, Microsoft, etc. terminología) es similar a la de ASP.NET. Esto
tema de dibujo de ventanas basado en DirectX  Otros subsistemas asociados como las ayu- es, la interfaz de usuario de una aplicación (si
con una impresionante gama de posibilidades. das, la distribución instantánea de aplica- es que dispone de tal cosa) se escribe en un
Si (además) llegamos o sobrepasamos los ciones (one-touch deployment), y un gran lenguaje de marcas tipo XML, como el lector
64MB, tendremos acceso a AERO-GLASS, la paquete de mejoras e innovaciones. que está siguiendo la serie sobre XAML muy
experiencia más rica de usuario implantada
hasta la fecha, con ventanas que se sitúan en el
espacio y no en el plano (y que pueden girar y
moverse libremente por él), diferentes grados
de transparencias para facilitar la lectura, y
muchas otras características, que ya hemos
podido ver en las primeras alphas del producto,
si bien en un estado muy embrionario.
Todas estas novedades no son más que una
parte de los cuatro nuevos subsistemas que
conforman el núcleo central de Longhorn (véase
la figura con los subsistemas de Longhorn):
 Avalon: subsistema gráfico. Basado en

DirectX. Basados en él están las antes


citadas experiencias de usuario: Aero y
Aero-Glass. El lector puede profundizar
sobre Avalon y sus nuevas posibilidades
en la serie de artículos sobre XAML que
se inició el mes anterior.  Esquema de los nuevos subsistemas de Longhorn.

SOLO PROGRAMADORES nº 122 12 http://digital.revistasprofesionales.com


 ACTUALIDAD
 Windows Longhorn: La evolución de .NET (I)

bien sabe: en concreto es una versión propia


del estándar XForms, llamada XAML, que sirve
para describir elementos de IU en términos de
elementos de marcado y que es compilada
antes de su ejecución. La parte funcional del
programa, se codifica en cualquiera de los len-
guajes disponibles para la plataforma .NET
(unos 30 en estos momentos, si bien Visual
Studio .NET 2005 y la siguiente versión, de
nombre clave Orcas, sólo incluirán de forma
predeterminada C++, C#, Visual Basic .NET y
J#). Se comprende ahora el porqué de la apa-
rición del concepto de clases parciales en la
próxima versión de Visual Studio 2005, como
parte fundamental del nuevo modelo. Se trata
de obtener de una única arquitectura progra-
mable, lo mejor de Windows y de la web.
Existe pues, una clara separación entre pre-
sentación y funcionalidad, similar a la de
ASP.NET (o incluso a la de los ficheros XML y  La seguridad es uno de los aspectos que más debe cuidar un sistema operativo.
las hojas de estilo extendidas (XSL), usadas
para su interpretación visual). De hecho la los nuevos chips lleven integradas caracterís- al usuario adecuado. Además, usando la tec-
interpretación gráfica de un fichero XAML es ticas de seguridad que Longhorn pueda apro- nología DRM (Administración de Derechos
directamente una ventana, incluso si no exis- vechar de forma nativa. Son micros que incor- Digitales) Palladium evitará la distribución de
te código fuente asociado con él. De esta porarán esas funcionalidades sin detrimento música, películas, y otro tipo de propiedades
forma el aprovechamiento de las capacidades de la ejecución o el rendimiento y que darán intelectuales a través de Internet (ignoramos a
de DirectX en el dibujo y el pintado en VSYNC origen a toda una nueva generación de soft- la fecha, si esta característica se podrá desins-
con doble buffer, permitirá a los marcos de las ware que aprovechará tales características, talar…) y las productoras de películas y la
ventanas aparecer en parte sombreadas y en aunque los chips y el software básico que lo industria de la música podrán usar esta tecno-
parte translúcidas, haciendo el texto más fácil utiliza permitirá que algunas de esas noveda- logía para permitir a sus clientes usar los dere-
de leer, y dispondremos, igualmente, de trans- des sean utilizadas por equipos antiguos. chos contra el copiado de CDs o películas, por
parencias y animaciones que faciliten y poten- Palladium tiene como algunos de sus objetivos ejemplo. Se asegura que Palladium podrá pro-
cien el uso del sistema. Y todo esto, con visua- más destacados, la posibilidad de informar teger el correo electrónico de tal forma que no
lizaciones de una calidad más moderna y más acerca de con quién se está tratando “on-line”, podrá ser reenviado o copiado a otra gente sin
alta que la utilizada hasta ahora (dependiendo pudiendo limitar (de forma configurable) lo permiso. También se podrán crear documen-
de la potencia de la tarjeta gráfica). Si sólo dis- que llega de Internet y lo que ejecuta cada PC. tos de texto sólo accesibles en fechas determi-
ponemos de una tarjeta básica, (menor de La información se verificará antes de que se nadas u otras circunstancias a establecer.
32MB de memoria), tendremos un sistema pueda acceder a ella. Se protegerán los datos
gráfico tipo Windows 2000. mediante encriptación y el sistema podrá Avalon y algunas consecuencias
Estas novedades en la arquitectura, implican la mantener la integridad de los documentos adicionales
construcción de tipos de aplicaciones total- para que no puedan ser alterados sin el con-
mente nuevas, yendo desde las tradicionales, sentimiento del usuario. ¿Y qué otras consecuencias (meramente ope-
compiladas, a aquellas que se descargan por De igual forma, no se podrán ejecutar progra- rativas, no de programación) nos vamos a
Internet y se ejecutan en el cliente sin dejar mas no autorizados, evitando que los virus encontrar? Pues, depende del subsistema que
huella (una vez concluida su ejecución), u otras afecten al funcionamiento. Respecto al spam, analicemos. Pero en cada uno de ellos un
que se actualizan automáticamente, e incluso será evitado antes de que llegue a la bandeja montón, según parece. Gracias a Avalon, dis-
aplicaciones compiladas de tipo navegador de entrada. El correo no solicitado que se pondremos de las siguientes características:
que se descargan y ejecutan progresivamente. quiera recibir sólo será permitido si sigue una  El menú inicio se podrá convertir en una

serie de credenciales que coincidan con nues- barra lateral realizada en XML que ocu-
Palladium y la seguridad tros parámetros de usuario previamente defi- pará la posición lateral de la pantalla.
nidos. El sistema aplica un nuevo motor de  Se podrá personalizar al igual que la

¿Y qué hay de la seguridad? Palladium es el inteligencia artificial actualmente terminado lista de programas del menú inicio.
nombre clave para un nuevo sistema de segu- y en fase de pruebas en Microsoft Research.  Se mejorarán “Mis Documentos”, “Mis

ridad basado en gran parte en el propio hard- En el otro sentido, también se controlará lo imágenes” y “Mi música”, con despliegues
ware. Microsoft ha llegado a acuerdos con los que sale del PC usando agentes de software de información mejorados que usarán las
principales fabricantes (Intel y AMD) para que que garantizarán que los datos sólo alcanzan últimas innovaciones multimedia.

http://digital.revistasprofesionales.com 13 SOLO PROGRAMADORES nº 122


 ACTUALIDAD

archivada físicamente. El cómo los usuarios y


aplicaciones organizan esta información, tam-
bién está separada de cómo se almacena en
disco. Los datos pueden ser organizados usan-
do una estructura conectada de carpetas, nom-
bres de espacios para datos, propiedades, tablas
o identificadores invariantes o relacionales.
Para beneficiar a los desarrolladores, WinFS
soporta servicios de datos unificados para
todas las aplicaciones de usuario final.
Algunos los más notables, son los Servicios
Integrados de Datos, como la sincronización,
notificación, el almacenamiento unificado y
un modelo común de seguridad, así como su
integración con otras tecnologías como redes
punto a punto (P2P) y servicios de directorio.

Indigo y las comunicaciones


Por último concluimos esta primera revisión
 Avalon mejora notablemente la interfaz gráfica. En esta figura podemos ver el nuevo de Longhorn con unas pinceladas sobre el
aspecto de “Mis imágenes”. subsistema de comunicaciones, Indigo.
 “Mis Imágenes” incluirá nuevas opcio- (buenos en streaming) y las bases de datos Aunque iremos más en detalle y con algo de
nes para crear un álbum de fotos, des- (buenas en indexación y búsquedas). WinFS código fuente en el próximo número, hay que
cargar vídeos de una cámara digital, o mantiene una base de datos estructurada con citar que Indigo pretende unificar todos los
grabar un DVD. Tanto DVD-R/RW como las propiedades de los ficheros almacenados servicios del sistema operativo, permitiendo la
DVD+R/RW estarán soportados. en el SO, y utiliza NTFS (que ahora es transac- interoperatividad con los actuales, y dotando
 También se incluirá Windows Movie cional) para almacenar los ficheros. WinFS al usuario de un API de acceso común.
Maker 2, que será rehecho completa- soporta un indexado eficiente del contenido Así mismo, suministrará un sistema de men-
mente en Longhorn e incluirá varias del fichero, con lo cual se enriquece cualquier sajería de alto rendimiento, con independencia
características nuevas. Esta nueva ver- tipo de búsqueda que sería tremendamente de los transportes y canales, y un modelo de
sión estará basada en Microsoft difícil en otro sistema de archivos (pudiendo servicios orientado al atributo (al tipo de infor-
Producer, un añadido de PowerPoint buscar incluso, otros objetos del sistema, como mación que se transporta). Por otra parte, sus
2003. por ejemplo, contactos, o correos). En WinFS es contenedores podrán ser diversos, variando
 Otra mejora será la del Soporte de sencillo buscar ficheros basados en su conteni- desde aplicaciones ASP.NET u otros servicios,
Pantalla Inteligente. Una versión simpli- do y otros criterios como el nombre del archi- hasta clásicos EXEs, componentes COM+, o
ficada de éste ya fue incorporada en el vo, titulo, autor o fecha de publicación. incluso, los nuevos “containers” que definirá el
Service Pack 1 de Windows XP. Esto, Aunque, en principio, WinFS se pensó que podría modelo de aplicaciones de Longhorn.
permitirá que dos usuarios puedan ini- ser usado con máquinas que ejecuten versiones En suma, se trata de un nuevo diseño basado en
ciar sesión en el mismo sistema, uno anteriores de Windows con tal que su sistema de el modelo de Arquitectura Orientada a Servicios
empleando la primera pantalla y el otro archivos sea NTFS, este punto no está del todo (SOA), capaz de interactuar con casi todo lo exis-
la secundaria. Se esperan asimismo claro al día de la fecha. Lo que sí es cierto, es que tente, y que, al igual que sucederá con Avalon,
mejoras de velocidad en este sistema. los ficheros almacenados en WinFS pueden ser podrá estar disponible también para las platafor-
accedidos usando las nuevas APIs de WinFS o mas Windows 2003 y Windows XP Service Pack 2.
WinFS y las implicaciones bien el actual Win32 API. Como complemento,
las actuales aplicaciones Win32, podrán acceder Conclusiones
Aunque no es cierto que WinFS no vaya a a los ficheros almacenados en WinFS con ningu-
estar presente en absoluto en la versión inicial na o con una muy pequeña modificación. En fin, un montón de novedades, algunas de
de Longhorn, tal y como se ha comentado por Los ficheros pueden ser almacenados con ellas en fase de depuración y otras bastante
ahí, sí que lo es que no lo va a estar en toda su WinFS o con NTFS, pero WinFS es mucho avanzadas que esperamos poder ver este vera-
extensión, tal y como se pensó en un principio, más eficiente que NTFS para organizar, bus- no cuando aparezca la primera beta oficial del
y que esa funcionalidad será suministrada en car y compartir ficheros. producto. Hasta entonces, haremos una revi-
forma de beta instalable, hasta que aparezca WinFS es particularmente potente para alma- sión de lo que supone Longhorn desde el punto
completo en su versión final en 2007. cenar datos que necesitan ser buscados o com- de vista del desarrollador en el próximo núme-
Tal y como se había concebido, Windows partidos por usuarios y aplicaciones, y en ro de Sólo Programadores , basándonos en las
Future Storage reúne lo mejor de dos entornos WinFS, la información se estructura de forma versiones “preview” disponibles, tanto del pro-
de trabajo con datos, los sistemas de ficheros distinta e independientemente de cómo esté ducto en sí, como del SDK de WinFX.

SOLO PROGRAMADORES nº 122 14 http://digital.revistasprofesionales.com


DISPOSITIVOS MÓVILES

Juegos de calidad
comercial en J2ME (I)
ALBERTO GUTIÉRREZ MARTÍNEZ
FRANCISCO JOSÉ GA RCÍA PEÑALVO (Profesor titular del prestaciones y que se verá más adelante, aunque
departamento de Informática y Automática de la
Universidad de Salamanca) también se hará referencia en ocasiones a la
Serie 40 de Nokia, plataforma que incluye teléfo-
En los números anteriores de Sólo nos para el mercado de consumo.
 Programadores se presentaron las Se ha elegido la Serie 60 de Nokia por varios moti-
 bases para el desarrollo de un vos, entre los que cabe destacar los siguientes:
 Cuota de mercado, ya que Nokia actualmen-
videojuego con J2ME. Sin embargo, te es el líder indiscutible del sector.
con esta serie de artículos queremos  Demanda, ya que los poseedores de este tipo

ir más allá. Nuestro objetivo será de terminales son los mayores demandantes
de juegos Java.
aprender el API de Nokia para poder   Espectacularidad, ya que son los terminales

desarrollar juegos de auténtica que permiten unos juegos más espectaculares.


 Adaptación al Terminal objetivo, ya que los
calidad comercial específicos para
desarrolladores profesionales de juegos Java
este tipo de terminales. adaptan sus juegos a sus terminales objetivo
para sacar el mayor partido de ellos. De modo
Introducción que siempre habrá que acabar utilizando una
API propietaria de un fabricante, que en este
En esta serie de cinco artículos vamos a conocer caso será la de Nokia, pero siguiendo procedi-
las limitaciones de la primera versión del perfil de mientos similares se podría usar la API de
programación de terminales móviles con Java, es Siemens por ejemplo.
decir, MIDP (Mobile Information Device Profile) Lo primero que debemos saber como programado-
versión 1.0, J2ME (Java 2 Micro Edition) y aprender res es sobre qué sistema operativo vamos a pro-
a superarlas con APIs (Application Programming gramar. El “Windows” en telefonía móvil se llama
Interfaces) propietarias, con especial atención a la Symbian OS. Y decimos el “Windows”, no sólo por-
de Nokia. Conoceremos, además, los problemas de que sea un sistema operativo gráfico, sino porque
programar para un teléfono real, para lo que exa- está tan extendido en los teléfonos móviles, como
minaremos en profundidad las características de Windows en los ordenadores personales.
varios terminales de Nokia. En los dos últimos artí- Actualmente la mayoría de los fabricantes de telé-
culos de la serie configuraremos un IDE gratuito fonos móviles (Nokia, Sony-Ericsson, Siemens,
para trabajar con J2ME y programaremos un Samsung y Panasonic, entre otros), instalan
“matamarcianos” clásico a pantalla completa con Symbian OS en sus terminales, aunque cambian la
sonido digital. interfaz gráfica y parecen sistemas operativos dis-
Con todo ello habremos aprendido las técnicas tintos, por debajo todos ejecutan el mismo sistema
que usan los juegos de última generación para operativo. Por poner un ejemplo, los Sony-Ericsson
sacar el máximo partido a nuestros móviles. Como de gama alta, como el P-800, ejecutan Symbian
Con el API de Nokia requisitos previos se supone que el lector tiene pero por encima implementan una interfaz de
unos conocimientos básicos de J2ME y tiene ins- usuario llamada UIQ. En el momento de la publica-
ganaremos un 30% talado todo lo necesario para poder compilar un ción de esta serie de artículos, Symbian OS va por
MIDlet (nombre que se le da a las aplicaciones su versión 8, que ya tienen teléfonos como el
de pantalla que se desarrolladas con MIDP). Nokia 6630.
Antes de empezar a desarrollar juegos Java de Actualmente existen dos tecnologías para desarro-
desperdicia si sólo calidad comercial, es fundamental conocer llar juegos para teléfonos móviles con sistema ope-
dónde enmarcaremos dicha tecnología. Esta rativo Symbian, una es la que nos ocupa (J2ME) y
programamos serie de artículos estará centrada a los termina- otra es C++. Debemos tener muy claro que desde el
les Nokia, y más concretamente a los de la Serie momento en el que decidimos emplear tecnología
con MIDP 1.0 60, plataforma que incluye teléfonos de altas Java para nuestras aplicaciones nos habremos

SOLO PROGRAMADORES nº 122 16 http://digital.revistasprofesionales.com


DISPOSITIVOS MÓVILES
 Juegos de calidad comercial en J2ME (I)

Comparación J2ME y Symbian OS


atado no sólo a las ventajas sino también a las J2ME Symbian OS
desventajas de usar código interpretado. Éstas
Tamaño de aplicación
son principalmente baja velocidad de ejecu- permitido
Decenas de Kb Varios MB
ción y limitaciones funcionales. Para entender
estas desventajas hay que saber distinguir Estándar abierto Sí Sí
entre código interpretado y código nativo, que Deployment (Despliegue) Grande Más pequeño
aunque muchos de nuestros lectores ya cono-
cerán las diferencias, vamos a hacer en pocas Soporte de varios
Sí Sí
fabricantes
líneas un pequeño repaso a ello:
 El código nativo es el código que obten- Sí, sin embargo las aplicaciones
dríamos al compilar un programa en de Symbian OS son normalmen-
Instalación OTA Sí
C++. Es el código máquina que puede te tan grandes que es imposible
ser ejecutado por el sistema operativo la distribución OTA
del teléfono móvil. Ejecución de forma nativa No Sí
 El código interpretado es el código que
Lenguaje de programación Java C++
obtendríamos al compilar un programa
en Java. Ese código debe ser traducido a Comunicación con servidores
Sí Sí
código máquina en el momento de su remotos
ejecución, por la Máquina Virtual Java. Animación en 2D Sí Sí
Esa traducción es la responsable de la
baja velocidad de ejecución mencionada Normalmente No. Sólo para los
anteriormente. móviles de última generación que
Cuando se habla de limitaciones funcionales se Animación en 3D soportan la especificación JSR- Sí
está haciendo referencia a que sólo se dispon- 184. Una completa API 3D basa-
drá de los recursos que la implementación de la da en Open GL es Open GL ES
máquina virtual Java nos permita utilizar. La
máquina virtual Java, por tanto, nos aísla , en la Normalmente No. J2ME puede
llamada “sandbox”(caja de arena), de las pecu- reproducir vídeos en teléfonos
liaridades del teléfono que se está programan- Mostrar vídeos
que soporten la Java Mobile
Sí, si lo permite el terminal
do. Razón por la cuál nuestro programa Java no Media API como el Nokia 3650 y
podrá, por ejemplo, usar la conexión por infra- posteriores o en teléfonos con
rrojos del teléfono, a no ser que el fabricante MIDP 2.0
nos proporcione una API a tal efecto. Por poner
un ejemplo, la especificación MIDP 1.0 de J2ME Normalmente No. Se necesita la
Audio MIDI API propietaria del fabricante o Sí
no permite el uso de ningún tipo de sonido. No MIDP 2.0
obstante los fabricantes de terminales con
capacidad para reproducir sonidos polifónicos Normalmente No. Se necesita la
o MIDI, como Nokia o Sony-Ericsson, permiten Audio de alta calidad API propietaria del fabricante o Sí
descargar desde la web las APIs que, entre otras, MIDP 2.0
nos proporcionan funciones para que nuestros
programas puedan sacar el máximo partido de Normalmente No. Acceso a los
sus terminales. En el cuadro “Comparación SMS desde J2ME es posible usan-
J2ME y Symbian OS” se muestra una compara- Acceso a SMS
do la Nokia SMS API (soportada Sí (Además MMS si lo soporta el
tiva entre las dos tecnologías comentadas ante- en Nokia 3410) o la Wireless terminal)
riormente. Messaging API (soportada por los
Nokia 3650 y posteriores)
Limitaciones de la plataforma
Normalmente No. Sólo para ter-
Cuando hablamos de limitaciones de la pla- Acceso a puerto de
minales con MIDP 2.0 ya que Siempre que lo tenga el terminal
Infrarrojos y Bl bluetooth
taforma, nos referimos no sólo a las limita- soportan la Bluetooth API
ciones que tienen los teléfonos móviles en
comparación con los ordenadores de sobre- Acceso a la agenda,
No Sí
mesa, sino también a las de J2ME en compa- calendario…
ración con J2SE (Java 2 Second Edition). En Marcar un teléfono No Sí
los siguientes apartados se enumeran dichas Complicaciones de desarrollo
limitaciones. Menos que Symbian Sí
multiplataforma

http://digital.revistasprofesionales.com 17 SOLO PROGRAMADORES nº 122


DISPOSITIVOS MÓVILES

Energía
Es el principal problema de cualquier aparato
electrónico y el causante, de forma directa o
indirecta, del resto de limitaciones. Es éste un
campo de continua investigación, ya que cada
vez los aparatos electrónicos son más comple-
 jos y demandan más recursos energéticos para
funcionar. Aunque en la actualidad con la
popularidad de las baterías de Litio los termi-
nales móviles han experimentado un impor-
tante incremento de autonomía, debemos
siempre tener en consideración a la hora de
programar nuestros juegos las limitaciones
energéticas. Por ejemplo, no deberemos abusar
de la vibración pues acabaremos con la batería
del teléfono en poco tiempo. Además, que el
  juego use vibración o sonido, deberían ser  Figura 1. Despliegue OTA.
opciones configurables. Y es que el altavoz del
teléfono es otro gran consumidor de energía. clase “Canvas” (lienzo). Y el uso de ésta está color mostrará los gráficos en movimiento tan
fuertemente ligado a la resolución de la pan- borrosos que serán impracticables.
Pantalla talla. Para que nuestro juego fuera lo más por-
Hay casi tantas variantes como modelos de table posible, lo ideal sería que todos los gráfi- Teclado
teléfonos en el mercado. La principal diferen- cos que se utilicen fueran escalables, de modo Un factor determinante para el éxito de un
cia es el número de colores que pueden repre- que se pudiera adaptar el juego a cualquier  juego es su jugabilidad. Y ésta depende direc-
sentar. Desde monocromo hasta los 65.535 tamaño de pantalla. Esto sólo será posible en tamente de los controles que el dispositivo nos
colores de los terminales más actuales. contadas ocasiones, así que tendremos que proporcione. En el momento de publicación de
Hay que tener especial cuidado cuando des- adaptar nuestro juego a cada resolución. Por esta serie de artículos, el único móvil del mer-
arrollemos juegos susceptibles de ser ejecu- lo tanto en este tipo de desarrollos será de cado concebido para jugar es el Nokia N-Gage
tados en pantallas monocromas o de escala vital importancia que nuestro código tenga y su evolución el Nokia N-Gage QD. El resto de
de grises, ya que si los gráficos no están una buena estructura que aísle todo lo posible los móviles, en el mejor de los casos, no están
especialmente adaptados, lo más probable la lógica del juego de las rutinas gráficas. preparados nada más que para movernos en
es que sean tan confusos que no se pueda Otro aspecto a tener muy en cuenta es la velo- las cuatro direcciones. Por si esto fuera poco,
llegar a jugar con un mínimo de calidad. cidad de refresco de la pantalla. Si estamos además los teclados no suelen tener una res-
La resolución de la pantalla será otro factor creando un juego de acción en el que, por puesta rápida, y lo que es aún peor, cada móvil
importantísimo a tener en cuenta. Aunque en ejemplo, usemos “scrolls” rápidos, deberemos tiene una disposición distinta de las teclas, que
J2ME podemos utilizar controles para cons- probarlo sobre todos los terminales que tene- puede llegar a ser tan problemática que haga
truir formularios que se verán correctamente mos como objetivo, pues habrá teléfonos que imposible el manejo del juego en determinados
en cualquier pantalla, cuando hacemos un aún capaces de ejecutar nuestro programa sin modelos. Especial atención en este aspecto
 juego al final siempre tendremos que usar la problemas, la baja calidad de su pantalla a merece el Nokia 3650, cuyo teclado se encuen-
tra en disposición circular. Por lo tanto no sería
mala idea permitir al usuario configurar los
controles a su gusto.
Por otra parte, en lo referente a las facilidades
de J2ME para gestionar las pulsaciones de
teclado, son un tanto escasas pero suficientes.
Por ejemplo, para detectar la pulsación conti-
nuada de una tecla deberemos hacerlo a la
antigua usanza, almacenando dicha tecla en
una variable, tal y como se explicará más ade-
lante, junto con la forma de detectar la pulsa-
ción simultánea de varias teclas.

Tamaño
A la hora de desplegar una aplicación MIDP,
toda la lógica y los recursos de la aplicación
 Figura 2. Despliegue por puerto de comunicaciones. quedan empaquetados en un fichero de

SOLO PROGRAMADORES nº 122 18 http://digital.revistasprofesionales.com


DISPOSITIVOS MÓVILES
 Juegos de calidad comercial en J2ME (I)

tipo JAR (Java Archive). Por tanto, las limi-


taciones de tamaño se refieren al tamaño
que ocupa el archivo .jar final del juego
listo para distribuirse.
Aunque el espacio de almacenamiento dis-
ponible en los móviles suele ser muy limita-
do, éste no será nuestro principal problema.
La razón por la que no deberemos superar
un tamaño límite, que puede estar entorno
a los 150KB, está relacionada con el proce-
so de distribución (deployment) de los jue-
gos para móviles. El modelo de negocio
actual de la venta de aplicaciones para
móviles consiste en que nosotros como
desarrolladores llegamos a un acuerdo con
la operadora, de modo que ella se encarga
de hacer accesible nuestro juego a sus
clientes y de la facturación. A cambio, la
operadora se queda con un porcentaje por
cada descarga del juego. A esta forma de  Figura 3. Despliegue mediante memory card.
distribución de las aplicaciones Java se la
llama OTA (Over-The-Air provisioning, problema fundamental es que estos méto- función de las prestaciones del móvil. Sin
véase la figura 1). dos facilitarían la piratería de los programas. embargo, hay un mínimo de 64KB de memo-
Por tanto, nuestro fichero deberá viajar por El modelo de negocio novedoso que ha pues- ria de ejecución que el estándar CLDC
una red GSM (Global System for Mobile) o to en marcha Nokia con la Nokia N-Gage (Connection Limited Devide Configuration)
por una GPRS (General Packet Radio consiste en distribuir los juegos en SD cards obliga que tengan todos los terminales. Por
Service), redes que tienen una tasa de trans- (vease la figura 3), equiparando el negocio al ejemplo, la Serie 60 de Nokia tiene cerca de
ferencia muy baja. Hasta que no se popula- de las videoconsolas. Aunque la mayoría de 4MB de memoria de ejecución. Los emulado-
rice el uso de redes UMTS (Universal Mobile los juegos en este soporte son nativos de res que usamos para probar nuestros juegos
Telecommunications System) nuestra apli- Nokia, también los hay hechos en Java. en tiempo de desarrollo nos mostrarán siem-
cación deberá viajar por redes de banda Gracias a este soporte no habría la limitación pre en pantalla la cantidad de memoria
estrecha, pero en cualquier caso el cliente de tamaño comentada anteriormente. usada en todo momento, dato éste que ten-
que compre nuestro producto deberá aca- dremos que vigilar para que nunca esté
rrear con los gastos de la transmisión del Memoria de ejecución demasiado cerca del límite que tenga nuestro
fichero .jar hasta su móvil. Aunque los ter- Aunque nuestro programa no ocupe mucho terminal objetivo.
minales más potentes podrían soportar jue- espacio en disco, puede ser capaz de acabar
gos que ocuparan más de 1MB sin demasia- rápidamente con la memoria de ejecución Sonido
dos problemas, no habría ningún cliente que del móvil. MIDP 1.0 no soporta el uso de sonido. Por
se descargara dicha cantidad de datos, por lo Si, por ejemplo, nos dedicamos a instanciar tanto, a no ser que usemos una API especí-
menos con los precios actuales. Además, las objetos indiscriminadamente sin liberarlos explí- fica del fabricante que permita reproducir
operadoras imponen un límite de tamaño citamente, es más que probable que veamos el sonidos polifónicos, nuestro juego será
máximo para OTA, que deberemos conocer fatídico mensaje de “Memoria Insuficiente”, de completamente mudo. Además, la mayoría
de antemano a la hora de crear nuestro forma que nuestro juego muera, pudiendo de los modelos tienen unos altavoces de
 juego. incluso en ocasiones llegar a matar hasta al pro- baja calidad, lo cual habrá que tener en
Por poner un ejemplo práctico, la Serie 40 pio sistema operativo del teléfono. cuenta, pues será inútil usar sonidos digita-
de Nokia impone un límite de 64KB para el Los procesadores que suelen ejecutar J2ME les de alta calidad. En este aspecto las cosas
fichero .jar, y de 5KB para el fichero JAD son tan poco potentes que no se pueden per- están cambiando y teléfonos como los
(Java Application Descriptor). mitir el “lujo” de llevar una gestión minuciosa Sony-Ericsson y los Samsung tienen un
Las aplicaciones J2ME se pueden instalar de los objetos en memoria que ya no se van a sonido estéreo de gran calidad. No así los
también usando USB (Universal Serial Bus), usar, como hace J2SE. Eso significa que el Nokia, en los que actualmente no merecerá
un puerto de infrarrojos o mediante blueto- recolector de basura sólo sea llamado en con- mucho la pena que nos esmeremos dema-
oth (véase la figura 2). Sin embargo, actual- tadas ocasiones, y debamos nosotros explíci- siado en el aspecto sonoro.
mente no existe ningún modelo de negocio tamente invocar al método “System.gc()” de
que permita el aprovechamiento de estos vez en cuando. Procesador
modos de instalación, ya que el usuario Cada fabricante de terminales decide el Los procesadores de los teléfonos móviles
necesitaría tener un ordenador. Aunque el tamaño de esta memoria de ejecución en son por lo general muy lentos y nuestros

http://digital.revistasprofesionales.com 19 SOLO PROGRAMADORES nº 122


DISPOSITIVOS MÓVILES

Comparación DP 1.x y DP 2.0


programas no deberían demandar dema- Developer Platform 1.0 for Series 60 Developer Platform 2.0 for Series 60
siados recursos de ellos. Más aún si esta-
mos desarrollando en Java, porque a parte MIDP 1.0 MIDP 2.0
de los recursos que demande el sistema
operativo, que no son pocos, se estará eje- CLDC 1.0 CLDC 1.0
cutando la máquina virtual Java, y encima Wireless Messaging API (JSR-120)
de todo esto, se deberá ejecutar nuestro Wireless Messaging API (JSR-120)
(excepto el Nokia 7650)
 juego.
Para complicar un poco más las cosas, los Mobile Media API (JSR-135)
Mobile Media API (JSR-135)
fabricantes de móviles no mencionan el (excepto el Nokia 7650)
tipo de procesador que utilizan sus mode- XHTML browsing XHTML Browsing sobre TCP/IP
los, ni mucho menos la frecuencia de éstos.
Además, las diferencias de rendimiento Mensajes MMS con Synchronized Multimedia
Mensajería MMS (Mensajes Multimedia)
entre distintos modelos son muy variables, Integration Language (SMIL)
como ejemplo, en la Serie 60 de Nokia, hay Sin posibilidad de programar
una diferencia notable de rendimiento APIs for Bluetooth (JSR-82)
bluetooth con J2ME
entre el Nokia 7650 y el Nokia 3650, siendo
éste último más rápido que el anterior. Por Symbian OS v6.1 Symbian OS v7.0
tanto, como siempre, deberemos probar
nuestros juegos en los modelos objetivo, Ejemplo: Nokia 3650 Ejemplo: Nokia 6600
pues un juego que es capaz de “mover” un
Nokia 3650 por ejemplo, en un Nokia 7650 actualidad, las operadoras españolas aca- común la Serie 60 de Nokia es el tamaño de
puede ser impracticable. ban de empezar a comercializar UMTS aun- la pantalla (176x208 píxeles), una profundi-
que todavía existen muy pocos usuarios dad de color mínima de 4.096 colores y
Ausencia de float y double con terminales de tercera generación. Por capacidad de conexión bluetooth. Otros
Como se ha comentado en el apartado tanto, con la red actual, para nuestro juego aspectos como puede ser la capacidad de
anterior, los procesadores de los teléfonos puede ser factible, por ejemplo, bajarse la proceso, o de sonido, son similares pero en
móviles son muy sencillos, tan sencillos que lista de las 10 mejores puntuaciones aloja- absoluto idénticos. Cada modelo que apa-
normalmente no tienen ni unidad de coma da en un servidor, o quizá enviar o recibir rece en el mercado dentro de la Serie 60 es
flotante. Es por esta razón que J2ME no un par de imágenes de baja resolución superior al anterior, y no nos deberemos
dispone de los tipos de datos primitivos . guiar tanto del número de modelo como
float y double. Sin ellos se dificulta, en prin- La Serie 60 de Nokia del orden de aparición en el mercado. Por
cipio, hacer cálculos trigonométricos, razón ejemplo, el Nokia 3650 es superior al 7650.
por la que han desaparecido métodos de la La Serie 60 de Nokia es una línea de produc- Como desarrolladores debemos conocer las
clase “Math” como “cos()” y “sin()”. En pró- tos guiada por las prestaciones en contrapo- características de la plataforma de desarrollo
ximos artículos daremos una solución para sición a otras de la misma Nokia guiadas por para la Serie 60, (Developer Platform for
este problema usando una clase de libre el precio y el tamaño del terminal, como por Series 60). Es importante distinguir entre las
distribución llamada “MathFP”. ejemplo la Serie 40. dos versiones principales, la 1.0 y la 2.0.
Conocer las características técnicas de los Dentro de la versión 1.0 existen otras inter-
Hilos sin método stop() terminales objetivo es de vital importancia medias, por lo que normalmente nos referi-
Otro de los múltiples recortes de J2ME es la a la hora de desarrollar aplicaciones para mos a ella como versión 1.x.
supresión de métodos en la clase “Thread”. móviles, ya que aunque la tecnología de En el cuadro “Comparación DP 1.x y DP 2.0”
En próximos artículos hablaremos del traba- programación es la misma, las platafor- se muestran las principales características de
  jo con hilos, e indicaremos cómo parar un mas son muy distintas entre sí. Incluso las dos versiones.
hilo que no tiene método “stop()”. entre los distintos modelos de una misma Para conocer las características técnicas de
serie se encuentran diferencias importan- cualquier móvil de Nokia, incluidos los de la
Red de comunicaciones de banda estrecha tes en cuanto a recursos y disposición del Serie 60, se pude visitar el enlace
Como ya se ha mencionado anteriormente teclado. http://www.forum.nokia.com/main/1,6566,0
al hablar del tamaño final del juego, las Por tanto, antes de desarrollar una aplica- 10_40,00.html.
redes GSM y GPRS son lentas, caras e ines- ción para un terminal móvil hay que cono- A continuación se muestran algunos mode-
tables. Debemos tener en cuenta esto si cer las capacidades de la plataforma objeti- los de la Serie 60 de Nokia por orden de
pretendemos que nuestra aplicación envíe vo, y luego ser consciente de que habrá que aparición.
o reciba datos. El usuario de nuestro pro- adaptar la aplicación y hacer las pruebas
grama deberá estar siempre bien informado pertinentes con cada modelo de terminal 7650
del uso que se haga de la red, pues el uso donde se desee ejecutar. En el caso concre- Primer modelo de la Serie 60 (véase la figu-
de este recurso le cuesta dinero. En la to que nos ocupa, lo único que tiene en ra 4). Modelo de alta gama y alto coste,

SOLO PROGRAMADORES nº 122 20 http://digital.revistasprofesionales.com


DISPOSITIVOS MÓVILES
 Juegos de calidad comercial en J2ME (I)

 Figura 4. Modelo  Figura 5. Modelo  Figura 6. Modelo  Figura 7. Modelo  Figura 8. Modelo  Figura 9. Modelo
7650 de Nokia.  3650 de Nokia.  N-Gage de Nokia. 6600 de Nokia.  3660 de Nokia. 7610 de Nokia.

orientado a ejecutivos. Es el único modelo deberá ser nuestra plataforma objetivo. 3660
de la Serie 60 que dispone de foto sensor Numerosas compañías desarrolladoras de Es prácticamente idéntico al modelo 3650
(no programable en MIDP). Este modelo no software de entretenimiento han portado salvo que la disposición del teclado ha
se comercializó en USA. De serie no lleva ya los juegos más populares a esta plata- cambiado de la disposición circular a la
software para grabación de vídeo pero forma. Títulos como Tomb Rider y Sonic the típica de cualquier teléfono móvil (véase la
Nokia lo proporciona gratuitamente en su Hedgehog ya se encuentran en el mercado, figura 8). Además su pantalla es capaz de
web. No tiene lector de tarjetas MMC con una calidad en cuanto a gráficos y mostrar 65.535 colores. La versión america-
(MultiMediaCard). Tiene capacidad de soni- sonido, muy similar a la de las antiguas na de este modelo se llama 3620. El tama-
do polifónico pero dispone de un altavoz de consolas de 16 bits como la Megadrive de ño máximo de aplicación Java es de 4MB y
poca calidad. Lleva cámara incorporada. El Sega. Los juegos se distribuyen en tarjetas la memoria de ejecución máxima (heap
tamaño máximo de aplicación Java es de MMC. Este modelo no incorpora cámara. El size) es de 1,4MB.
4MB y la memoria de ejecución máxima tamaño máximo de aplicación Java es de
(heap size) es de 1,4MB. 4MB y la memoria de ejecución máxima 7610
(heap size) es de 2,8MB. Es el primer teléfono de Nokia en incorpo-
3650 rar una cámara de 1 Megapíxel. Además
Terminal multimedia orientado a gente 6600 es novedoso también su puerto USB Pop-
 joven (véase la figura 5). Viene de serie con Es el primer teléfono de la comentada ante- Port que permite una rápida conectividad
software para grabación de vídeo y para riormente Developer Platform 2.0 for Series con un PC. Por todo lo demás, es similar al
reproducción (Real ONE player). La disposi- 60 (véase la figura 7). Lleva la versión 7 del modelo 3660. El tamaño máximo de apli-
ción del teclado en círculo es de vital sistema operativo Symbian que a simple cación Java es de 4MB y la memoria de
importancia a tener en cuenta a la hora de vista no se diferencia mucho de la versión ejecución máxima (heap size) es de 8MB.
definir las teclas de control de nuestro anterior. Su pantalla es de 65.535 colores.
 juego. Tiene capacidad de sonido polifónico La mejora más necesaria que se echaba de MIDlet para conocer las capacidades
pero dispone de un altavoz de poca calidad. menos en modelos anteriores ha sido en lo gráficas de nuestro móvil
Incorpora lector de tarjetas MMC. Lleva referente al sonido. Es también destacable
cámara incorporada. El tamaño máximo de la posibilidad de zoom de la cámara incor- Si las pantallas de la mayoría de los móvi-
aplicación Java es de 4MB y la memoria de porada, sin haber variado la resolución ni la les son pequeñas, al utilizar un “Canvas” la
ejecución máxima (heap size) es de 1,4MB. calidad de la misma respecto a modelos pantalla de nuestro juego todavía será más
anteriores. Lo más importante de este telé- pequeña que la pantalla del móvil. Si se
N-Gage fono para los programadores Java es que es observan los juegos Java comerciales de
Es el primer móvil orientado al mercado del el primer Nokia en soportar MIDP 2.0, calidad, como por ejemplo el “Prince of 
entretenimiento (véase la figura 6). Puede hecho este que facilita bastante la progra- Persia” de Gameloft, veremos que se ejecu-
reproducir MP3 y es competencia directa mación de juegos. La versión para el merca- tan a pantalla completa. ¿Cómo lo hacen?
de consolas de videojuegos portátiles como do americano de este modelo se llama ¡No hay ninguna clase en MIDP 1.0 que sea
la Gameboy. Los compradores de este 6620. El tamaño máximo de aplicación Java capaz de conseguir esto! La solución la
modelo serán los usuarios más dispuestos a es de 4MB y la memoria de ejecución máxi- veremos en próximos artículos cuando
adquirir nuestros juegos, por lo que ésta ma (heap size) es de 3MB. hablemos de la clase “FullCanvas” de la API
propietaria de Nokia.
Como se puede deducir a estas alturas, cuan-
do desarrollemos un juego deberemos adap-
tar los gráficos al terminal en el que quere-
mos que funcione nuestra aplicación. Para
ello deberemos conocer con exactitud las
características de la pantalla de nuestro ter-
minal. Esto no es otra cosa que “interrogar” a
la clase “Canvas” sobre sus propiedades, aun-
 Figura 10. KTootlBar.
que también tendremos que sacar algunas

http://digital.revistasprofesionales.com 21 SOLO PROGRAMADORES nº 122


DISPOSITIVOS MÓVILES

downloads.html) y posteriormente instalar el mente la Serie 60 de Nokia tiene un área


J2ME Wireless Toolkit 2.2 de SUN que puede de pantalla de 176x208 píxeles. Hemos
obtenerse en http://java.sun.com/products/ perdido 64 píxeles en altura de nuestra
 j2mewtoolkit/download-2_2.html. pantalla, lo que supone más de un 30% de
Una vez instalado el software buscaremos la pantalla.
la aplicación KToolBar (véase la figura 10). El teléfono admite double buffering. Esto
Pulsaremos sobre “New Project”. Le dare- significa que el propio teléfono maneja una
mos el nombre que queramos al proyecto memoria de vídeo donde hace los cambios
(sin espacios) y en el campo “MIDlet name” oportunos antes de mostrarlos por pantalla
tendremos que poner “Principal”. en un evento de repintado. Esto a efectos
Posteriormente aparecerá otro diálogo con prácticos significa que podremos recoger el
la etiqueta “API Selection” activa. objeto “Graphics”, que recibiremos del even-
Deberemos aquí seleccionar como “Target to “Paint” del “Canvas”, y pintar sobre él,
Platform” MIDP 1.0, y al aceptar observare- sabiendo que no vamos a tener el engorroso
mos que volvemos al entorno de la efecto de parpadeo de nuestros gráficos, que
KToolBar que ahora nos indica con un un juego sin double buffering tendría.
texto dónde deberemos poner los fuentes y Como vemos el objeto “Canvas” nos dirá si el
los recursos del proyecto. Los ficheros teléfono sobre el que estamos ejecutando
fuentes en: tiene una pantalla táctil, lo que abriría un
[unidad de instalación]/WTK22/[Nombre gran abanico de posibilidades a la interac-
Proyecto]/src/ ción con nuestros juegos.
Aunque la clase “Canvas” en principio pare-
Los ficheros de recursos en: ce estar relacionada con gráficos, vemos que
[unidad de instalación]/WTK22/[Nombre también lo está con el teclado. Esta propie-
 Figura 11. Aplicación en ejecución sobre 
el emulador Serie 60 de Nokia. Proyecto]/res/ dad nos dice que el terminal es capaz de
detectar cuándo hemos dejado pulsado un
propiedades de la clase “Display”. Esto es lo Y los ficheros de bibliotecas en: botón, levantándose eventos a tal efecto
que haremos en el programa que se recoge en [unidad de instalación]/WTK22/[Nombre como veremos más adelante.
el listado 1 incluido en el CD-ROM. Este pro- Proyecto]/lib/ Las dos propiedades que hemos sacado per-
grama tiene como peculiaridad que hemos tenecen al objeto “Display”, y como observa-
hecho el “truco” de Java, para poder usar la Una vez copiado el archivo “Principal.java” mos nos hablan de las posibilidades gráficas
clase “Canvas” sin tener que instanciar una incluido en el CD-ROM y mostrado en el lis- de la pantalla. Con la primera sabemos que
clase que herede de ella, ni crear otro .java. La tado 1 al directorio de fuentes correspon- la pantalla es en color y con la segunda
clase “Canvas” es una clase abstracta y debe- diente, sólo tendremos que pulsar en “Build” sabemos cuántos colores es capaz de mos-
mos implementar su método “paint()” al ins- para compilar y/o “Run” para ejecutar en un trar simultáneamente. Vamos a fijarnos en
tanciarla. En esa misma sentencia, además emulador, tal como muestra la figura 11. ésta última. Según las características de la
estamos asignando el “Display” al “Canvas” Serie 60 de Nokia, el teléfono que más colo-
que se ha creado. Por lo demás, el código es Conclusiones res podía mostrar estaba en torno a los
auto explicativo, y nos estamos limitando a 65.000. En el emulador vemos que la panta-
sacar propiedades de ambas clases (“Canvas” Analicemos los resultados usando el emu- lla muestra 16 millones de colores. Si ejecu-
y “Display”) por pantalla. lador de Nokia de la Serie 60 (en próximos tamos la misma aplicación en un Nokia
números veremos su instalación, mientras 3650, todas las propiedades salen idénticas,
Compilación tanto el lector puede probar el ejemplo con salvo ésta última, en la que aparece el valor
los emuladores que el Wireless Toolkit trae real de 4.096 colores. Ésta es una muestra
Los lectores de Sólo Programadores  ya han por defecto), y comparándolo con un telé- más de que nunca nos deberemos fiar de los
practicado con las herramientas necesarias fono real, el Nokia 3650. Lo que debería emuladores...
para el desarrollo con J2ME, sin embargo verse es lo que aparece en la figura 11. En el próximo número veremos en profun-
repetiremos aquí, una vez más, los pasos a De los datos que obtenemos nos fijamos didad la API propietaria de Nokia para,
seguir para ejecutar un proyecto J2ME en un primero en la resolución del “Canvas”. El entre otras cosas, aprovechar ese 30% de
emulador. programa nos dice que tenemos disponi- pantalla que como acabamos de comprobar
Para desarrollar aplicaciones J2ME es necesa- ble para nuestro juego un área de 176x144 se desperdicia si sólo programamos con
rio tener el J2SE SDK (http://java.sun.com/j2se/ píxeles, cuando según dijimos anterior- MIDP 1.0.

Agradecimientos
Los autores agradecen a la empresa Flag Solutions (http://www.flagsolutions.net) y al grupo AWEG (Adaptive Web Engineering Group) de la Universidad de
Salamanca sus aportaciones y consejos para la elaboración de este artículo.

SOLO PROGRAMADORES nº 122 22 http://digital.revistasprofesionales.com


MIDDLEWARE

XAML (II)
ERICH R. BÜHLER (MVP en .NET Framework)
1.-XAML define una interfaz gráfica avanzada
para una ventana o página utilizando como
XAML cambiará radicalmente la medio un documento en formato XML.
filosofía de desarrollo de las 2.-XAML es un lenguaje declarativo aunque se
aplicaciones, por lo que a la interfaz puede también interactuar con este median-
te código (escritura de eventos para contro-
de usuario se refiere. En esta les, creación dinámica de elementos, etc.).
segunda entrega analizaremos 3.-Cada elemento de XAML se corresponde con
algunos aspectos centrados en la una clase del nuevo conjunto de clases que se
le adicionará a .NET Framework 2.0.
 programación de interfaces bajo esta 4.-XAML cuenta con su propio conjunto de con-
nueva tecnología. troles que no son de Windows Forms, aunque
en casos extremos se pueden también inser-
Introducción tar estos últimos.
5.-La apariencia de controles se establece
En el artículo anterior conocimos las ideas bási- mediante etiquetas o atributos, contándose
cas de la estructura de XAML y vimos también con propiedades complejas y la posibilidad de
que marcará un hito en la forma en la que se pro- interactuar desde un control hijo con su
gramarán las aplicaciones. El hecho de que cam- padre (por ejemplo, un botón que indique la
bie el motor gráfico implica nuevas posibilidades posición dentro de su contenedor).
y abre el espectro a un nuevo conjunto de aplica- 6.-Todo dentro de XAML (incluso los controles)
ciones que serán vistas como una mezcla entre lo pueden ser vectoriales, lo que da la ventaja de
mejor del web y Windows, multimedia, y docu- llegar a ser “resolución independiente”.
mentos. Le estoy anticipando que es un buen A estas seis verdades hay que sumarle que es muy
momento para que comience a aprender XAML si sencillo aplicarle una animación a un conjunto de
no quiere quedarse atrás. Esto es lo mismo que si controles de la interfaz gráfica, por ejemplo para
hace 12 años (cuando algunas pantallas todavía que varíe a lo largo del tiempo su forma, tamaño,
solían ser de fósforo verde) le hubiese dicho que color, etc. Por supuesto que todo esto es en realidad
sería buena idea que considerase programar para un pequeño conjunto de las ventajas, he iremos
Windows. Es que en realidad me he quedado muy viendo más a lo largo de las distintas entregas.
corto en el artículo pasado sobre las bondades de
la nueva camada de aplicaciones, pero afortuna- Resolución independiente
damente aquí comenzaré a desvelar varias carac-
terísticas que si bien mencioné brevemente ahora Si conoce .NET Framework sabrá que es posible ade-
ya se está en condiciones de plasmar. Por supues- cuar el tamaño de los controles de un contenedor
to que si no leyó la entrega anterior no es mala (ventana, marco, etc.) de acuerdo al espacio dispo-
idea que se haga de alguna forma con ella, ya que nible, aunque en realidad lo que hacía la infraes-
tengo la intención al finalizar con esta serie de tructura era reducir los anchos y altos de los ele-
artículos abordando la mayor parte de las carac- mentos. Mediante las propiedades “Anchor” y
XAML permite terísticas de XAML y así lograr que esté en carre- “Dock” se definían medidas relativas al contenedor
ra para los próximos años. o borde y finalmente si el mismo cambiaba los con-
crear IGUs troles disminuían su tamaño o se apretaban entre sí,
Las 6 verdades absolutas sobre XAML lo que daba algunas ventajas si nuestro cliente no
visualizables tanto tenía la resolución de pantalla esperada. Ésto es lo
Los siguientes 6 puntos ya los vimos en la entrega mismo que si usted se muda a una casa más peque-
en ventanas como anterior, pero deseo refrescar su memoria sobre todo ña y desea conservar todos sus muebles, en realidad
porque sé que un mes puede llegar a ser mucho tiem- éstos tendrán el mismo tamaño pero por supuesto
en navegadores po para tener presente la totalidad de un artículo. dentro de un espacio menor.

SOLO PROGRAMADORES nº 122 24 http://digital.revistasprofesionales.com


MIDDLEWARE
 XAML (II)

 Vea ahora la figura 1, en ella se muestran 3


copias de la misma ventana la que he adecua-
do su tamaño manualmente estirando y/o
contrayendo sus bordes. ¿Qué hay de fantás-
tico en ello? Si presta atención notará que su
contenido ha sido realmente adecuado de
acuerdo al espacio disponible, esto es así por-
que todo es vectorial en XAML incluso los
controles. ¡Ahora sus muebles cambian de
tamaño de acuerdo al espacio disponible!
Por supuesto que ello hace que la solución
ofrecida en .NET Framework 1.1 pase a ser una
broma de mal gusto comparada con la nueva
potencia de auto-ajuste en XAML. Veremos
más adelante lo sencillo que es lograr esta
característica utilizando un tipo de contene-  Figura 1. XAML nos permite construir interfaces vectoriales, lo cual permitirá a
dor especial llamado “ViewBox”. Pero antes nuestras ventanas adaptarse al tamaño necesario sin perder por ello el diseño original.
vamos a analizar brevemente el modelo pro-
puesto por Microsoft conociendo los nuevos objetivo principal radica en mostrar informa- código a alguna de las páginas entonces se
tipos de aplicación. ción como podrían ser documentos o gráficos. dice que se tiene una aplicación y allí la apro-
Debido a ello están disponibles varias caracte- ximación es diferente. En estos casos se debe-
Nuevos tipos de aplicación rísticas para la gestión de la visualización rá compilar el código para poder visualizar su
como puede ser zoom y vistas de una o más resultado de forma funcional. Para ello se uti-
Para Microsoft es doble responsabilidad XAML páginas, firmas de documentos, etc. Éste es un liza una herramienta llamada MSBUILD de la
por un lado por ser el padre de esta tecnología importante capítulo para la nueva infraestruc- que hablaremos en próximas entregas.
y por otro por ser la piedra fundamental de los tura ya que se ha hecho un esfuerzo muy Otra cosa muy importante a entender es que
nuevos tipos de aplicación. Hasta el momento grande y como veremos en próximas entregas las aplicaciones navegables o de documentos
en la programación clásica se podían distin- se ha adicionado una nueva y completa
guir 3 tipos diferentes de ellas: infraestructura para la visualización de docu-
 Aplicación web mentos. Prometo cubrir este punto en su tota-
 Aplicación de ventanas lidad en breve.
 Aplicación de ventanas que interactúa Finalmente se tienen las “aplicaciones de ven-
con servicios web XML u otro servicio web tana” donde se cuenta con una o más venta-
El último punto puede no ser considerado un nas en un modelo similar al que ya conoce,
tipo específico de aplicación, pero he decidi- aunque los controles factibles de ser incluidos
do incluirlo ya que interactúa con lo mejor de son muchísimo más amplios que tan sólo el
los dos mundos: web y Windows. El nuevo reducido número de los intrínsecos de
modelo propuesto por Microsoft incluye Windows.
también 3 tipos llamados aplicaciones WinFX Es importante destacar que la mayor parte
(véase la figura 2), aunque en realidad difie- de los elementos pueden ser utilizados en los
ren de lo que se conoce actualmente. tres modelos, lo que brinda una transparen-
El primer tipo es el llamado “aplicaciones de cia total entre ellos. Digo la mayor parte por-
páginas múltiples” y es conceptualmente simi- que por supuesto que no es posible emplear
lar a una aplicación web. Una aplicación de los llamados controles de navegación cuan-
este tipo consistirá de una o más páginas do se usa el modelo de ventanas.
XAML y cada una de ellas representará una
interfaz gráfica dentro de la aplicación. Una Compilación de aplicaciones
vez que el usuario finalice con una página vs documentos
podrá pasar a la próxima y así sucesivamente.
El código de programación (el que responde a Si se tienen documentos XAML “sueltos”, esto
los eventos) de cada una de ellas está en gene- es sin código asociado a los mismos, entonces
ral contenido por un archivo externo, en forma ellos serán factibles de ser visualizados sim-
similar a como se hace hoy en día en ASP.NET. plemente haciendo doble clic; se abrirá enton-
El segundo tipo es el de “documentos”, aquí ces el visor predeterminado y mostrará su
 Figura 2. Ejemplo de los tres tipos de 
también se tienen múltiples páginas en las que contenido, al igual que se hace hoy en día con aplicaciones WinFX propuestos por el 
el usuario puede navegar, pero sin embargo el una página HTML. Ahora bien, si se asocia nuevo modelo de Microsoft.

http://digital.revistasprofesionales.com 25 SOLO PROGRAMADORES nº 122


MIDDLEWARE

LISTADO 1 El contenedor ViewBox


pueden ser visualizadas tanto dentro de una
<Viewbox>
ventana como dentro de un navegador. El <Canvas Width=”350” Height=”80” Background=”Gold”>
cambio de un tipo a otro debe indicarse en <!—Aquí dibuja los controles—>
tiempo de compilación, esto no implica en </Canvas>
</Viewbox>
general más que modificar un parámetro de
compilación, lo que hace muy fácil abstraerse 1.-Controles contenedores contenga un panel y que a su vez este panel
del modelo. 2.-Controles de interacción con el usuario contenga otros y así sucesivamente.
Como último decir que la creación de con- El primer grupo ofrece diferentes alternativas El primer paso es entonces elegir uno de
troles también puede ser realizada mediante de paneles, es decir, aquellos que se encarga- ellos de acuerdo a las características que
código prescindiendo de los documentos rán de almacenar a los demás elementos. éste ofrece, lo que lógicamente podrá reper-
XAML. Esto es así ya que como comenté Podemos imaginarnos esto como un conjun- cutir en la conducta de sus miembros. Una
anteriormente cada control es una clase de to de distintos tipos de contenedores para los vez hecho ésto pasaremos a hacer uso del
la infraestructura la cual puede ser gestiona- más diversos usos. La importancia de los segundo grupo, el que ofrece desde botones,
da de forma estándar como tantas otras. controles contenedores radica en que luego hipervínculos, multimedia, etc. Pero antes de
sus integrantes podrán ganar sus caracterís- comenzar a escribir XAML quiero detenerme
Trabajando con contenedores ticas. Por ejemplo, existe un control llamado para comentarle las diferentes alternativas
“ViewBox” que se encarga de que si cambia que necesitará tener instalado si quiere pro-
 Vamos a empezar viendo cómo trabajar con su tamaño se adecue su contenido. Como ve, gramar en XAML:
documentos “sueltos”, esto es, sin lógica aso- éste es el tipo de panel que he utilizado para 1.- Visor XAML de Xamlon y también con-
ciada a ellos. Una vez que entendamos el fun- el ejemplo de la figura 1, el contenido del lis- versor de Flash a este formato
cionamiento comenzaremos a vincular todo tado 1 es un resumen de su código. (http://www.xamlon.com).
esto con los diferentes tipos de aplicación. A A su vez algunos controles de interacción 2.- Visor XAML de Mobiform, que contiene
modo de organizar los distintos tipos de con- con el usuario tienen que ser obligatoria- el único editor gráfico en el momento
trol, he separado a los mismos dentro de 2 gru- mente almacenados por un contenedor (http://www.mobiform.com).
pos lógicos, aunque esta división es totalmen- específico, veremos ésto cuando tratemos al 3.-  Visor XAML de Microsoft contenido
te ficticia y solamente tiene el fin de que pueda tipo “Gris”. Además se pueden anidar varios dentro del paquete SDK de WinFX
entender su funcionamiento y relación: contenedores, por ejemplo que “ViewBox” (http://www.msdn.microsoft.com).
Los 7 tipos de contenedor
Espacio de nombres
Control Descripción
en .NET Framework 2.0
Define un área en el cual cada elemento contenido puede ser dibujado en una coordenada del
Canvas eje vertical y horizontal relativo al mismo. Es lo más parecido al posicionamiento que utiliza System.Windows.Controls
 Visual Basic u otros lenguajes para situar los controles en sus formularios.
Define un área en el que los elementos contenidos se pueden organizar uno con respecto al
DockPanel otro, tanto sea en forma vertical u horizontal, y se pueden especificar los tamaños de los con- System.Windows.Controls
troles en porcentaje relativo al contenedor.

FlowPanel Alinea y particiona el contenido (controles) en varias líneas para el caso que exceda la longi- System.Windows.Controls
tud del espacio horizontal disponible en la línea.
Establece una cuadrícula consistente de filas y columnas; cada elemento puede ser posiciona-
Gris do dentro de uno de los espacios formados. Es un panel menos pesado en recursos que “Table”, System.Windows.Controls
pero también ofrece menos características.
Table Muestra datos en forma tabular, como lo hace cualquier tabla. System.Windows.Documents
Gestiona una o más líneas de texto como de sólo lectura así como también todo lo referente a su for-
Text mato. Es mucho más liviano en recursos, en comparación con “TextPanel”, pero ofrece menos funciona- System.Windows.Controls
lidades.
Gestiona una o más líneas de texto como de sólo lectura así como también todo lo referente
a su formato. Algunos controles deben ser obligatoriamente contenidos por este tipo de panel.
TextPanel Se utiliza en general para darle formato a documentos, aunque no es excluyente. Soporta tam- System.Windows.Documents
bién paginación del contenido.
El contenido del mismo será escalado al tamaño del contenedor. Puede contener un sólo hijo
 ViewBox directo, aunque ésto no es un problema ya que se puede insertar un panel y luego dentro de System.Windows.Documents
éste otros.

SOLO PROGRAMADORES nº 122 26 http://digital.revistasprofesionales.com


Sólo Programadores
en Formato
Digital 
Con el respaldo de más de diez años 
de publicación mensual y sin interrupciones 
Entra en http://digital.revistasprofesionales.com
Suscripción anual a Sólo Programadores por sólo 27 euros 
y a Sólo Programadores y Mundo Linux por sólo 40 euros 
Regalo de un CD-ROM con el archivo de los 12 ejemplares
de la temporada 2003-04
MIDDLEWARE

LISTADO 2 Formateando un texto con TextPanel

<TextPanel xmlns=”http://schemas.microsoft.com/2003/xaml” FontFamily=”Palatino Linotype”>


<Heading OutlineLevel=”5”>.NET framework</Heading>
<Heading OutlineLevel=”4”>.NET framework</Heading>
<Heading OutlineLevel=”3”>.NET framework</Heading>

<Paragraph>Si piensas en migrar tus aplicaciones de VB4, VB5, o VB6, deberías tener en cuenta que la nueva versión
de Microsoft Visual Basic .NET cambia radicalmente la forma en que harás las cosas, y los productos que ya tienes imple-
mentados.</Paragraph>

<Block FontSize=”30” HorizontalAlignment=”Center” Capitals=”Titling”>Guía de migración y actualización a</Block>


<Block FontSize=”30” HorizontalAlignment=”Center”>Visual Basic .NET</Block>
<Block></Block>
<Block HorizontalAlignment=”Center” Capitals=”Titling”>Erich Buhler</Block>
<Block></Block>
<Block HorizontalAlignment=”Center” Capitals=”Unicase”>McGraw-Hill</Block>
<Block HorizontalAlignment=”Center” Capitals=”AllSmallCaps”>ISBN 84-481-3271-8</Block>
<LineBreak/>

<List>
<ListElementItem><Bold>Todo lo que necesita conocer</Bold></ListElementItem>
<ListElementItem><Underline>Explicado en forma sencilla</Underline></ListElementItem>
<ListElementItem><Bold><Underline>18 capítulos</Underline></Bold></ListElementItem>
<ListElementItem><Italic>Casi 1.000 páginas</Italic></ListElementItem>
</List>
</TextPanel>

Es importante destacar que la implementación ado empleando varias de las características, a las propiedades “Left” y “Top” del panel prin-
WinFX del SDK de Microsoft es lógicamente la mientras que la figura 3 exhibe su resultado. cipal para indicar su posicionamiento dentro
que ofrece el conjunto más amplio de carac- del mismo. Véase el resultado en la figura 4.
terísticas. Sin embargo al momento de escribir Canvas... el modelo tradicional
este artículo la misma requiere que esté sus- DockPanel
crito a la MSDN. Por su parte Mobiform cuen- El marco “Canvas” es uno de los más sencillos
ta con un editor gráfico que hace posible dise- de utilizar ya que ofrece un modelo cartesiano, “DockPanel” organiza los elementos contenidos
ñar las páginas XAML de forma muy sencilla; ésto es, que los elementos pueden ser posicio- en forma horizontal o vertical uno con respec-
por supuesto que no es mala idea tener lo nados en un valor fijo del eje vertical y horizon- to al otro. Cada control integrante puede esta-
mejor de cada uno. En cuanto a los requisitos tal respectivo al contenedor. El listado 3 emplea blecer una propiedad llamada “Dock”, la que
de sistema operativo son Windows XP, 2000 o un “Canvas” principal y luego otros secunda- brinda cinco opciones: “Top” (arriba), “Bottom”
2003 (dependiendo del producto). rios que almacenarán diferentes rectángulos (abajo), “Left” (izquierda), “Right” (Derecha), o
de distintos colores. Por último se dibuja un “Fill” (rellenar). En tiempo de ejecución
Tipos de contenedor botón directamente sobre el control principal, “DockPanel” examinará las propiedades de cada
lo que nos servirá nuevamente para ver cómo integrante y determinará su posición con res-
Como vimos anteriormente los tipos de panel un elemento secundario interactúa con la pecto al miembro anterior, así como también si
condicionarán el comportamiento y las futuras  jerarquía. En este caso el botón hace referencia deberá o no cubrir todo el panel. A su vez el
propiedades de su contenido. Existen 7 posi-
bles contenedores y se explican brevemente en
el cuadro “Los 7 tipos de contenedor”.
No deseo aburrirlo ya que quiero que siga
leyendo mi entrega de XAML, y debido a ello
veremos en esta segunda parte del curso
solamente algunos de los contenedores, y en
próximas conoceremos más sobre el resto.

TextPanel... el más sencillo


Con “TextPanel” es sencillo darle formato a los
textos y afortunadamente utiliza nomenclatura
en muchos casos comparable con algunas eti-
quetas HTML. Ello hace que sea fácil compren-
der su funcionamiento. Básicamente es posible
especificar desde diferentes tipos de letras a blo-
ques, pasando por párrafos o listas de elemen-
tos, así como también jerarquía de títulos. El lis-
tado 2 muestra cómo exhibir un texto formate-  Figura 3. El código del listado 2 en ejecución.

SOLO PROGRAMADORES nº 122 28 http://digital.revistasprofesionales.com


MIDDLEWARE
 XAML (II)

LISTADO 3 Combinación de Canvas


tamaño del control se puede especificar como
<Canvas
porcentaje de “DockPanel”, lo que hará que si se xmlns=”http://schemas.microsoft.com/2003/xaml”
cambia el tamaño del panel también se modifi- Height=”600”
que el de sus integrantes. El listado 4 utiliza un Width=”800”>
<Canvas Height=”100” Width=”100” Top=”10” Left=”0”>
panel principal y 2 paneles secundarios; estos <Rectangle Width=”100” Height=”100” Fill=”red”/>
últimos ocuparán cada uno el 50% del área. El </Canvas>
<Canvas Height=”100” Width=”100” Top=”110” Left=”100”>
primero definirá varios botones de tamaño y <Rectangle Width=”100” Height=”100” Fill=”green”/>
posición relativa, mientras que el segundo es un </Canvas>
<Canvas Height=”100” Width=”100” Top=”50” Left=”50”>
botón que cubrirá la totalidad del espacio. El <Rectangle Width=”100” Height=”100” Fill=”blue”/>
resultado puede verse en la figura 5. </Canvas>
<Button Canvas.Left=”10” Canvas.Top=”220” Width=”100” Height=”50”>Hace
algo...</Button>
FlowPanel </Canvas>

“FlowPanel” es utilizado para gestionar conte-


nido que pueda en algún momento ocupar LISTADO 4 Organizando elementos con DockPanel
más de una línea y tenga que ser reorganiza-
<DockPanel
do dinámicamente. Básicamente este panel xmlns=”http://schemas.microsoft.com/2003/xaml”>
contiene propiedades para indicar el alinea- <DockPanel
Height=”100%”
miento y qué hacer si se sobrepasa la línea. A Width=”50%”>
su vez el panel puede reacomodar sus miem- <Button DockPanel.Dock=”Top” Width=”20%” Height=”10%”>Arriba</Button>
bros de forma que se utilice mejor el espacio. <Button DockPanel.Dock=”Bottom” Width=”20%” Height=”30%”>Medio</Button>
<Button DockPanel.Dock=”Bottom” Width=”20%” Height=”10%”>Abajo</Button>
El listado 5 muestra cómo “FlowPanel” reorga- </DockPanel>
niza automáticamente su contenido cuando el <DockPanel
xmlns=”http://schemas.microsoft.com/2003/xaml”
tamaño del panel es menor que el de la longi- Height=”100%”
tud de sus elementos (véase la figura 6). Width=”50%”>
<Button DockPanel.Dock=”Fill”>Completo</Button>
</DockPanel>
 ViewBox </DockPanel>

Hablamos ya brevemente de “ViewBox” al


comienzo de este capítulo pero solamente nos cuenta con propiedades de alto y ancho máxi- ellos tendrá que adicionar alguno de los
basamos en su funcionamiento. Como habrá mo, lo que lógicamente indicará que en caso de paneles vistos anteriormente y luego ya sí
visto, este panel ajusta dinámicamente el con- sobrepasarse la altura o ancho el contenido se dentro del mismo los elementos que desee.
tenido a su nuevo tamaño, pero a diferencia fije utilizando esta información (véase de nuevo
con otras aproximaciones, el mismo es real- la figura 1). Recursos y estilos
mente escalado en vez de limitarse solamente a Debe tener en cuenta que “ViewBox” puede
disminuir los espacios o tamaño de los contro- contener un sólo control secundario, por lo En XAML es muy sencillo personalizar la apa-
les. Como podemos apreciar en el listado 6 se que en caso de que desee insertar más de riencia de los controles y de la aplicación

 Figura 4. El código del listado 3 en


ejecución.  Figura 5. El código del listado 4 en ejecución.

http://digital.revistasprofesionales.com 29 SOLO PROGRAMADORES nº 122


MIDDLEWARE

LISTADO 5 Reorganizando el contenido con FlowPanel

<Border xmlns=”http://schemas.microsoft.com/2003/xaml” Background=”White”>


<FlowPanel>
<Border Background=”Yellow” Width=”1in” Height=”1in”/>
<Border Background=”Blue” Width=”1in” Height=”1in”/>
<Border Background=”Red” Width=”1in” Height=”1in”/>
<Border Background=”Green” Width=”1in” Height=”1in”/>
</FlowPanel>
</Border>

 Figura 6. El código del listado 5 en LISTADO 6 Ejemplo de ViewBox


ejecución.
<Window xmlns=”http://schemas.microsoft.com/2003/xaml/”>
<Viewbox MaxHeight=”600” MaxWidth=”800”>
mediante la utilización de estilos. Cuando digo <Canvas Width=”350” Height=”80” Background=”Gold”>
personalizar la apariencia veremos que es <Label ID=”Label1” Height=”18” Width=”177” Canvas.Top=”17”
mucho más flexible que tan sólo modificar los Canvas.Left=”15” FontSize=”12”>Nombre del archivo:</Label>
<TextBox Height=”24” Width=”177” Canvas.Top=”16” Canvas.Left=”139”
colores. Sin embargo, antes de explicar qué es Foreground=”Black” BorderBrush=”Black” FontSize=”12”/>
un estilo debemos comprender qué son los <Button Height=”20” Width=”77” Canvas.Top=”49” Canvas.Left=”153”
BorderBrush=”Black” FontSize=”12”>Abrir</Button>
recursos. Preste atención al listado 7. <Button Height=”20” Width=”77” Canvas.Top=”49” Canvas.Left=”238”
Este código define un nuevo recurso llamado Foreground=”Black” BorderBrush=”Black” FontSize=”12”>Cancelar
“Micolor” que es un relleno de color Rojo y </Button>
</Canvas>
sólido. Este elemento pasa a ser parte de la </Viewbox>
colección de recursos del panel. Cada ele- </Window>
mento en XAML puede contar una colección
de estos. De esta forma es posible definir uno LISTADO 7 Definiendo un nuevo recurso
o más miembros en el control que usted
<Border
desee, pero en general se establece en el ele- xmlns=”http://schemas.microsoft.com/2003/xaml”
mento principal con el fin de que pueda ser xmlns:def=”Definition”
Background=”Yellow”>
utilizado por los controles de la jerarquía. <FlowPanel>
Una vez que el recurso es creado pasará a <FlowPanel.Resources>
estar disponible para los otros objetos, esto <SolidColorBrush def:Name=”MiColor” Color=”Red”/>
</FlowPanel.Resources>
es, como suministro de valor para una o más <Button Background=”{MiColor}”/>
propiedades. Siempre se debe hacer referen- <Ellipse Fill=”{MiColor}”/>
</FlowPanel>
cia al recurso utilizando llaves, y recordando </Border>
que se diferencia entre mayúsculas y minús-
culas. La siguiente línea establecerá como LISTADO 8 Definiendo un nuevo estilo
fondo del botón el relleno definido en el
recurso del panel: <Border
xmlns=”http://schemas.microsoft.com/2003/xaml”
<Button Background=”{MiColor}”/> xmlns:def=”Definition”
Background=”BlanchedAlmond”>
<FlowPanel>
En tiempo de ejecución el valor “Micolor” <FlowPanel.Resources>
será buscado en la colección de recursos del <Style def:Name=”MiPlantillaBoton”>
botón, pero al no haber nadie con este nom- <Button Background=”Red” FontSize=”18” Height=”30”/>
</Style>
bre se subirá en la jerarquía hasta que se </FlowPanel.Resources>
encuentre uno con la misma denominación. <Button>Botón normal</Button>
<Button Style=”{MiPlantillaBoton}”>¡Este sí que es un botón con esti-
Sin embargo existe una utilidad que es real- lo!</Button>
mente interesante, la que radica en la posi- </FlowPanel>
bilidad de definir un objeto plantilla y pos- </Border>

teriormente aplicar las características del


mismo a otro objeto del mismo tipo; a esto En este caso se ha definido un botón de plan- Conclusiones
se lo denomina “Estilo” (véase el listado 8 y tilla que contiene el posible estilo a utilizar.
la figura 7). Aquí se incluye el color de fondo, de fuente y Hasta aquí hemos llegado, sé que nos falta
la altura, pero nada con respecto al resto de mucho por ver y como siempre hay poco
las propiedades. En tiempo de ejecución se espacio. En la próxima entrega seguiremos
dibujará el botón utilizando el estilo y poste- avanzando en el tema de estilos ya que le
riormente se aplicarán los valores establecidos brinda mucha flexibilidad (aquí simplemente
 Figura 7. Como se aprecia en la figura, en el propio control. Para el caso de haber un he hecho una breve reseña). Además conoce-
la personalización de los controles  conflicto siempre se descartará el valor del remos más sobre controles y documentos.
mediante estilos va más allá de un simple 
cambio de colores. estilo quedando el del elemento en sí. Hasta el mes que viene.

SOLO PROGRAMADORES nº 122 30 http://digital.revistasprofesionales.com


CD-ROM

Contenido del CD-ROM


Fuentes dores Java. En esta sección se incluye el do, en gran parte, las cuestiones tecnoló-
proyecto que se ha venido desarrollando en gicas referidas a la implementación. En
Juegos de calidad comercial en J2ME (I) el artículo. última instancia, se pretende que las apli-
Antes de iniciar el diseño y desarrollo de caciones puedan ser menos vulnerables a
una aplicación sobre un terminal móvil, es Programación los cambios tecnológicos.
necesario conocer las capacidades y limi- Por ejemplo, AndroMDA es capaz de recibir
taciones del mismo. En esta primera AndroMDA 3.0M3 como entrada un modelo conceptual (dise-
entrega, hemos preparado una pequeña AndroMDA es una herramienta construida ñado con una herramienta CASE) y generar
aplicación que “interroga” al teléfono siguiendo el paradigma del desarrollo de a partir de él el código que lo implementa.
móvil (o emulador) y muestra por panta- software dirigido por modelos, o más con-
lla ciertas características que nos serán de cretamente, la propuesta MDA (Model CMS
máximo interés para el desarrollo de Driven Architecture) de OMG. Para aque- Los Sistemas Gestores de Contenidos (CMS)
nuestro juego. llos no iniciados en los conceptos que son una buena opción para el desarrollo de
esconde MDA, diremos que este paradig- portales web. Sin duda es una buena noticia
XAML (II) ma propone un modelo de desarrollo de el disponer de una oferta tan variada de
Como se ha venido comentando a lo largo CMS, sin embargo, la pregunta resulta obvia:
de estas dos entregas, XAML puede revolu- ¿Cómo saber qué CMS es el mejor para mi?
cionar el sector con un nuevo modelo de El lector encontrará en el CD-ROM las
programación declarativo para las interfa- últimas versiones de los CMS PostNuke
ces de usuario. En este punto, el lector (orientado al trabajo con Apache, MySQL
encontrará ejemplos de interfaces pro- y PHP), OpenCMS y Magnolia (estos
gramadas con XAML. En las páginas del dos últimos pensados para la plata-
artículo se explica cómo y dónde forma J2EE).
obtener las aplicaciones para visuali- Recomendamos visitar el site
zar estas interfaces gráficas. http://www.opensourcecms.com,
pues en él hay multitud de conteni-
Servlets Filters (I) dos de interés, tanto para quienes
Podríamos encontrar muchísimas uti- estén interesados en iniciar un des-
lidades para un filtro en una aplica- arrollo con un CMS, como para quie-
ción web. En esta ocasión, ofrecemos la nes quieran ampliar sus conocimien-
implementación de un filtro que “proce- tos sobre este tipo de productos.
sará” aquellas peticiones que demanden
una imagen. Este ejemplo puede servir de Resin 3.0.10
base para que el lector inicie a partir de Resin es un servidor de aplicaciones Java
aquí sus propios desarrollos. Open Source que recientemente ha sido
liberado con licencia GPL. Tomcat y Resin
Desarrollo visual de IGUs Java software basado en enfatizar las tareas de son los contenedores de Servlets más
Eclipse es una de las plataformas de des- especificación, dejando que la lógica sea populares, sin embargo Resin se diferencia
arrollo más populares para los programa- implementada de forma automática por en algo fundamental: también dispone de
las herramientas (como un contenedor de EJBs.
por ejemplo Andro
MDA). Uno de los objeti-  Y además…
vos de MDA sería, por Al margen de los productos comentados
ejemplo, permitir que anteriormente, en el CD-ROM de este mes
alguien con un buen encontraremos la implementación de refe-
conocimiento del domi- rencia de la especificación Java Portlet
nio en el que va a traba- (Pluto 1.0.1), JCrawler (véase la sección
  jar la aplicación y con “javaHispano”), la plataforma Eclipse con
conocimientos de UML, los plug-ins necesarios para convertirlo en
pudiera desarrollar el un editor visual de IGUs y la librería ACE
software desconocien- para los programadores C++.

SOLO PROGRAMADORES nº 122 32 http://digital.revistasprofesionales.com


MIDDLEWARE

Desarrollo visual
de IGUs Java
OSCAR COMBARROS, IRENE JIMÉNEZ  VE es un plug-in que extiende Eclipse y que permite el
desarrollo de los interfaces de usuario de manera muy
VE es un plug-in Open Source de sencilla, y que presenta varias ventajas sobre otros
Eclipse que permite el desarrollo competidores como por ejemplo el implementar
varios APIs diferentes como AWT, Swing o SWT. En el
rápido de interfaces de usuario. Con
presente artículo haremos una introducción median-
Eclipse y VE es posible desarrollar  te un ejemplo práctico a VE, veremos cómo instalarlo,
interfaces de usuario con Java Swing y las posibilidades que tiene para el desarrollo auto-
mático de interfaces de usuario. Como el lector recor-
tan rápida y fácilmente como lo dará, en los números 117, 118, 119 y 120 se publicó el
haríamos en un entorno de desarrollo curso “Creación de interfaces con JFC/Swing” acerca
del estilo Visual Basic. de la librería gráfica Swing, sin embargo para seguir el
presente artículo no será necesario tener grandes
Introducción conocimientos sobre esta librería, pues precisamente
eso es lo atractivo del plug-in VE.
En el presente artículo trataremos de hacer una
introducción al desarrollo de interfaces de usuario Instalación de VE
con la herramienta Eclipse VE usando el API de Java
JFC/Swing. Eclipse no es solo un entorno de programación, está
Eclipse es uno de los entornos de desarrollo Java más diseñado como una plataforma de desarrollo que
populares en la actualidad, y los lectores pudieron implementa una serie de servicios básicos, y que
profundizar en su arquitectura en el número 120. Uno puede ampliarse mediante los tan conocidos plug-
de los problemas más comunes con los que se ins. Un plug-in es una unidad de ejecución que
encuentra un nuevo desarrollador al empezar con amplia la funcionalidad de la plataforma. De hecho
Eclipse es el desarrollo de las interfaces de usuario de la plataforma propiamente dicha apenas ofrece fun-
manera fácil. El SDK de Eclipse no incluye una herra- cionalidad, básicamente permite gestionar recursos
mienta para el desarrollo visual de los interfaces, como y manejar programas Java, y en el SDK que es la dis-
pueden incluir otras herramientas de desarrollo como tribución normal de Eclipse se incluye la plataforma
JBuilder o NetBeans que permiten crear la interfaz   junto con varios plug-ins que permiten ampliar
gráfica de manera sencilla simplemente arrastrando dicha funcionalidad, como se vio en su momento
componentes desde una paleta. Sin embargo Eclipse con el artículo “Desarrollo J2EE con herramientas
soluciona este problema con Eclipse VE (Visual Editor). Open Source” publicado en el número 120.
En la figura 1 se puede ver un esquema de la estruc-
tura de Eclipse, la caja gris representa la distribución
básica de Eclipse, el Eclipse SDK que como se puede
ver a su vez incluye la plataforma y una serie de plug-
ins básicos. Dicho SDK se puede ampliar con otros
plug-ins, en la imagen las cajas con el texto “New tool”.
La comunidad Open Source se ha volcado con el
desarrollo de distintos plug-ins para Eclipse, además
de los plug-ins desarrollados por IBM, padre del pro-
yecto Eclipse y que aún le proporciona soporte. Eso
hace que en la actualidad existan plug-ins para
Eclipse para hacer prácticamente cualquier cosa,
desde editar XML, desplegar EJBs en los servidores
más comunes, desarrollo con J2EE, Antlr…
  VE no es más que eso, un plug-in que amplia la
 Figura 1. Arquitectura de plug-ins de Eclipse.
capacidad de la plataforma Eclipse para permitir la

SOLO PROGRAMADORES nº 122 36 http://digital.revistasprofesionales.com


MIDDLEWARE
Desarrollo visual de IGUs Java

creación gráfica de interfaces de usuario de encarga de generar todo el código necesario  Vamos ahora a probar el editor visual. En pri-
manera fácil. por nosotros y nos abre el editor visual de la mer lugar vamos a modificar algunas de las
La instalación de un plug-in es muy simple, clase, en la figura 2 podemos ver las partes propiedades del Frame creado. Modificamos la
basta con copiar los ficheros del plug-in en los principales del editor. En primer lugar en la propiedad “Visible”, que a priori está fijada a
directorios adecuados de Eclipse, esto es, los parte de la imagen etiquetada con un 1 pode- “false”, y la modificamos, fijándola a “true”. A
directorios “Plugins” y “Features”. VE se puede mos ver cómo verá el usuario la clase en tiem- continuación modificamos la propiedad “Title”
obtener de la dirección http://www.eclipse.org/ po de ejecución. En esta parte del editor es y le ponemos como título al Frame la cadena,
vep/. Como se indica en la página de descarga, posible cambiar, por ejemplo, el tamaño del “Hola Mundo”.
para que VE funcione correctamente deben Frame simplemente arrastrando los bordes. Ahora vamos a comprobar cómo se vería nues-
estar instalados otros dos plug-ins, EMF y GEF. En la zona 2, podemos ver el código Java gene- tra aplicación en tiempo de ejecución. Hay dos
En la misma página de descarga de VE se pue- rado automáticamente, estas dos zonas están maneras distintas de ejecutar la aplicación.
den obtener enlaces a esos dos plug-ins. conectadas de manera que si por ejemplo cam- Puesto que estamos realizando un JavaBean
Nosotros usaremos durante el artículo las ver- biamos el tamaño del Frame en la zona 1, vere- podemos ejecutar simplemente al Frame como
siones Eclipse 3.0.1, VE 1.01, EMF 2.0.1 y GEF mos que se modifica el código Java del método si fuera un Bean, o añadir el código necesario al
3.0.1 (incluidas en el CD-ROM). “initialize”, que es donde se especifica el tamaño método “main” para que se ejecute como una
Una vez obtenidos los ficheros de los plug-ins del Frame en la zona 2. De igual manera, si aplicación normal. Durante el tiempo de des-
basta con descomprimirlos y copiar el conteni- modificamos el método “initialize” y cambiamos arrollo es normal el ejecutar simplemente como
do del directorio descomprimido “Features” la línea que especifica “this.setSize(300,200);” Bean la aplicación para ver el aspecto que tiene
bajo el directorio “Features” de Eclipse y el con- por “this.setSize(400,200);”, veremos cómo se aunque ésta solución solo sirva para tiempo de
tenido del directorio “Plugins” bajo el directorio cambia el tamaño del Frame en la zona 1. desarrollo.
“Plugins” de Eclipse. La zona 3 es la paleta. La paleta sirve para aña- Para ejecutar la aplicación como un Bean,
Con solo copiar esos ficheros y volver a lanzar dir nuevos componentes a la clase creada, seleccionamos en la vista de Beans (zona 4) el
Eclipse los nuevos plug-ins quedan instalados como podemos ver incluye todos los compo- Bean del Frame y ejecutamos la opción “Run”-
y ya podemos ver la nueva funcionalidad de la nentes Swing posibles. Desde la paleta es posi- >“Run as”->“Java Bean”. Veremos el resultado
plataforma. Para comprobar que todo ha sido ble añadir un componente al Frame simple- de la ejecución de la aplicación y el aspecto que
correcto, basta con seleccionar la opción “File”- mente arrastrando y soltando, y automática- tiene. La otra forma de ejecución también es
>“New”->“Other”. Como veremos ahora, bajo mente se añade el código necesario a la clase. muy simple, y consisten en añadir al método
la carpeta Java aparecen un gran número de La cuarta zona es la vista de JavaBeans. Los com- “main” creado la siguiente línea:
opciones que no aparecerían antes, como por ponentes de Swing se empaquetan en Beans, en public static void main(String[] args) {
ejemplo “Visual Class”, “Swing”… esta parte de la pantalla podemos ver los Beans
HolaMundo hm = new HolaMundo();
que se han creado. Si nos fijamos en ella veremos
Hola Mundo que ahora tenemos creado un Bean llamado }

“this” que es de tipo “JFrame”, si lo seleccionamos Como puede verse, lo único que hemos hecho
Ya tenemos instalado correctamente VE, vamos vemos que se selecciona la pantalla completa del es crear una nueva instancia de la clase, que en
ahora a crear la primera clase de la interfaz de Frame en la zona 1, y en la zona de código se nuestro caso se llama “HolaMundo”. Como
usuario con VE. Para ello creamos un proyecto selecciona el método “initialize” que es donde se dicha clase ya implementa todos los métodos
Java y a continuación elegimos la opción “File”- inicializa el Frame. Debajo de ese Bean se puede necesarios de “JFrame”, no es necesario hacer
>“New”->“Other”->“Visual Class”. Una clase ver que se ha creado una clase de tipo nada más.
 Visual no es más que una clase normal Java que “JContentPane”. Si la seleccionamos vemos que Ahora ejecutamos la aplicación como una apli-
hereda de alguna de las clases visuales posibles se selecciona la parte interior del Frame que apa- cación normal Java, opción “Run”->“Run as”-
de la API elegida, en nuestro caso Swing, y que rece en gris en la pantalla, y en la zona de códi- >“Java Application”. Como vemos el resultado
implementa ya los métodos necesarios. go el método “getJContentPane” que es donde se final es el mismo de cualquiera de las dos for-
Aparecerá una nueva ventana, en ella debemos crea esa clase. Así pues, de momento tenemos un mas de ejecución.
especificar el nombre de la clase y el paquete, Bean de tipo “JFrame” que a su vez contiene otro En este apartado hemos creado nuestra primera
además debemos escoger qué tipo de clase que- Bean de tipo “JContenPane”. Cuando añadamos y muy simple interfaz de usuario. Como hemos
remos crear. En la parte izquierda de la pantalla sucesivamente componentes al Frame, veremos visto es muy sencillo el crear de manera visual la
aparece un listado con todas las clases visuales cómo dichos componentes se van creando bajo interfaz, pero a continuación analizaremos el
posibles, dependiendo de si queremos usar AWT, el “JContentPane”. código que nos ha generado VE y complicaremos
SWT o Swing. Nosotros vamos a usar Swing, y Por último, la zona 5 es la zona de las propieda- el ejemplo con nuevas funcionalidades.
veremos que es posible elegir entre crear des del componente. Esta zona cambia depen-
Frames, Paneles, Windows, Applets… en resu- diendo del componente seleccionado, según las Un ejemplo más avanzado
men todos los posibles contenedores de compo- posibles propiedades del mismo. Por ejemplo,
nentes Swing. en el caso del Frame podemos editar propieda- Si nos fijamos en el código generado por VE, y
En este primer ejemplo vamos a elegir crear un des como por ejemplo el “Layout”. Si cambiamos que aparece en el listado 1, veremos que es muy
“Frame” y le vamos a especificar que deseamos las propiedades de la zona 5 se modifica auto- simple. Solo ha creado una clase que hereda de
que nos añada a la clase un método “main”. máticamente el código generado en la zona “JFrame” y que tiene un “JPanel”. En el construc-
Una vez seleccionadas estas opciones VE se visual (zona 1) y en la zona de código (zona 2). tor de la clase se llama a un método de iniciali-

http://digital.revistasprofesionales.com 37 SOLO PROGRAMADORES nº 122


MIDDLEWARE

Para alinear los tres componentes, igualar la dis-


tancia entre ellos y este tipo de cosas existen las
propiedades de alineado, se puede acceder a ellas
pulsando el botón de “Customize layout” de la
barra de tareas. En la figura 4 se puede ver resal-
tado en rojo el botón a seleccionar y la ventana
que aparece. La ventana de “Customize Layout”
permite ajustar los componentes a la parte supe-
rior del panel, igualarlos en alto y ancho, distri-
buirlos entre el espacio tanto horizontal como
vertical del panel… con lo cual fácilmente se con-
sigue un diseño más profesional.
Podemos comprobar la apariencia del panel
seleccionándolo en la vista de Beans y eligien-
do “Run”->“Run As” ->”JavaBean” al igual que
hicimos antes con el Frame. Una vez que el
panel ya tenga el diseño que queremos vamos
a añadirle el código necesario para que lleve a
cabo alguna acción.
 Figura 2. Desarrollando con Eclipse y VE. Como podemos ver en el listado 2, el código
generado por VE es bastante simple, para cada
zación el cual se ocupa de fijar propiedades del Al nuevo panel que nos crea VE le vamos a componente añadido al panel crea un campo
Frame, como son el tamaño o el título. A su vez cambiar algunas propiedades, en primer de la clase del tipo oportuno, y en el método
la clase tiene un campo “jContentPane” que es lugar le modificamos la propiedad del “initialize” configura propiedades del panel
una instancia de una clase “JPanel” y que será el “Layout”. Por defecto un panel se crea con la como el Layout y le añade como hijos los obje-
panel donde se fijará el contenido del Frame, propiedad layout fijada a “FlowLayout”, en tos anteriores tras inicializarlos.
dicho panel se inicializa en un método nuestro caso la cambiaremos por un valor El objetivo de nuestro panel será almacenar el
“getJContentPanel” si no estaba inicializado “null”. A continuación añadiremos a este texto que introduzca el usuario en una propie-
anteriormente. Como se puede ver el código panel un par de componentes, añadiremos dad del panel llamada “Nombre”, de tipo “String”
generado es bastante limpio y fácil de seguir. una etiqueta (“JLabel”) a la que le cambiamos y a dicha propiedad le añadiremos un método
Fijémonos ahora en la de componentes Swing. el campo “Text” por “Nombre”, un botón para fijarle el valor y para recogerlo, por lo tanto
Dicha paleta tiene todos los componentes (“JButton”) al que le ponemos como texto habrá que añadir el siguiente código:
posibles de una interfaz Swing, organizado en “OK” y un campo de texto (“JTextField”), hasta private String nombre = “N/A” ;
3 grupos, “Componentes”, donde se almacena crear un diseño parecido al que se puede ver
public String getNombre()
el grueso de los componentes, como pueden en la figura 3.
ser botones, campos de texto, etiquetas, barras
de progreso… “Containers” donde se almace- LISTADO 1 Código del Frame generado automáticamente
nan los componentes que a su vez pueden import javax.swing.JFrame;
contener a otros componentes, como pueden public class HolaMundo extends JFrame {
ser los paneles y los Frames, y finalmente private javax.swing.JPanel jContentPane = null;
“Menus” donde están los componentes de los
menús. public static void main(String[] args) {
...
Ahora podríamos añadir cualquiera de estos }
componentes a la ventana que tenemos cre- public HolaMundo() {
super();
ada simplemente arrastrando y soltando, sin initialize();
embargo ya que queremos presentar las }
posibilidades de VE vamos a elegir otro enfo- private void initialize() {
this.setSize(400,200);
que. Vamos a crear un panel personalizado, this.setContentPane(getJContentPane());
con una serie de componentes sencillos y this.setTitle(“HOLA MUNDO”);
this.setVisible(true);
luego vamos a insertar en la pantalla princi- }
pal de la aplicación el Panel personalizado private javax.swing.JPanel getJContentPane() {
que crearemos. if(jContentPane == null) {
jContentPane = new javax.swing.JPanel();
Para crear el panel elegimos la opción “New”- jContentPane.setLayout(new java.awt.BorderLayout());
>“VisualClass” y en la pantalla que ya vimos }
return jContentPane;
antes elegimos crear un panel, y lo llamamos }
“MiPanel”. }

SOLO PROGRAMADORES nº 122 38 http://digital.revistasprofesionales.com


MIDDLEWARE
Desarrollo visual de IGUs Java

{ return nombre; }

public void setNombre(String string)

{ this.nombre = string; }

Ahora ya tenemos preparada una propiedad en


la que almacenar el valor que introduzca el
usuario en el campo de texto.
  Vamos a querer en el futuro que el Frame, o
cualquier otro Bean de la IGU que contenga el
panel, sea notificado cuando se produzca algu-
na modificación en el campo nombre del panel,
así que cambiaremos el método “setNombre”
creado antes por el siguiente código:
public void setNombre(String string) {

String old = this.nombre;

firePropertyChange(“nombre”,old,string);
 Figura 3. Panel personalizado.
getJTextField().setText(string);
private JTextField getJTextField() { public void actionPerformed(java.awt.
this.nombre = string;
… event.ActionEvent e)
} {setNombre( jTextField.getText());}
jTextField.addActionListener
Como se puede observar, básicamente lo que (new java.awt.event.ActionListener() { Ahora cuado el usuario escriba algo en el campo
hemos hecho es invocar a un método public void actionPerformed(java. de texto, dicho valor se fijará en la propiedad
“firePropertyChange”. Este método se ocupa de awt.event.ActionEvent e) “Nombre” del panel, y el método que lo fija,
lanzar un evento indicando que la propiedad se “setNombre”, se ocupará de lanzar un evento
{System.out.println(“action
ha modificado. De esta manera, para que cual- indicando que la propiedad se ha modificado.
Performed()”);}
quier otro objeto se entere de que se ha modi- Como podemos ver con VE se facilita mucho la
});
ficado la propiedad, basta con que implemen- gestión de eventos. Si en lugar de seleccionar la
te un manejador del evento que genera el … opción de “Action Performed” hubiéramos selec-
método “setNombre”, veremos más adelante } cionado la opción “Add Events”, nos aparecería
cómo hacerlo. una nueva ventana en la cual podríamos ver
Como podemos ver el manejador del evento catalogados por secciones todos los eventos
Eventos creado sólo escribe por la consola un mensaje posibles, como por ejemplo eventos que respon-
de texto. Podemos modificar esa línea para dan cuando una tecla es pulsada, etc. En esa
Ya tenemos creada nuestra propiedad donde añadir la inteligencia que queramos al maneja- pantalla podremos añadir un manejador de cual-
almacenar el valor, pero ahora necesitamos dor. Nosotros vamos a modificar esa línea y quiera de los eventos que se puedan producir.
enterarnos de cuándo el usuario introduce cambiarla por una que fije la propiedad al valor   Vamos a repetir el proceso para añadir un
un nuevo texto en el campo de texto o cuán- introducido en el campo de texto: evento a la pulsación del botón, para ello selec-
do pulsa el botón de OK. La manera con la
que Swing interactúa con el usuario es
mediante eventos.
La gestión de eventos es una de las partes
más complicadas de programar con Swing y
por este motivo fue tratada con amplitud en
el curso sobre Swing publicado en Sólo
Programadores . Vamos a ver cómo se con-
vierte en algo automático cuando usamos
 VE. Vamos a añadir el código necesario a la
caja de texto para que ésta reaccione ante
un evento. Primero la seleccionamos y pulsa-
mos el botón derecho del ratón, nos aparece-
rá un menú emergente en el que selecciona-
mos la opción “Events”->“Action Performed”.
 Veremos que automáticamente se nos modi-
fica el método “getTextField” y se añade el
código del manejador (listener) que se mues-
tra a continuación:  Figura 4. Alineando los componentes.

http://digital.revistasprofesionales.com 39 SOLO PROGRAMADORES nº 122


MIDDLEWARE

LISTADO 2 Código del panel generado automáticamente “MiPanel”. Cuando seleccionemos el Bean nos
aparecerán resaltadas sobre el Frame las distin-
public class MiPanel extends JPanel {
tas zonas en las que podemos insertar el nuevo
private JLabel jLabel = null; componente, y arrastraremos el componente
private JTextField jTextField = null; seleccionado sobre la zona que queramos, al
private JButton jButton = null;
igual que haríamos con un componente normal
public MiPanel() { … } añadido desde la paleta. En este ejemplo la
private void initialize() { arrastraremos a la zona central del Frame.
this.setLayout(null); Como vemos, el Panel que habíamos creado
this.setSize(271, 56);
jLabel = new JLabel();
antes se inserta en el Frame que será la panta-
jLabel.setBounds(31, 21, 53, 20); lla principal de nuestra aplicación. Como no
this.add(jLabel, null); vamos a añadir más componentes a la pantalla
this.add(getJTextField(), null);
this.add(getJButton(), null); pues podemos redimensionar la pantalla para
} que se ajuste mejor al tamaño del Panel que
private JTextField getJTextField() {
if (jTextField == null) {
hemos insertado.
jTextField = new JTextField(); El código que VE nos ha generado para inser-
jTextField.setBounds(100, 21, 53, 20); tar el Panel en la pantalla principal es el
}
return jTextField; siguiente:
} private MiPanel miPanel = null;

private JButton getJButton() { private MiPanel getMiPanel() {


if (jButton == null) {
jButton = new JButton(); if (miPanel == null) {
jButton.setBounds(168, 21, 53, 20);
jButton.setText(“OK”); miPanel = new MiPanel();
}
}
return jButton;
} return miPanel;
}
}

cionamos el botón y con el botón derecho Si ahora pinchamos en la zona del panel de la
seleccionamos las mismas opciones, esto es, jTextField.setText(nombre); pantalla principal y miramos las propiedades
“Events”->“Action Performed”, y vemos cómo … veremos que tiene una propiedad llamada
se añade un código muy parecido al que se }
“Nombre” que como vimos antes es el campo
añadió al campo de texto, y de igual manera del Panel donde almacenamos el texto que nos
cambiamos la línea que escribe por pantalla un Si nos fijamos ahora en la vista de JavaBeans introduzca el usuario en la GUI.
mensaje, por una que fije el valor a la propie- (véase la figura 3), veremos que se han añadi-  Vamos a añadirle al Frame el manejador que se
dad “Nombre” del panel: do los eventos creados debajo del botón y del ocupe de llevar a cabo alguna acción cuando el
private JButton getJButton() { campo de texto. usuario teclee algo en la caja de texto y pulse el
botón de OK. Para ello seleccionamos el panel y

Uniendo nuestro Panel con el pulsamos el botón derecho del ratón para selec-
jButton.addActionListener(new java.
programa principal cionar la opción “Events”->“Add Events”. Esta
awt.event.ActionListener() { opción nos conduce a una pantalla en la cual
public void actionPerformed(java. Hasta el momento hemos aprendido a mane- podemos seleccionar todos los eventos posibles,
awt.event.ActionEvent e)  jar VE para crear componentes complejos que en este caso abrimos la categoría “Property
{setNombre( jTextField.getText());} contengan diferentes componentes de Swing y Change” y seleccionamos la propiedad
});
a gestionar los diferentes eventos de estos “Nombre”, en la parte derecha de la pantalla nos
componentes fácilmente. En este apartado aparece la nomenclatura que deseamos para el

vamos a unir la pantalla principal de nuestro manejador del evento, en este ejemplo seleccio-
} programa y el panel creado, además vamos a namos la segunda opción, la que nos pide dos
Ya tenemos casi completo nuestro panel, nos ver cómo crear un manejador que reaccione parámetros en el manejador. Podemos ver el
hemos ocupado de que tenga el aspecto que que- cuando se modifique la propiedad del panel. código que nos genera VE en el listado 3.
remos y ahora hemos implementado las acciones Primero seleccionamos el Frame principal, y pul- Como ocurría en ocasiones anteriores, el
que queremos que realice, sólo nos falta un paso, samos el botón de la barra de tareas de elegir manejador creado automáticamente solo
que consiste en añadir una línea al método que Bean, el botón que aparece resaltado en un cír- imprime por pantalla un mensaje, en este
inicializa el campo de texto para hacer que al ini- culo rojo en la figura 3 (parte superior derecha ejemplo de juguete vamos a dejar el manejador
ciarse tenga el valor de la propiedad “Nombre”: de la figura). Nos aparecerá una pantalla en la tal y como está.
… cual podemos buscar los JavaBeans disponibles. Ya tenemos prácticamente lista la aplicación,
Escribimos en nuestro caso el nombre que le solo nos falta un detalle, y es indicar a la pan-
private JTextField getJTextField() {
hayamos puesto al panel, en este ejemplo talla principal qué hacer cuando el usuario la

SOLO PROGRAMADORES nº 122 40 http://digital.revistasprofesionales.com


MIDDLEWARE
Desarrollo visual de IGUs Java

Listener de cambio de propiedades


cierre. El proceso es el mismo que hemos LISTADO 3 generado automáticamente
hecho antes, generar un manejador que res-
private MiPanel getMiPanel() {
ponda a un evento, en este caso el cierre de la if (miPanel == null) {
ventana. Seleccionamos el Frame y pulsamos el miPanel = new MiPanel();
botón derecho, en el menú emergente que miPanel.setNombre(“N/A”);
miPanel.addPropertyChangeListener(“nombre”, new
aparece seleccionamos “WindowClossing”, y java.beans.PropertyChangeListener() {
modificamos el manejador que nos genera VE, public void propertyChange(java.beans.PropertyChangeEvent e) {
System.out.println(“propertyChange(nombre)”);
añadiendo el código “System.exit(0);” como }
vemos en el listado 4. });
}
Ya tenemos la aplicación lista, ahora podemos return miPanel;
ejecutarla y comprobar que si introducimos un }
nuevo texto en la caja de texto y pulsamos el
botón de OK, en la consola se imprime un men- LISTADO 4 Código de finalización de la aplicación
saje indicando que se ha modificado la propiedad.
private void initialize() {
El enfoque que hemos elegido de crear un panel this.setTitle(“Hola Mundo”);
y a ese panel añadirle los componentes sencillos this.setSize(351, 90);
y luego insertar el panel en la pantalla principal this.setContentPane(getJContentPane());
this.setVisible(true);
de la aplicación puede parecer excesivamente this.addWindowListener(new java.awt.event.WindowAdapter() {
complicado. En realidad habríamos conseguido public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
el mismo efecto si directamente hubiéramos }
insertado en la pantalla principal de la aplicación });
una etiqueta, un campo de texto y un botón. Sin }

embargo la opción elegida es mucho más flexi- vamos al menú “Windows”->“Preferences” Cuando estamos desarrollando una aplicación
ble. Si imaginamos una aplicación real, en la cual para abrir la pestaña de “Java”->“VE”. Nos apa- que deseamos que se ejecute sobre distintos
puede haber multitud de pantallas en las que se rece una pantalla con un apartado con los dis- sistemas operativos (por ejemplo Windows y
repitan formularios, por ejemplo para pedir los tintos Look And Feel de Swing, y veremos que Linux) es importante el probar diferentes Look
datos personales de una persona, este enfoque no aparece seleccionado ninguno. Vamos a And Feels para comprobar que cuando ejecu-
nos permite reutilizar el código generándolo solo seleccionar el Look And Feel de Windows. temos la aplicación en un entorno distinto del
una vez, he insertando el panel en tantos sitios A continuación cerraremos todas las pantallas de desarrollo no nos llevemos una sorpresa
como nos haga falta. Y lo que es más importan- que tenemos abiertas, la del Panel y la del desagradable. En la figura 5 podemos ver el
te, nos permite que modificando una sola vez el Frame y las volvemos a abrir para que VE coja aspecto de la aplicación con distintos Look And
panel (por ejemplo para eliminar errores) se las nuevas propiedades. Como veremos el Feel, en este caso “Metal”, “Windows” y
modifique en todos los puntos de la aplicación. aspecto del Panel cambia bastante, y su aspec- “CDE/Motif”. Como podemos ver el aspecto que
to es mucho más atractivo ahora. presentará la aplicación si la ejecutamos con
El Look And Feel Siguiendo estos pasos podemos cambiar el un Look And Feel “Motif” no es el esperado, si
Look And Feel que nos muestra el editor, lo cual queremos que la aplicación presente un aspec-
La aplicación ya tiene toda la funcionalidad es fundamental para comprobar que la IGU se to correcto en todos los entornos sería conve-
que queremos pero su apariencia (Look And va a comportar como esperamos en cualquier niente el cambiar el tamaño del botón.
Feel) no es demasiado actual. En este apartado entorno. Si queremos que la aplicación coja un
vamos a ver cómo VE nos facilita el trabajar Look And Feel determinado en tiempo de ejecu- Conclusiones
con diferentes Look And Feels. ción dependiendo del sistema operativo sobre
Para cambiar el Look And Feel con el que dise- el que se ejecute, debemos añadirle algo de   VE permite desarrollar interfaces gráficas de
ñamos nuestros componentes tenemos que código a nuestra aplicación. Modificaremos el usuario de manera sencilla y rápida, facilitando
modificar las propiedades de VE, para ello método “main” del programa añadiéndole las el desarrollo especialmente a programadores
siguientes líneas: que no son expertos en Swing.
public static void main(String[] args) { La característica más apreciable de VE es la lim-
pieza del código que genera, al contrario que
try {
otras aplicaciones de generación gráfica de
UIManager.setLookAndFeel(UIManager.
código, el código generado por VE es bastante
getSystemLookAndFeelClassName()); limpio y fácil de seguir. Todo ello con el añadido
} catch (Exception e) {e.printStack de ser una herramienta que al igual que Eclipse
Trace();} es Open Source y totalmente gratuita. Como
HolaMundo hm = new HolaMundo(); única pega se podría mencionar que al igual que
}
Eclipse, para desarrollar de manera fluida nece-
sita de una máquina bastante potente, pero al
Si ahora ejecutamos de nuevo la aplicación vere- ritmo que avanza el hardware esto no parece un
 Figura 5. Diferentes Look And Feel. mos que se ejecuta con el Look And Feel correcto. problema demasiado importante.

http://digital.revistasprofesionales.com 41 SOLO PROGRAMADORES nº 122


REDES

Sistemas de Gestión
de Contenidos (y II)
ALVARO ZABALA ORDÓÑEZ
la solución idónea para organizaciones que bus-
quen una solución integrada. Seguidamente vere-
Para concluir con nuestra revisión a mos con más detalle el resto de familias de CMS
los Sistemas de Gestión de Open Source.
Contenidos veremos las dos grandes Soluciones CMS basadas en PHP
familias de CMS existentes (PHP y
Java) y describiremos brevemente el En esta familia de CMS agrupamos a aquellas
soluciones que se apoyan en lo que se viene a
API de Portlets, iniciativa que trata denominar la pila de tecnologías “LAMP”, es
de estandarizar la construcción de decir, Linux, Apache, MySQL y PHP. Estos CMS
tienen la ventaja de que todas estas tecnologías
componentes de portal para el son muy extendidas dentro del mundo del soft-
mundo Java. ware libre, pero también tienen el inconveniente
de que trabajan en un entorno más heterogéneo,
que además debe ser coordinado con otros ser-
El mes pasado vimos una clasificación de CMS que vidores de aplicaciones y bases de datos existen-
consideraba tres grandes familias: sistemas basa- tes en la organización que desea implantar el
dos en PHP, sistemas basados en Java y sistemas CMS. El lenguaje de script de servidor PHP está
basados en el empleo de otras tecnologías. Dentro muy extendido, dispone de un amplio soporte y
de esta última familia repasamos las característi- es de ejecución rápida. No obstante, todavía
cas del que posiblemente sea el CMS Open Source muchos expertos y analistas de sistemas no lo
más maduro, Zope. También comentamos que al consideran una solución tan fiable para sistemas
estar basado en una plataforma tecnológica empresariales como las basadas en las platafor-
inusual (base de datos propia orientada a objetos, mas J2EE o .NET, en gran parte debido a que el
lenguaje de programación Python) quizás no fuese balanceo de carga no está tan fácilmente imple-
mentado como en las otras.
Dentro de los CMS pertenecientes a esta familia
cabe destacar PHP-Nuke, PostNuke y Midgard.
PHP-Nuke y PostNuke son soluciones muy simila-
res, como su propio nombre deja intuir, empleadas
sobretodo para la construcción de portales temá-
ticos de pequeño tamaño, dedicados al ocio,
entretenimiento, o temas comunes. PostNuke fue
desarrollado por un miembro original de la comu-
nidad de PHP-Nuke que disentía de la dirección
que éste estaba tomando. No obstante, el código
de PostNuke fue sustituido para mejorar su rendi-
miento y seguridad.
Partiendo de estos CMS han surgido numerosas
derivaciones o “forks”, lo que no ha contribuido ni
a fomentar el desarrollo de estos productos ni a
facilitar la tarea de optar por alguno de ellos para
su implantación.
El punto fuerte de estas soluciones radica en la
comunidad que las respalda. Existen numerosísi-
 Figura 1. Portal de la comunidad de PHP-Nuke, uno de los primeros grandes CMS  mas extensiones de estos CMS disponibles para su
Open Source.

SOLO PROGRAMADORES nº 122 42 http://digital.revistasprofesionales.com


REDES
Sistemas de Gestión de Contenidos (y II)

descarga en el web. Aún así, todavía deben


avanzar muchísimo en materias como
soporte para workflow, ciclo de vida de
publicación, herramientas gráficas de admi-
nistración, etc. Además, no ofrecen muchas
opciones para diseñar la apariencia y distri-
bución de los elementos del portal. Ésto hace
que todos los sitios web creados con estos
CMS tengan una apariencia muy similar.
Midgard es un CMS muy maduro cuyo de-
sarrollo fue iniciado en 1999. También está
basado en PHP, MySQL y Apache, pero es de
mayor robustez y escalabilidad que los ante-
riores, por lo que puede ser empleado para
implementar portales empresariales de
carga media o alta.
Algunas de las características que dan un
valor añadido a Midgard son la accesibilidad
(a través del cumplimiento de las directrices
WAI del W3C), el soporte para múltiples  Figura 2. Portal de Postnuke, el otro gran CMS Open Source en PHP.
sitios web dentro de un mismo CMS, gracias
a aplicar un modelo de bases de datos vir-
tuales, y la incorporación de un motor de taforma: OpenCMS, Magnolia, Jboss Nukes, servidores de aplicaciones J2EE, excelente
workflow basado en la tecnología XML. Jahia, o incluso el CMS impulsado por la soporte para el estándar XML y tecnologías
comunidad JavaHispano, colaboradora habi- derivadas como Web Services, motores de
Soluciones CMS basadas en la tual de esta revista, Canyamo, con el que plantillas para el renderizado HTML, etc. No
plataforma J2EE ésta ha desarrollado su portal web. obstante, cada proyecto sigue sus propias
Todos estos sistemas se benefician de las pautas de desarrollo, y tiene sus propias
Actualmente la plataforma de desarrollo ventajas de la plataforma Java: portabilidad políticas de calidad y diseños. Esto hace que
empresarial J2EE parece estar imponiéndose a todas las plataformas para las que haya la comunidad existente detrás de cada uno
para la construcción de aplicaciones de lado disponible una máquina virtual, conectivi- de ellos sea desigual. Como en este artículo
del servidor. Por esta razón, existe un gran dad con cualquier tipo de base de datos no podemos hablar de todos ellos, comenta-
número de CMS desarrollados bajo esta pla- mediante el estándar JDBC, integración con remos algunas de las principales caracterís-
ticas de dos de los más famosos: Magnolia y
OpenCMS.

Magnolia
El punto fuerte de Magnolia radica en su
repositorio de contenidos, que ha sido
construido según el estándar JCR (Java
Content Repositories). Otro de sus puntos
fuertes es el de su distribución, resultando
bastante sencilla su instalación y puesta
en marcha (característica bastante infre-
cuente en los proyectos de software libre).
Además, no requiere de ninguna base de
datos adicional.

OpenCMS
OpenCMS comparte con Magnolia todos
los beneficios derivados de utilizar la pla-
taforma Java. Además, también resulta
bastante sencillo de instalar. OpenCMS dis-
pone de una comunidad más amplia que
Magnolia pues ha surgido como un pro-
 Figura 3. Creación de workflows en OpenCMS. yecto libre promovido por su propia comu-

http://digital.revistasprofesionales.com 43 SOLO PROGRAMADORES nº 122


REDES

nidad, al contrario que Magnolia que es


desarrollado por una empresa que se
encarga de mantenerlo. OpenCMS sí
requiere de una base de datos para poder
trabajar, e incorpora un motor de workflow
al igual que el anterior.
Su interfaz gráfica es muy amigable, siendo
muy parecida a los exploradores de ficheros
más corrientes. En ésta los recursos que
forman parte del portal aparecen organiza-
dos de forma jerárquica, y en diferentes
colores según su estado (en producción,
bloqueado y siendo editado por un usuario
o eliminado). Proporciona un editor
WYSIWYG, al estilo de FrontPage, para la
creación de contenidos desde la propia
herramienta. También incluye un reposito-
rio de recursos, como imágenes, scripts, etc.
de forma que para incrustar uno de estos  Figura 4. Explorador de la estructura del portal de OpenCMS.
recursos en una página sólo hay que aña-
dirlos al repositorio, y desde éste a la pági- de gran utilidad para determinados conte- Desde el punto de vista de esta aproxima-
na que se está creando. Esto facilita nota- nidos que tienen un carácter muy estático, ción, un CMS estaría formado por un con-
blemente la gestión de estos recursos, y como imágenes o archivos binarios. Otro tenedor de Portlets, que gestionaría los
evita su duplicidad. OpenCMS también pro- punto destacable de OpenCMS es la inclu- componentes de portal, recibiría peticiones
porciona herramientas gráficas para la cre- sión de características de seguridad: y generaría contenido dinámico. Los porta-
ación de workflows. En la figura 3 podemos OpenCMS permite aplicar encriptado fuerte les utilizarían los Portlets como elementos
ver cómo gracias a esta herramienta se a todo el sitio web o a parte de él, etique- de interfaz de usuario ensamblables, que
pueden crear tareas y asignárselas a usua- tando a sus contenidos como “sólo accesi- proporcionarían una capa de presentación
rios dentro del workflow de creación de bles a través de conexiones HTTPS”. al sistema. Algunos de los objetivos de esta
contenidos. Esta herramienta permite ade- especificación son:
más el envío de correos electrónicos a los Estandarización CMS en el mundo  Definir las especificaciones que debe

usuarios a los que se les ha asignado una Java: el API de Portlets cumplir el entorno de ejecución para los
tarea, la reasignación de la misma a otro Portlets, el contenedor de Portlets.
usuario, y el envío de un correo notificando Como hemos visto a lo largo de estas dos  Establecer el API que deben seguir los

la finalización de una tarea a aquel usuario entregas, el número de CMS y WCM existen- Portlets para que sean gestionados por
que la creó. tes es cada vez mayor. La mayoría de estos el contenedor, a través de los mecanis-
OpenCMS es un sistema que se apoya sistemas han creado mecanismos para su mos de ligadura dinámica, herencia y
totalmente en la base de datos. En este tipo fácil extensión, basados en el empleo de fra- polimorfismo.
de sistemas las páginas suelen ser creadas meworks que permitan la creación de com-  Proporcionar mecanismos para guardar

dinámicamente a partir del contenido de la ponentes de portal denominados Portlets. de forma persistente el estado de los
base de datos y de las plantillas de presen- De esta forma, cuando construimos un por- Portlets, bien sea en base de datos, XML o
tación establecidas. Para evitar los proble- tal web con nuestra herramienta CMS y le cualquier otro mecanismo de persistencia.
mas de rendimiento que esta característica añadimos una sección de noticias, el compo-  Permitir la portabilidad binaria de los

podría ocasionar, OpenCMS incorpora un nente de software encargado de implemen- Portlets entre diferentes contenedores,
mecanismo de caché extensible. La primera tar esta funcionalidad sería un Portlet, des- y definir un estándar de empaquetado
vez que una página es solicitada, ésta es arrollado con el framework proporcionado de Portlets para su posterior despliegue
generada dinámicamente y almacenada en por el CMS. en el contenedor.
caché para posteriores peticiones. Cuando No obstante, esta variedad de frameworks Conforme a esta nueva filosofía, un portal web
se producen modificaciones en el conteni- incompatibles unos de otros representa un estaría formado por una aplicación que proce-
do de la base de datos al que está asociado problema, puesto que los componentes des- sa las peticiones de clientes, solicita todos
la página, estos cambios son propagados arrollados para un CMS no son reutilizables aquellos Portlets que formen parte de la pági-
automáticamente a la caché. No obstante, para otros CMS. Esto ha desembocado, den- na actual del usuario al contenedor de Portlets,
en el caso de que se requiera una versión tro del mundo Java, en la especificación JSR- que se encargará de cargarlos y ejecutarlos,
estática del portal entero o de partes de 168 o especificación de Portlets, cuyo objeti- volcando finalmente en la página final el con-
éste, OpenCMS permite la exportación de vo es proporcionar interoperabilidad entre tenido de la ejecución de cada Portlet. El con-
estos directamente al servidor web. Ésto es Portlets y portales. tenedor de Portlets proporciona el entorno de

SOLO PROGRAMADORES nº 122 44 http://digital.revistasprofesionales.com


REDES
Sistemas de Gestión de Contenidos (y II)

ejecución para los Portlets, y se comunica con métodos según el orden definido por su ciclo
éstos a través del API de Portlet. A su vez, el de vida. En virtud a este diseño, se pueden Implementación de referencia de
contenedor de Portlets es llamado por el portal añadir nuevos Portlets sin que el sistema se la especificación: Pluto
web a través del API de invocación de Portlets. vea afectado o haya que reiniciarlo. El único
Por último, el contenedor devuelve informa- requisito es que sigan esta especificación. Pluto es la implementación de referencia de
ción sobre el portal a través del SPI (interfaz la especificación de Portlets, y ha sido inclui-
para proveedores de servicios). Modo de trabajo de un Portlet da dentro del incubador de proyectos del
Anteriormente hemos comentado que proyecto Jakarta, proyecto que alberga un
 Visión general del API de Portlets como consecuencia de la invocación del gran número de herramientas Open Source
Para entender un poco mejor cómo se con- método “processAction” un Portlet puede de interés para el mundo Java. No obstante,
sigue la estandarización de los elementos de cambiar su modo de trabajo. El modo de un Pluto no pretende ser una solución para
portal en el mundo Java, haremos un breve Portlet sirve para indicar la función que el entornos empresariales de elevada carga. Su
repaso al API de Portlets. Portlet realiza. Normalmente, los Portlets objetivo es mucho más simple: proporcionar
De acuerdo con la especificación, un Portlet pueden ejecutar diferentes tareas y crear a los desarrolladores de componentes de
sería una clase Java que implementase la diferentes contenidos en función de la portal un entorno de desarrollo para realizar
interfaz Portlet, o que heredase de alguna tarea que estén desempeñando. Gracias al sus pruebas. La arquitectura de Pluto está
clase que la implemente. Esta interfaz esta- modo de trabajo del Portlet, éste sabe qué formada por dos componentes básicos: el
ría formada por los siguientes métodos: función realizar y qué contenido generar portal y el contenedor de Portlets, por dos
 init(PortletConfig config): En este ante la petición de un usuario. La especifi- interfaces: la interfaz de invocación del con-
método se ejecutan todas las tareas de cación clasifica los modos de trabajo de tenedor (para la comunicación portal-conte-
inicialización del Portlet. Se llama una Portlets en tres grandes categorías: nedor) y la interfaz del proveedor de servicios
sola vez para cada Portlet, cuando se  Modos obligatorios: Todo portal debe (para la comunicación del contenedor con el
construye su instancia. Suele ser utili- contemplar los modos de edición, portal). En la figura 5 podemos ver esta
zado para realizar operaciones costo- ayuda y vista. En cuanto a los Portlets, arquitectura representada de forma gráfica.
sas como cargar datos de la base de deben soportar al menos el modo de El servicio de portal de Pluto recibe las peti-
datos, leer imágenes de ficheros, etc. vista, necesario para generar sus sali- ciones de los clientes y accede al contene-
que sean necesarias para el Portlet. das. El modo de edición se utiliza para dor a través del API de invocación del con-
 processAction(ActionRequest request, modificar las configuraciones de usua- tenedor de Portlets. Para tal fin, aquellos
ActionResponse response): Este méto- rio que les permiten personalizar la servicios que invoquen al contenedor de
do se utiliza para notificar al Portlet apariencia del Portlet, y el modo de Portlets deben implementar la interfaz SPI
que el usuario ha realizado una acción ayuda se emplea para visualizar en para proveedores de servicios. Esto es nece-
sobre dicho Portlet. Como resultado de pantalla información sobre el funcio- sario para independizar el contenedor del
ésta, un Portlet puede realizar una redi- namiento del Portlet. portal, ya que cuando el contenedor haya
rección, modificar su modo de trabajo  Modos opcionales: Son modos que un finalizado la ejecución de los Portlets, se
(seguidamente veremos qué es esto), portal podría tener. Tenemos el modo comunicará a través de la mencionada
cambiar su estado de persistencia, etc. “Acerca de”, el modo “Configuración”, el interfaz con los usuarios de sus servicios,
 render(RenderRequest request, Ren modo “Previsualización” y el modo para obtener información del componente
derResponse response): Este método “Impresión”. portal. La comunicación entre los Portlets y
es llamado por el contenedor para  Modos específicos de las casas el contenedor se realiza a través del API de
generar la salida del Portlet. Para cada comerciales: Todos aquellos que de- Portlet. Cabe reseñar que este componente
Portlet de la página actual del usuario seen implementar los fabricantes de es bastante simple, y sólo trata de mostrar
se llama a este método, y la salida final portales y contenedores de Portlets. cómo debe interactuar un servicio de portal
de todos los Portlets es compuesta con el contenedor de Portlets, a través de
según defina la plantilla de composición Empaquetado y despliegue de Portlets las APIs de invocación y de proveedor de
establecida para la página. Al estar basados en la arquitectura J2EE, un servicios.
 destroy(): La llamada a este método Portlet junto con los recursos que necesite El contenedor de Portlets está diseñado de
indica el final del ciclo de vida del y sus descriptores de despliegue son empa- tal forma que permanece completamente
Portlet, por lo que el Portlet debe libe- quetados juntos en fichero WAR. Para los aislado de cualquier otro elemento del por-
rar todos los recursos costosos que lectores que desconozcan esta plataforma tal. En consecuencia, podría ser embebido
esté consumiendo y guardar de forma de desarrollo empresarial, cabe decir que dentro de cualquier otro portal.
persistente su estado. un descriptor de despliegue es un docu- El proceso de despliegue de Portlet en Pluto
Gracias a que todos los Portlets cumplen el mento XML que proporciona información es bastante sencillo: una vez creado el
contrato de implementar esta interfaz, de configuración sobre el Portlet al conte- fichero WAR, se debe ejecutar el script
cuando el contenedor de Portlets recibe una nedor, y que un fichero WAR es un fichero “deployPortlet.bat” especificándole como
petición, se encarga de instanciar el Portlet de empaquetado para componentes des- parámetro la ubicación del archivo de
al que está destinada, y de invocar estos plegados en un servidor de aplicaciones. empaquetado WAR del Portlet que quere-

http://digital.revistasprofesionales.com 45 SOLO PROGRAMADORES nº 122


REDES

en otro portal tan solo habría que utilizar


un servicio web publicado por éste.
 El estándar SAML (Security Assertion

Markup Language) trata de federar los


esquemas de seguridad establecidos
para los diferentes portales, permitien-
do a un usuario navegar entre los domi-
nios de diferentes portales sin tener que
volver a autentificarse al cambiar de
portal. Básicamente consiste en un pro-
tocolo basado en el intercambio de
aserciones que permite a los sistemas
de seguridad de diferentes portales
comunicarse entre sí e intercambiar
información acerca del perfil de un
determinado usuario.
La tecnología de portales federados estaba
 Figura 5. Arquitectura del contenedor de Portlets y portal de Portlets Pluto. concebida en un primer momento para con-
seguir la integración de los diferentes porta-
mos desplegar. Este script de despliegue cientos de URLs y autentificarse en tantos les departamentales de una misma organiza-
forma parte de la instalación de Pluto. sitios como portales contengan la informa- ción. Un paso más en este sentido consiste en
Por último, una vez desplegados los Portlets ción que requiere consultar. Para ello, estos la federación entre portales de diferentes
y registrados en el componente de portal, portales deberán coordinarse para propor- organizaciones. Para dar respuesta a esta
habría que definir la apariencia final del cionar una sola autentificación (lo que se necesidad han surgido proyectos como
portal. Para tal fin, Pluto utiliza el archivo viene a denominar “single sign-on”), lo que Liberty (http://www.projectliberty.org), o
de configuración “pageregistry.xml”. En esta implica crear un único usuario para todos Microsoft Passport (http://www.passport.net).
estructura XML se incluirán etiquetas para estos portales. Además, deberán comuni-
introducir la salida de un Portlet en la com- carse para intercambiar contenido entre Conclusiones
posición final de la página, indicando la ellos y así atender las solicitudes de sus
orientación que deben tomar sus salidas en usuarios. Evidentemente, esta coordinación A lo largo de estos dos artículos hemos tra-
dicha composición final. entre portales no sería posible sin la elabo- tado de introducir al lector en el tipo de sis-
ración de estándares a los que todos se tema que constituye un CMS. Hemos visto
Siguiente paso en la gestión de adhieran. En este sentido la industria de algunas de sus principales características y
portales: portales federados elaboración de gestores de contenido y ser- funcionalidades, y una pequeña muestra de
vidores de portal ha creado varios estánda- productos comerciales y de carácter libre.
Según la prestigiosa consultora Garnet res para alcanzar este objetivo: En la parte final de la serie, nos hemos cen-
Group, los sistemas WCM tenderán hacia la  El estándar JSR-168, descrito con ante- trado en una interesante iniciativa para la
construcción de portales federados. Este rioridad, para buscar la portabilidad de estandarización de los elementos de portal
tipo de portales se basan en permitir a sus Portlets creados por diferentes fabri- para CMS en la plataforma Java: la especi-
usuarios, bien sea de una intranet, extranet cantes a diferentes servidores de portal. ficación JSR-168.
o de Internet, acceder a una determinada  El estándar WSRP (Web Services for No obstante, a la hora de optar por una solu-
información de forma transparente a la Remote Portlets) trata de dar solución al ción u otra no sólo influyen los condicionan-
localización real del contenido. En conse- problema del intercambio de contenido tes técnicos o económicos. También influye la
cuencia, los diferentes portales que conten- entre portales remotos. Para ello, se apoya plataforma tecnológica (sistema operativo,
gan esta información se integrarán de en la tecnología de servicios web, de forma bases de datos, servidor de aplicaciones, etc.)
forma que el usuario no necesite recordar que para acceder a contenido albergado que ya se encuentre implantada.
Direcciones de interés
 http://www.phpnuke.org: Portal desde el que se puede descargar PHP-Nuke, así como gran número de módulos/Portlets para éste.
 http://www.postnuke.com: Portal de Postnuke, con descargas de Portlets y el CMS principal.
 http://www.magnolia.info: Portal del CMS en Java Magnolia.
 http://www.opencms.org: Portal del CMS OpenCMS.
 http://www.opensourcecms.com: Portal desde el que se puede acceder a un servidor con un gran número de CMS instalados. Proporciona privilegios de adminis-
trador para que sus usuarios puedan evaluar los distintos CMS.
 http://portals.apache.org/pluto/: Página desde la que se puede descargar Pluto, implementación de referencia de la especificación de Portlets.
 http://www-106.ibm.com/developerworks/webservices/library/ws-wsrp/: Artículo de IBM en el que se habla de la especificación WSRP. Esta especificación trata
de definir un mecanismo de intercambio de información entre portales remotos a través de servicios web.

SOLO PROGRAMADORES nº 122 46 http://digital.revistasprofesionales.com


REDES

Servlets Filters (I)


ADOLFO ALADRO GARCÍA
Estructura de
LISTADO 1 directorios con Caucho
Agregando filtros a nuestra /digital.revistasprofesionales
|
aplicación web podremos interceptar  +— /html
| |
las peticiones que se hagan sobre | +- /WEB-INF
| |
ésta, pudiéndolas procesar antes y/o | +- web.xml
|
después de pasar el control al Servlet +— /WEB-INF
|
o la página JSP correspondiente. +- classes
Además, los filtros ofrecen un
Configuración
mecanismo muy útil para añadir 
funcionalidades a nuestra aplicación El listado 1 muestra la típica estructura de direc-
web. torios y subdirectorios que presenta una aplica-
ción web desarrollada con Caucho.
Introducción El directorio “/digital.revistasprofesionales.com/
html” es el document root del sitio web. El fichero
A veces resulta muy útil poder procesar las peti- de configuración de la aplicación (donde se defi-
ciones HTTP atendidas por un servidor de aplica- nen los Servlets y los filtros, se indican cuáles son
ciones web. El objeto de este tratamiento no es los classpath, se establecen variables de inicializa-
tanto cambiar la funcionalidad de los Servlets y ción que posteriormente se pueden obtener con el
páginas JSP originales como poder añadir otra método “getInitParameter”, etc.) se llama
nueva sin necesidad de rescribir el código ya des- “web.xml” y se encuentra en un subdirectorio,
arrollado y puesto en producción. En ocasiones se dentro del document root, denominado “WEB-
necesita que este procesamiento se haga antes de INF”. A la misma altura que el document root se
que la petición se sirva. Por ejemplo, ésto es típico encuentra también otro directorio que también se
cuando se quieren implementar sistemas que sólo llama “WEB-INF”. El directorio “classes” que se
acepten peticiones procedentes de determinadas especifica es donde se almacenan todos los fiche-
IP. En otros casos el procesamiento debe llevarse a ros .CLASS correspondientes a las clases de la apli-
cabo después, es decir, una vez que se ha genera- cación.
do una respuesta ésta se intercepta y se trata El fichero “web.xml” es un documento XML que
antes de que llegue finalmente al cliente. Uno de guarda la configuración tanto de los filtros
los casos más comunes de este segundo tipo es el como de los Servlets. Para el primer caso se
Los filtros permiten que se hace para codificar las páginas HTML con definen dos etiquetas: “<filter>” y “<filter-
gzip para comprimirlas, de forma que reduzca el mapping>”. La etiqueta “<filter>” permite esta-
procesar tanto las ancho de banda consumido entre el servidor y el blecer el nombre del filtro (el atributo “filter-
navegador. name”) y la clase que lo implementa (el atribu-
peticiones que Los filtros de Java se ajustan perfectamente a los to “filter-class”). La segunda etiqueta, “<filter-
dos modelos expuestos. Su funcionamiento y mapping>”, proporciona una forma de definir
llegan a nuestra configuración es muy simple, de forma que varios reglas que se aplican a las URL correspondien-
filtros pueden encadenarse tan solo modificando tes a las peticiones y que determinan cuáles de
aplicación como el fichero de configuración del servidor web. Para estas peticiones son filtradas o no. Así el atribu-
los ejemplos que se desarrollarán en estos artícu- to “filter-name” especifica el filtro a aplicar, y el
las respuestas los se empleará Resin 2.1.5 (www.caucho.com) atributo “url-pattern” la regla que, aplicada a la
uno de los servidores de aplicaciones web en Java URL de la petición, indica si debe aplicarse el fil-
de ésta Open Source más populares. tro o no en ese caso.

SOLO PROGRAMADORES nº 122 48 http://digital.revistasprofesionales.com


REDES
Servlets Filters (I)

LISTADO 2 Definición del filtro spp-filter

<web-app id=”/” app-dir=”C:/Proyectos/digital.revistasprofesionales.com/html”>


<classpath id=”../WEB-INF/classes” source=”../WEB-INF/classes”/>
<welcome-file-list>index.xtp, index.jsp, index.html</welcome-file-list>
<filter filter-name=”spp-filter” filter-class=”com.spp.servletfilters.filter.FSerlvetFiltersFilter”/>
<filter-mapping url-pattern=”/SServletFiltersServlet/*” filter-name=”spp-filter”/>
<servlet-mapping url-pattern=”SServletFiltersServlet” servlet-name=”SServletFiltersServlet”/>
<servlet servlet-name=”SServletFiltersServlet” servlet-class=”com.spp.servletfilters.servlet.SServletFiltersServlet”/>
</web-app>

En el listado 2 se muestra un fichero LISTADO 3 Nuestro primer filtro


“web.xml” que define un filtro cuyo nombre
es “spp-filter” y que está implementado en la HttpServletRequest req = (HttpServletRequest) request;

clase “FSerlvetFiltersFilter”, perteneciente al for (Enumeration e = req.getHeaderNames(); e.hasMoreElements() ;) {


paquete “com.spp.servletfilters.filter”. Las String sHeaderName = (String)e.nextElement();
String sHeaderValue = req.getHeader(sHeaderName);
peticiones que recibe la aplicación web sólo
se filtran cuando la URL se ajusta al patrón System.out.println(sHeaderName + “=” + sHeaderValue);
“/SServletFiltersServlet/*”. }
System.out.println(“AuthType()=” + req.getAuthType());
Como se puede observar en el código anterior, System.out.println(“ContentType()=” + req.getContentType());
los Servlets se definen de forma similar. La eti- System.out.println(“ContentLength()=” + req.getContentLength());
System.out.println(“PathInfo()=” + req.getPathInfo());
queta “<servlet>” permite establecer el nom- System.out.println(“PathTranslated()=” + req.getPathTranslated());
bre del Servlet (el atributo “servlet-name”) y la System.out.println(“QueryString()=” + req.getQueryString());
System.out.println(“RemoteAddr()=” + req.getRemoteAddr());
clase que lo implementa (el atributo “servlet- System.out.println(“RemoteHost()=” + req.getRemoteHost());
class”). Por otro lado, la etiqueta “<servlet- System.out.println(“RemoteUser()=” + req.getRemoteUser());
mapping>” especifica qué URL correspon- System.out.println(“Method()=” + req.getMethod());
System.out.println(“ServletPath()=” + req.getServletPath());
dientes a peticiones son servidas por ese System.out.println(“ServerName()=” + req.getServerName());
Servlet. El atributo “servlet-name” indica el System.out.println(“Protocol()=” + req.getProtocol());
System.out.println(“ServerPort()=” + req.getServerPort());
nombre del Servlet, y el atributo “url-pattern”
es el patrón que aplicado a la URL revela si esa
petición debe ser atendida o no por el Servlet. ta en una única ocasión, normalmente private FilterConfig config = null;

cuando el filtro va a emplearse por primera public void init(FilterConfig config)

Esqueleto de un filtro vez. En este método se realizarán entre otras throws ServletException
aquellas tareas de inicialización que sean { this.config = config; }
En los filtros, existen dos métodos principa- necesarias en función de la naturaleza del En este caso simplemente se guarda en una
les que deben implementarse, y que se deno- filtro. Seguidamente se muestra la imple- propiedad de la clase el objeto que contiene
minan “init” y “doFilter”. El primero se ejecu- mentación más sencilla del método init: la información de configuración del filtro.
El método “doFilter” es el responsable de
procesar las peticiones, es decir, es quien
realmente filtra las peticiones. Se define tal y
como sigue a continuación:
public void doFilter(ServletRequest
request, ServletResponse response,
FilterChain next) throws IOException,
ServletException

{ ... }

Los dos primeros parámetros representan los


objetos que se corresponden respectivamen-
te con la petición y la respuesta. El tercer
parámetro permite gestionar la concatena-
ción de filtros, o lo que es lo mismo, hace
posible redirigir la petición al siguiente filtro,
si es que hay alguno configurado.
El filtro más sencillo que puede definirse es
aquél cuyo método “doFilter” tiene una
única línea:
next.doFilter(request, response);
 Respuesta dada por el servidor cuando se solicita una imagen JPG y el filtro que la
escala no está activado.

http://digital.revistasprofesionales.com 49 SOLO PROGRAMADORES nº 122


REDES

LISTADO 4 La clase ServletResponseWrapperImg


De las líneas anteriores se deduce que todas
class ServletResponseWrapperImg
extends HttpServletResponseWrapper
aquellas peticiones que terminen con la
{ cadena de texto “jpg” serán procesadas por
protected HttpServletResponse responseOrig = null; el filtro que se corresponde con la clase
protected ServletOutputStream servletOutputStream = null;
“FSerlvetFiltersImgFilter”, cuyo método prin-
public ServletResponseWrapperImg(HttpServletResponse response) cipal, “doFilter”, es tal y como sigue:
{
super(response); HttpServletResponse res = (HttpServlet
responseOrig = response; Response)response;
}
... ServletResponseWrapperImg servlet
} ResponseWrapperImg = new ServletResponse
WrapperImg(res);
LISTADO 5 Los métodos a implementar next.doFilter(request, servletResponse

public ServletOutputStream getOutputStream() WrapperImg);


throws IOException
{ Como se verá dentro de poco, la clase
if (servletOutputStream==null) { “ServletResponseWrapperImg” extiende a la
servletOutputStream = new ServletOutputStreamImg(responseOrig);
}
clase “HttpServletResponseWrapper”, que es
return servletOutputStream; una clase del API con la que se puede “envol-
} ver” el tratamiento de las peticiones de
public void flushBuffer() forma que éstas se procesen de una manera
throws IOException determinada, independientemente de lo que
{
servletOutputStream.flush();
haga la aplicación web. Esto es justo lo que
} define a un filtro.
La clase “ServletResponseWrapperImg”
public ServletResponse getResponse()
{ cuenta con dos propiedades definidas como
return this; “protected” y que almacenan respectiva-
}
mente el objeto original correspondiente a la
respuesta y un flujo de escritura. Estúdiese el
Este filtro no haría nada salvo pasar la peti- Procesamiento de las respuestas listado 4.
ción al siguiente filtro que se haya configu- El constructor llama en primer lugar al cons-
rado en el fichero “web.xml”. De no existir, El filtro del listado 3 es muy simple. En rea- tructor de la clase padre y después se asigna la
simplemente se pasará la petición al Servlet lidad no hace nada especial, ni con la peti- propiedad “responseOrig”. A partir de ahora la
responsable en última instancia de procesar ción ni con la respuesta. En la práctica los fil- clase “ServletResponseWrapperImg” debe
y atender a dicha petición. tros se emplean para procesar anticipada- implementar aquellos métodos que sean
Tal y como se ha adelantado, los objetos mente las peticiones o bien para tratar las necesarios para el propósito del filtro, dejando
“request” y “response” permiten gestionar la respuestas dadas por los Servlets o las pági- que los restantes métodos sean ejecutados
petición y la respuesta, lo que hace posible nas JSP justo después de que se hayan pro- por la clase padre, o dicho de otra forma,
que un filtro pueda hacer prácticamente lo ducido y antes de que éstas lleguen al nave- dejando que en el resto de los casos se ejecu-
mismo que un Servlet. En el listado 3 se gador del usuario. La gran ventaja de los fil- te el método por defecto.
muestra el código de un filtro que imprime tros es que se pueden modificar las funcio- En el caso que nos ocupa se necesita proce-
por la salida estándar el valor de todas las nalidades de las aplicaciones web por capas, sar la imagen devuelta para escalarla por lo
variables HTTP de la solicitud. evitando además que haya que rescribir el que se van a implementar los métodos que
En primer lugar se obtiene una referencia a un código de la programación original. A conti- luce el listado 5.
objeto que implementa la interfaz “javax.ser- nuación se va a estudiar un caso más com- El primero de ellos es el más importante ya
vlet.HttpServletRequest” simplemente modifi- plejo en el que se emplea un filtro que pro- que cuando se llama al método “getOut
cando el tipo del parámetro “request”. A partir cesa todas las peticiones HTTP que solicitan putStream” se obtiene el flujo de escritura que
de este momento se puede trabajar con la imágenes JPG. La función del filtro será se empleará más adelante para escribir los
variable “req” del mismo modo que se hace en escalar dichas imágenes antes de servirlas. datos correspondientes a la lectura, es decir, la
un Servlet, por lo que el método En primer lugar se configura el filtro en el propia imagen. Para procesar los datos y
“getHeaderNames” proporciona una colección fichero “web.xml”: hacerlos llegar al cliente se ha creado una
con los nombres de las cabeceras HTTP de la <filter filter-name=”img-filter” nueva clase, “ServletOutputStreamImg”. Esta
solicitud, y el método “getHeader” permite filter-class=”com.spp.servletfilters. es la responsable última del tratamiento de las
conocer el valor de una cabecera dado su nom- filter.FSerlvetFiltersImgFilter”/> imágenes y su estructura es la que se presen-
bre. Asimismo los métodos “getAuthType”, <filter-mapping url-pattern=”*jpg”
ta en el listado 6.
“getContentLength”, “getContentType”, etc., Los dos primeros miembros de la clase
filter-name=”img-filter”/>
permiten conocer todos los datos de la petición. guardan el objeto correspondiente a la

SOLO PROGRAMADORES nº 122 50 http://digital.revistasprofesionales.com


REDES
Servlets Filters (I)

LISTADO 6 La clase ServletOutputStreamImg


para ser tratados después. Esta misma
class ServletOutputStreamImg
extends ServletOutputStream
clase, cuando haya acabado el procesa-
{ miento de dichos datos, será quien final-
protected HttpServletResponse response = null; mente los mande al cliente. Por lo tanto
protected ServletOutputStream servletOutputStream = null;
protected ByteArrayOutputStream baos = null; “ServletOutputStreamImg” implementará
protected boolean bClosed = false; los métodos del listado 7.
public ServletOutputStreamImg(HttpServletResponse response) El mecanismo es sencillo: en vez de escribir
throws IOException en la salida estándar para estos casos se
{
super();
escribe en el buffer interno utilizando la
bClosed = false; clase “ByteArrayOutputStream”.
this.response = response; La ejecución del método “close” marca el
this.servletOutputStream = response.getOutputStream();
baos = new ByteArrayOutputStream(); final de los datos, momento en el que la
} clase “ServletOutputStreamImg” tiene que
...
comenzar el tratamiento de los datos:
} public void close()

throws IOException

LISTADO 7 Métodos que implementa la clase ServletOutputStreamImg {

if (bClosed) {
public void write(int b)
throws IOException throw new IOException(“This output
{
stream has already been closed”);
if (bClosed) {
throw new IOException(“Cannot write to a closed output stream”); }
}
baos.write((byte)b); byte[] bytes = baos.toByteArray();
} ...

public void write(byte b[]) }


throws IOException
{
write(b, 0, b.length);
} El método “toByteArray” de la clase
“ByteArrayOutputStream” devuelve un array
public void write(byte b[], int off, int len)
de bytes con los datos escritos hasta el
throws IOException
{ momento. Este array representa la imagen
if (bClosed) { original devuelta. Existen muchas formas de
throw new IOException(“Cannot write to a closed output stream”);
} escalar una imagen pero quizás la más sen-
baos.write(b, off, len); cilla consiste en emplear el método
}
“getScaledInstance” de la clase “Image”. Pero

respuesta y el canal de escritura origina-


les. La propiedad denominada “baos” se
empleará para almacenar en un buffer
intermedio los datos de la imagen devuel-
ta (antes de ser escalada). Finalmente el
miembro “bClosed” contiene un valor
booleano que indica si el flujo de escritu-
ra está cerrado o no. El constructor de la
clase llama en primer lugar al constructor
de la clase padre y después pasa a inicia-
lizar sus miembros.
Cuando el servidor devuelve la imagen
emplea los métodos de esta clase para
escribir los datos, lo que para el caso de las
imágenes, que son datos binarios, serán
típicamente todos los métodos “write”. El
propósito de esta clase es hacer que la eje-
cución de esos métodos no sea “real”, es
decir, que los datos no se manden al clien-  Respuesta dada por el servidor cuando se solicita una imagen JPG y se ha activado el 
te sino que se almacenen internamente  filtro que la escala.

http://digital.revistasprofesionales.com 51 SOLO PROGRAMADORES nº 122


REDES

tado en un método estático llamado


“toBufferedImage”. Las diferencias entre los
objetos “Image” y “BufferedImage” no son el
objeto de este artículo así que no se va a
explicar el código del método “toBuffe
redImage”, el cual en cualquier caso es bas-
tante sencillo de seguir leyendo el código
fuente de los ejemplos.

Procesamiento de las peticiones


Uno de los ejemplos más típicos de la apli-
cación de filtros para procesar las peticio-
nes es aquel que se encarga de aceptar o
rechazar las peticiones en función de la IP
de origen desde la cual dichas peticiones se
han originado. Esta tarea se puede llevar a
cabo de forma muy sencilla utilizando un
filtro.
En primer lugar se debe modificar el fichero
“web.xml” para definir el nuevo filtro:
 Documentación de la clase “HttpServletResponseWrapper”, la cual per mite procesar las  <filter filter-name=”ip-filter”
respuestas dadas por el servidor de aplicaciones.
filter-class=”com.spp.servletfilters.
filter.FSerlvetFiltersIPFilter”/>

LISTADO 8 Código del filtro ip-filter <filter-mapping url-pattern=”*”


filter-name=”ip-filter”/>
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain next)
throws IOException, ServletException Obsérvese que esta definición debe situarse
{ la primera de todas y que además el patrón
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
que se aplica en la URL es asterisco (*), es
decir, que se filtrarán todas las peticiones.
String sRemoteAddr = req.getRemoteAddr(); El código del filtro es bastante sencillo y
if (sRemoteAddr!=null && sRemoteAddr.equals(“33.33.33.33”)) {
next.doFilter(request, response); puede verse en el listado 8.
} else { El método “getRemoteAddr” del objeto
res.sendRedirect(“http://digital.revistasprofesionales.com”);
}
“HttpServletRequest” devuelve la direc-
} ción IP desde la que se realizó la petición.
Si esta dirección no se corresponde con lo
antes de poder emplear este método es pre- Para este ejemplo simplemente se va a deseado una de las opciones más sencillas
ciso obtener la propia imagen a partir del reducir el tamaño de las imágenes a su consiste en emplear el método
array de bytes: cuarta parte: “sendRedirect” de forma que el navegador
ImageIcon imageIcon = new ImageIcon int iNewWidth = imageIcon.getIconWidth() redirige automáticamente a la portada del
(bytes); / 4; site. Evidentemente este mecanismo se
int iNewHeight = imageIcon.getIcon
puede hacer todo lo complejo que la apli-
La ventaja principal de usar la clase Height() / 4;
cación requiera, de forma que se puede
“ImageIcon” es que, a diferencia de lo que mostrar una página de error, o incluso
ocurre con otras técnicas para leer imáge- Con estos datos escalar la imagen es tan mostrar todo un site alternativo para ese
nes con Java, ésta no devuelve el control simple como ejecutar: caso.
al programa principal hasta que la imagen imageIcon.getImage().getScaledInstance
no se ha cargado en su totalidad, por lo (iNewWidth, iNewHeight, Image.SCALE_ Conclusiones
que inmediatamente después de haber DEFAULT)
llamado al constructor se puede comen- Hemos visto los fundamentos de los filtros
zar el tratamiento de la imagen sin peligro Ahora bien, este método devuelve un objeto Java con algunos ejemplos sencillos. En el
de que se encuentre parcialmente carga- del tipo “Image” y para que la imagen pueda siguiente capítulo profundizaremos en más
da. escribirse es preciso tener un objeto del tipo ejemplos hasta haber visto cuáles son los fil-
En el siguiente paso determinamos los “BufferedImage”. La conversión entre objetos tros que más comúnmente se usan en las
nuevos valores para la imagen escalda. “Image” y “BufferedImage” se ha empaque- aplicaciones web actuales.

SOLO PROGRAMADORES nº 122 52 http://digital.revistasprofesionales.com


DISEÑO

La diferencia entre
el éxito y el fracaso
JORDI BORJA (Director de Tecnología de Borland) Hoy, más de una década después de mi primer
contacto con el fascinante mundo del desarrollo,
Todos sabemos que abordar el he comprendido que, aquello que creía era una
desarrollo de un proyecto de actitud prepotente y torturadora del profesor, es
el mayor problema con el que nos encontramos
software entraña muchos en la actualidad en el aún más complicado mundo
 problemas que pueden derivar en del desarrollo empresarial de software.
retrasos y sobrecostes. Como Los requisitos
respuesta a las necesidades de
Los estudios denominados “post-mortem” de los
gestores de proyectos, analistas, proyectos de desarrollo de software señalan que la
 programadores etc., Borland ofrece principal causa de los retrasos, sobrecostes y/o no
aceptación de un desarrollo es una incorrecta ges-
una completa solución para cada tión de los requisitos. Se calcula que las dos terceras
una de las fases del ciclo de vida partes de los desarrollos no cubren las expectativas
iniciales de los usuarios y, como consecuencia de
de las aplicaciones. ello, los proyectos son entregados tarde y con sobre-
costes. ¿Exageración? ¿Derrotismo? Seguro que más
Introducción de uno no ha podido evitar una leve sonrisa recor-
dando alguna de sus vivencias pasadas o presentes…
Mis primeros pasos en el mundo de la programación En efecto, la gestión efectiva y eficiente de los requi-
fueron en la facultad. Aún recuerdo mis primeras sitos de una aplicación es el gran reto de los des-
prácticas (con Borland Pascal, curiosamente) en las arrollos actuales y es una de las fases del ciclo de
que el profesor de turno nos pedía que desarrollára- vida en la que más esfuerzos de normalización se
mos pequeñas aplicaciones y, durante toda la sema- están llevando. Una incorrecta gestión de requisitos
na previa a la entrega, recuerdo las discusiones con puede llevar a un esfuerzo y coste innecesario.
mis compañeros de promoción (cómo no, en la can- Además, detectar en fase de codificación que un
tina) en las que intentábamos ponernos de acuerdo requisito no ha sido correctamente capturado, supo-
sobre qué era realmente lo que el profesor había soli- ne de forma segura un retraso en la planificación.
citado. Cada compañero había construido interna- Cuando más tarde se detecta un problema en los
mente un conjunto de requisitos. Por supuesto, cada requisitos, más compleja es la resolución del proble-
uno de nosotros creíamos tener la razón e imple- ma Entonces, ¿qué hacer?
mentaba su propia versión de la aplicación solicitada. La gestión de los requisitos es una técnica de inge-
Nuestra sorpresa era mayúscula cuando descubría- niería muy antigua. Cualquier empresa de desarro-
mos que, el día de entrega, el profesor, con una cruel llo tiene sus mecanismos para gestionar catálogos
sonrisa, nos decía que lo que habíamos implementa- de requisitos, típicamente basada en documentos
do no era lo que él realmente había solicitado. (recuerdo los proyectos de una compañía en la que
Aprendimos de nuestros errores y, en las prácticas trabajé en la que los desarrolladores tenían las pan-
siguientes, acudíamos al profesor para intentar acla- tallas repletas de Post-Its con los requisitos a
rar nuestras dudas e intentar acotar mejor el alcance implementar). Lo que se busca en la actualidad es
de la aplicación. Recuerdo lo terriblemente difícil que mucho más que poder documentar requisitos.
era que el profesor nos definiese claramente qué era En un entorno cada vez más globalizado, con facto-
lo que él esperaba de nosotros. Nunca tenía tiempo rías de desarrollo a kilómetros de distancia de los
para atendernos y explicarnos claramente los objeti- clientes, con penalizaciones por retrasos como
vos del ejercicio y una y otra vez nos encontrábamos norma habitual, con clientes (con memoria humana
en la entrega con la temida frase: “Está muy bien, pero limitada) que manejan varios proyectos softwarede
en realidad lo que os pedía era… ”. forma concurrente, y en un ambiente competitivo

SOLO PROGRAMADORES nº 122 54 http://digital.revistasprofesionales.com


DISEÑO
La diferencia entre el éxito y el fracaso

ción del software entre diferentes entornos


es una necesidad habitual, como lo es poder
gestionar versiones de la aplicación, peticio-
nes de cambio o tareas. De igual forma, el
garantizar la calidad homogénea de una apli-
cación desarrollada por personas que nunca
antes han trabajado conjuntamente es un
auténtico reto para los equipos de desarrollo.
Durante el ciclo de vida de un proyecto, los
diferentes perfiles deben de poder trabajar
sobre un repositorio centralizado, al que pue-
dan acceder a través de protocolos estándares.
Repositorios escalables, que guarden gran
cantidad de metainformación preferiblemente
en bases de datos y que permitan el acceso
rápido y concurrente de múltiples desarrolla-
dores. No hablamos exclusivamente de tener
una herramienta de control de versiones (algo
obviamente necesario), sino de tener una
herramienta que permita gestionar releases,
Caliber Requirement Manager, para una correcta gestión de los requisitos. que permita promocionar estas releases entre
diferentes entornos (desarrollo, integración,
en el que los cambios de los requisitos por mos a conseguir ahora que teníamos la opor- pruebas, preproducción, producción,…) y que
parte del cliente para adoptar una ventaja tunidad de unificar esfuerzos y conocimientos? permita, por ejemplo, poder crear una vista
competitiva son la práctica habitual, necesita- Pero pronto descubrimos otro de los principales evolutiva y otra correctiva de una release.
mos mucho más que una simple documenta- problemas en el mundo actual de desarrollo: la Hablamos de poder asignar peticiones de cam-
ción de requisitos. comunicación entre los miembros del equipo. bio o incidencias a determinados perfiles, y que
Las empresas de desarrollo buscan solucio- Outsourcing y Offshoring son dos términos estos perfiles puedan asociar las modificaciones
nes distribuidas, que permitan comunicar a con los que cada vez estamos más familiari- que realicen en el repositorio a las peticiones de
clientes y equipos de desarrollo, soluciones zados. Los equipos de desarrollo ya no tienen cambio, para que sea posible conocer el esfuer-
que permitan conocer en todo momento, que trabajar en casa del cliente. En la era de zo asociado a su resolución. De igual forma,
quién, cómo y por qué ha realizado un cam- las comunicaciones, es cada vez más habitual buscamos herramientas que permitan poder
bio en un requisito; que permitan conocer que los diferentes perfiles del equipo de des- gestionar la petición de cambio e incidencia en
qué partes del proyecto se verán afectadas arrollo estén distribuidos geográficamente, sí, a través de un workflow personalizable, en el
por ese cambio y, por lo tanto cuál va a ser creando centros de especialización. España que se formalicen los estados de la misma y se
el impacto en tiempo y coste del mismo. ha sido reconocida como un país candidato a definan roles y responsabilidades.
Soluciones que permitan garantizar que el albergar factorías de software para las gran- Hablamos también de poder trasladar la planifi-
impacto del cambio es aceptado por el clien- des compañías internacionales. La promo- cación de un proyecto a la herramienta de tra-
te antes de abordarlo. Soluciones que permi-
tan de forma automatizada eliminar la
ambigüedad, trazar con otras partes del pro-
yecto (planificación, pruebas, análisis,…) los
requisitos, notificar los cambios inmediata-
mente a los miembros del equipo de des-
arrollo,… en definitiva, soluciones que
implementen las más modernas recomenda-
ciones para una correcta gestión de requisi-
tos, como las definidas por el cada vez más
aceptado nivel de medición de la calidad de
los procesos de desarrollo: CMMI.
El equipo de trabajo
 Volviendo a mis tiempos de facultad, recuerdo
mis primeras prácticas en grupo. Por primera
vez nos sentíamos parte de un equipo de des-
arrollo. La soledad del programador había sido
superada, y a partir de ese momento, nuestras
vidas iban a cambiar por completo: si antes
habíamos sido capaces de hacer de forma indi-
vidual nuestras aplicaciones, ¿cómo no lo íba-  El ciclo de vida para la solución JBuilder.

http://digital.revistasprofesionales.com 55 SOLO PROGRAMADORES nº 122


DISEÑO

bajo en grupo, de forma que a partir de una pla-


nificación desarrollada, por ejemplo, con MS
Project, se generen de forma automática tareas
que se asignen a los diferentes miembros del
equipo y de esa forma tener en todo momento
una visibilidad y control del estado del proyecto.
Buscamos herramientas, en definitiva, que
sean flexibles, que permitan ser adaptadas a
nuestra metodología de desarrollo y ser
embebidas en nuestras herramientas diarias
de trabajo para que su uso no sea intrusivo.
Si conseguimos poder gestionar de forma
efectiva y eficiente los requisitos de un pro-
yecto y cohesionamos internamente el equi-
po, automatizando los procesos de desarro-
llo, habremos creado la base para garantizar
el éxito de nuestros desarrollos.
Sin embargo, existen dos factores críticos
adicionales en los desarrollos actuales de
software: la calidad y la productividad.
La calidad
 El ciclo de vida para Visual Studio .NET 
Las empresas que contratan proyectos softwa-
re son, afortunadamente, cada vez más exigen- turas y guías de estilo y la ejecución de las aplicaciones que queremos que puedan
tes respecto a la calidad de las aplicaciones que métricas de calidad del diseño (acoplamien- ser desplegadas sobre diferentes servidores
reciben. Es habitual encontrarse con pliegos en to, cohesión, encapsulamiento, herencia,…) de aplicaciones) y que no se dependa de un
los que se exige el cumplimiento de estándares Estas herramientas deben de poder ser perso- proveedor ni tecnología concreta. Una aplica-
de calidad, bien sean éstos universales o inter- nalizables, para que los equipos de desarrollo ción desarrollada para WebSphere debería de
nos de las compañías. Habitualmente se exige puedan configurar sus propios patrones de poderse portar a WebLogic o a Oracle AS con
la utilización de un catálogo de patrones de diseño, su propio conjunto de normas sintácti- un simple proceso de recompilación. Un equi-
diseño, una nomenclatura y guías de estilo y la cas y sus propias métricas de calidad de diseño po de desarrollo debería poder usar la misma
correcta utilización de las técnicas de la en función del cliente para el que trabajen. herramienta de trabajo independientemente
Programación Orientada a Objetos. Los objeti- Además, las empresas buscan soluciones que de si trabaja sobre Borland Enterprise Server,
vos perseguidos son, por un lado, que las apli- permitan tener siempre sincronizado el código WebSphere, Sun One u Oracle AS.
caciones puedan ser mantenidas por el depar- con el modelo y que puedan utilizarse de forma
tamento interno de informática y, por otro, que embebida en sus herramientas de codificación. Las pruebas
las empresas no tengan que depender de un
proveedor concreto y puedan asignar diferen- La productividad Por último, otro factor clave en el éxito del pro-
tes fases del desarrollo a diferentes compañías, yecto es la correcta planificación y ejecución de
sin encontrarse con la desagradable sorpresa de Precisamente con las herramientas de codifi- pruebas (funcionales y de rendimiento). Las
que es totalmente imposible que un equipo cación está relacionado el segundo factor crí- pruebas no deben ser una parte aislada del des-
diferente al que ha realizado el desarrollo origi- tico de desarrollo: la productividad. En la arrollo, sino que lo que se busca es que poda-
nal pueda abordar el mantenimiento y/o evolu- actualidad, los desarrolladores de aplicacio- mos ejecutar de forma continuada nuestro
ción del sistema. nes que utilizan Ultraedit o vi son afortuna- conjunto de pruebas y, que éstas puedan rela-
El principal elemento diferenciador de las damente residuales. Cualquier programador cionarse con los requisitos, por ejemplo, para
compañías de desarrollo es la calidad que utiliza un entorno integrado de desarrollo conocer qué requisitos de la aplicación han sido
imprimen a sus proyectos. Cuando una com- especializado en la plataforma sobre la que se probados satisfactoriamente y cuáles no.
pañía certifica la calidad de sus entregables desarrolla la aplicación. Cualquier aplicación Cuando hablamos de pruebas de rendimiento,
antes de que lo haga el cliente (o una J2EE, por ejemplo, requiere de la utilización de no es suficiente con herramientas que nos per-
empresa externa de auditoría), se asegura EJBs, Struts y/o Java Server Faces, Web mitan conocer el tiempo de respuesta de una
una inmejorable imagen de calidad y el Services, XML, editar descriptores de desplie- aplicación bajo una situación de carga. Si nos
mantenimiento de la relación con el cliente, gue,... El uso de estas tecnologías sin la ayuda limitamos a ejecutar pruebas de carga y de
además de evitar penalizaciones o retrasos de herramientas especializadas es complejo, tiempo de respuesta, nada nos garantiza que
en las entregas del proyecto. propenso a errores y poco productivo. Los una aplicación que se comporta correctamente
Es por ello, que las mejores empresas de des- entornos de desarrollo actuales permiten durante la fase de pruebas lo vaya a continuar
arrollo han introducido en sus equipos aumentar la productividad de los programa- haciendo tras varias horas en producción. Si el
herramientas que permiten la aplicación dores. Hay muchas alternativas en el merca- tiempo de respuesta directamente no es el
automática de patrones de diseño sobre el do pero, al mismo tiempo, se busca que el deseado, no tenemos información sobre cuál es
código existente, la verificación automática código generado sea portable (o portátil, la raíz del problema. Las herramientas de caja
y continua del cumplimiento de nomencla- como correctamente se debería denominar a blanca, permiten monitorizar, de forma interna

SOLO PROGRAMADORES nº 122 56 http://digital.revistasprofesionales.com


DISEÑO
La diferencia entre el éxito y el fracaso

a la aplicación, el consumo de CPU por cada


método (o línea de código), la gestión interna
de memoria (lotering objects y excesiva crea-
ción de objetos temporales) y el funcionamien-
to de los hilos de ejecución (excesiva conten-
ción de threads o deadlocks). Monitorizar de
forma continuada el funcionamiento de la JVM
(Java/J2EE) o el CLR (.NET) permite detectar pro-
blemas de rendimiento antes de que la aplica-
ción esté integrada, minimizando así el impac-
to de resolución del problema.
De igual forma, cuando la aplicación ya está
integrada, incluso en producción, y realiza-
mos las pruebas de carga, resulta necesario
disponer de herramientas que, de forma
intuitiva, permitan conocer qué ocurre desde
que llega una petición HTTP(S), IIOP, o SOAP
al servidor, hasta que se produce la respues-  El ciclo de vida para la solución Eclipse.
ta, para poder analizar el comportamiento des, Borland ha desarrollado una completa que consideran las empresas con equipos
interno de la aplicación. solución que cubre cada una de las fases del distribuidos de desarrollo, que requieren de
Desde luego, en mis tiempos de universitario, ciclo de vida de las aplicaciones. Las princi- una única solución para gestionar sus ver-
nunca podía llegar a pensar que el éxito del pales características de esta solución son: siones, peticiones de cambio y tareas.
desarrollo de una aplicación estuviese condi-  Ajuste 100% a estándares técnicos y Caliber Requirement Manager es una solución
cionado a factores como los abordados. Qué metodológicos. diseñada específicamente para la gestión de
tiempos aquellos en los que nos poníamos a  Portabilidad garantizada de todos los los requisitos, teniendo en cuenta todas las
programar directamente, sin un análisis previo, entregables del proyecto. recomendaciones y necesidades de nuestros
sin ningún diseño y ¡sin preocuparnos de la  Integración entre las diferentes solucio- grandes clientes y de estándares como CMMI.
calidad! ¿Añoranza o ignorancia? Más bien lo nes del ciclo de vida, no solamente entre OptimizeIT Suite y ServerTrace permiten
último. Somos ingenieros, desarrollamos apli- las propias herramientas de Borland, monitorizar en tiempo real y de forma distri-
caciones de las cuáles en muchos casos depen- sino con otras alternativas líderes del buida nuestras aplicaciones J2EE y .NET,
den vidas humanas y, en cualquier caso, gran- mercado. complementando las herramientas de prue-
des volúmenes de negocio, y estamos todavía  Soluciones flexibles, extensibles y perso- bas de rendimiento existentes.
aplicando técnicas prehistóricas de desarrollo. nalizables.
La experiencia nos ha demostrado, a clientes y  Interfaz visual sencilla e intuitiva. Conclusiones
a desarrolladores, que crear un software mejor Las herramientas de codificación de Borland
es posible. Tan sólo necesitamos los conoci- (Delphi, JBuilder, C++Builder y Mobile Como veis, Borland ofrece herramientas
mientos y herramientas adecuadas. Studio) serán posiblemente las herramientas especializadas en cada fase del ciclo de vida.
más conocidas por vosotros. Sin embargo, es Pero la solución de ciclo de vida de Borland
El ciclo de vida curioso descubrir que aún se desconocen es mucho más que un conjunto de herra-
muchísimas de las funcionalidades y venta- mientas especializadas. El uso integrado y
En esta introducción, hemos abordado los  jas de estas herramientas. El mercado de las conjunto de la solución permite que cada
principales retos y problemas de los desarro- herramientas de codificación es sin duda el perfil de desarrollo pueda acceder a todas las
llos actuales: la gestión de los requisitos de más competitivo en el que Borland ofrece fases del ciclo de vida desde una única
los proyectos, la necesidad de disponer de sus soluciones, sobre todo desde la aparición herramienta, independientemente de si se
herramientas distribuidas de trabajo en de soluciones Open Source. Sin embargo, utilizan todas las herramientas de Borland u
grupo, la necesidad de poder verificar la cali- Borland continúa siendo la solución elegida otras alternativas del mercado.
dad de los desarrollos, la necesidad de dis- por las principales empresas de desarrollo. La pregunta que os lanzo es: ¿sois “sólo pro-
poner de herramientas que aumenten la Mi reto es que vosotros descubráis por qué. gramadores”, o leéis una revista que es “sólo
productividad del equipo de desarrollo, Together Technologies es una solución de para programadores”? Estoy seguro que vues-
manteniendo la portabilidad del código y la modelado y verificación de calidad del soft- tra respuesta es la segunda. Únicamente se
necesidad de disponer de herramientas que ware que ofrece múltiples ventajas respecto puede ser un buen programador si se tienen
permitan gestionar y ejecutar los planes de a las soluciones clásicas de análisis y diseño en cuenta las problemáticas anteriores.
pruebas, incluyendo la monitorización inter- Orientado a Objetos. A través de sus edicio- Es por ello, que, con el objetivo de que
na y distribuida de las aplicaciones. nes especiales para entornos de desarrollo conozcáis mejor estas problemáticas, y
Como muchos de vosotros sabréis, desde J2EE, C++ y .NET, por fin es posible que per- conozcáis una de las alternativas para solu-
vuestras propias primeras experiencias con files multidisciplinares trabajen paralela- cionarlas, en los próximos números Borland
el mundo del desarrollo, Borland es y ha sido mente con modelo y código independiente- y Sólo Programadores  publicarán artículos
la empresa líder en herramientas de codifi- mente de la plataforma de desarrollo. específicos sobre cada una de las fases del
cación desde hace más de 20 años. Sin StarTeam es la solución de trabajo en grupo ciclo de vida, analizando las problemáticas
embargo, como respuesta a las necesidades que mayor crecimiento ha experimentado en asociadas, y cómo las soluciones de Borland
de los desarrolladores, a vuestras necesida- los últimos dos años y es la principal opción permiten resolverlas. ¡Os espero!

http://digital.revistasprofesionales.com 57 SOLO PROGRAMADORES nº 122


DISEÑO

Diseño multiplataforma
para aplicaciones C++ (I)
GABRIEL DOS SANTOS DÁVILA den permitirse y es en estos casos cuando
debemos recurrir a algún lenguaje que nos
Con este artículo iniciamos un permita generar código nativo. Lenguajes
curso en el que aprenderemos a como C++ no permiten, a diferencia de Java,
crear código compilado independiente de la
diseñar e implementar código C++ plataforma pero sí permiten, si se es cuidado-
independiente del sistema so y se parte de un buen diseño, crear código
fuente que pueda ser compilado en cualquier
operativo. Esto lo conseguiremos plataforma. En esta serie de artículos apren-
gracias a la librería de código deremos cómo diseñar e implementar código
C++ que sea independiente del sistema ope-
abierto ACE, que no sólo nos rativo. Para ello usaremos una librería de
abstrae de las particularidades de código abierto llamada ACE (Adaptive
Communication Environment) que no sólo
cada plataforma sino que además nos abstrae de las particularidades de cada
nos ofrece una implementación de sistema sino que además nos provee una
implementación de patrones de diseño para
 patrones de diseño para sistemas sistemas concurrentes o de red.
concurrentes o de red.
Introducción Diferencias entre plataformas
Aunque no es el caso más común, muchas El estándar C++ especifica ciertas condiciones
veces nos encontramos con que nuestras apli- que debe cumplir un compilador y un conjunto
caciones deben ser capaces de funcionar en de funciones que deben estar accesibles al pro-
más de un sistema operativo. Esto ocurre con gramador. Desafortunadamente este estándar
mayor asiduidad en aplicaciones para entornos no incluye nada acerca de la longitud exacta de
Unix debido a que existen diferencias entre las las variables o funciones de librería estándar
diferentes versiones de Unix y Linux que hacen para control de threads por ejemplo.
que una aplicación programada para uno de Las diferencias entre plataformas pueden agru-
estos sistemas no siempre pueda usarse en parse de la siguiente manera:
otro. También puede darse el caso en que nece-  Diferencias de la arquitectura del hardware.
sitemos que nuestra aplicación funcione no  Diferencias en las funciones del sistema
sólo en distintas variantes de Unix sino tam- operativo.
bién en Windows. En estos casos las diferen-  Diferencias en las librerías disponibles para el
cias son aún mayores y hacer el “port” desde programador.
un sistema a otro puede tener un coste y com- En esta serie nos centraremos en la resolución de
plejidad muy elevados. problemas relacionados con las diferencias a nivel
La respuesta más inmediata al problema de de sistema operativo.
una aplicación multi-plataforma suele ser el
uso de lenguajes como Java que nos permiten Diferencias de arquitectura
ACE es la librería escribir el código una vez y ejecutarlo en cual- Estas son las diferencias en las longitudes de los
quier plataforma deseada. También .NET (y el distintos tipos de datos entre plataformas o el
más usada para proyecto MONO) está ofreciendo esta “porta- orden en que se guardan los números en memo-
bilidad”, sin embargo el problema de estos ria. En arquitecturas Intel por ejemplo, un entero
crear código C++ lenguajes interpretados es que imponen a de dos bytes se guarda en memoria con sus bytes
nuestra aplicación una penalización de veloci- invertidos mientras que en otras plataformas
portable dad que algunas aplicaciones críticas no pue- esto no es así.

SOLO PROGRAMADORES nº 122 58 http://digital.revistasprofesionales.com


DISEÑO
Diseño multiplataforma para aplicaciones C++ (I)

concebida para ejecutarse en varias pla-


taformas y más tarde durante su ciclo de
vida surge este requerimiento. En la
figura 1 podemos ver un esquema de la
arquitectura de una aplicación que acce-
de de manera directa a las funciones de
la plataforma. Como vemos, esta aplica-
ción posee una gran cantidad de puntos
de contacto con el sistema operativo, los
cuales deberán ser modificados en su
totalidad al cambiar a otra plataforma.
En general es muy complicado portar
una aplicación desarrollada sólo con un
sistema operativo en mente. Es por ello
que, de existir alguna posibilidad de que
en el presente o futuro nuestra aplica-
ción deba funcionar con otro sistema,
deberemos plantearnos un diseño que
tenga en cuenta este escenario. En cual-
quier diseño, cuando algún elemento
 Figura 1. Aplicación que usa directamente funciones del sistema operativo. puede variar, se agrega un nivel de indi-
rección adicional que hace que el mismo
quede aislado del resto. De esta manera,
Diferencias en el sistema operativo muy habitual. Para evitar problemas de este si cambia, no afectará de manera alguna
Éstas son quizás las más evidentes. Las tipo, es muy importante informarse acerca a los demás componentes. En nuestro
librerías para crear threads en Windows son de si una función es o no estándar antes de caso será la librería ACE la que nos ofrez-
completamente diferentes de aquellas dis- comenzar a utilizarla. Si no hay alternativa a ca este nivel adicional de indirección y
ponibles en sistemas Unix. En este apartado una función que no es estándar lo más con- en lugar de invocar de manera directa a
podemos mencionar como “no portables” a veniente es encapsular el acceso a ella en un las funciones del sistema operativo,
las siguientes funcionalidades: solo lugar de la aplicación para que luego invocaremos funciones de ACE que a su
 Listar contenido de directorios, crear sea fácil de cambiar si se debe portar a una vez harán llamadas a las funciones
directorios y otras tareas del sistema de plataforma en la que la función no existe. correspondientes del sistema operativo
archivos. en el que estemos trabajando lo cual nos
 Cargar librerías dinámicas (DLL en dará la independencia de la plataforma.
Windows o SO en Linux) dentro de la Diseño En la figura 2 podemos ver el esquema
aplicación y ejecutar funciones dentro de la arquitectura propuesta en el cual la
de éstas. El problema de la portabilidad se agrava interfaz entre ACE y nuestra aplicación
 Creación y manipulación de conexiones si una aplicación no fue inicialmente se mantiene constante sin importar la
de red por TCP/IP usando sockets.
 Creación de hilos de ejecución o thre-
ads.
 Sincronización entre threads.
 Gestión de procesos.
Estas incompatibilidades nos obligan a
escribir diferente código para cada siste-
ma operativo y compilar condicionalmen-
te uno u otro. Esto tiene varias desventa-
 jas, siendo la duplicación de código la más
evidente. Pero también implica que debe-
remos invertir tiempo en aprender cómo
funciona cada conjunto de funciones de
cada sistema operativo.
Diferencias en las librerías disponibles
No todas las funciones disponibles al pro-
gramador en una plataforma lo estarán en
otras. Hay funciones que no son estándar y
por lo tanto no existen en algunas platafor-
mas como es el caso de la función “itoa()”
que no está disponible en ciertas versiones
de Unix a pesar de ser una función de uso  Figura 2. Uso de ACE para abstraer el sistema operativo.

http://digital.revistasprofesionales.com 59 SOLO PROGRAMADORES nº 122


DISEÑO

plataforma subyacente y la interfaz entre


ACE y los distintos sistemas operativos
es gestionada por ACE.
La desventaja de esta aproximación radica
en que tendremos invocaciones a ACE des-
perdigadas por toda nuestra aplicación y si
en algún momento deseamos cambiar ACE
por otra librería similar, será muy difícil
hacerlo. Para evitar esto se puede imple-
mentar el patrón de diseño Abstract Factory
el cual agrega un nivel más de indirección
creando un conjunto de clases abstractas
que representen la funcionalidad del siste-
ma operativo y luego una familia de clases
concretas que implementan esa funcionali-
dad usando ACE. Durante la ejecución de la
aplicación el Abstract Factory creará las ins-
tancias de las clases concretas que utilizan
ACE. En la figura 3 podemos ver los compo-
nentes de esta arquitectura. Este diseño nos  Figura 3. Arquitectura flexible que permitiría sustituir facilmente ACE.
permite separar la creación de las clases del
punto donde se utilizan y de esta manera
podremos, si es necesario, usar una librería Principios de diseño de ACE  Simplificar el código a escribir por el
distinta de ACE sólo con crear una nueva La librería ACE fue pensada y construida programador para los casos más comu-
familia de clases concretas. Esta es la teniendo en cuenta los conceptos más avan- nes de uso de la librería. La forma de
estructura más flexible a la que podemos zados de patrones de diseño de software. lograrlo es creando métodos que agru-
recurrir pero también la más compleja y no Entre los principales principios de diseño pen varias llamadas a funciones que
en todos los casos será necesaria. A la hora empleados podemos destacar: sean generalmente usadas en conjunto
de diseñar software no sólo es importante  Usar Wrapper Façades para forzar la y proveer valores predeterminados que
saber dónde agregar niveles de indirección verificación estricta de tipos de dato por sean los más usados para todos aque-
sino también saber cuándo dejar de hacerlo. el compilador. La idea es no exponer llos parámetros que sea posible.
Para más información sobre este patrón se estructuras internas a la implementa-  Usar jerarquías de clases para crear un
puede recurrir al libro “Patrones de Diseño” ción como ocurre en C. La principal téc- diseño fácil de entender, usar y exten-
de Eric Gamma y otros autores. nica usada es crear clases C++ que der.
hagan que el compilador verifique los  Ocultar diferencias entre plataformas
ACE tipos usados. siempre que sea posible. En el caso en
ACE es una librería gratuita que nos faci-
litará enormemente la portabilidad de
nuestra aplicación. El código fuente de
ACE ha sido compilado en multitud de sis-
temas operativos con lo cual su correcto
uso nos permitirá migrar sin mayores pro-
blemas, actuando como una capa inter-
media entre el sistema operativo y nues-
tro código.
Para trabajar con ACE necesitaremos
descargar de Internet la librería y si bien
existen algunas versiones precompiladas
veremos cómo hacer para descargar las
fuentes y realizar la compilación a partir
de ellas. En la página http://deuce.doc.
wustl.edu/Download.html encontrare-
mos enlaces para descargar los fuentes
de ACE. De este sitio descargaremos
“ACE-5.4.zip” o “ACE-5.4.tar.gz” según
nos resulte más cómodo. Es importante
descargar una versión release final y no
una versión beta. Para facilitar al lector
el acceso a este material, se han incluido
en el CD-ROM ambos archivos.
 Figura 4. Página de descarga de ACE.

SOLO PROGRAMADORES nº 122 60 http://digital.revistasprofesionales.com


DISEÑO
Diseño multiplataforma para aplicaciones C++ (I)

que todas las plataformas soportan LISTADO 1 main.cpp


una funcionalidad dada, se compila el
//main.cpp
código perteneciente a una u otra. Si #include <ace/config.h>
hay alguna plataforma en particular #include <ace/OS.h>
que no tiene alguna funcionalidad #include <string>
específica se intenta emular por códi- int main(int argc, char* argv[])
go propio de ACE siempre que sea {
posible. return 0;
 Permitir compilar con la funcionali- }
dad mínima necesaria. Supongamos
una plataforma que no soporte thre- estáticas de depuración multi-hilo para rio “ACE_ROOT” en la lista de direc-
ads. Si ACE, que implementa threads, la configuración “Debug” y librerías torios de búsqueda de inclusión
se intenta compilar con los threads estáticas mult-hilo para la configura- (include).
activos la compilación fallaría por no ción “Release”. Si por error selecciona-  En “C++” -> “Cabeceras precompila-
estar soportados por la plataforma. mos las librerías dinámicas (DLL) en esta das”, no usar cabeceras precompiladas.
Si alguien desea crear una aplicación opción, obtendremos errores bastante  En “C/C++” -> “Generación de códi-
que no requiere threads se vería extraños a la hora de compilar nuestras go”, cambiar las librería de un sólo
impedido de hacerlo a causa de que aplicaciones que utilicen ACE. hilo de ejecución por las librerías
su plataforma no soporta una fun- Hacer clic en “Aceptar”, activar la configura- multi-hilo.
cionalidad que él ni siquiera necesita. ción “Debug” de la solución y presionar F7  En la opción “Vinculador” ->
Esto es demasiado restrictivo y por para compilar ACE. Si todo va bien, esto “Entrada”, añadir la ruta completa del
eso ACE permite activar y desactivar dejará como resultado el fichero “ACE.lib” en fichero “ACE.lib” como dependencia
opciones de compilación de manera el directorio “ACE_ROOT\lib”. adicional.
que se pueda compilar en una plata- Es posible que al compilar la solución  En “C/C++” -> “Pre procesador”, aña-
forma que soporte las capacidades completa los resultados sean tener un dir la definición del preprocesador
mínimas requeridas por cada aplica- proyecto (ACE) compilado con éxito y “ACE_AS_STATIC_LIB”.
ción. otros dos (RMCast y TMCast) que generan Es importante que todos los cambios en las
 Optimizar el código para obtener la un mensaje de error. El proyecto de ACE propiedades del proyecto se hagan tanto en
máxima eficiencia posible. para Visual Studio incluye estas dos libre- la configuración de Debug como en la de
rías adicionales que dependen de ACE y Release. Ya tenemos listo el esqueleto que
Compilar ACE con Visual C++ que no usaremos. Sus proyectos están utilizaremos como punto de partida para
Descargar el fichero “ACE-5.4.zip” y extraer su configurados de manera predeterminada todas nuestras aplicaciones por lo cual es
contenido en un directorio de nuestro disco. para que su configuración Debug intente conveniente hacer una copia de resguardo
Dentro de este directorio se creará automáti- compilar con la versión Debug de ACE en antes de seguir. A continuación agregare-
camente uno de nombre “ACE_Wrappers” al una librería llamada “ACEd.lib” pero en mos las siguientes líneas al principio del
cual llamaremos “ACE_ROOT” durante el resto algunas distribuciones de ACE, al compilar archivo “main.cpp”:
de la serie. en modo Debug, la librería generada se #include <ace/Dirent_Selector.h>
Para comenzar, en el directorio “ACE_ llama “ACE.lib” en lugar de “ACEd.lib” y de
ACE_Dirent_Selector dir;
ROOT\ace”, crearemos un fichero llamado ahí el error. No es necesario preocuparse
“config.h” que contenga: por esto pues no afecta para nada a nues- Por último ejecutaremos el programa presio-
#define ACE_AS_STATIC_LIBS tras prácticas. nando F5. Si compila y ejecuta sin errores, ya
tenemos enlazada nuestra aplicación con la
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
Usar ACE desde una aplicación con librería ACE.
#include “ace/config-win32.h”  Visual C++
Para crear una aplicación que use la librería Compilar ACE con g++ en Linux
ACE provee archivos de proyecto para ACE ir al menú “Archivo” -> “Nuevo” -> Debemos descargar el archivo “ACE-
  Visual Studio 6.0 y .NET. En “Proyecto”, seleccionar “Proyectos Visual 5.4.tar.gz”, copiarlo en un directorio y a con-
“ACE_ROOT\ace”, abriremos “ace.sln” para C++”, elegir la opción “Proyecto de Consola tinuación ejecutar los siguientes pasos:
compilar con Visual Studio.NET. ACE puede Win 32” (no confundir con aplicación de $tar -xvzf ACE-5.4.tar.gz
compilarse como una librería dinámica o console .NET), entrar el nombre “main” para
$cd ACE_wrappers/
estática y en nuestro caso lo haremos de el proyecto, presionar “Aceptar” y “Finalizar”.
forma estática para que en las aplicaciones Esto nos creará un nuevo esqueleto de pro- $export ACE_ROOT=$PWD
que no sea necesario distribuir la librería grama que modificaremos un poco: $cd ace/
dinámica junto con los ejecutables.  Reemplazaremos todo el contenido del
En Visual Studio, en el menú “Proyecto” -> archivo donde se encuentra definida la $ln -s config-linux.h config.h
“Propiedades”: función “_tmain” por el contenido del $cd $ACE_ROOT/include/makeinclude
 En la sección “General”, en “Tipo de listado 1.
$ln -s platform_linux.GNU platform_
Configuración” elegir “biblioteca estáti-  En la ficha de propiedades del proyecto
ca (.lib)”. y para todas las configuraciones: macros.GNU

 En la sección “C/C++” -> “Generación  En la entrada “C/C++” -> “General”, $cd $ACE_ROOT/ace
de Código”, seleccionar las librerías añadir la ruta completa del directo- $make debug=0 static_libs_only=1

http://digital.revistasprofesionales.com 61 SOLO PROGRAMADORES nº 122


DISEÑO

Definiciones de tipos de datos


tamente los tipos de datos en cuanto a su
ACE_INT16, ACE_UINT16 Enteros de 16 bits, con y sin signo. longitud sino en cuanto a qué es lo que
pueden contener. ACE define un conjunto
ACE_INT32, ACE_UINT32 Enteros de 32 bits, con y sin signo. de macros que representan tipos de datos
de manera portable y otros que permiten
Entero de 64 bits sin signo. Puede emularlo aún obtener información de la plataforma
ACE_UINT64
en plataformas de 32 bits. actual. En el cuadro “Definiciones de tipos
de datos” podemos ver una lista de éstas
ACE_SIZEOF_CHAR Longitud en bytes de un char. definiciones y una explicación de cada
una de ellas.
ACE_SIZEOF_SHORT Longitud en bytes de un short.

ACE_SIZEOF_INT Longitud en bytes de un int. Incompatibilidades del sistema


ACE_SIZEOF_LONG Longitud en bytes de un long.
operativo
ACE provee un conjunto de clases llamadas
ACE_SIZEOF_LONG_LONG Longitud en bytes de un long long int. Wrapper Façades cuya función consiste en
proveer un abstracción genérica sobre el
ACE_SIZEOF_VOID_P Longitud en bytes de un puntero. sistema operativo. Para ello provee clases
que encapsulan todos los aspectos que
ACE_SIZEOF_FLOAT Longitud en bytes de un float. cambian de un sistema operativo a otro
que hemos enumerado al comienzo de este
ACE_SIZEOF_DOUBLE Longitud en bytes de un double. artículo.
ACE_SIZEOF_LONG_DOUBLE Longitud en bytes de un long double. Conexiones de red TCP/IP
Una conexión de red TCP/IP se crea desde
Ordenamiento de los bytes en la plataforma: un programa por medio de la creación de
ACE_BYTE_ORDER
ACE_BIG_ENDIAN o ACE_LITTLE_ENDIAN. elementos llamados sockets. Un socket
es como un descriptor de archivo pero
que permite transferir datos por una red
Al final del proceso se habrá creado la libre- Para compilar y crear el ejecutable de la TCP/IP como Internet. La lógica sobre
ría estática “libACE.a” en “ACE_ROOT/ace”. aplicación de prueba haremos lo siguiente: cómo crear y utilizar un socket no varía
$g++ -I$ACE_ROOT -c main.cpp entre sistemas operativos pero si los
Usar ACE desde una aplicación con g++ nombres de las funciones específicas
$g++ -o prueba *.o -L$ACE_ROOT/ace -l ACE
en Linux para hacerlo. Para demostrar el uso de
Como primer paso, crearemos el archivo Si no obtenemos ningún mensaje de error, las conexiones por socket con ACE crea-
“main.cpp” con el contenido del listado 1. En estos comandos dan como resultado el remos un servidor echo (reenvía al clien-
este punto haremos una copia de resguardo archivo ejecutable “prueba” que está enla- te todo lo que recibe) y un cliente que lo
de “main.cpp” que luego usaremos como zado estáticamente con la librería ACE. utilice.
punto de partida para cada una de las prác- Sin embargo antes, estúdiese el listado 2. En
ticas de esta serie. A continuación agregare- Incompatibilidad entre plataformas él, se muestra cómo abrir un socket cliente
mos las siguientes líneas a “main.cpp”: El punto de incompatibilidad más impor- tanto en Unix (arriba) como en Windows
#include <ace/Dirent_Selector.h> tante a nivel de hardware es el de los (abajo).
tamaños de los tipos de datos. Esto es Dicho código simplemente muestra la
ACE_Dirent_Selector dir;
porque el estándar C++ no define estric- manera de establecer una conexión por
sockets en Unix y en Windows, pero no
hace uso de la conexión y tampoco hace
LISTADO 2 Sockets en Unix y en Windows
ningún control de errores. Como puede
//VERSIÓN UNIX verse en el listado 2, el código es bastante
struct sockaddr_in srvr; diferente.
memset (&srvr, 0, sizeof(srvr));
srvr.sin_family = AF_INET;
La solución para crear una aplicación
srvr.sin_addr.s_addr = inet_addr (“127.0.0.1”); que pueda compilarse en Linux y
srvr.sin_port = htons (80); Windows podría ser en este caso usar
fd = socket (AF_INET, SOCK_STREAM, 0); compilación condicional para incluir en
connect (fd,(struct sockaddr *)&srvr,sizeof(srvr));
el ejecutable el código correspondiente a
//VERSIÓN WINDOWS cada plataforma pero esta solución se
nRet = WSAStartup(wVersionRequested, &wsaData); hace más complicada a medida que el
SOCKET sock;
struct sockaddr_in saDest;
tamaño de la aplicación y los sistemas
saDest.sin_addr.s_addr = “127.0.0.1”; operativos a soportar aumentan. Una
saDest.sin_family = AF_INET; mejor solución es utilizar ACE y escribir
saDest.sin_port = 80; código portable sólo una vez con el
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_ICMP);

SOLO PROGRAMADORES nº 122 62 http://digital.revistasprofesionales.com


DISEÑO
Diseño multiplataforma para aplicaciones C++ (I)

LISTADO 3 Cliente echo usando sockets bloquea la ejecución hasta que llega una
petición de conexión de un cliente. En
#include <ace/config.h>
#include <ace/OS.h>
ese momento la función “accept()”
#include <ace/INET_Addr.h> devuelve el control y se procesa la peti-
#include <ace/SOCK_Stream.h> ción. Al igual que en el cliente, se usa un
#include “ace/SOCK_Connector.h” objeto de clase “ACE_SOCK_Stream” para
#include <iostream>
#include <string> leer y escribir en el socket. Todo el códi-
go de gestión de peticiones se encuentra
int main(int argc, char* argv[]) { dentro de un while para que continúe
if (argc<=1) {
std::cout << “Uso: main mensaje” << std::endl; esperando más peticiones una vez que
return -1; termina con una. En un caso real un ser-
} vidor de sockets crea un nuevo thread
ACE_INET_Addr srvr (7, ACE_LOCALHOST); para gestionar cada petición y el proce-
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer; samiento de cada una procede de mane-
if (-1 == connector.connect (peer, srvr)){ ra independiente pero para mantener el
std::cout << “Error al conectar al servidor” << std::endl; código simple, este ejemplo usa un sólo
return -1;
} thread.
peer.send_n(argv[1], sizeof(argv[1]));
char buf[1000];
int bc = peer.recv (buf, sizeof(buf));
std::cout << std::string(buf,bc) << std::endl; Conclusiones
peer.close ();
return 0; En esta primera entrega hemos hecho una
} presentación de la librería ACE y aprendido
a incluirla en nuestros programas. También
agregado de que además es mucho más podemos ver la implementación completa pudimos apreciar la potencia de sus clases
fácil de programar. El código ACE equi- del código del servidor echo. a la hora de simplificar la creación de soc-
valente a los ejemplos anteriores es el Se crea un objeto de tipo kets. En las próximas entregas veremos la
siguiente: “ACE_SOCK_Acceptor” al cual le indica- manera de realizar tareas como acceder al
ACE_INET_Addr srvr (80, ACE_LOCALHOST); remos el puerto donde debe escuchar y sistema de archivos o crear aplicaciones
llamaremos al método “accept()”, que multi-thread.
ACE_SOCK_Connector connector;

ACE_SOCK_Stream peer;
LISTADO 4 Servidor echo usando sockets
connector.connect(peer, srvr);
#include <ace/config.h>
Este código puede compilarse sin pro- #include <ace/OS.h>
blemas en cualquier plataforma en la #include <ace/INET_Addr.h>
que ACE esté disponible y como vemos #include <ace/SOCK_Stream.h>
#include <ace/SOCK_Acceptor.h>
es mucho más simple. En el listado 3 #include <iostream>
podemos ver todo el código necesario #include <string>
para implementar el cliente echo con
int main(int argc, char* argv[])
ACE. Las conexiones por sockets en ACE {
se efectúan utilizando un patrón ACE_INET_Addr port_to_listen(7);
Connector/Acceptor en el cual el accep- ACE_SOCK_Acceptor acceptor;
if (acceptor.open (port_to_listen, 1) == -1) {
tor espera peticiones y el connector las std::cout <<
inicia. El objeto connector de clase “Error al crear el socket server” << std::endl;
“ACE_SOCK_Connector” encapsula un return -1;
socket cliente y el objeto “peer” de clase }
ACE_SOCK_Stream peer;
“ACE_SOCK_Stream” representa el canal ACE_INET_Addr peer_addr;
de datos que éste abre hacia el otro while (true) {
extremo de la conexión a través del cual if (acceptor.accept (peer, &peer_addr) == -1) {
std::cout << “Error al aceptar una conexión” << std::endl;
es posible tanto leer como escribir. La return -1;
función miembro “send_n()” se bloquea }
hasta que consigue enviar la cantidad de else {
bytes indicada como segundo paráme- char buffer[4096];
ssize_t bytes_received;
tro. A continuación, la función “recv()” while ((bytes_received = peer.recv(buffer, sizeof(buffer))) > 0){
lee los datos disponibles en el buffer. std::cout << std::string(buffer,bytes_received) << std::endl;
También hay funciones que permiten peer.send_n (buffer, bytes_received);
}
bloquear o especificar un tiempo límite peer.close ();
de espera para leer datos. }
Una vez que tenemos listo el cliente creare- }
return (0);
mos el código del servidor. En el listado 4 }

http://digital.revistasprofesionales.com 63 SOLO PROGRAMADORES nº 122


DUDAS

Preguntas y respuestas
ADOLFO ALADRO GARCÍA
LISTADO 1 Empezando a trabajar con XML/XSLT
Estoy trabajando con XML/XSLT en el var oXSLTemplate, oFreeThreadedDOMDocument, oXSLProcessor, oXMLHttpRequest;
navegador. Hasta el momento todas las var oXMLSerializer, oDOMDocumentOutput, oDOMParser;
páginas que he desarrollado están pensa- function InitXMLEngine()
das para Internet Explorer pero me gus- {
taría que también pudieran verse correc- try {
if (ns6) {
tamente en Firefox. ¿Existe alguna forma oXMLHttpRequest = new XMLHttpRequest();
de hacer que sean compatibles? oXSLProcessor = new XSLTProcessor();
oXMLSerializer = new XMLSerializer();
oDOMParser = new DOMParser();
Existen algunas diferencias notables entre } else {
los motores de XML/XSLT de IE y Firefox oDOMDocumentData = new ActiveXObject("MSXML2.DOMDocument");
oXSLTemplate = new ActiveXObject("MSXML2.XSLTemplate");
pero sí que se pueden crear páginas com- oDOMDocumentStylesheet = new
patibles de forma que el comportamiento ActiveXObject("MSXML2.FreeThreadedDOMDocument");
oXMLHttpRequest = new ActiveXObject("MSXML2.XMLHTTP");
en ambos navegadores sea prácticamente }
el mismo, si bien es necesario complicar un } catch (e) {
poco el código Javascript. alert("InitXMLEngine error: " + e.description);
}
En primer lugar se requiere un método para }
diferenciar entre un navegador y el otro. Hay
muchísimas formas de llevar a cabo esta tarea.
LISTADO 2 Cargando los datos XML
En Internet se pueden encontrar numerosos
ejemplos, algunos muy diferentes entre sí. Uno function LoadData()
{
de los más sencillos es el que se presenta a try {
continuación, y que se fundamenta en la dife- if (ns6) {
renciación de los objetos que soporta el nave- oXMLHttpRequest.open("GET", "source.xml", false);
oXMLHttpRequest.send(null);
gador en el que está mostrándose la página: oDOMDocumentData = oXMLHttpRequest.responseXML;
var ns6 = !document.all && document. } else {
oDOMDocumentData.async = false;
getElementById; oDOMDocumentData.preserveWhiteSpace = false;
oDOMDocumentData.load("source.xml");
var ie5 = document.all && !document.
oDOMDocumentData.documentElement.normalize();
fireEvent && !window.opera; }
} catch (e) {
var ie55= document.all && document.
alert("LoadData error: " + e.description);
fireEvent && !document.createComment; }
}
var ie6 = document.all && document.
fireEvent && document.createComment; Una vez establecidas las variables globales que “XSLTProcessor”, se emplea para las transforma-
Las expresiones anteriores evalúan la existen- permiten diferenciar entre navegadores se ciones con XSLT. El objeto “XMLSerializer” permite
cia de objetos y funciones como por ejemplo puede empezar a desarrollar el resto del códi- convertir un documento XML en una cadena de
“document.all” y “document.getElementById” go. La función “InitXMLEngine” es la responsa- texto. Finalmente, “DOMParser” se emplea para
para determinar el navegador que se está uti- ble de inicializar los objetos que se emplean hacer justo lo contrario del objeto anterior, es decir,
lizando. para trabajar con XML/XSLT (véase el listado 1). para obtener un documento XML a partir de una
Cabe señalar que este método no es perfec- Si el navegador es Firefox se crean los objetos cadena de texto.
to. Todo depende de la audiencia, es decir, si “XMLHttpRequest”, “XSLTProcessor”, “XMLSeriali- En el caso de que el navegador sea IE los obje-
ésta es muy variada probablemente el zer” y “DOMParser”, utilizando directamente los tos se llaman y obtienen de forma diferente
script deba complicarse para detectar más constructores del mismo nombre. El primero sirve aunque básicamente sirven para las mismas
casos (otros navegadores, otras pequeñas para realizar llamadas HTTP (también puede tareas que se han descrito anteriormente.
diferencias entre versiones, etc.) pero para emplearse para leer ficheros XML/XSLT locales, La siguiente función se denomina “LoadData”
la mayor parte de los casos el código ante- aunque no sea estrictamente una llamada HTTP), y como su propio nombre indica se usará para
rior es más que suficiente. obteniendo así un documento XML. El segundo, cargar los datos XML (véase el listado 2).

SOLO PROGRAMADORES nº 122 64 http://digital.revistasprofesionales.com


NÚMEROS ANTERIORES
121 - Enero 2005 120 - Diciembre 2004
Las interfaces del futuro con Introducción a la programación
XAML, finalizamos nuestro de juegos con J2ME, aplicaciones
videojuego con J2ME, integra- web con Python, herramientas
ción de Python con Java, XML Open Source para J2EE, persis-
e IA, XQuery, Sistemas de tencia con Hibernate, creación
Gestión de Contenidos, XSL-FO de servicios web con Java, diseño
avanzado y la quinta entrega de interfaces Swing, profundiza-
del coleccionable ASP.NET. mos en XSL-FO y la cuarta entre-
2 CD-ROMs incluidos. ga del coleccionable ASP.NET.
1 CD-ROM incluido.

119 - Noviembre 2004 118 - Octubre 2004


Persistencia de datos en J2ME, Programación sobre Pocket PC y
aplicaciones de escritorio sobre Tablet PC, introducción a
.NET, programación gráfica con Python, creación de un servidor
Python, Firebird sometido a aná- de mensajería instantánea, pro-
lisis, optimización de servicios gramación de servicios web en
web en .NET, diseño de interfaces .NET, patrones J2EE, diseño de
Swing, conversión de XML a PDF interfaces Swing y la segunda
con XSL-FO y la tercera entrega entrega del coleccionable
del coleccionable ASP.NET. ASP.NET.
1 CD-ROM incluido. 1 CD-ROM incluido.

117 - Septiembre 2004


.NET para programadores C++, Si te falta algún número de la
el modelo transaccional de los
temporada 04/05, ahora tienes
EJB, creación de un cliente de
mensajería instantánea, consu- la oportunidad de conseguirlo
mo de servicios web desde .NET,
patrones J2EE, diseño de inter-
Precio Oferta descuento
Precio por ejemplar: 6€
faces Swing y la primera entre-
ga del coleccionable ASP.NET. 1 a 10 = 10% dto. / 11 a 20 = 20% dto.
1 CD-ROM incluido. 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 VISA _ _ _ _/ _ _ _ _/ _ _ _ _/ _ _ _ _/ Fecha de caducidad:
Extranjero: Gastos de envio 5€ por paquete. Unica forma de pago tarjeta VISA.

También podría gustarte