miércoles, 23 de diciembre de 2009

Creando un servicio web a partir de su interfaz WSDL

Fte: http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=WSDL2Java

En este tutorial se resalta la importancia de definir la interfaz de un servicio web antes de implementarlo, y cómo hacer todo esto con Eclipse y Apache Axis v1.

Por Javier Cámara (jcamara@softwareag.es)
Arquitecto de software en el BCS Competence Center de Software AG España.

Introducción

Una de las tareas más importantes a la hora de crear una SOA es definir su modelo de servicios: o sea, qué servicios hay y qué tareas en concreto hace cada uno. Esto aclara mucho las tareas a realizar por el sistema y qué elemento del mismo las llevará a cabo, y permite validar que esos elementos implementarán las necesidades del usuario, previamente definidas. Lo cual en cualquier sistema es siempre el grueso del diseño arquitectónico del mismo. Por ello, de la bondad de este resultado depende en gran parte el éxito de la SOA.

Más tarde o más temprano, en una SOA basada en servicios web este modelo se plasmará en documentos WSDL que definan en detalle las interfaces de cada servicio: operaciones, datos recibidos, datos devueltos y errores que pueden ocurrir. Estos WSDLs son casi imprescindibles a la hora de crear los clientes de un servicio, pues facilitan enormemente la tarea de invocarlo y gestionarlo.

La mayoría de las herramientas de creación de servicios web, como Apache Axis o Visual Studio .Net, facilitan que primero se implemente el servicio (o un esqueleto del mismo), por ejemplo en Java, y a partir de él se genere automáticamente el WSDL. Pero lo cierto es que esta forma de trabajar que promueven estas herramientas es incorrecta por varias razones. Para empezar, lo normal es crear la interfaz de algo antes de implementarlo, lo que permite crear los clientes y los servidores en paralelo. Pero sobre todo es que si creamos el WSDL a partir del código, tenemos bastantes posibilidades de que los detalles de este WSDL dependan de la herramienta que hemos usado para generarlo. Por tanto, si luego queremos que ese servicio sea implementado usando una herramienta diferente, o incluso por una versión superior de esa misma herramienta, puede que ese WSDL cambie, con lo cual tendríamos que cambiar los clientes de ese servicio. Por ello, lo apropiado es que la herramienta se adapte al WSDL, y no al revés.

Estos posibles problemas no son imaginaciones, y ha habido proyectos en Software AG que han tenido problemas por esto, por ejemplo para llamar a servicios creados con Axis desde el Sun Java Web Services Developer Pack (JWSDP). Los WSDLs generados por Axis pueden contener referencias a tipos de Java (que no funcionan en .Net), o a construcciones propias de Axis (que no funcionan en otros clientes de servicios web Java), o incluso cuya sintaxis no sigue siquiera el estándar WSDL. Eso sí, un cliente Axis no tiene problemas para conectarse a un servicio web Axis. Pero para conseguir eso no necesitábamos todas estas complejidades; el beneficio clave de los servicios web es la interoperabilidad, que se fundamenta en la independencia de las plataformas.

Por todo eso, lo aconsejable es crear el WSDL antes del código, y no al revés. De esta forma el modelo de los servicios de nuestra SOA no dependerá de las herramientas con las que se implemente, sino al revés, y los clientes de los servicios pueden conectarse a ellos independientemente de si está implementado con Axis, con JWSDP, con .Net o con cualquier otra herramienta. Y eso es lo que vamos a ver en este tutorial, usando Apache Axis, claro, que para eso es el más popular. Como todos los entornos de servicios web, Axis trae una herramienta para crear esqueletos de servicios a partir de WSDL, tanto para los clientes como para los servicios, llamada WSDL2Java. No es la herramienta definitiva: el código que genera a veces no compila, y cuando compila puede no cumplir la interfaz definida por el WSDL. Pero bueno, en muchos casos sí funciona bien, y en cualquier caso cuando no lo hace nos da una aproximación al resultado que podemos luego completar.

En este tutorial vamos a usar todo el rato Java, así que si tu PC no lo tiene, tendrás que instalarte el Developer Kit de Java Standard Edition descargándotelo desde http://java.sun.com/javase/downloads/.

El resto del tutorial contiene las siguientes secciones:

Diseñando nuestra interfaz
Diseñando el WSDL en Eclipse
Generando el esqueleto de nuestro servicio
Disgresiones adicionales
Diseñando nuestra interfaz

Como hemos dicho, antes que ponernos a implementarlo primero hay que pensar cuál será la interfaz de nuestro servicio. En nuestro caso vamos a crear un servicio que podría ser usado por un banco y que informaría de las sucursales del mismo que están próximas a un código postal. Por ello, tendría una interfaz como esta:

Entrada: código postal (ej. "28760"), o parte del mismo (ej. "28" o "760")
Salida: lista de sucursales cuyo código postal contiene al menos parte del recibido, posiblemente vacía. A su vez, para cada sucursal se informará de lo siguiente:
Código de la sucursal
Dirección
Código postal
Ahora tenemos que plasmar eso en WSDL. WSDL es un lenguaje XML y se puede escribir a mano, pero es más complicado de lo que uno se imaginaría y no es lo más divertido o sencillo de escribir, así que lo normal es usar una herramienta. Hay una bastante buena para ello, el XML Spy, pero la versión gratuita del mismo no permite crear WSDLs; así que usaremos otra gratuita que se puede usar en Eclipse.

Diseñando el WSDL en Eclipse

Para esto vamos a tener que hacer las siguientes cosas que se describen a continuación:

Instalar Eclipse
Instalar Tomcat
Creación de un proyecto web dinámico
El portType de WSDL
El XML Schema de nuestros mensajes
El binding de WSDL
El servicio en WSDL
Instalar Eclipse

Para poder manejar WSDLs en Eclipse vamos a usar el Web Tools Project. En este tutorial utilizaremos la versión 1.5 de Junio de 2006, que precisa de Eclipse 3.2. Si tienes Eclipse 3.2 puedes instalarte los numerosos plugins que las webtools contienen y necesitan, pero aquí vamos a tirar por el camino fácil: vamos a descargar una versión preconfigurada de Eclipse 3.2 con todo lo necesario para el WTP, o sea el archivo wtp-all-in-one-sdk-R-1.5.0-200606281455-win32.zip, que ocupa 182Mb.

Una vez descomprimido ese ZIP en un directorio de nuestra elección, ejecutamos el eclipse.exe que contiene y, después de un ratito, ya tendremos el Eclipse arrancado.

Si tu PC necesita de un proxy para salir a Internet, te aconsejo que configures el Eclipse para que lo use, pues debido al uso de XML Schema externos, a veces se intentará conectar al exterior para recuperar esos esquemas (ej. debido al web.xml a veces intentará recuperar http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd). Si estamos detrás de un proxy, no podrá hacerlo y tardará un rato, retardando nuestro trabajo. Aquí no se cuenta cómo se hace, pero está en las preferencias de Eclipse y es sencillo.

Instalar Tomcat

Para evitarnos problemas futuros como que Eclipse nos cree un proyecto web que luego dice que no se puede desplegar porque no está soportado por el servidor, o que no podamos cambiar cuál es el servidor de un proyecto debido a errores esotéricos, lo mejor será que definamos cuanto antes en Eclipse el servidor de aplicaciones que vamos a usar. Como de costumbre, en este tutorial utilizaremos Apache Tomcat, que es gratis y conveniente. Para instalarlo en Eclipse:

Descarga Tomcat desde http://tomcat.apache.org/ e instálalo (aquí no contamos cómo se hace, pero es fácil)
Una vez instalado, defínelo en Eclipse así:




Para nuestro tutorial esto ya vale, pero si queremos que ese Tomcat pueda ejecutar JSPs, debe tener acceso no sólo a un JRE sino a un JDK. Si ese es tu caso, además de ésto primero tienes que tener instalado un JDK, luego lo defines en Eclipse desde ese botón de "Installed JREs", y lo asocias a Tomcat.

Por cierto, un comentario relevante respecto a este Tomcat: las aplicaciones web que ejecutes con él desde dentro de Eclipse no serán las que estén en el directorio webapps del propio Tomcat, sino que Eclipse utiliza su propio directorio de despliegue y fichero de configuración de servidor. Este fichero de configuración lo puedes ver y editar en la ventana de layout del Eclipse, y ese directorio de despliegue está en tu (Eclipse workspace)\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps .

Creación de un proyecto web dinámico

Lo siguiente que haremos será crear un nuevo Proyecto web, diciéndole que lo despliegue en ese servidor que hemos creado:



Lo llamaremos sucursales:


Nos preguntará si queremos cambiar a la perspectiva J2EE. En este tutorial no se ha hecho así, pero yo creo que da igual.

Una vez creado el proyecto, crearemos un nuevo archivo WSDL dentro de él. Intentaremos explicar la menor cantidad posible de conceptos de WSDL, pues la versión 1 de este estándar tiene un modelo innecesariamente complejo (ya ha salido la versión 2, pero aún no la soporta casi nadie, y he leído alguna crítica demoledora).

Hay diversas variantes para definir nuestro servicio, pero nosotros no vamos a entrar en ellas y nos quedaremos directamente con la variante document/literal, que es la que ofrece mayor interoperabilidad. Aunque no entremos en detalles, quiero señalar que otra opción llamada "RPC/literal", al contrario de lo que mucha gente piensa, es igualmente válida y estándar en lo referente a interoperabilidad, y más sencilla en muchos casos. Pero lo cierto es que document/literal es la que se está popularizando más.

El wizard de las web tools ofrece bastantes ayudas para editar el WSDL y nos creará ya un esqueleto de para que luego lo adaptemos:



¿Cómo llamar a nuestro servicio? A mí esto de llamar a los servicios "AlgoServicio" me parece tan redundante como llamar a las clases "AlgoClase", así que como nuestro servicio va a manejar datos de sucursales, lo llamaremos Sucursales.wsdl:


Y cambiaremos el Target namespace y su prefijo por algo adaptado a nuestro ejemplo:


Así, el wizard ya nos creará un esqueleto de servicio, con una operación llamada NewOperation:


Y ahora vamos a adaptar ese esqueleto a nuestras necesidades.

El portType de WSDL

"PortType" es un término poco afortunado de WSDL v1 para referirse a una interfaz independiente del medio de transporte: define qué operaciones tiene nuestro servicio y qué recibe y qué devuelve cada una, de forma independiente del mecanismo de comunicación usado (SOAP, HTTP GET, correo-e, etc). Esta aparente flexibilidad de definir una única interfaz abstracta válida para diferentes transportes ha demostrado ser inútil en el mundo real, con lo que es una de las complejidades innecesarias que WSDL v1 incorpora a la vida del desarrollador. Pero es lo que hay.

Esa interfaz abstracta está compuesta de una serie de operaciones, y a su vez cada una de ellas puede tener una entrada y una salida (también declarar errores, pero eso no lo vemos aquí). Esas entrada y salida se define cada una en base a un mensaje. Cualquiera pensaría que un mensaje es simplemente un documento XML, y en nuestro caso de document/literal esto es prácticamente así, pero en otros casos no lo es. Pero bueno, el caso es que nosotros tenemos que definir la estructura XML de esos mensajes de entrada y salida en base a elementos en XML Schema.

