122
122
122
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
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
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
BEA SYSTEMS
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.
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-
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.
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 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
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 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 el autor
Abraham Otero (abraham.otero@javahispano.org) es responsable de calidad y miembro de la junta de javaHispano.
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).
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.
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.
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.
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
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
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
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.
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.
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.
<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>
<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.
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
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-
{ return nombre; }
{ this.nombre = string; }
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.
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;
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.
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.
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-
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
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-
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
{ ... }
throws IOException
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();
} ...
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
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í.
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
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 }
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).
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.