viernes, 31 de julio de 2009

SOA

En Facultad nos enseñan que para comprender una realidad compleja se debe dividirla y de esta manera analizar cada componente y comprenderlo para luego analizar la totalidad de la realidad. Utilizaremos este método para definir la Arquitectura orientada a Servicio. Primero analicemos el término servicio.

Servicio tradicionalmente se ha utilizado para describir una función de negocio autocontenida, con una interfaz bien definida y estable, que recibe requerimientos de sus clientes. El servicio no depende del contexto de sus clientes y puede ser consumido por varios sistemas sin ser modificado. Los servicios son instalados (o desplegados) una única vez, esto lo diferencia de los componentes que deben ser incluidos dentro del contexto de cada aplicación que requiera de su uso y permanecen disponibles, sin consumir recursos hasta que son invocados.

Propiedades de un servicio:

· Interfaz bien definida

· Autocontenido

· No depende del contexto de sus clientes

· No requiere ser desplegado con cada cliente

Luego de definir servicio nos especificaremos arquitectura. Una definición reconocida es la de Clements: La Arquitectura de Software es, a grandes rasgos, una vista del sistema que incluye los componentes principales del mismo, la conducta de esos componentes según se la percibe desde el resto del sistema y las formas en que los componentes interactúan y se coordinan para alcanzar la misión del sistema. La vista arquitectónica es una vista abstracta, aportando el más alto nivel de comprensión y la supresión o diferimiento del detalle inherente a la mayor parte de las abstracciones.

Una vez aclarada la definición de servicio y arquitectura, podemos avanzar sobre la de SOA. Se podría definir como un estilo arquitectónico que propone modelar la empresa como una colección de servicios expuestos en la red. Nos propone ver a la empresa no como sistemas aislados si no como un todo.

La principal utilidad de los servicios web es que promueven la interoperabilidad entre diferentes plataformas, sistemas y lenguajes. Con servicios web, por ejemplo, sería posible integrar una aplicación Windows desarrollada con Microsoft .NET con una aplicación desarrollada en J2EE desplegada en un servidor de aplicaciones bajo un sistema Linux.

Alrededor de los Web services, que dominan el campo de un estilo SOA más amplio que podría incluir otras opciones, se han generado las controversias que usualmente acompañan a toda idea exitosa. Al principio hasta resultaba difícil encontrar una definición aceptable y consensuada que no fuera una fórmula optimista de mercadotecnia. El grupo de tareas de W3C, por ejemplo, demoró un año y medio en ofrecer la primera definición canónica apta para consumo arquitectónico, que no viene mal reproducir aquí:

Un Web service es un sistema de software diseñado para soportar interacción máquina-a-máquina sobre una red. Posee una interfaz descripta en un formato procesable por máquina (específicamente WSDL). Otros sistemas interactúan con el Web service de una manera prescripta por su descripción utilizando mensajes SOAP, típicamente transportados usando HTTP con una serialización en XML en conjunción con otros estándares relacionados a la Web

Un servicio es una entidad de software que encapsula funcionalidad de negocios y proporciona dicha funcionalidad a otras entidades a través de interfaces públicas bien definidas.

Los componentes del estilo (o sea los servicios) están débilmente acoplados. El servicio puede recibir requerimientos de cualquier origen. La funcionalidad del servicio se puede ampliar o modificar sin rendir cuentas a quienes lo requieran. Los servicios son las unidades de implementación, diseño e implementación.

Como todos los otros estilos, las SOA poseen ventajas y desventajas. Como se trata de una tecnología que está en su pico de expansión, virtudes y defectos están variando mientras esto se escribe.

SOA no es un concepto concreto para un área de la empresa, si no que dependiendo del punto de vista que se emplea. Ya que un ejecutivo de negocio lo puede ver como un conjunto de servicios de negocio, un arquitecto de software lo vera como un estilo arquitectónico y el desarrollador un conjunto de estándares, herramientas y tecnologías concretas que permiten llevar a cabo sus tareas.

miércoles, 29 de julio de 2009

¿Otro más?


Estaba leyendo un articulo y me llamo la atención que hay un lenguaje script soportado por la JVM de java que yo no conocía, Clojure muy parecido a List por lo poco que vi.