En fin, el wizard ya nos ha creado un portType llamado Sucursales, con una operación y elementos XML asociados para su entrada y salida. Inicialmente la operación se llama NewOperation, y pinchando sobre ese nombre podemos cambiarlo por buscaSucursales, que es el que queremos nosotros:


Ahora vamos a definir exactamente el XML que esa operación recibirá y devolverá.

El XML Schema de nuestros mensajes

En WSDL la definición de nuestros mensajes puede estar incrustada dentro del propio WSDL, o ser incluida desde documentos externos. Ésto último suena más apropiado para un entorno de sistemas de información empresariales, pero lo cierto es que más frecuentemente los tipos van definidos dentro del propio WSDL, y algunas herramientas dan problemas si no es así.

Sea como sea, en nuestro caso para definir ese XML debemos abrir el XML schema incrustado en nuestro WSDL, lo que hacemos desde la ventanita de Outline:



Como vemos, el wizard ya nos ha creado esqueletos de las estructuras XML de entrada y salida de nuestra operación (incluso las ha renombrado cuando la hemos renombrado, siguiendo las conveniciones Request y Response), pero ahora tenemos que cambiarlas según nuestras necesidades.

En el esqueleto, el elemento XML que define el XML que recibiremos, buscaSucursalesRequest, es un elemento simple que sólo contiene una string. Eso podría valernos puesto que sólo pediremos un trozo de código postal, pero va a quedar más claro si creamos un elemento con un nombre más indicativo para enviar ese trozo de código postal, como "parteCodPostal" o algo.

Para eso tenemos que hacer que buscaSucursalesRequest sea un elemento complejo que contenga un "parteCodPostal". Esto, que es algo muy frecuente en XML Schema, por alguna razón el editor de XML Schema de Eclipse no nos lo pone fácil. Según él tendríamos que crear un tipo con nombre, en vez de crear sólo un elemento complejo con tipo anónimo, que es el pan nuestro de cada día en XML Schema. Bueno, pues como yo creo que eso es innecesario, recurriremos al código fuente, que tampoco es tan complicado. Pinchamos en la pestaña inferior "Source", y cambiamos un poco la declaración de buscaSucursalesRequest. Donde ponía:


Vamos a poner esto otro:


Si ahora volvemos a la pestaña de "Design", vemos que la declaración buscaSucursalesRequest ha cambiado y el tipo es ahora "**anonymous**" (que es una opción que lamentablemente no teníamos antes). Si pinchamos en buscaSucursalesRequest, veremos su estructura interna:


El "(buscaSucursalesRequestType)" corresponde con ese tipo anónimo. El XML Spy lo muestra mucho más clarito que el Eclipse, pero así es suficiente. Ahora vamos a añadirle el sub-elemento que representará el código postal parcial, parteCodPostal:



Pinchando en el icono volveremos a ver el schema.

Ahora vamos a definir el resultado de nuestra operación, buscaSucursalesResponse. Este elemento debe contener una lista de 0 o más estructuras, cada una con información sobre una de las sucursales encontradas. Así que lo primero vamos a definir cuál es la información que vamos a devolver para cada sucursal, y ésto lo haremos con un nuevo tipo complejo de XML, InfoSucursal, que va a contener una sequence y dentro tres elementos, codSucursal, direccion y codPostal:






Ahora vamos a definir buscaSucursalesResponse. Lo podemos hacer al menos de dos maneras, que resultarían en las dos variantes siguientes de XML que se devolvería:

Opción 1: todas las infoSucursal directamente bajo buscaSucursalesResponse Opción 2: un único elemento sucursales para contener la lista completa


...

...

...





...

...

...



Es una cuestión en parte de gusto, pero yo prefiero la segunda porque admite con más facilidad que haya más cosas junto a las sucursales. Por ejemplo, en un servicio más realista, posiblemente no se devolviesen todas las sucursales, sino sólo las primeras y se permitiría luego recuperar las demás, así que la respuesta podría incluir también un flag diciendo si hay más, y cómo continuar recuperándolas. Y además, como veremos más adelante, WSDL2Java puede dar problemas con la primera opción.

Así pues escogemos la segunda opción. De nuevo, el editor de XML Schema de Eclipse no nos ayuda mucho, así que tiraremos de código fuente para dejar la declaración de buscaSucursalesResponse así:


El visor gráfico del XML Schema no nos muestra mucho, pero confiemos en que esté bien.

Con esto ya hemos definido las estructuras de entrada y de salida, pero aún nos queda un detallito relacionado con los namespaces, que son un mecanismo de XML que a menudo causa problemas pero que en el fondo es útil.

Hasta donde yo sé, en servicios web SOAP lo normal es que todos los elementos de los XML intercambiados tengan un namespace. Por ejemplo,

Elementos con namespace "uri:myns" Elementos con namespace "uri:myns" (exactamente igual que el anterior) Elementos sin namespace

..
..


..
..


..
..

Los dos primeros casos son dos formas diferentes de escribir exactamente lo mismo: elementos cuyo namespace URI es "uri:myns". Sin embargo, el tercero son elementos sin namespace, o sea con namespace URI "", lo cual aunque no lo parezca hace una gran diferencia.

En SOAP 1.2 se requiere que el hijo del Body (o sea, en nuestro caso buscaSucursalesRequest) tenga un namespace, y sobre los hijos de ese primer elemento se recomienda que también lo tengan. Por eso, yo casi siempre he visto que los elementos de los mensajes SOAP llevan namespace. Y nuestro servicio no va a ser menos.

Para conseguir esto, la forma más fácil es especificar en nuestro schema un atributo elementFormDefault="qualified". Pero resulta que el editor de XML Schema de Eclipse tampoco nos deja establecer este atributo, lo que es una carencia incluso más importante que la de los elementos complejos de antes. Pero bueno, recurrimos de nuevo al código fuente y dejamos nuestra declaración como sigue:


Si ahora cerramos y salvamos nuestro "Inline Schema of Sucursales.wsdl" volveremos al WSDL. Como nuestra operación buscaSucursales ya apuntaba a los elementos que hemos definido, no tenemos que hacer nada más para definir su entrada y salida.

El binding de WSDL

Éste es otro término poco afortunado de WSDL 1. Un binding es la particularización de un portType para un transporte particular. O sea, define una interfaz (operaciones, parámetros, etc) para un tipo de transporte particular. En nuestro caso, el portType Sucursales tiene ya asociado un binding SOAP, que podemos ver en el editor de WSDL si pinchamos en el icono correspondiente , o navegando hasta él en la ventana de Outline. El esqueleto ya nos lo ha generado, pero aún así tenemos que cambiar una cosa que Eclipse olvidó adaptar cuando renombramos la operación: el soapAction. Su valor es una cabecera HTTP que se usa en SOAP, y supongo que está pensado para permitir redirigir peticiones sin tener que analizar el XML. No estoy seguro de que sirva de mucho, pero lo apropiado es ponerlo en cualquier caso. De nuevo, incomprensiblemente Eclipse no nos deja editar este valor, pero siempre podemos recurrir al fuente para cambiar el valor incorrecto de http://banquito.com/Sucursales/NewOperation por el correcto de http://banquito.com/Sucursales/buscaSucursales:


El servicio y puerto en WSDL

Igualmente, el esqueleto ya contiene nuestro servicio, llamado Sucursales. Dentro de él podemos ver una cosa llamada "SucursalesSOAP", que es lo que en WSDL se llama port (puerto) y es el punto de entrada que implementa el binding, que a su vez está asociado al portType. O sea, la interfaz definitiva de nuestro servicio. Lo que vamos a cambiar ahí es la dirección, poniendo la que luego usará Axis, o sea http://localhost:8081/sucursales/services/SucursalesSOAP:


Ya que Axis por omisión pone en el URL el nombre del puerto ("SucursalesSOAP"), decisión que a mí no me parece adecuada en absoluto, pero bueno. Se puede cambiar, siempre que te acuerdes de hacerlo cada vez que generas el servicio web.

Esto de cablear las direcciones en el WSDL es una de las peores cosas de los servicios web y que más problemas trae luego, pues gracias a la ocultación que hacen las herramientas luego quedan guardados en sitios inverosímiles y escondidos que cuesta encontrar y cambiar (porque obviamente "localhost:8081" no es normalmente una dirección válida para un servicio de producción). Pero ésto no vamos a comentarlo aquí porque podría dar para varios tutoriales más.

Vale la pena mencionar la importante característica de WSDL de que un servicio puede implementar varios puertos. Esto es, el mismo servicio puede implementar a la vez diferentes interfaces (o lo que es lo mismo, diferentes versiones de la misma interfaz), en direcciones distintas (o iguales, dependiendo de lo listo que sea el servicio).

Generando el esqueleto de nuestro servicio

Una vez tenemos un WSDL, ya podríamos crear el cliente del servicio en cualquier plataforma, pero nosotros lo que vamos a crear es el servidor. Esto lo podemos hacer fuera de Eclipse invocando manualmente a la utilidad WSDL2Java de Axis, pero ya que estamos en Eclipse lo haremos con la opción de crear un nuevo servicio web, que por debajo llama a esa utilidad:




Si al elegir el New teníamos seleccionado el WSDL, por omisión nos sale como Web service type = Top down Java bean Web Service, que es justo lo que queremos: crear el Java a partir desde WSDL. El otro tipo (Bottom up Java bean Web service) corresponde a crear el WSDL a partir de Java, que es justo lo que Eclipse y Axis promocionan pero que yo (y más gente, eh) pensamos que es incorrecto. Una vez seleccionado el tipo Top down Java bean Web Service, si en Service definition no tenemos nuestro WSDL, deberemos seleccionarlo.

Por omisión, el selector vertical de la izquierda está marcado hasta "Start service". Podemos dejarlo ahí, o con "Install service", da igual. Luego le vamos dando a Next (o directamente a Finish, si preferimos) y después de esperar un ratito, y si todo va bien (copiar el runtime de Axis, crear el Java, arrancar Tomcat y desplegar el servicio), pues al final tendremos el Tomcat funcionando y el esqueleto del servicio generado:


El fichero SucursalesSOAPImpl es justo el que implementa las operaciones del servicio web, así que vamos a editarlo y ponerle una implementación sencilla:

/**
* SucursalesSOAPImpl.java
*
* This file was auto-generated from WSDL
* by the Apache Axis 1.3 Oct 05, 2005 (05:23:37 EDT) WSDL2Java emitter.
*/

package com.banquito.Sucursales;

import java.util.List;
import java.util.ArrayList;

public class SucursalesSOAPImpl implements com.banquito.Sucursales.Sucursales_PortType{
protected static List Sucursales=new ArrayList();
static {
Sucursales.add(new InfoSucursal("6565","Av. Colmenar, 13", "28760"));
Sucursales.add(new InfoSucursal("34734","Pº Castellana, 145", "28034"));
Sucursales.add(new InfoSucursal("9832","C/ Mayor, 12", "19001"));
}

public com.banquito.Sucursales.BuscaSucursalesResponse buscaSucursales
(com.banquito.Sucursales.BuscaSucursalesRequest buscaSucursalesRequest)
throws java.rmi.RemoteException {

List results=new ArrayList();
String parteCodPostal=buscaSucursalesRequest.getParteCodPostal();
for (InfoSucursal suc:Sucursales)
if (parteCodPostal==null || suc.getCodPostal().indexOf(parteCodPostal)>=0)
results.add(suc);
InfoSucursal[] resultsA=new InfoSucursal[results.size()];
results.toArray(resultsA);
BuscaSucursalesResponse resp=new BuscaSucursalesResponse(resultsA);

return resp;
}

}
Cuando salvemos el fuente, si todo está bien Eclipse se ocupará de reiniciar lo que haga falta para que funcione, así que con eso ya debería estar nuestro servicio. Asegúrate de que Tomcat está arrancado (Status: started), y vamos a probar el servicio con una utilidad de Eclipse que sirve para invocar a cualquier servicio web:





Parece que ha funcionado. También podemos ver el XML intercambiado con nuestro servicio, pinchando en el enlace Source:


Ahora podríamos probar con otros clientes de servicios web, que a partir del WSDL podrían acceder a nuestro servicio. Pero no conozco ningún otro cliente que sea gratis y relevante, así que esto lo vamos a dejar para otro tutorial en el que crearemos una aplicación AJAX que permitirá acceder a nuestro servicio de sucursales. Además, en otro tutorial se muestra cómo utilizar el producto AmberPoint Express para monitorizar la actividad de nuestro servicio web.

Disgresiones adicionales

¿Para qué tengo que ocuparme de todos estos malditos detalles del WSDL y el XML Schema, si Axis lo puede hacer por mí?

Como ya he dicho, en mi empresa hay ejemplos de problemas de interoperabilidad entre herramientas por no preocuparse del WSDL. En mi opinión, la creación de servicios de esa forma "bottom up" debería estar prohibida, excepto para casos muy concretos, pues esta aproximación causa problemas reales de interoperabilidad, o sea se carga el argumento mismo para usar servicios web. Imagino que las sucesivas versiones de Axis irán mejorando el asunto, pero aún así yo considero que el diseño del modelo de servicios de una SOA es una pieza de la misma demasiado importante como para arriesgarse a que quede limitado por las manías o defectos de una herramienta, y así dificultar su futura evolución fuera de esa herramienta.

Y demonios, no es tan difícil. La SOA es el concepto más importante en la informática de estos tiempos (no, no es sólo marketing), así que aprender a usar unas herramientas, en vez de usar sólo Java no parece fuera de lugar. Y además, seamos realistas: siempre hay problemas, y cuando ocurren a menudo las herramientas te dejan tirado y es muy útil conocer cosas tan vitales como estas.

¿Y qué hay de malo en el WSDL2Java?

Bueno, el WSDL2Java de Axis 1 tiene al menos dos problemas que yo conozca:

Por omisión no maneja correctamente los elementos XML repetitivos (arrays)
No maneja bien los tipos simples que extienden xs:string, ej. para poner strings con atributos
Las dos son problemáticas, pero la primera además contribuye a no respetar el modo de trabajo que Eclipse llama "Top-down", o sea hacer primero los WSDLs y luego el Java. Vamos a ilustrar esto.

Si creamos el XML Schema con la segunda opción para definir buscaSucursalesResponse que hemos comentado antes, podemos ver alguno de esos problemas. Por ejemplo, crea un nuevo proyecto web "sucursales2", copia en él Sucursales.wsdl y luego cambia la definición de buscaSucursalesResponse así:


Que en el diseño visual se ve así:


También debemos cambiar el URL de nuestro servicio en el WSDL para reflejar el nuevo proyecto, http://localhost:8081/sucursales2/services/SucursalesSOAP.

Si generamos un nuevo servicio web "Top down" a partir de eso, veremos que el esqueleto de nuestro servicio se creará diferente. En vez de que el método devuelva una estructura, como antes:

public com.banquito.Sucursales.BuscaSucursalesResponse buscaSucursales
(com.banquito.Sucursales.BuscaSucursalesRequest buscaSucursalesRequest)
throws java.rmi.RemoteException {
ahora tendremos que devuelve directamente un array:

public com.banquito.Sucursales.InfoSucursal[] buscaSucursales
(com.banquito.Sucursales.BuscaSucursalesRequest buscaSucursalesRequest)
throws java.rmi.RemoteException {
Si rellenamos ese esqueleto con código similar al del otro servicio:

package com.banquito.Sucursales;

import java.util.List;
import java.util.ArrayList;

public class SucursalesSOAPImpl implements com.banquito.Sucursales.Sucursales_PortType{
protected static List Sucursales=new ArrayList();
static {
Sucursales.add(new InfoSucursal("6565","Av. Colmenar, 13", "28760"));
Sucursales.add(new InfoSucursal("34734","Pº Castellana, 145", "28034"));
Sucursales.add(new InfoSucursal("9832","C/ Mayor, 12", "19001"));
}

public com.banquito.Sucursales.InfoSucursal[] buscaSucursales
(com.banquito.Sucursales.BuscaSucursalesRequest buscaSucursalesRequest)
throws java.rmi.RemoteException {

List results=new ArrayList();
String parteCodPostal=buscaSucursalesRequest.getParteCodPostal();
for (InfoSucursal suc:Sucursales)
if (parteCodPostal==null || suc.getCodPostal().indexOf(parteCodPostal)>=0)
results.add(suc);
InfoSucursal[] resultsA=new InfoSucursal[results.size()];
results.toArray(resultsA);

return resultsA;
}

}
Después, cuando esté el Tomcat arrancado, probamos el servicio. Todo funciona, pero si miramos el XML devuelto por el servicio, veremos que contiene cosas inesperadas:





6565
Av. Colmenar, 13
28760


34734
Pº Castellana, 145
28034




¿"item"? ¿Cómo que "item"? Nosotros no hemos puesto nada sobre "item" en nuestro XML Schema, así que no deberían aparecer. Cualquier cliente que utilice nuestro WSDL original no entenderá esa respuesta, pues "item" no es "sucursal".

Ocurrirá lo mismo si usamos el WSDL original pero, en vez de document/literal, usamos rpc/literal. WSDL2Java (que es la herramienta de Axis subyacente que nos ha generado ese código) parece tener un problema con los elementos XML repetitivos (o sea, arrays). En casos como este, el código funciona pero genera el XML que no es (así como Axis genera luego un WSDL incorrecto), pero en otros casos directamente el código de WSDL2Java no compila porque pone clases que extienden de un array o que intentan lanzan arrays como excepción.

Pero bueno, afortunadamente WSDL2Java tiene una especie de switch que viene a decirle "genera el código correcto". Lamentablemente, el sencillo wizard de Eclipse no parece permitirnos poner ese switch ni lo pone él por omisión, así que tendremos que utilizar directamente la utilidad WSDL2Java desde la línea de comandos. Para ello:

Abrimos una caja de comandos (ejecutamos cmd.exe) y establecemos el classpath de Axis. Aquí vamos a usar el mismo Axis que ya tenemos dentro de Eclipse, que es la versión 1.3, pero puedes usar cualquier Axis que ya tengas instalado por ahí:

C:> set p=C:\Archivos de programa\eclipse32\plugins
En la línea anterior tienes que poner el directorio donde esté el Eclipse en tu máquina
C:> set a=%p%\org.apache.axis_1.3.0.v200606181221\lib
C:> set classpath=%a%\axis.jar;%a%\wsdl4j-1.5.1.jar;%a%\commons-discovery-0.2.jar;
%a%\jaxrpc.jar;%a%\saaj.jar;
%p%\org.apache.commons_logging_1.0.4.v200606131651\lib\commons-logging-1.0.4.jar
Luego nos cambiamos a un directorio temporal y ejecutamos WSDL2Java:

C:> cd c:\temp\w
C:\temp\w> java org.apache.axis.wsdl.WSDL2Java --wrapArrays --server-side "
C:\Trabajo\varios\wsdl2java\eclipsews\sucursales2\Sucursales.wsdl"
En la línea anterior debes poner el camino correcto hasta tu WSDL modificado, dentro de tu workspace de Eclipse
Esa opción --wrapArrays (o -w) es ese switch de "genera el código correcto" que decía antes: le dice a WSDL2Java que, en vez de usar arrays directamente, les ponga alrededor una clase. En nuestro caso, eso le da la posibilidad a WSDL2Java de generar la metainformación del nombre de los elementos individuales del array; o sea "sucursal" en vez de "item". Si tienes curiosidad, esta metainformación está en el código que WSDL2Java ha generado (ahora) para la clase BuscaSucursalesResponse:

// Type metadata
private static org.apache.axis.description.TypeDesc typeDesc =
new org.apache.axis.description.TypeDesc(BuscaSucursalesResponse.class, true);

static {
typeDesc.setXmlType(new javax.xml.namespace.QName
("http://banquito.com/Sucursales/", ">buscaSucursalesResponse"));
org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
elemField.setFieldName("sucursal");
elemField.setXmlName(
new javax.xml.namespace.QName("http://banquito.com/Sucursales/", "sucursal"));
elemField.setXmlType(
new javax.xml.namespace.QName("http://banquito.com/Sucursales/", "InfoSucursal"));
elemField.setMinOccurs(0);
elemField.setNillable(false);
elemField.setMaxOccursUnbounded(true);
typeDesc.addFieldDesc(elemField);
}
Que parece que no se puede poner si no se crea esta clase que envuelva al array.

Debo confesar que yo no he conocido este switch -w hasta el otro día (lamentablemente, después de haber publicado la primera versión de este tutorial), que lo vi casualmente, y hasta entonces pensaba que WSDL2Java era incapaz de generar este código correcto. No entiendo bien por qué no hace ésto por omisión, aunque supongo que se debe a razones históricas, pero a mí me parece que también se debe a poco respeto a la interoperabilidad que, en mi opinión, destila Axis: como luego el WSDL que genera Axis es coherente con el código de WSDL2Java, pues da igual que no sea compatible con el original.

En fin, el código generado lo tenemos en el subdirectorio com de ese directorio temporal. Ahora lo tenemos que meter en nuestro proyecto Eclipse. Eso es fácil: sólo hay que machacar los fuentes. Puedes hacerlo desde Eclipse, desde el explorador de archivos o desde la línea de comandos:

C:\temp\w> xcopy /s/y com "C:\Trabajo\varios\wsdl2java\eclipsews\sucursales2\src\com"
Recuerda poner el camino correcto hasta tu proyecto en el workspace de Eclipse
Después de lo cual podemos tener que darle a la opción de Refresh en Eclipse, en el menú contextual del directorio "src" de nuestro proyecto. Luego veremos que la declaración del método buscaSucursales de nuestra clase SucursalesSOAPImpl vuelve a devolver una clase BuscaSucursalesResponse, en vez de un array. Así que le podemos copiar como implementación del servicio el código de nuestra clase original.

Pero esto no es todo: tenemos también que modificar la información de despliegue de Axis. Axis trae herramientas de línea de comandos para ello, pero nosotros lo vamos a hacer dentro de Eclipse. Para ello,

Abrimos el fichero deploy.wsdd que está en el directorio src de nuestro proyecto y que también ha sido generado por WSDL2Java:


Ahí seleccionamos toda la declaración de nuestro servicio, desde hasta , y la copiamos en el portapapeles.

Luego, dentro del directorio WebContent/WEB-INF de nuestro proyecto, abrimos el archivo server-config.wsdd:


Ahí buscamos el texto Sucursal, y encontraremos la declaración del servicio SucursalesSOAP:


Vamos a sustituir toda esa declaración, desde hasta , por lo que hemos copiado antes desde deploy.wsdd y tenemos ahora en el portapapeles, y salvamos el fichero:


Tras esos cambios, Eclipse redesplegará lo necesario a nuestro Tomcat y, cuando accedamos con el Web Services Explorer, podremos ver que esta vez el servicio devuelve la respuesta adecuada, o sea una con varias etiquetas dentro.

Ahora bien, si resulta que no usamos WSDL2Java sino sólo Eclipse, o si usamos WSDL2Java pero no sabemos que para que genere el código correcto hay que darle la opción -w (como me pasaba a mí), pues nos vamos a encontrar con que el servicio de Axis no cumple con nuestro WSDL. Es posible que ni nos demos cuenta, pues en vez de usar el WSDL original (correcto) pasemos a usar el que nos genera Axis (erróneo). Si todos los demás clientes lo usan también, pues bueno; pero si no, pues en algún momento futuro encontraremos que no hay interoperabilidad.

El segundo problema de WSDL2Java que mencionaba arriba se ve por ejemplo cuando uno intenta generar stubs complejos como los necesarios para acceder a UDDI v3 a partir de su WSDL. Aún si tenemos en cuenta la opción --wrapArrays, el resultado no compila, pues a partir de tipos que derivan de xs:string, genera clases que no extienden de nadie pues no se puede extender de la clase String (que vaya otra idea feliz, ésta) pero llaman a su super().

Pero al menos, una vez arreglado esto (a mano clase por clase), parece que los mensajes intercambiados con el servidor son correctos. En fin, al menos por ahora no he encontrado una opción que haga que WSDL2Java trate bien esto, pero si lo encuentro modificaré el tutorial.

En mi opinión, Axis es una herramienta útil pero tiene un grave problema: está diseñado desde el principio para funcionar en modo "Bottom-up", o sea primero hacer el Java y luego que Axis genere el XML. Como ya he dicho, esta facilidad precisamente hay que evitarla.

Introducción a SOA y Servicios Web

SOA Servicios Web Info Mgmt WebSphere



¿Qué puedo hacer con los servicios Web?
¿Cuáles son las tecnologías de componentes de servicios Web?
¿Cuál es la relación entre los servicios Web y otras tecnologías?
¿Cómo puedo usar servicios Web en una aplicación?
¿Cómo puedo mejorar mis habilidades en servicios Web?



El área de contenido de servicios Web en developerWorks contiene literalmente centenares de artículos, tutoriales y recomendaciones para ayudar al desarrollador a aprovechar al máximo las aplicaciones relacionadas con servicios Web; sin embargo, para los usuarios que están intentando estudiar un nuevo tema, esa gran cantidad de informaciones puede ser abrumadora. Esa página proporciona una visión general para los lectores que desean aprender acerca de los servicios Web pero no saben dónde comenzar. La página coloca todos los fundamentos de la tecnología de servicios Web en el contexto adecuado y reúne artículos, tutoriales y recomendaciones de developerWorks, formación de los servicios de aprendizaje de IBM, Webcasts, talleres y productos IBM para más investigaciones.
El término "servicios Web" designa una tecnología que permite que las aplicaciones se comuniquen en una forma que no depende de la plataforma ni del lenguaje de programación. Un servicio Web es una interfaz de software que describe un conjunto de operaciones a las cuales se puede acceder por la red a través de mensajería XML estandarizada. Usa protocolos basados en el lenguaje XML con el objetivo de describir una operación para ejecutar o datos para intercambiar con otro servicio Web. Un grupo de servicios Web que interactúa de esa forma define la aplicación de un servicio Web específico en una arquitectura orientada a servicios (SOA).
La industria de software finalmente se está dando cuenta de que integrar aplicaciones de software en varios sistemas operativos, lenguajes de programación y plataformas de hardware no es algo que puede ser resuelto por un entorno patentado específico. Tradicionalmente, el problema viene siendo el acoplamiento fuerte, en el cual una aplicación que llama una red remota está fuertemente vinculada a ella por la llamada de función que hace y por los parámetros que solicita. En la mayoría de los sistemas antes de los servicios Web, se trata de una interfaz fija con poca flexibilidad y adaptabilidad a entornos o necesidades cambiantes.
Los servicios Web usan XML, que puede describir cualquier tipo de datos en una forma realmente independiente de plataforma para el intercambio entre sistemas, lo que permite el movimiento hacia aplicaciones flojamente acopladas. Además, los servicios Web pueden funcionar a un nivel más abstracto que puede reevaluar, modificar o manejar tipos de datos dinámicamente on demand (mediante solicitud). Por tanto, en términos técnicos, los servicios Web pueden manejar datos con mucho más facilidad y permiten una comunicación más libre entre los softwares.
En términos conceptuales más elevados, es posible ver los servicios Web como unidades de trabajo, donde cada una maneja una tarea funcional específica. Un paso arriba de eso, las tareas se pueden combinar en tareas orientadas a negocios para manejar tareas operacionales empresariales específicas y eso, por su turno, permite que el personal que no es técnico piense en aplicaciones que pueden manejar temas empresariales en conjunto en un flujo de trabajo de aplicaciones de servicios Web. Así, una vez que el personal técnico haya diseñado y construido los servicios Web, los arquitectos de procesos empresariales pueden agregarlos para resolver problemas en el ámbito empresarial. En una analogía con el motor de un auto, un arquitecto de procesos empresariales puede pensar en montar un motor de auto completo, con el chasis, la carrocería, la transmisión y otros sistemas, en lugar de analizar las diferentes partes dentro de cada motor. Además, la plataforma dinámica significa que el motor puede funcionar en conjunto con la transmisión o con componentes de otros fabricantes.
Lo que se concluye con ese último aspecto es que los servicios Web ayudan a conectar el personal de negocios al personal tecnológico de una organización. Los servicios Web facilitan la comprensión de las operaciones técnicas por parte del personal de negocios. El personal de negocios puede describir eventos y actividades y el personal tecnológico puede asociarlos a los servicios adecuados.
Con interfaces definidas universalmente y tareas bien diseñadas, también resulta más fácil reutilizar esas tareas y, consecuentemente, las aplicaciones que representan. La reusabilidad de softwares de aplicación implica un mejor retorno de la inversión en software, pues puede producir más con los mismos recursos. También permite que el personal de negocios considere la posibilidad de usar una aplicación ya existente en una forma nueva u ofrecerla a un socio en una forma nueva, aumentando así las transacciones empresariales entre socios.
Por tanto, los principales problemas que los servicios Web tratan de resolver son los temas de integración de datos y aplicaciones y de la transformación de funciones técnicas en tareas informáticas orientadas a negocios. Esos dos aspectos permiten que las empresas se comuniquen con sus socios en el ámbito de los procesos o aplicaciones y que, al mismo tiempo, dejen un espacio dinámico para adaptarse a nuevas situaciones o trabajar con otros socios mediante solicitud.
Aprenda más sobre eso:
Para aprender más acerca de los servicios Web, primeramente debe saber como el lenguaje XML funciona.XML and how it will change the WebeIntroducción a XMLson dos artículos buenos para empezar. Aunque la tecnología de los servicios Web propiamente dicha sea independiente del lenguaje, hay varias otras herramientas e implementaciones de software disponibles en latecnología Java.
Si es un arquitecto de software o un profesional de negocios que desea entender los servicios Web,An Executive's Guide to Web servicestiene varias ideas útiles sobre el valor empresarial de los servicios Web.

Volver arriba



¿Qué puedo hacer con los servicios Web?
Aunque los servicios Web permitan que todos esos dispositivos dinámicos combinen varios servicios en aplicaciones, aun así es necesario construir los servicios primero. Los lenguajes de programación en la Ciencia de la Computación están en continua evolución. Se comenzó hace décadas con la idea de una función en la cual uno la proporciona algunos parámetros, la función ejecuta alguna operación con los parámetros y retorna un valor basado en los cálculos. Con el tiempo, ese primer concepto evolucionó al objeto en el cual cada objeto no sólo tenía varias funciones que podía realizar, sino también sus propias variables de datos privados, en lugar de basarse en variables externas de todo el sistema, que anteriormente hacían más complejo el desarrollo de aplicaciones. A medida que las aplicaciones comenzaron a comunicarse, el concepto de interfaces universales definidas para objetos se hizo importante, para permitir que objetos de otras plataformas se comuniquen aunque hayan sido escritos en lenguajes de programación distintos y operen en otros sistemas operativos.
En el paso más reciente, los servicios Web se acercaron al concepto de interfaces y comunicaciones definidas en XML, para finalmente unir aplicaciones de cualquier tipo, además de proporcionar la libertar de cambiar y evolucionar a lo largo del tiempo, a condición de que estén diseñadas para la interfaz adecuada. Lo que distingue los servicios Web de las tecnologías que componen la generación anterior es la versatilidad de XML. Permite separar la estructura gramatical (sintaxis) del significado gramatical (semántica) y posibilita la separación de la forma que cada servicio del entorno procesa y entiende eso. Por tanto, ahora, los objetos pueden ser definidos como servicios que se comunican con otros servicios en la gramática definida por XML, donde cada servicio traduce y analiza el mensaje de acuerdo con la implementación local y el entorno. Por tanto, una aplicación conectada en red puede efectivamente estar compuesta por varias entidades con varias construcciones y diseños diferentes, a condición de que cumplan con las reglas definidas por su arquitectura orientada a servicios.
Así, teniendo eso en mente, los servicios Web permiten:
Interacción entre servicios en cualquier plataforma, escritos en cualquier lenguaje.
Conceptualizar funciones de aplicaciones en tareas, lo que lleva al desarrollo y a flujos de trabajo orientados a tareas. Eso posibilita más abstracción del software que puede ser empleado por usuarios menos técnicos que trabajan con análisis en el ámbito de negocios.
Permite el acoplamiento flojo, lo que significa que las interacciones entre aplicaciones de servicio no se rompen siempre que haya un cambio en la forma de diseño o implementación de un servicio o más.
Adaptar las aplicaciones ya existentes a las cambiantes condiciones empresariales y necesidades de clientes.
Proporcionar aplicaciones de software ya existentes o legadas con interfaces de servicio sin cambiar las aplicaciones originales, lo que permite operar totalmente en el entorno de servicios.
Introducir otras funciones administrativas o de gestión de operaciones como confiabilidad, rendición de cuentas, seguridad, etc., independientemente de la función original, lo que aumenta su versatilidad y utilidad en el entorno de computación empresarial.
Aprenda más sobre eso:
Business Processes in a Web services Worldexplica cómo se pueden representar el flujo de trabajo y los procesos empresariales con servicios Web.
Security in a Web services worldexplora cómo el modelo de seguridad en los servicios Web está evolucionando.
Merging grids and Web servicestrata de cómo la computación grid puede usar los servicios Web en una arquitectura orientada a servicios, consistente y distribuida.
An e-mail user interface to Web servicesdescribe cómo los dispositivos móviles pueden interactuar con servicios Web empresariales al usar protocolos simples de comunicación como el e-mail.
Aprenda cómo los servicios Web funcionan en el modelo J2EE enIntegrate enterprise applications with Web services and J2EEy lea sobre los diferentes mecanismos de comunicación enChoosing among JCA, JMS, and Web services for EAI.

Volver arriba



¿Cuáles son las tecnologías de componentes de servicios Web?
Los servicios Web involucran una familia de protocolos relacionados para describir y suministrar Servicios Web e interactuar con ellos. Se puede subdividir esa familia en grupos basados en funciones y usos comunes. El primer grupo maneja los temas de mensajería y dirección, suministro y descripción de interfaces. El protocolo más conocido es el protocolo de mensajería conocido como protocolo simple de acceso a objetos (SOAP). Ese protocolo codifica mensajes para que puedan ser entregados en la red a través de un protocolo de transporte como HTTP, IIOP, SMTP u otros.
El lenguaje de descripción de servicios Web (WSDL) es representado como una serie de sentencias XML que constituyen la definición de las interfaces de cada servicio. Otra especificación que está en progreso actualmente es WS-Addressing, que define cómo dar direcciones exclusivas e identificar en forma exclusiva los servicios Web en una arquitectura distribuida. Otra especificación popular es Web Services Invocation Framework, en la cual se pueden definir interfaces WSDL para todos los tipos de componentes, incluso los que no usan los mismos protocolos de mensajería.
El siguiente grupo de protocolos y especificaciones define cómo los servicios se anuncian y encuentran otros servicios en la red. Para que un servicio encuentre otro, el protocolo de descripción, descubierta e integración universal (UDDI) define un registro y protocolos asociados para ubicar servicios y acceder a ellos. El lenguaje Web Services Inspection Language es un mecanismo alternativo al UDDI que funciona sin el uso de un registro.
Los protocolos de seguridad para servicios Web comienzan por la especificación WS-Security que define una arquitectura basada en señales para comunicaciones seguras. Existen seis principales especificaciones de componentes construidas sobre esa base:
WS-Policy y sus especificaciones relacionadas, que definen las reglas de políticas sobre la interacción de servicios.
WS-Trust, que define el modelo confiable para el intercambio seguro.
WS-Privacy, que define cómo se mantiene la privacidad de las informaciones.
WS-Secure Conversation, que define cómo establecer una sesión protegida entre servicios para intercambiar datos usando las reglas definidas en WS-Policy, WS-Trust, y WS-Privacy.
WS-Federation, que define las reglas de identidad distribuida y de la gestión de esa identidad.
WS-Authorization, que maneja el procesamiento de autorización para acceder a los datos e intercambiarlos.
Además del modelo de seguridad, existen las especificaciones específicas de las aplicaciones, incluyendo el lenguaje de ejecución de procesos empresariales para servicios Web (BPEL4WS), que define las operaciones de flujos de trabajo, y WS-Transaction y WS-Coordination, que funcionan en conjunto para manejar el procesamiento distribuido de transacciones.
Actualmente está en desarrollo una especificación para la gestión distribuida de servicios Web que trata de la gestión administrativa de software de todos los servicios y de la arquitectura orientada a servicios. Por fin, existen especificaciones para interfaces de usuario (WS-InteractiveApplications) y acceso remoto a servicios Web (WS-RemotePortals).
Las especificaciones y protocolos para servicios Web aún están siendo definidas y sólo están comenzando a explicar cómo los servicios deben interactuar. Sin embargo, no pueden abarcar todas las situaciones y combinaciones posibles. Así, el Web Services Interoperability Group (WS-I), constituido por prácticamente todos los grandes y pequeños proveedores involucrados en el desarrollo de los servicios Web, se encargó de la tarea de desarrollar estudios de caso, ejemplos de aplicaciones, casos de ejemplo de implementación y herramientas de prueba para asegurar que esos estándares y especificaciones realmente funcionarán los unos con los otros, independientemente de las implementaciones de productos de los proveedores.
WS-I ha definido su primer Basic Profile 1.0 para servicios Web y también ha lanzado sus casos de ejemplo, ejemplos de aplicaciones y herramientas de prueba para evaluar y comparar resultados de varias implementaciones de acuerdo con los casos de ejemplo.
Además de WS-I, una buena parte del trabajo de los estándares está siendo realizado por la Organización para el Avance de Estándares de Informaciones Estructuradas (OASIS), el World Wide Web Consortium (W3C) y el Grupo de Trabajo de Ingeniería de Internet (IETF).
Aprenda más sobre eso:
The Web Services Conceptual Architectureexplica las ideas técnicas relacionadas a los servicios Web y cómo funcionan.
Los estándares de protocolo y especificaciones importantes para los servicios Web están disponibles en la página de developerWorksStandards and Web services.
Están disponibles más informaciones sobre especificaciones y estándares en elsitio de W3Cy en elsitio de OASIS.
Puede leer más acerca del trabajo deWS-IenFirst look at the WS-I Basic Profile 1.0,First look at the WS-I Usage ScenariosyUnderstanding the WS-I Test Tools.

Volver arriba



¿Cuál es la relación entre los servicios Web y otras tecnologías?
Los servicios Web son, principalmente, una tecnología de integración. Sin embargo, son independientes de la forma propiamente dicha. Las tecnologías de componentes para servicios Web son definidas en forma común e interactúan en XML, según se mencionó anteriormente. Sin embargo, ya que el propio XML es independiente de lenguaje, los servicios Web también lo son. Por tanto, los servicios Web se pueden desarrollar en varios lenguajes de programación, como Java, Python, Perl, C#, Basic y otros.
Los orígenes de los servicios Web están en la tentativa de encontrar una forma mejor para que la arquitectura de Internet y la arquitectura de las aplicaciones Web se comuniquen mejor e interactúen. Así, actualmente la mayoría de los servicios Web se basan en programas que operan en entornos de servidores de aplicaciones como WebSphere, Apache y otros. No son obligatorios, mas algunas de las mejores herramientas para servicios Web están diseñadas para esos entornos.
Al proporcionar interfaces universales y más simples, los servicios Web también están ayudando a mejorar el funcionamiento del modelo de informática ubicua para entornos móviles y portables. Los softwares para informática móvil están adoptando rápidamente el modelo de comunicación de los servicios Web y, al mismo tiempo, ayudando a mejorar la cuestión de las interfaces de los servicios Web.
La computación grid ha adoptado los servicios Web como parte de la arquitectura abierta de servicios de grid, un nuevo modelo para ese tipo de informática distribuida que usa los servicios Web para comunicar cómo la grid opera.
Incluso la informática autonómica, que es una nueva forma de mantener y administrar computadores, tiene algunas aplicaciones para servicios Web.
Aprenda más sobre eso:
Java es esencial para los servicios Web y, de hecho, la mayoría del contenido sobre Servicios Web en developerWorks enfoca el desarrollo basado en Java. Por ejemplo:Developer's introduction to JAX-RPC, Part 1yDeveloper's introduction to JAX-RPC, Part 2tratan específicamente de las APIs J2EE involucradas en el desarrollo de los servicios Web.
Developing a .Net client to interact with a WebSphere Web serviceyA Demonstration of Web Services Interoperability Between the WebSphere and .Netdan un ejemplo de cómo los servicios Web pueden funcionar en plataformas distintas con arquitecturas Web diferentes.
A visual tour of OGSAexplica cómo la computación grid está siendo diseñada ahora sobre la base de los servicios Web.
Cross-platform programming with the WSTK for Mobile Devicesanaliza las herramientas para programar servicios Web para la informática móvil.
El textoETTK self-healing and optimizing demomuestra la informática autonómica y los servicios Web funcionando en conjunto.

Volver arriba



¿Cómo puedo usar servicios Web en una aplicación?
Existen varias formas de pensar acerca de los servicios Web al crear aplicaciones. En el nivel más básico, es una familia de protocolos avanzados de comunicaciones que permite que las aplicaciones se comuniquen. Ese nivel ha progresado mucho en los años recientes con muchas herramientas que permiten que los desarrolladores de software escriban servicios Web que interactúan y creen aplicaciones complejas. Ese nivel frecuentemente se caracteriza por interacciones directas uno a uno entre los servicios o por relativamente pocos servicios que interactúan los unos con los otros.
Sin embargo, el uso de los servicios Web sólo como un protocolo de comunicaciones no representa su verdadera capacidad: la capacidad de la arquitectura orientada a servicios (SOA). La SOA describe un sistema entero de servicios que buscan dinámicamente los unos a los otros, se unen para realizar alguna aplicación y se recombinan de varias formas. Ese modelo fomenta la reutilización de la tecnología y de softwares, lo que produce una evolución en la forma de diseñar, desarrollar y poner en uso las aplicaciones. Acerca a la realidad el mundo de la informática distribuida. En ese nivel, los desarrolladores de software necesitan pensar en el modelo SOA y diseñar su aplicación distribuida con ese modelo. Ese nivel se caracteriza por el uso de tecnologías para permitir las comunicaciones distribuidas de los servicios, como el uso del bus de servicios empresariales (ESB), que es una red de distribución común para el trabajo con los servicios.
Por fin, el nivel más alto es considerar ese modelo SOA y los varios servicios que lo componen como elementos constructivos, que pueden ser montados en secciones enteras dentro de aplicaciones completas, en lugar del método convencional de escribir el código línea por línea. Al examinar las interfaces que se conectan, es posible construir aplicaciones enteras sin escribir código. En realidad, el código directo puede aun perjudicar, ya que los servicios se pueden escribir en varias plataformas y lenguajes diferentes. Es posible unir los bloques en un flujo de trabajo de operaciones que define el rendimiento de la aplicación, y se pueden usar otras herramientas para supervisar la eficiencia del flujo de trabajo de cada servicio o grupo de servicios. En ese nivel, los desarrolladores pueden abandonar los lenguajes de programación regulares y trabajar en una arquitectura basada en modelos que les ayuda a crear aplicaciones con más exactitud respecto al diseño. Luego, se ejecuta ese diseño sobre la base de un sistema distribuido como un ESB.
Aprenda más sobre eso:
El Java 2 Enterprise Edition (J2EE) es uno de los principales modelos para desarrollar servicios Web en lenguaje de programación Java. Debeleer acerca de J2EEy aprender cómo funciona para entender el primer nivel de desarrollo para servicios Web.
Building a Web service from SOAP to nutsyCreate, deploy, publish, and consume a simple Web serviceson dos artículos introductorios sobre la creación de servicios Web interactuantes.
Access DB2 with Web serviceseInvoking Web services from SQLtratan de la creación de servicios Web de bases de datos.
Business processes and workflow in the Web services worlddescribe cómo los procesos empresariales funcionan en una arquitectura orientada a servicios.
Para aprender más acerca de flujos de trabajo y procesos empresariales con servicios Web, debe leer acerca de la especificación BPEL4WS en lacolumna BPEL4WSescrita por algunos de los autores de la especificación.
From UML to BPEL: Model Driven Architecture in a Web services worldexplica cómo los servicios Web se encuadran en el contexto de las arquitecturas basadas en modelos.

Volver arriba



¿Cómo puedo mejorar mis habilidades en servicios Web?
La mejor forma de mantenerse actualizado respecto a los servicios Web es leer los artículos técnicos más recientes y trabajar con las varias herramientas disponibles. Ya que la propia tecnología está en evolución, esas informaciones y herramientas proporcionan las interpretaciones más recientes de las mejores formas de trabajar con servicios Web. Además, kits de herramientas como el Emerging Technology Toolkit le dan una ventaja respecto a la innovación de esas tecnologías para que pruebe las mismas tecnologías en las cuales los expertos están trabajando. La siguiente sección presenta descripciones de esas herramientas.
Actualmente, los servicios Web vienen progresando significativamente y la diversidad de informaciones sobre ese tema está aumentando muchísimo. Hay una cantidad significativa de contenido técnico acerca del primer nivel del desarrollo de servicios Web para interacción directa que puede ser encontrada en el sitio de servicios Web. Incluso los protocolos como SOAP, que existe hace más de tres años, aún están siendo mejorados. Ya que ese tema es un blanco en movimiento, es conveniente consultar regularmente el área de contenido sobre servicios Web.
Otra buena forma de mejorar sus habilidades es participar en los foros de discusión listados directamente en la zona. Aquí puede encontrar los profesionales que trabajan activamente en esa área e incluso buscar ayuda directamente del personal de investigación y desarrollo que está diseñando las tecnologías y construyendo los productos.
Los desarrolladores avanzados pueden participar en el desarrollo y la evolución de las especificaciones de servicios Web al participar en los varios talleres que ocurren mensualmente.
Aprenda más sobre eso:
El área sobre servicios Web agrega regularmentenuevos tutorialesque explican detalladamente cómo realizar tareas útiles en los servicios Web.
Lostalleres de especificaciones de servicios Webson eventos con varios proveedores realizados para que aprenda y opine acerca de las especificaciones de servicios Web.
La columnaBest Practices for Web servicesen developerWorks analiza situaciones reales que los miembros del programa JStart de IBM para implementación temprana de la tecnología están encontrando en su camino a la implementación exitosa del proyecto. El aprendizaje de esas buenas prácticas puede ayudarle a evaluar y adaptar a la situación de su propio proyecto.


Volver arriba


Java y todas las marcas registradas basadas en Java son marcas registradas de Sun Microsystems, Inc. en Estados Unidos, otros países o ambos. Otros nombres de compañías, productos y servicios pueden ser marcas registradas o marcas de servicios de otros. Otras compañías, productos o nombres de servicios pueden ser marcas comerciales o marcas de servicio de los demás

Fte: http://www.ibm.com/developerworks/ssa/webservices/newto/websvc.html

Introduccion a los servicios Web en JAVA

Crear tu Primer Servicio Web en 30 minutos
El Servicio Web - una Definición Programática
Instalar el Software
Implementar un Sencillo Servicio Web
Implementar un Cliente Java de un Servicio Web
Desplegar y Ejecutar el Servicio Web JavaScript
Mensajes SOAP de un Vistazo
Limpieza
Vistazo en Profundidad a SOAP
SOAP y los Tipos Complejos
Mapeo de Tipos Complejos -- Mirada en Profundidad
Procesamiento de Errores SOAP
Referencias Remotas
Implementar Sencillas Referencias Remotas
Borrar Referencias Remotas
Seguridad
Introducción a la Seguridad en los Servicios Web
Criptografía Asimétrica -- Claves Privada y Pública
Identidades
La Firma de Datos
Certificados Verdaderos
Los Servicios Web y los Mecanismos del API Secure
Seguridad en Acción: Autentificación, Autorización y Privacidad de los Datos
Instrucciones para Ejecutar el Ejemplo
Integración con J2EE
Entender los Servicios Web y la Integración Básica con J2EE
Procesamiento Estándar J2EE
J2EE -- Aproximaciones Básicas
El ejemplo "Stock Quote EJB Wrapper"
Integración J2EE Transparente
Ejemplo de Integración Transparente J2EE
Enviar Mensajes SOAP de Forma Eficiente sobre JMS
Limpieza
Interoperabilidad de los Servicios Web
Introducción
Cómo no Verse Atrapado
Mantener Simples nuestros Tipos -- evitar Construcciones Avanzadas del Esquema XML.
Proporcionar Definiciones del Esquema XML para todos nuestos Tipos de Datos
Múltiples Uniones WSDL
Estilo de Documento por Defecto con Codificación Literal
Uso único de SOAPActions para nuestros métodos
Códigos de Ejemplo
Acceder a un Servicio MS .NET desde Java
Llamar a un Servicio Java desde un Cliente MS .NET
Seguridad en los Servicios Web con Firma Simple
La Firma Simple -- El Concepto Básico
El Escenario Simple de SSO
SSO Avanzado -- usando SAML
Instalación
Escenario Simple SSP -- ejemplo práctico
Explorando SAML


Fte: http://www.programacion.com/java/tutorial/servic_web/

MacBook Pro 13" Unibody Repair Manual

Como reparar y desmontar un MacBook Pro 13"

Fte: http://www.ifixit.com/Guide/Device/MacBook_Pro_13%22_Unibody

con referencia a:

"MacBook Pro 13" Unibody Repair Manual"
- MacBook Pro 13" Unibody - iFixit (ver en Google Sidewiki)

jueves, 17 de diciembre de 2009

FORA.tv - Steve Wozniak: How I Invented the Personal Computer

FORA.tv - Steve Wozniak: How I Invented the Personal Computer

Programación por capas - Wikipedia, la enciclopedia libre

Programación por capas - Wikipedia, la enciclopedia libre

Programación por capas
De Wikipedia, la enciclopedia libre
Saltar a navegación, búsqueda

La programación por capas es un estilo de programación en el que el objetivo primordial es la separación de la lógica de negocios de la lógica de diseño; un ejemplo básico de esto consiste en separar la capa de datos de la capa de presentación al usuario.

Tres capas.PNG

La ventaja principal de este estilo es que el desarrollo se puede llevar a cabo en varios niveles y, en caso de que sobrevenga algún cambio, sólo se ataca al nivel requerido sin tener que revisar entre código mezclado. Un buen ejemplo de este método de programación sería el modelo de interconexión de sistemas abiertos.

Además, permite distribuir el trabajo de creación de una aplicación por niveles; de este modo, cada grupo de trabajo está totalmente abstraído del resto de niveles, de forma que basta con conocer la API que existe entre niveles.

En el diseño de sistemas informáticos actual se suele usar las arquitecturas multinivel o Programación por capas. En dichas arquitecturas a cada nivel se le confía una misión simple, lo que permite el diseño de arquitecturas escalables (que pueden ampliarse con facilidad en caso de que las necesidades aumenten).

El diseño más utilizado actualmente es el diseño en tres niveles (o en tres capas).
Capas y niveles [editar]

1.- Capa de presentación: es la que ve el usuario (también se la denomina "capa de usuario"), presenta el sistema al usuario, le comunica la información y captura la información del usuario en un mínimo de proceso (realiza un filtrado previo para comprobar que no hay errores de formato). Esta capa se comunica únicamente con la capa de negocio. También es conocida como interfaz gráfica y debe tener la característica de ser "amigable" (entendible y fácil de usar) para el usuario.

2.- Capa de negocio: es donde residen los programas que se ejecutan, se reciben las peticiones del usuario y se envían las respuestas tras el proceso. Se denomina capa de negocio (e incluso de lógica del negocio) porque es aquí donde se establecen todas las reglas que deben cumplirse. Esta capa se comunica con la capa de presentación, para recibir las solicitudes y presentar los resultados, y con la capa de datos, para solicitar al gestor de base de datos para almacenar o recuperar datos de él. También se consideran aquí los programas de aplicación.

3.- Capa de datos: es donde residen los datos y es la encargada de acceder a los mismos. Está formada por uno o más gestores de bases de datos que realizan todo el almacenamiento de datos, reciben solicitudes de almacenamiento o recuperación de información desde la capa de negocio.

Todas estas capas pueden residir en un único ordenador, si bien lo más usual es que haya una multitud de ordenadores en donde reside la capa de presentación (son los clientes de la arquitectura cliente/servidor). Las capas de negocio y de datos pueden residir en el mismo ordenador, y si el crecimiento de las necesidades lo aconseja se pueden separar en dos o más ordenadores. Así, si el tamaño o complejidad de la base de datos aumenta, se puede separar en varios ordenadores los cuales recibirán las peticiones del ordenador en que resida la capa de negocio.

Si, por el contrario, fuese la complejidad en la capa de negocio lo que obligase a la separación, esta capa de negocio podría residir en uno o más ordenadores que realizarían solicitudes a una única base de datos. En sistemas muy complejos se llega a tener una serie de ordenadores sobre los cuales corre la capa de negocio, y otra serie de ordenadores sobre los cuales corre la base de datos.


En una arquitectura de tres niveles, los términos "capas" y "niveles" no significan lo mismo ni son similares.

El término "capa" hace referencia a la forma como una solución es segmentada desde el punto de vista lógico:

Presentación/ Lógica de Negocio/ Datos.

En cambio, el término "nivel" corresponde a la forma en que las capas lógicas se encuentran distribuidas de forma física. Por ejemplo:

* Una solución de tres capas (presentación, lógica del negocio, datos) que residen en un solo ordenador (Presentación+lógica+datos). Se dice que la arquitectura de la solución es de tres capas y un nivel.

* Una solución de tres capas (presentación, lógica del negocio, datos) que residen en dos ordenadores (presentación+lógica, lógica+datos). Se dice que la arquitectura de la solución es de tres capas y dos niveles.

* Una solución de tres capas (presentación, lógica del negocio, datos) que residen en tres ordenadores (presentación, lógica, datos). La arquitectura que la define es: solución de tres capas y tres niveles.

Simple Flex Tutorial

I've been learning Flex for a presentation at my local CFUG, and I'm actually quite impressed with how much you can do with so little code.

However, most of the Flex tutorials I have found are very long and over simplified, so I've created a simple blog reader in 23 lines of MXML code to use as a tutorial. Here's what our Flex Application will look like:
flex blog reader screen shot
How does the example work?

When you click the Load Blog Entries button my RSS feed entries are loaded into the datagrid. When you click on a row in the datagrid the corresponding entry is loaded into the text area.
Step 1 - XML and Application declaration

Start your XML file with a XML declaration, and an mx:Application tag:





Step 2 - Define your HTTPService

Our first step is to define the HTTPService that we will use to connect to my RSS feed. We will give an id of httpRSS so we can refer back to it.



Step 3 - Enclose your controls within a panel

A panel is simply a container to put controls (the DataGrid, TextArea, and Button) into. We are going to set some attributes on the panel as well, it should be pretty easy to figure out what they mean:



Step 4 - Define your DataGrid

We are using the DataGrid component to display the list of blog entries in my RSS feed, along with their date.

This step is probably the most complicated step because we have to bind our RSS xml data to the datagrid, and define an event handler when the rows are clicked.

In the attributes of the DataGrid we are using dynamic variables or expressions denoted by the curly braces {variable}.










Ok so there is a lot going on there, first so I'll break it down a bit:
width

We are setting the width dynamically based on the size of its parent panel reader, specifically we set it to be 15 pixels narrower than its panel.
dataProvider

In the dataProvider attribute we are binding the data for this grid to the result of our HTTPService named httpRSS. More specifically we want to bind each item tag in our XML file to a row in the datagrid. Since the item tags are inside the rss and channel tags we refer to it the array of items as httpRSS.result.rss.channel.item.
cellPress

Next we want to create an event handler that will display the contents of the description tag inside the item that is clicked on. Using the variable entries.selectedIndex we know which item was clicked on, and we can refer to the description (the entry body) of that item as: httpRSS.result.rss.channel.item[entries.selectedIndex].description.

Now we just need to set the value of our TextArea which we will define in the next step to the rss item description, so we simply assign that value to the htmlText property of the TextArea (whose name will be body).
columns

Now we need to define which columns we are to display in the datagrid. The columnName must match the tag name that we want it to correspond to.
Step 5 - Define the TextArea

Use the mx:TextArea tag to define the text area where the entry body will go:



Step 6 - Create a Button

Our last control to define is a Button which will simply tell the HTTPService to make the request.



In the click event handler we call the send() method on our HTTPService object.
Step 7 - Close Panel and Application

Simply close some tags, and your done!


con referencia a:

"I've been learning Flex for a presentation at my local CFUG, and I'm actually quite impressed with how much you can do with so little code. However, most of the Flex tutorials I have found are very long and over simplified, so I've created a simple blog reader in 23 lines of MXML code to use as a tutorial. Here's what our Flex Application will look like: How does the example work? When you click the Load Blog Entries button my RSS feed entries are loaded into the datagrid. When you click on a row in the datagrid the corresponding entry is loaded into the text area. Step 1 - XML and Application declaration Start your XML file with a XML declaration, and an mx:Application tag: <?xml version="1.0" ?> <mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"> Step 2 - Define your HTTPService Our first step is to define the HTTPService that we will use to connect to my RSS feed. We will give an id of httpRSS so we can refer back to it. <mx:HTTPService id="httpRSS" url="http://www.petefreitag.com/rss/" resultFormat="object" /> Step 3 - Enclose your controls within a panel A panel is simply a container to put controls (the DataGrid, TextArea, and Button) into. We are going to set some attributes on the panel as well, it should be pretty easy to figure out what they mean: <mx:Panel id="reader" title="Pete Freitag's Blog Reader" width="500"> Step 4 - Define your DataGrid We are using the DataGrid component to display the list of blog entries in my RSS feed, along with their date. This step is probably the most complicated step because we have to bind our RSS xml data to the datagrid, and define an event handler when the rows are clicked. In the attributes of the DataGrid we are using dynamic variables or expressions denoted by the curly braces {variable}. <mx:DataGrid id="entries" width="{reader.width-15}" dataProvider="{httpRSS.result.rss.channel.item}" cellPress="{body.htmlText=httpRSS.result.rss.channel.item[entries.selectedIndex].description}"> <mx:columns> <mx:Array> <mx:DataGridColumn columnName="title" headerText="Title" /> <mx:DataGridColumn columnName="pubDate" headerText="Date" /> </mx:Array> </mx:columns> </mx:DataGrid> Ok so there is a lot going on there, first so I'll break it down a bit: width We are setting the width dynamically based on the size of its parent panel reader, specifically we set it to be 15 pixels narrower than its panel. dataProvider In the dataProvider attribute we are binding the data for this grid to the result of our HTTPService named httpRSS. More specifically we want to bind each item tag in our XML file to a row in the datagrid. Since the item tags are inside the rss and channel tags we refer to it the array of items as httpRSS.result.rss.channel.item. cellPress Next we want to create an event handler that will display the contents of the description tag inside the item that is clicked on. Using the variable entries.selectedIndex we know which item was clicked on, and we can refer to the description (the entry body) of that item as: httpRSS.result.rss.channel.item[entries.selectedIndex].description. Now we just need to set the value of our TextArea which we will define in the next step to the rss item description, so we simply assign that value to the htmlText property of the TextArea (whose name will be body). columns Now we need to define which columns we are to display in the datagrid. The columnName must match the tag name that we want it to correspond to. Step 5 - Define the TextArea Use the mx:TextArea tag to define the text area where the entry body will go: <mx:TextArea id="body" editable="false" width="{reader.width-15}" height="300" /> Step 6 - Create a Button Our last control to define is a Button which will simply tell the HTTPService to make the request. <mx:Button label="Load Blog Entries" click="{httpRSS.send()}" /> In the click event handler we call the send() method on our HTTPService object. Step 7 - Close Panel and Application Simply close some tags, and your done! </mx:Panel> </mx:Application> One Caveat Flex 1.5 uses a proxy to invoke HTTPService calls, and other remote service calls, and for security reasons the proxy will block the HTTP call. You add the RSS feed url (or simply http://*) to the proxy whitelist in your flex-config.xml. See this KB article for more info. Complete MXML source code: <?xml version="1.0" ?> <mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"> <mx:HTTPService id="httpRSS" url="http://www.petefreitag.com/rss/" resultFormat="object" /> <mx:Panel id="reader" title="Pete Freitag's Blog Reader" width="500"> <mx:DataGrid id="entries" width="{reader.width-15}" dataProvider="{httpRSS.result.rss.channel.item}" cellPress="{body.htmlText=httpRSS.result.rss.channel.item[entries.selectedIndex].description}"> <mx:columns> <mx:Array> <mx:DataGridColumn columnName="title" headerText="Title" /> <mx:DataGridColumn columnName="pubDate" headerText="Date" /> </mx:Array> </mx:columns> </mx:DataGrid> <mx:TextArea id="body" editable="false" width="{reader.width-15}" height="300" /> <mx:Button label="Load Blog Entries" click="{httpRSS.send()}" /> </mx:Panel> </mx:Application>"
- Simple Flex Tutorial (ver en Google Sidewiki)

miércoles, 16 de diciembre de 2009

GANTT-Diagramm GANTT diagram Diagramme de GANTT Diagramma di GANTT Diagrama de GANTT Diagrama de GANTT

Introducción al diagrama de GANTT

El diagrama de GANTT es una herramienta que le permite al usuario modelar la planificación de las tareas necesarias para la realización de un proyecto. Esta herramienta fue inventada por Henry L. Gantt en 1917.

Debido a la relativa facilidad de lectura de los diagramas de GANTT, esta herramienta es utilizada por casi todos los directores de proyecto en todos los sectores. El diagrama de GANTT es una herramienta para el director del proyecto que le permite realizar una representación gráfica del progreso del proyecto, pero también es un buen medio de comunicación entre las diversas personas involucradas en el proyecto.

Este tipo de modelo es particularmente fácil de implementar con una simple hoja de cálculo, pero también existen herramientas especializadas, la más conocida es Microsoft Project. También existen equivalentes de este tipo de software que son gratis.
Cómo crear un diagrama de GANTT

En un diagrama de GANTT, cada tarea es representada por una línea, mientras que las columnas representan los días, semanas, o meses del programa, dependiendo de la duración del proyecto. El tiempo estimado para cada tarea se muestra a través de una barra horizontal cuyo extremo izquierdo determina la fecha de inicio prevista y el extremo derecho determina la fecha de finalización estimada. Las tareas se pueden colocar en cadenas secuenciales o se pueden realizar simultáneamente.

Diagrama GANTT de un proyecto Web

Si las tareas son secuenciales, las prioridades se pueden confeccionar utilizando una flecha qué desciende de las tareas más importantes hacia las tareas menos importantes. La tarea menos importante no puede llevarse a cabo hasta que no se haya completado la más importante.

Prioridades en un diagrama de GANTT

A medida que progresa una tarea, se completa proporcionalmente la barra que la representa hasta llegar al grado de finalización. Así, es posible obtener una visión general del progreso del proyecto rastreando una línea vertical a través de las tareas en el nivel de la fecha actual. Las tareas ya finalizadas se colocan a la izquierda de esta línea; las tareas que aún no se han iniciado se colocan a la derecha, mientras que las tareas que se están llevando a cabo atraviesan la línea. Si la línea está cubierta en la parte izquierda, ¡la tarea está demorada respecto de la planificación del proyecto!

Idealmente, un diagrama como este no debe incluir más de 15 ó 20 tareas para que pueda caber en una sola hoja con formato A4. Si el número de tareas es mayor, es posible crear diagramas adicionales en los que se detallan las planificaciones de las tareas principales.
Acontecimientos

Adicionalmente, es posible que los eventos más importantes, que no sean las tareas mismas, se muestren en la planificación como puntos de conexión del proyecto: estos se denominan acontecimientos.

Los acontecimientos permiten que el proyecto se realice en fases claramente indentificables, evitando que se prolongue la finalización del mismo. Un acontecimiento podría ser la producción de un documento, la realización de una reunión o el producto final de un proyecto. Los acontecimientos son tareas de duración cero, representadas en el diagrama por un símbolo específico, frecuentemente un triángulo invertido o un diamante.

Representación de un acontecimiento en un diagrama de GANTT
Recursos

Generalmente es posible (y útil) mostrar referencias en el diagrama, humanas o materiales, para permitir calcular el tiempo restante y tener una idea del costo global.

Para ser más concisos, por lo general sólo serán necesarios las iniciales o los nombres de los responsables.
Herramientas

* Proyecto GANTT

Fte: http://es.kioskea.net/contents/projet/gantt.php3

con referencia a:

"Introducción al diagrama de GANTT El diagrama de GANTT es una herramienta que le permite al usuario modelar la planificación de las tareas necesarias para la realización de un proyecto. Esta herramienta fue inventada por Henry L. Gantt en 1917.Debido a la relativa facilidad de lectura de los diagramas de GANTT, esta herramienta es utilizada por casi todos los directores de proyecto en todos los sectores. El diagrama de GANTT es una herramienta para el director del proyecto que le permite realizar una representación gráfica del progreso del proyecto, pero también es un buen medio de comunicación entre las diversas personas involucradas en el proyecto. Este tipo de modelo es particularmente fácil de implementar con una simple hoja de cálculo, pero también existen herramientas especializadas, la más conocida es Microsoft Project. También existen equivalentes de este tipo de software que son gratis. Cómo crear un diagrama de GANTT En un diagrama de GANTT, cada tarea es representada por una línea, mientras que las columnas representan los días, semanas, o meses del programa, dependiendo de la duración del proyecto. El tiempo estimado para cada tarea se muestra a través de una barra horizontal cuyo extremo izquierdo determina la fecha de inicio prevista y el extremo derecho determina la fecha de finalización estimada. Las tareas se pueden colocar en cadenas secuenciales o se pueden realizar simultáneamente. Si las tareas son secuenciales, las prioridades se pueden confeccionar utilizando una flecha qué desciende de las tareas más importantes hacia las tareas menos importantes. La tarea menos importante no puede llevarse a cabo hasta que no se haya completado la más importante. A medida que progresa una tarea, se completa proporcionalmente la barra que la representa hasta llegar al grado de finalización. Así, es posible obtener una visión general del progreso del proyecto rastreando una línea vertical a través de las tareas en el nivel de la fecha actual. Las tareas ya finalizadas se colocan a la izquierda de esta línea; las tareas que aún no se han iniciado se colocan a la derecha, mientras que las tareas que se están llevando a cabo atraviesan la línea. Si la línea está cubierta en la parte izquierda, ¡la tarea está demorada respecto de la planificación del proyecto! Idealmente, un diagrama como este no debe incluir más de 15 ó 20 tareas para que pueda caber en una sola hoja con formato A4. Si el número de tareas es mayor, es posible crear diagramas adicionales en los que se detallan las planificaciones de las tareas principales. Acontecimientos Adicionalmente, es posible que los eventos más importantes, que no sean las tareas mismas, se muestren en la planificación como puntos de conexión del proyecto: estos se denominan acontecimientos. Los acontecimientos permiten que el proyecto se realice en fases claramente indentificables, evitando que se prolongue la finalización del mismo. Un acontecimiento podría ser la producción de un documento, la realización de una reunión o el producto final de un proyecto. Los acontecimientos son tareas de duración cero, representadas en el diagrama por un símbolo específico, frecuentemente un triángulo invertido o un diamante. Recursos Generalmente es posible (y útil) mostrar referencias en el diagrama, humanas o materiales, para permitir calcular el tiempo restante y tener una idea del costo global. Para ser más concisos, por lo general sólo serán necesarios las iniciales o los nombres de los responsables. Herramientas Proyecto GANTT"
- Diagrama de GANTT (ver en Google Sidewiki)

Aplicaciones para el OMNIA i900

martes, 15 de diciembre de 2009

Mas de 100 aplicaciones para MAC

Mac OS X keyboard shortcuts

Start up hot-keys (press key while booting)

X = Force Mac OS X startup
C = Start up from a bootable CD
N = Attempt to start up from a compatible network server (NetBoot)
T = Start up in FireWire Target Disk mode
Opt-Cmd-Shift-Delete = Seeks a different startup volume
Shift = Start up in Safe Boot mode
Cmd-V = Start up in Verbose mode
Cmd-S = Start up in Single-User mode

Cmd-Opt-Esc = Force Quit menu
Cmd-Opt-D = Show/hide the dock
Ctrl-Eject = Bring up Shutdown/Sleep/Logout Dialog
Ctrl-Cmd-Eject = Restart immediately

Clipboard

Cmd-C = Copy
Cmd-V = Paste
Cmd-X = Cut
Cmd-A = Select All

Finder Navigation

Cmd-N = New Finder window
Cmd-W = Close Window
Opt-Cmd-W = Close all Windows
Cmd-Down = Open File/Folder
Cmd-Up = Navigate to parent
Cmd-Right = Expand folder (in list view)
Cmd-Left = Collapse Folder (in list view)
Opt-Cmd-Right = Expand folder and its subfolders (in list view)
Opt-Cmd-Up = Open parent folder and close current window
Cmd-Shift-H = Jump to your Home folder
Cmd-Shift-A = Jump to your Applications folder
Cmd-Shift U = Jump to your Utilities folder
Cmd-Shift K = Jump to the Network browser
Cmd-Shift G = Goto Folder…
Cmd-1 = View as Icons
Cmd-2 = View as List
Cmd-3 = View as Columns
Cmd-Space = Open Spotlight (OS X 10.4)
Cmd-Delete = Move file/folder to trash
Cmd-Click window title = Display the file path


Menu Commands

Shift-Cmd-Q = Log out
Shift-Opt-Cmd-Q = Log out immediately
Shift-Cmd-Delete = Empty Trash
Opt-Shift-Cmd-Delete = Empty Trash without dialog
Cmd-H = Hide window
Opt-Cmd-H = Hide Others
Cmd-N = File New window
Shift-Cmd-N = New Folder
Cmd-O = Open
Cmd-S = Save
Shift-Cmd-S = Save as
Cmd-P = Print
Cmd-W = Close Window
Opt-Cmd-W = Close all Windows
Cmd-I = Get Info
Opt-Cmd-I = Show Attributes Inspector
Cmd-D = Duplicate
Cmd-L = Make Alias
Cmd-R = Show original
Cmd-T = Add to Favorites
Cmd-Delete = Move to Trash
Cmd-E = Eject
Cmd-F = Find
Cmd-Z = Undo
Cmd-B = Hide Toolbar
Cmd-J = Show View Opts
Cmd = [ = Go Back
Cmd = ] = Go Forward
Shift-Cmd-C = Go to Computer
Shift-Cmd-H = Go to your Home folder
Shift-Cmd-I = Go to iDisk
Shift-Cmd-A = Go to Applications folder
Shift-Cmd-G = Go to Go-To Folder
Cmd-K = Connect to Server
Cmd-M = Minimize Window
Cmd-? = Open Mac Help
Cmd-Space = Open Spotlight (OS X 10.4)

Screen capture

Cmd-Shift 3 = Capture the screen to a file
Cmd Ctrl Shift 3 = Capture the screen to the clipboard
Cmd-Shift 4 = Select an area to be captured to a file
Cmd Ctrl Shift 4 = Select an area to be captured to the clipboard
Cmd-Shift 4, then press Space = Capture entire window


Universal Access

Opt-Cmd-* (asterisk) = Turn on Zoom
Opt-Cmd-+ (plus) = Zoom in
Opt-Cmd– (minus) = Zoom out
Cmd-Opt-Ctrl-8 = Invert Screen colours

Window Management

Cmd-W = Close window
Cmd-Opt-W = Close all windows
Cmd-M = Minimise window
Cmd-Opt-M = Minimise all windows
Cmd-H = Hide Application
Cmd-~ = Cycle through windows for current application
Ctrl-F4 = Cycle through every open window
Cmd-Tab = Bring up the Application Switcher.
Cmd-Tab = Cycle Forwards
Cmd-~ = Cycle Backwards
Cmd-Shift-Tab = Cycle Backwards
Cmd-Q = Quit application

Expose

F9 = Show all open windows on the screen at once
F10 = Show all windows for the current application.
F11 = Shows Desktop
F12 = Activates Dashboard
F12 (hold) = ejects disk

Miscellaneous

Opt-Cmd-D = Show/Hide Dock
Ctrl-Up = Move up one page
Ctrl-Down = Move down one page
Opt-Drag = Copy to new location
Opt-Cmd-Drag = Make alias in new location
Cmd-Drag = Move to new location without copying
Opt-Cmd-Eject = Sleep
Cmd-click window toolbar button (upper right corner) = Cycle through toolbar views
Ctrl-Cmd-D and mouse over word in Cocoa applications = shows Dictionary description for that word


http://www.silvermac.com/mac-os-x-keyboard-shortcuts/

con referencia a: Publicación de entradas de Sidewiki en Blogger : Contribute with Sidewiki - Ayuda de Barra Google (ver en Google Sidewiki)

Portátiles de Apple: Calibración de la batería del equipo para un rendimiento óptimo

Resumen
Puedes calibrar la batería de iones de litio de tu iBook, PowerBook, MacBook, MacBook Air o MacBook Pro para obtener el mejor rendimiento posible.

La batería dispone de un microprocesador interno que ofrece una estimación de la cantidad de energía que hay en la batería conforme se carga y descarga. La batería necesita volver a calibrarse de vez en cuando para que el tiempo y el porcentaje de batería que aparecen en pantalla sean los correctos y para que la batería funcione con la máxima eficacia. Deberías realizar esta operación la primera vez que utilices tu ordenador y luego cada unos pocos meses. Si habitualmente dejas tu ordenador portátil Apple enchufado a la CA y utilizas la batería pocas veces, lo mejor sería realizar este proceso una vez al mes. En el sitio web http://www.apple.com/es/batteries/ encontrarás más información útil acerca de las baterías y un calendario iCal que te recordará cuándo debes calibrar tu batería.

con referencia a: Publicación de entradas de Sidewiki en Blogger : Contribute with Sidewiki - Ayuda de Barra Google (ver en Google Sidewiki)

Consejos para maximizar la carga de la batería del portátil

Resumen
Puedes seguir algunos sencillos pasos para prolongar la carga de la batería del portátil de Apple.

A continuación, se especifican algunos pasos y configuraciones sencillos que puedes llevar a cabo para sacar el máximo provecho de la batería de tu MacBook, MacBook Pro, iBook o PowerBook.

Productos afectados
Ordenadores portátiles

Optimiza la configuración de la batería en preferencias de Economizador.
En el menú Apple, selecciona Preferencias del sistema.
En el menú Ver, selecciona Economizador.
Haz clic en Mostrar detalles.
Selecciona Batería o Alimentación con batería en el menú emergente "Configuración para".
Selecciona Batería mejor o más larga en el menú emergente Optimizar configuración de energía.
Estas configuraciones pondrán el disco duro en el modo de reposo siempre que sea posible y reducirán el rendimiento del microprocesador del ordenador para maximizar la duración de la batería. Si estás utilizando aplicaciones que requieren un uso intensivo del procesador, es posible que desees cambiar estas configuraciones para que el rendimiento del microprocesador no se vuelva a ver reducido.



Ajusta el brillo de la pantalla según el nivel adecuado más bajo.
Pulsa las teclas F1 (más oscuro) y F2 (más brillante) para atenuar el brillo de la pantalla hasta que esté lo más bajo posible al mismo tiempo que se pueda ver la pantalla adecuadamente.



Desactiva la tecnología y opciones que no se utilicen.
Igual que apagas las luces de una habitación vacía, también puedes apagar la tecnología y opciones que no utilices para maximizar la duración de la batería. Aquí tienes unas cuantas sugerencias:

Saca los CD y DVD que no se estén utilizando. Cada cierto tiempo, la unidad óptica gira para leer el CD o DVD. Esto consume energía.
Desconecta los periféricos cuando no los estés utilizando. Los periféricos conectados, como impresoras y cámaras digitales, pueden consumir energía de la batería aunque no los estés utilizando.
Si te encuentras en un lugar en el que no necesitas utilizar AirPort o Bluetooth, puedes apagarlos para ahorrar energía.

Para desconectar el AirPort:

En el menú Apple, selecciona Preferencias del sistema.
En el menú Ver, selecciona Red.
En el menú Mostrar, selecciona Configuraciones de puerto de red.
Elimina la marca de verificación de AirPort.
Haz clic en Aplicar ahora.
Para desconectar el Bluetooth en Mac OS X 10.2 o posterior:

En el menú Apple, selecciona Preferencias del sistema.
En el menú Ver, selecciona Bluetooth.
Haz clic en la ficha Configuración.
Haz clic en Apagar Bluetooth.


Fte: http://support.apple.com/kb/HT1446?viewlocale=es_ES

con referencia a: Publicación de entradas de Sidewiki en Blogger : Contribute with Sidewiki - Ayuda de Barra Google (ver en Google Sidewiki)