Esto me hizo reflexionar cuantos lenguajes conozco que corran sobre JVM. Acá va la lista:

-Jython

-JRuby

-Groovy

-Scala

-IoKe

-PHP

-BeanShell

-Rhino

-JavaFX

-Clojure

Y cuantos son soportados por spring, es decir que yo puedo hacer mi bean en uno de estos lenguajes:

-Groovy

-BeanShell

-JRuby

-Jython (esta adquisición fue hace muy poco: http://blog.springpython.webfactional.com/2009/07/01/spring-python-makes-final-1-0-0-release/)

Y ustedes conocen otro??

Java va a terminar soportando más lenguajes que .net?? (esto es broma no se enojen)


domingo, 26 de julio de 2009

Los poderes de Super Vaca


En Linux los poderes de Super Vaca son los poderes que tienen algunos programas, como apt-get, pero aptitude no tiene los poderes de super vaca y hay esta la mayor diferencia entre apt-get y aptitude.
$ apt-get
[...]
Este APT tiene poderes de Super Vaca.
$ aptitude --help
[...]
Este aptitude no tiene poderes de Super Vaca

aptitude, a diferencia que apt-get, no dispone de poderes de Super Vaca, que pueden comprobarse mediante:



$ apt-get moo

con lo que APT nos devolvería:


        (__)
(oo)
/------\/
/
* /\---/\
~~ ~~
...."Have you mooed today?"...



Sin embargo, en aptitude, al invocar la ayuda, dice:


$ aptitude help

[...]
-u : Descarga una nueva lista de paquetes al arrancar.
-i : Realiza una instalación al arrancar.

Este aptitude no tiene poderes de Super Vaca.




Sin embargo, invocando la opción «moo» y agregando v como parámetro, aptitude nos irá negando que posea huevos de pascua, hasta que finalmente confiesa. Según la versión, puede cambiar el contenido. En aptitude 0.4.0 en español, mostraría lo siguiente:


$ aptitude moo
No hay ningún huevo de pascua en este programa.
$ aptitude -v moo
Realmente no hay ningún huevo de pascua en este programa.
$ aptitude -vv moo
¿No le he dicho ya que no hay ningún huevo de pascua en este programa?
$ aptitude -vvv moo
¡Deje de hacer eso!
$ aptitude -vvvv moo
Vale, vale, si le doy un huevo de pascua, ¿se irá?
$ aptitude -vvvvv moo
De acuerdo, usted gana.

/----\
-------/ \
/ \
/
-----------------/ --------\
----------------------------------------------
$ aptitude -vvvvvv moo
¿Qué es? Un elefante siendo devorado por una serpiente, evidentemente.

Si siguiéramos añadiendo más «v», mostraría siempre la última respuesta. Este huevo de pascua es una referencia al libro El Principito.

Esta es la principal razón por la que yo uso apt-get y no aptitude. Los poderes de Super Vaca!!!

Open Source University

Sun abrio como una universidad libre, onda para compartir conocimiento, paso el link: http://studentdevelopers.ning.com/

Espero que lo disfruten.

this, self, Me y Yo!!!

this en un puntero a el mismo objeto. Bueno puntero en c++, para ser más generico es una referencia a si mismo, a nuestro mismo objeto. Por ejemplo:

this.hacerAlgo()

Es lo mismo que decir yo hago algo.
Este puntero a si mismo es muy útil. Ya que en un lenguaje no totalmente orientado a objeto. Como se que estoy llamando un método que esta dios sabe donde esta, o es un método que esta dentro de la clase. Con this queda mucho más claro.

Bueno this es en C++, java, php, javascript; es decir todos los derivados de c++.
self es en object pascal, simula, smalltalk y ruby.
Me es en visual Basic.

La verdad creo que es la primera (y va a ser la única) vez que diga que la gente de vb hizo bien las cosas. Me me parece más intuitivo, bueno self también esta bueno pero son 4 caracteres, mucho para escribir. Me es el ganador sin duda, intuitivo y corto.

Auque no entiendo porque ningún lenguaje uso I, es intuitivo y corto. Si programáramos en castellano seria “yo” que a mi por ser de lengua española me gusta más.
Por ejemplo podría escribir:

yo.voyAHacerAlgo();

Y ustedes, ¿que piensan cual es la palabra que les gusta más para referirse a nuestro mismo objeto? ¿this, self o Me?

viernes, 24 de julio de 2009

Inyección de dependencias


Originalmente, La inyección de dependencia se la llamaba de otra forma: inversión de control (IoC). Pero en un artículo escrito por Martin Fowler preguntaba qué aspecto del control se estaba invirtiendo. Llego a la conclusión de que la adquisición de la dependencia lo que se invertía. Basándose en esa revelación, acuño la frase “inyección de dependencia”, un término que describe mejor lo que ocurre.

Pero ahora bien ¿ qué es la inyección de dependencia? La wikipedia nos dice algo así: http://es.wikipedia.org/wiki/Inyección_de_dependencias

Cualquier aplicación no trivial está formada por dos o más clases que colaboran entre sí para realizar alguna lógica. Tradicionalmente cada objeto se hacía cargo de obtener sus propias referencias a los objetos a los cuales colaboraba (sus dependencias). Esto lleva a código acoplado y difícil de probar.

Cuando se aplica inyección de dependencia le decimos a una entidad externa que provea las dependencias a los objetos. Esto nos resuelve el problema del acoplamiento.

El acoplamiento es un mal necesario ya que sin él los objetos no podrían interactuar para resolver problemas, pero cuan menor sea el acoplamiento es más reutilizable, comprobable y flexible.

La ventaja clave de inyección de dependencia es el acoplamiento débil. Si un objeto solo conoce sus dependencias mediante su interfaz (no su implementación o como fueron definidos) entonces la dependencia puede intercambiarse con una implementación diferente sin que el objeto dependiente sepa la diferencia.

Por ejemplo si defino una interfaz la implementación de la misma pude ser un objeto plano, web service, objeto remoto, etc.

Inyección de dependencia es la llave para minimizar el acoplamiento.



Lua


Lua es luna en portuges y tambien es un lenguage de programación extensible diseñado para una programación procedimental general con utilidades para la descripción de datos. También ofrece un buen soporte para la programación orientada a objetos, programación funcional y programación orientada a datos. Se pretende que Lua sea usado como un lenguaje de script potente y ligero para cualquier programa que lo necesite. Lua está implementado como una biblioteca escrita en Climpio (esto es, en el subconjunto común de ANSI C y C++).

Siendo un lenguaje de extensión, Lua no tiene noción de programa principal (main): sólo funciona embebido en un cliente anfitrión, denominado programa contenedor o simplemente anfitrión (host). Éste puede invocar funciones para ejecutar un trozo de código Lua, puede escribir y leer variables de Lua y puede registrar funciones C para que sean llamadas por el código Lua. A través del uso de funciones C, Lua puede ser aumentado para abarcar un amplio rango de diferentes dominios, creando entonces lenguajes de programación personalizados que comparten el mismo marco sintáctico. La distribución de Lua incluye un programa anfitrión de muestra denominado lua, que usa la biblioteca de Lua para ofrecer un intérprete de Lua completo e independiente.


Los programas en Lua no son interpretados directamente, sino compilados a código bytecode, que es ejecutado en la máquina virtual de Lua. El proceso de compilación es normalmente transparente al usuario y se realiza en tiempo de ejecución, pero puede hacerse con anticipación para aumentar el rendimiento y reducir el uso de memoria al prescindir del compilador.


Debido a que Lua compilado es pequeño, veloz y tiene una licencia permisiva ha ganado seguidores entre los desarrolladores de videojuegos. Algunos usos de Lua:

World of Warcraft, donde el usuario tiene la posibilidad de personalizar casi completamente la interfaz creando añadidos que permiten informarle de cualquier cosa en su correspondiente carpeta Interface en la qué el WoW.exe tiene el intérprete de lua y ejecuta en su Interface el Addon creado en lua.

También en un mod tipo "sandbox" para Half-Life 2 llamado Garry's Mod, pudiendo modificarlo casi completamente. Gran parte de Garry's Mod está escrito en lua.

También en un mod para Half-Life 2 llamado Fortress Forever que permite configurar altamente los mapas.

El RTS a gran escala Supreme Commander, el cual es modificable por el usuario en casi todos sus aspectos.

El juego de RPG Tibia

Parte de S.T.A.L.K.E.R. - Shadow Of Chernobyl, permitiendo al jugador modificar armas, armaduras y aspectos varios del juego.

Grim Fandango y La Fuga de Monkey Island (cuarta entrega de la saga Monkey Island) utilizan internamente scripts en Lua para definir la historia y los eventos que ocurren durante la partida.

Worms 4: mayhem utiliza lua y xml para definir las misiones y desafios.

Mediante un programa casero(o homebrew), el LuaPlayer, permite ejecutar archivos .lua en la conocida consola portatil de Sony.

Ragnarok Online usa LUA para programar la inteligencia artificial de los homunculos.

Regnum Online usa LUA para la mayoria de scripts del juego como interfaz, modo de juego, acciones, étc.

Lua es software libre, y se proporciona, como es usual, sin garantías, como se establece en su licencia. La implementación descrita en este manual está disponible en el sitio web oficial de Lua, www.lua.org.

miércoles, 22 de julio de 2009

Y te gustan esos raros Lenguajes nuevos...

Estuve leyendo sobre lenguajes script y encontré gran similitud entre Ruby y SmallTalk. Le dejo un link que es muy recomendable leer:

http://www.rubyist.net/~slagell/ruby/index.html

No solo porque explica Ruby; sino que se ve como el creador de Ruby va buscando todo lo bueno de otros lenguajes para agregarlo a Ruby.

Hay otros lenguajes nuevos basados en ruby por ley transitiva en smalltalk:

Scala : http://www.scala-lang.org/

Groovy: http://groovy.codehaus.org/

Si bien tienen operadores (if, for, while) son mucho más puros. Lo bueno de estos últimos es que corren en la JVM de java. Bueno jRuby corre también jvm.

Por ejemplo scala tiene dos formas de que un objeto envié un mensaje a otro.

1 + 1 (se envía el mensaje + con un espacio sintaxis smalltalk)

1.+(1) (se envía un mensaje con sintaxis java)

Personalmente me gusta mucho scala.

¿Conocen otros lenguajes nuevos? ¿Cuál les gusta más?

martes, 21 de julio de 2009

POO = Herencia

Cuando pensamos en POO siempre caemos en que cuanto más usemos herencia más orientado objeto esta. Y claramente no es así. Es decir si tenemos este pensamiento estamos comenzando con el pie izquierdo; estamos pensando en "programación orientada a clases". Claro estamos generalizando de ante mano.

Lo ideal (que no quiere decir que en el día a día lo haga) es imaginar el problema con solo objetos. Una representación del problema; como una simulación. Sin interesarnos en clases, datos, etc.

Luego que ya entendimos el problema; pensamos como se comportan los objetos. Hay objetos que se comportan similar y los podemos generalizar entonces tenemos nuestra clase!!!

Hora tenemos un conjunto de clases y vemos que algunas tienen el mismo comportamiento, entonces podemos generalizar en una clase padre.

Claro esta que esto en teoría es muy fácil, el problema es la práctica. Veamos un problema aparentemente fácil, una academia donde tenemos alumnos y profesores. Fácil no? Una clase persona de la cual heredan la clase Alumno y Profesor. Muy fácil !!!

Momento ... y si un alumno también es profesor. Mmm... NO era tan fácil.

Con el modelo presentado hacemos agua, donde estuvo el error el primer paso, NO ENTENDIMOS EL PROBLEMA!!!

Lo escrito no es un descubrimiento filosófico ni un pensamiento que va a cambiar tu vida profesional. Simplemente una reflexión y recordatorio, antes de pensar en herencia y clases; pensemos: ¿entiendo el problema?



Liks de Web services

Mis próximas lecturas sobre web services van a ser las siguientes:

Primero infoq (hace bastante) saco una comparativa sobre web services open source en java este es el link:

http://www.infoq.com/articles/os-ws-stacks-background

Comparativa entre cxf, axis 2, Metro, Spring WS; ventajas y desventajas de cada uno de los frameworks.

Segundo; cortito y al pie una lista de buenas prácticas a la hora de desarrollar web services; dejo el link:

http://jcesarperez.blogspot.com/2009/06/buenas-practicas-para-desarrollar.html

Muy buena info a la hora de desarrollar web services.



viernes, 17 de julio de 2009

Platon sera programador ??

Platon creía que antes de reencarnarse todas las almas beben agua del río Ameles olvidando de este modo su vida anterior, y reinician el proceso de purificación hasta su retorno al mundo de las Ideas. De esta forma nosotros traíamos conocimiento a este mundo pero olvidado. Por lo tanto el proceso de aprendizaje era recordar lo que sabíamos.

Aristoteles lejos de coincidir con Platon creía que el conocimiento era enteramente construido en este mundo. Es decir que adquiríamos todo el conocimiento.

Piaget nació unos cuantos siglos después y puso luz al asunto diciendo que hay conocimiento que aprendemos y otras habilidades la traemos con nosotros y a medida que la usamos, las pulimos, las intensificamos.

Sin duda la teoría de Piaget es la que creo más cerca de la verdad. Y la vivo que es peor ya que por más que lo intente no creo tener habilidad para ciertos deportes (casi todos).

¿Que piensan la capacidad de resolver un problema computacional es adquirido? ¿Todos tenemos la habilidad de programar en java, php, u otro lenguaje? ¿Programador se nace o hace?
Les dejo estas dudas existenciales.

Blogs Amigos

Esta entrada es para invitarlos a mirar, leer y aportar a dos blogs:

El primero a presentar es el de un compañero y amigo Diego Graf es lo mas abarcativo posible para despertar el interés de todos y que el blog sea material de consulta y de lectura de temas de actualidad. http://diegograf.blogspot.com/

El otro es un blog social de otro compañero Marino Testaseca (espero haber escrito bien el apellido), Blog de cultura, reflexión y pensamientos (que no todo es tecnología). http://muchosmundosenuno.blogspot.com/

Muy buenos blogs!!!

Además los voy a agregar como blogs amigos.



jueves, 16 de julio de 2009

IOKE

Ioke es un lenguaje que mezcla la programación funcional con la orientada a objeto (similar a scala)
Pero Ioke es un desconocido, no se bien porque. Pero esta muy bueno el lenguaje y lo mejor de todo corre sobre jvm de java.

Les dejo la url de la wiki : http://ioke.org/wiki/index.php/Guide

Libros

Gente encontre este link con libros muy bueno!!!

ECMAScript for XML (E4X)

Bueno, Me encontraba leyendo un manual de actionscript y decía que implementa E4X, si , si , soy informático y me encantan las siglas pero que es E4X? Leyendo http://en.wikipedia.org/wiki/ECMAScript_for_XML supe que es un lenguaje que permite que un archivo xml sea soportado como un tipo más del lenguaje.

ActionScript implementa este lenguaje y permite hacer cosas como estas:

Crear un xml:

var empleado:XML = <empleado> </empleado>;
empleado.nombre = "Pedro";
empleado.apellido = "Godoy";
empleado.@id = 234;

var otroEmpleado:XML = <empleado> </empleado>;
otroEmpleado.nombre = "Andres";
otroEmpleado.apellido = "Godoy";
otroEmpleado.@id = 224;

var empleados:XML = <empleados> </empleados>;;
empleados.appendChild(empleado);
empleados.appendChild(otroEmpleado);

ejemploText.text = empleados.toXMLString();

Y la salida va a ser esto:

<empleados>
<empleado id="234">
<nombre>Pedro</nombre>
<apellido>Godoy</apellido>
</empleado>
<empleado id="224">
<nombre>Andres</nombre>
<apellido>Godoy</apellido>
</empleado>
</empleados>

Para recorrer un xml se podria hacer algo así:

var orden:XML =
<order>
<item id='1'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>;
ejemploText.text = "Imprime el precio del item 1 \n";
ejemploText.text += orden.item.(@id == 1).price;
ejemploText.text += " \n \n ";
ejemploText.text += "Imprime los items id < 3 \n"; ejemploText.text += orden.item.(@id < 3).toXMLString();

Como ven el @ permite acceder a los atributos de un tag y con el . puedo acceder a elementos del xml.

Que Grande E4X !!!!!!

miércoles, 15 de julio de 2009

Apache Camel

Encontre estos tutoriales de apache camel: http://www.tecsisa.com/index.igw?item=1631

Muy bueno!!!


Apache Camel es una implementación de los patrones para integración empresarial descritos en el libro Enterprise Integration Patterns de Gregor Hohpe y Bobby Woolf hecha en Spring.
Estos patrones de diseño permiten integrar sistemas heterogéneos usando sistemas de Mensajería. Actualmente Apache Camel soporta un gran número de transportes de mensajería, como JMS, ActiveMQ, CXF Bus, JBI e incluso HTTP simple.

Anuncios Google

Gente Linda, me dieron una cuenta de AdSense, así que si presionan sobre los link de publicidad google va a compartir conmigo su riqueza. Por lo tanto no voy a tener que trabajar tanto y entonces voy a tener más Tiempo; y voy a poder agregar más entradas al Blog.

Además agrege un boton para donar plata, dolares o cualquier cosa que quieran donar.

Quiero expresar mi agradecimiento a todos los que me ayudaron en el Blog.


lunes, 13 de julio de 2009

Que es ORM ?

Mapeo Objeto Relacional (ORM) ,en otras palabras persistir los objetos Java en una base de datos relacional ha tenido su mayor cambio recientemente, gracias, en parte a la proliferación de métodos
avanzados que intentan hacer esta tarea mas fácil .
Entre estas tecnologías están los Entity Beans 2.x , TopLink , Hibernate , JDO , y también JDBC con DAO. Con muchas alternativas incompatibles , el grupo Java EE experto toma inspiración de estos frameworks
populares y creo el api de persistencia de Java (JPA) , el cual se puede usar desde aplicaciones Java EE o SE.
En pocas palabras JPA , usa el modelo de programación POJO para la persistencia. A pesar de que este modelo esta incluido en la especificación EJB 3 , JPA puede ser usado fuera de un contenedor
EJB , y esta es la forma que será usada en este articulo . “Plain Old Java Objects” ( POJO ) ejecutándose en una aplicación Java SE.

Como trabaja JPA ?
Inspirado en los frameworks como Hibernate , JPA usa anotaciones para mapear objetos a la base de datos relacional. Estos objetos , usualmente llamados entidades, no tienen nada en común con los Entity Beans 2.x . Las entidades JPA son clases
POJOs, no extienden de ninguna clase y no implementan ninguna interface.
Usted no necesita archivos descriptores XML para hacer los mapeos . Si uno se fija en el API ( java doc ) uno observara que esta compuesto de pocas clases e interfaces.
La mayoría del contenido de el paquete javax.persitence son anotaciones. Con esto explicado , veremos el siguiente ejemplo de código:

@Entity
public class Customer {
@Id
private Long id;
private String firstname;
private String lastname;
private String telephone;
private String email;
private Integer age;
// constuctors, getters,
setters
}

35 sitios para descargar plantillas css

El web master publico un articulo en el que muestra 35 sitios para

descargar.

A disfrutar!!!

http://www.elwebmaster.com/articulos/35-sitios-destacados-para-descargar-plantillas-css-gratuitas

jueves, 9 de julio de 2009

¿ Como Configurar virtual host con Tomcat ?

Para configurar virtual host en Tomcat es muy fácil tenemos que seguir
los siguientes pasos:


Ir a el archivo server.xml ($CATALINA_HOME/conf/ ) y agregar los host
(en el ejemplo vamos a configurar prueba1.com y prueba2.com)










server.xml
original



Nuevo
server.xml



<Host
name="localhost" appBase="webapps"


unpackWARs="true"
autoDeploy="true"


xmlValidation="false"
xmlNamespaceAware

="false">








</Host>



<Host
name="prueba1.com" appBase="webapps"


unpackWARs="true"
autoDeploy="true"


xmlValidation="false"
xmlNamespaceAware="false">


</Host>





<Host
name="prueba2.com" appBase="otroWebapps"


unpackWARs="true"
autoDeploy="true"


xmlValidation="false"
xmlNamespaceAware

="false">


</Host>



Podemos ver que en prueba1.com se van a encontrar las aplicaciones
desplegadas en webapps y en prueba2.com las de otroWebapps.


Para poder probar su correcto funcionamiento agregamos la siguiente
entrada a /etc/host





127.0.0.1 localhost
prueba1.com prueba2.com

Para que tome las url, luego reinicie el servidor.





./etc/init.d/tomcat6
restart


Al ingresar a http://prueba1.com:8080 vera las aplicaciones deplogeadas en webapps y al ir http://prueba2.com:8080 las de otroWebapps.



¿ Como Configuración de Realms ?


En Apache Tomcat no existe el concepto htaccess como se entiende en Apache. Para obtener este comportamiento se deben configurar realms.

Un realm es una “base de datos” de usuarios y passwords que nos sirve para implementar un mecanismo de autenticación para
aplicaciones Web. Se puede pensar en roles similar a
grupos
de unix/linux, y se puede dar permisos de acceso a un recurso a un grupo.

En muchos casos es deseable que se autentique con mecanismos ya implementados dentro de una aplicación. Para esto Apache tomcat define una serie interfaces java que se encuentran en el paquete

org.apache.catalina.Realm; se puede implementar “plug in” para establecer esta conexión.
Tomcat provee 5 formas estándares para autenticación:


JDBCRealm:
Autenticación contra una base de datos relacional usando driver jdbc.





<Realm className="org.apache.catalina.realm.JDBCRealm" 
debug="99"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/authority? user=dbuser&amp;password=dbpass"
userTable="users"
userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>

Para el ejemplo se debe tener las siguientes tablas en la base de datos:




create table users (
user_name varchar(15) not null primary key,
user_pass varchar(15) not null
);

create table user_roles (
user_name varchar(15) not null,
role_name varchar(15) not null,
primary key (user_name, role_name)
);


DataSourceRealm:
Autenticación contra una base de datos relacional, accedida vía un
nombre JNDI JDBC DataSource.





<Realm className="org.apache.catalina.realm.DataSourceRealm" 
debug="99"
dataSourceName="jdbc/authority"
userTable="users"
userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>

Para el ejemplo se debe tener las siguientes tablas en la base de datos:


create table users (
user_name varchar(15) not null primary key,
user_pass varchar(15) not null
);

create table user_roles (
user_name varchar(15) not null,
role_name varchar(15) not null,
primary key (user_name, role_name)
);

JNDIRealm:
Autenticación contra una base de datos LDAP, accedida vía un nombre JNDI provider.



<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99"
connectionURL="ldap://localhost:389"
userPattern="uid={0},ou=people,dc=mycompany,dc=com"
roleBase="ou=groups,dc=mycompany,dc=com"
roleName="cn"
roleSearch="(uniqueMember={0})"
/>


Para el ejemplo se debe tener las siguientes estructura en el ldap:




# Define top-level entry
dn: dc=mycompany,dc=com
objectClass: dcObject
dc:mycompany

# Define an entry to contain people
# searches for users are based on this entry
dn: ou=people,dc=mycompany,dc=com
objectClass: organizationalUnit
ou: people

# Define a user entry for Janet Jones
dn: uid=jjones,ou=people,dc=mycompany,dc=com
objectClass: inetOrgPerson
uid: jjones
sn: jones
cn: janet jones
mail: j.jones@mycompany.com
userPassword: janet

# Define a user entry for Fred Bloggs
dn: uid=fbloggs,ou=people,dc=mycompany,dc=com
objectClass: inetOrgPerson
uid: fbloggs
sn: bloggs
cn: fred bloggs
mail: f.bloggs@mycompany.com
userPassword: fred

# Define an entry to contain LDAP groups
# searches for roles are based on this entry
dn: ou=groups,dc=mycompany,dc=com
objectClass: organizationalUnit
ou: groups

# Define an entry for the "tomcat" role
dn: cn=tomcat,ou=groups,dc=mycompany,dc=com
objectClass: groupOfUniqueNames
cn: tomcat
uniqueMember: uid=jjones,ou=people,dc=mycompany,dc=com
uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com

# Define an entry for the "role1" role
dn: cn=role1,ou=groups,dc=mycompany,dc=com
objectClass: groupOfUniqueNames
cn: role1
uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com

MemoryRealm:

Autenticación contra una colección de objetos user que se
encuentran en memoria estos usuarios se cargan al iniciar el servidor del archivo conf/tomcat-users.xml




<Realm className="org.apache.catalina.realm.MemoryRealm"
pathname="$CATALINA_HOME/conf/tomcat-users.xml"
/>


Para el ejemplo se debe agregar los usuarios a $CATALINA_HOME/conf/tomcat-users.xml




<tomcat-users>
<user name="tomcat" password="tomcat" roles="tomcat" />
<user name="role1" password="tomcat" roles="role1" />
<user name="both" password="tomcat" roles="tomcat,role1" />
</tomcat-users>

JAASRealm:
Autenticación usando Java Authentication & Authorization
Service (JAAS) framework.






<Realm className="org.apache.catalina.realm.JAASRealm"                 
appName="MyFooRealm"
userClassNames="org.foobar.realm.FooUser"
roleClassNames="org.foobar.realm.FooRole"
debug="99" />


Pero también es posible escribir nuestras propias implementaciones y integrarlas con tomcat, para esto necesitaremos:

  • Implementar org.apache.catalina.Realm.


  • Agregar el jar en $CATALINA_HOME/lib


  • Declarar el realm.


  • Declarar el realm en el Mbeans Descriptor.


Luego
de entender como el funcionamiento de los Reamls vamos a explicar como se configuran:


Se debe agregar el tag Realm





<Realm
className="... clase que implementa
org.apache.catalina.Realm"


...
otros atributos.../>



El elemento Realm puede estar contenido en los siguientes elementos:

  • Dentro de un elemento <Engine>:
    Este elemento es compartido por todos los virtual host
    y
    todas las aplicaciones web. Se puede pisar con los realms
    configurados en
    <Host>
    o
    <Context>.


  • Dentro de un elemento <Host>:
    Este elemento es por virtual host y todas las aplicaciones web que se encuentran en el mismo. Se puede pisar con los realms configurados en
    <Context>.


  • Dentro de un elemento <Context>:
    Este elemento es por aplicación web.




¿ Como desplegar aplicaciones web en Tomcat ?

Para

desplegar aplicación web en Tomcat solo se debe parar el servidor:


Para
distribuciones debian en las que se instalo tomcat:







invoke-rc.d
tomcat6 stop



Para cualquier distribución que se allá instalado tomcat:





./etc/init.d/tomcat6
stop



Paraversiones descomprimidas:







./$CATALINA_HOME/bin/shudown.sh







Mover
la aplicación al directorio configurado en context que se usara para el despliegue. Por ejemplo se desplegara una aplicación llamada myaplicacion al directorio webapps





mv myaplicacion.war $CATALINA_HOME/webapps


Donde $CATALINA_HOME contiene el path donde se instalo el tomcat.

Levantar tomcat:


Para distribuciones debian en las que se instalo tomcat:





invoke-rc.d
tomcat6 start

Para cualquier distribución que se allá instalado tomcat:




./etc/init.d/tomcat6
start





Para versiones descomprimidas:




./$CATALINA_HOME/bin/start.sh


De esta forma la url donde se desplegara la aplicación sera

http://localhost:8080/myaplicacion/


Muchas veces deseamos desplegar aplicaciones de forma que la URL para acceder sea http://host para esto lo
primero que hay que hacer es configurar el tomcat para que escuche el puerto 80. Cambiando el atributo port a 80 del tag Connector del archivo server.xml.




<Connector
port=”80” ...


Luego desplegar la aplicación pero cambiando el nombre del war a ROOT.war



mv myaplicacion.war $CATALINA_HOME/webapps/ROOT.war


Si se encuentra la carpeta ROOT cambiarle el nombre o borrarlo. En el ejemplo cambiamos el nombre.






mv ROOT ROOT_


Levantar el tomcat y listo!