Translate

lunes, 27 de septiembre de 2010

Concurrencia en Erlang



Erlang es un lenguaje de programación de propósito general, que como mayor característica es un lenguaje funcional el cual implementa el paradigma funcional por medio del modelo de actores. Como es esto?

Erlang tiene un proceso basado en modelo de concurrencia con pasaje de asíncrono de mensajes.

El modelo de actores es un modelo de concurrencia computacional que trata a los "actores" como los primitivos universal de la computación digital en paralelo: en respuesta a un mensaje que recibe, un actor puede tomar decisiones locales, crear más actores, envía más mensajes, y determinar cómo responder al siguiente mensaje recibido.

Veamos un pequeño ejemplo:

-module(counter).
-export([start/0,loop/1]).

start() ->
spawn(counter, loop, [0]).

loop(Val) ->
receive
increment -> loop(Val + 1)
end.

En este ejemplo se muestra:
  • Un nuevo proceso contador inicia por cada llamada a counter:start/0 . Cada función evalua counter:loop/0.
  • Una función recursiva para generar un proceso permanente que se suspende cuando espera de la entrada. Lazo es una función recursiva de cola, que asegura que un proceso contra evaluará en el espacio constante.
  • Recepción de mensajes selectivos, en este caso el incremento de mensajes.

El modelo de actores también fue tomado por Scala para implementar la concurrencia computacional.

El modelo de Actores de Scala proporciona envios de mensajes síncronos y asíncronos (este último se implementan mediante el intercambio de varios mensajes asíncronos). Por otra parte, los actores pueden comunicarse con el futuro en que las solicitudes se gestionan de forma asíncrona, pero devuelven una representación (el futuro) que queda a la espera de la respuesta.
Lo bueno de scala es que los actores los cuales se puede usar beneficios de la programación orientada a objetos.


Dejo links:
http://www.erlang.org
http://ruben.savanne.be/articles/concurrency-in-erlang-scala

viernes, 24 de septiembre de 2010

Noticias de la JDK en la JavaOne

Todo el mundo Java esta mirando lo que sucede en la JavaOne, para el que no sabe es el evento Java más importante organizado en su momento por Sun ahora por Oracle.

Entre lo más relevante para mi es los cambios y fechas para las nuevas jdks digo jdks que oracle piensa sacar 2 versiones el año que viene una Java 7 el proyecto coin, que ya lo nombramos anteriormente.

http://emanuelpeg.blogspot.com/2009/09/las-novedades-del-jdk-7.html

La otra versión Java 8 proyecto Jigsaw saldrá para fines del año siguiente con Clousures y modularización de la JDK.

Otras novedades es que la OpenJDK esta en un 98% y el 2% que queda son cosas que casi ni se usan. Por lo tanto esta casi a punto caramelo.

Esto es un muy humilde resumen de lo relevante a la JDK. A mi entender es positivo que java siga progresando y que Oracle no deje a Java quedarse en el tiempo.

domingo, 19 de septiembre de 2010

Lift Web Framework


Lift es otro framework web. El cual corre bajo la plataforma java, pero usa Scala como lenguaje. Si miramos la pagina de lift nos indica que es seguro, productivo y fácil de mantener.

Lift nació con las virtudes de frameworks web más famosos como Rails y Django. Lift tiene la ventaja del lenguaje scala que al ser un lenguaje script y multiparadigma permite desarrollar rápidamente, pero como corre en la plataforma java se puede comunicar con librerías jar ya desarrolladas.

Lift puede empaquetarse como un war y funcionar en cualquier servidor web java como Tomcat o Jetty.

Lift es un proyecto open source distribuido bajo licencia Apache V2.0

Dejo, como siempre, links:

http://liftweb.net/

http://lift-example.appspot.com/


miércoles, 15 de septiembre de 2010

SyntaxHighlighter

Luego de un consejo de un importante lector del blog (Roman) , y varios comentarios de diferentes lectores hemos agregado un formateador de código!!

Un esfuerzo más para que los lectores se sientan más cómodos, el plugin que agregamos se llama SyntaxHighlighter, dejo la pagina y una demostración.

http://alexgorbatchev.com/SyntaxHighlighter


package tutorial;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorld extends ActionSupport {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String execute() {
name = "Hello, " + name + "!";
return SUCCESS;
}
}

lunes, 13 de septiembre de 2010

¡Feliz día del programador!

Hoy es el 256º día del año, de modo que –apropiadamente– se celebra el Día del programador. Según parece en Rusia además consiguieron que fuera oficialmente un día festivo para quienes se dedican a ello como profesión.

Aprender a programar en Ruby


Encontré un libro muy recomendable para aprender a programar en Ruby

http://pine.fm/LearnToProgram/

Espero que les sea útil!!!

sábado, 11 de septiembre de 2010

Editor HTML online.

Siempre que tengo que editar algo en HTML, CSS o hacer algo con javascript, jquery, etc dudo, dado que no trabajo todos los días con estas tecnologías la memoria juega una mala pasada. Una practica interesante es ir a un blog de notas probar lo que se quiere hacer y luego aplicarlo en la pagina, esto es muy bueno especialmente cuando se esta probando algo en javascript.

Buscando en internet encontré una pagina que permite editar HTML, javascript, etc. online. Esta muy no necesito más el blog de notas, además se pueden importar librerías como jquery, prototype, dojo, etc.

http://jsbin.com/unuyi/edit#source

Espero que les sea útil!!!

sábado, 4 de septiembre de 2010

FUSE


FUSE es una comunidad que promueve el uso de productos Apache para el uso de SOA. La idea es crear una comunidad Open Source de uso de SOA, de esta forma poder compartir experiencias, conocimiento, etc.

Dejo el link: http://fusesource.com/

viernes, 3 de septiembre de 2010

Apache click y dobleClick


Apache click es un framework web, diseñado para ser eficiente y fácil de desarrollar, si tenemos en cuenta estos objetivos comprobamos que cumple altamente con las expectativas, resumiendo “alto framework”. La única desventaja es que esta muy inmaduro todavía, por ejemplo no trae una forma estándar de integrarse con Spring. Pero no todo esta perdido existe un proyecto llamado doble click que integra Apache click con Spring y ofrece unas anotaciones que nos hacen la vida más fácil aun.
Bueno vamos hacer un ejemplo, creamos un proyecto web con maven.

$ mvn archetype:create -DarchetypeartifactId=maven-archetype-webapp -DgroupId=com.example -DartifactId=example-war-project

Luego agregamos las dependencias al pom:

<!-- Apache Click -->

<dependency>
<groupId>org.apache.click</groupId>
<artifactId>click</artifactId>
<version>2.2.0</version>
</dependency>

<dependency>
<groupId>org.apache.click</groupId>
<artifactId>click-extras</artifactId>
<version>2.2.0</version>
</dependency>

<dependency>
<groupId>org.apache.click.doubleclick</groupId>
<artifactId>inject</artifactId>
<version>1.0</version>
</dependency>

<dependency>
<groupId>org.apache.click.doubleclick</groupId>
<artifactId>injectspring</artifactId>
<version>1.0</version>
</dependency>

<!-- /Apache Click -->

Necesitamos el siguiente repositorio:

<repositories>
<repository>
<id>doubleclick-repo</id>
<url>https://doubleclick.googlecode.com/svn/repo/</url>
</repository>
</repositories>

Ahora debemos configurar web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
<display-name>Web Application</display-name>
<description>Web Application</description>

<servlet>
<servlet-name>ClickServlet</servlet-name>
<servlet-class>org.apache.click.ClickServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>ClickServlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>redirect.html</welcome-file>
</welcome-file-list>

</web-app>

Tenemos que crear un html redirect.html dado que el interceptor no puede tomar la pagina de inicio ya que el filtro dice *.htm entonces hacemos el redirect.htm:

<html>
<head>
<meta http-equiv="Refresh" content="0;URL=home/home.htm">
</head>
</html>

Ahora todas las paginas van a ir a home/home.htm, las paginas de apache click estan formadas con 2 archivos un htm y una clase java. Pero antes de crear estos archivos veamos el archivo click.xml necesario para que funcione apache click:

<?xml version="1.0" encoding="UTF-8"?>
<click-app>

<pages package="com.example.web"/>

<page-interceptor classname="org.apache.click.doubleclick.inject.DependencyInjectorPageInterceptor"
scope="application"/>

<controls>
<control classname="org.apache.click.doubleclick.injectspring.SpringControl" />
</controls>

</click-app>

Ahora veamos la HomePage.java :

/**
*
*/
package com.example.web.home;


/**
* Home Page
*
* @author emanuel
*
*/
public class HomePage extends Page {

private static final long serialVersionUID = -2868696724309671438L;

@InjectBean
private String title;

private String titlePage

@Override
public void onInit() {
this.titlePage = "Home";
}

}

Veamos home.htm :

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="keywords" content="blog" />
<meta name="description" content="Blog Website" />

<title>Example - $titlePage </title>

</head>

<body>

<h1> $title </h1>

</body>
</html>

Buenísimo, ahora vamos a configurar applicationContext.xml de Spring :

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


<bean id="hola" class="java.lang.String" >
<constructor-arg index="0" value="HOLA MUNDO!!" />
</bean>

</beans>

Y con esto terminamos, como ven doble click injecta el bean hola por medio de inferencia por tipo.

Espero que les guste el ejemplo, dejo links como siempre:

http://click.apache.org/
http://code.google.com/p/doubleclick/wiki/clickspring
http://emanuelpeg.blogspot.com/2010/02/apache-click.html

sábado, 28 de agosto de 2010

Firebug para jquery


Firebug es un plugin para firefox imprescindible para un desarrollador web, dado que nos permite entre otras funcionalidades debugear javascript.

Existen diferentes extenciones de firebug, entre ellas encontré fireQuery, que nos facilita el debug para cuando usamos JQuery.

Dejo los links:

http://firequery.binaryage.com/

martes, 17 de agosto de 2010

Flex 4


Flex 4 hace rato que esta en el mercado, pero husmeando por MadeInFlex encontré un recopilado de nuevas características. Como sabrán Flex 4 cambio bastante, tanto que tuvo que romper compatibilidad con la versión 3.
Dejo el link:

http://www.madeinflex.com/2010/08/15/serie-introduccion-flex4/

Léanlo que esta bueno.

Saludos!!

domingo, 15 de agosto de 2010

Libro Gratuito de SEO

En un momento libre de mi vida (hace un rato) me puse a hacer seo y a investigar un poco para posicionar el blog, googleando encontré el siguiente libro gratuito:

http://www.slideshare.net/IAB_Spain/seo-optimizacin-de-webs-para-buscadores-buenas-prcticas-y-resultados

sábado, 14 de agosto de 2010

Productos BPM Open Sources

En el mercado existen gran variedad de herramientas BPM y BPEL open source, las más importantes son:

  • Intalio BPM (edición community) : Herramienta BPM rica en funcionalidades que utiliza la noción de modelado de procesos de negocio BPMN para generar orquestaciones basadas en BPEL. Al ser una versión open source de un producto comercial utiliza librerías de la versión de pago, este software fue concebido para permitir el desarrollo y luego cuando se ponga en producción se compre la versión estándar.
  • Motor ActiveBPEL: Motor BPEL eficiente y sumamente cuidado. Los modelos pueden diseñarse utilizando su herramienta Designer que es gratuita pero no es open source. La funcionalidad más importante, como puede ser las instancias de procesos persistentes a una base de datos o el control de versión de los procesos, únicamente esta disponible en la versión Enterprise.
  • Apache ODE: Apache ODE (Orchestation Director Engine) es un motor BPEL de ejecución de procesos. Su API permite extenderlo de muchas maneras y por lo tanto, no esta limitado a utilizar únicamente SOAP. Es un motor liviano que puede integrarse fácilmente con productos de Apache como Service Mix. Apache ODE no posee editor gráfico para deseñar los procesos pero se puede contar con un plugin que se puede instalar en Eclipse.
  • Jboss JBPM: Es un motor de workflow maduro, eficiente y ligero que va siempre de la mano de la herramienta de modelado basado en Eclipse. Usa su propio lenguaje de grafo en xml llamado jPDL (jBPM process Definition Language) y tiene soporte para todos los nodos de modelado principales, como puede ser las decisiones y las bifurcaciones. Se puede extender de manera sencilla y no está restringido su uso a ningún entorno de despliegue. A diferencia de otras alternativas, no existe una actualización a la versión comercial y no hay ninguna funcionalidad que esté restringida.
  • ObjectWeb Bonita: Se trata de un motor de workflow potente y compatible con XPDL. Es un proyecto maduro y bien documentado. Incluye excelente integración con herramientas graficas de actividades humanas (por ejemplo, un generador de formularios) No dispone de ningún editor de software libre y necesita el servidor de aplicaciones JOnAS (Java Open Application Server)
  • WSO2 Bussiness Process Server: El producto está basado en Apache ODE e incluye una interfaz administrativa basada en la Web y funcionalidades de simulación.
La pregunta del millon es cual usar? Lo mejor es elegir los 100% libres, y a la vez que tenga madurez en el mercado si tomamos estas dos premisas JBPM de la gente de JBoss es el ganador. Aunque yo antes de tomar una decisión de lleno jugaría con Apache ODE.

Ustedes usan uno de estos framework? Cual y porque?

viernes, 13 de agosto de 2010

PET


Yo no tengo ni la más mínima idea de python, pero la idea del blog es compartir conocimiento y apoyar a las comunidades.

En este caso presento una revista libre y gratuita, llamada PET: Python entre todos. PyAr escribio una revista para la comunidad.

Para leerla: http://revista.python.org.ar

Felicitaciones!!

Se viene Tomcat 7 Beta !!


Después de más de tres años desde el lanzamiento de Tomcat 6, el popular servidor Web hecho en Java, la Apache Software Foundation (ASF) ha anunciado la primera versión beta de Tomcat 7. De acuerdo con la ASF, hasta la fecha de hoy, el Tomcat se ha descargado más de 10 millones de veces. Entre la nueva versión beta está donando la plena aplicación de la especificación Java Servlet 3.0, Java Server Pages (JSP) 2.2, y el Expression Language (EL) 2.2, que fue parte de la especificación de Java EE 6 (Java Enterprise Edition) terminó en diciembre 2009. Como resultado, el medio ambiente
tiempo de ejecución sólo es compatible con el Java Runtime Environment (JRE) 6.0, que a su vez, la necesidad de actualizar el compilador integrado Eclipse.

Los desarrolladores también están trabajando en la seguridad privada y de rendimiento para el 7 de Tomcat. Es cambios ya son visibles. Un ejemplo son las aplicaciones Web, Gerente y Host Manager, Que ahora tienen nuevas reglas de autorización en su propia URL para que sea más fácil identificar pérdidas de memoria de aplicaciones Web a través de la máquina virtual Java (JVM), la aplicación del Administrador de ahora contiene un botón para la dirección http://localhost:8080/manager/html/findleaks Para hacer un análisis de uso de memoria.

lunes, 9 de agosto de 2010

Gambas


Gambas es un lenguaje derivado de visual basic, pero no es una copia. Gambas es un lenguaje de programación libre. Es distribuido con licencia GNU GPL. Cabe destacar que presenta ciertas similitudes con Java ya que en la ejecución de cualquier aplicación, se requiere un conjunto de librerías interprete previamente instaladas (Gambas Runtime) que entiendan el bytecode de las aplicaciones desarrolladas y lo conviertan en código ejecutable por el computador.

Permite crear formularios con botones de comandos, cuadros de texto y muchos otros controles y enlazarlos a bases de datos como MySQL, PostgreSQL o SQLite además de facilitar la creación de aplicaciones muy diversas como videojuegos (utilizando OpenGL), aplicaciones para dispositivos móviles (en desarrollo pero muy avanzado), aplicaciones de red (con manejo avanzado de protocolos HTTP, FTP, SMTP, DNS), entre otras.

Esto es interesante para un programación Basic que quiere desarrollar en linux. Para mi una buena oportunidad para aprender basic.

Dejo link:


sábado, 7 de agosto de 2010

¿Que herramienta de registro de servicios utilizar?

El objetivo de tener un registro de las funcionalidades desarrolladas en una arquitectura SOA es que todos los desarrolladores conozcan los servicios y no exista duplicidad de servicios. Para esto se podría utilizar diferentes herramientas de propósito más general, como una wiki o una base LDAP pero es mejor utilizar herramientas de objetivo particular. En el mercado existen herramientas open sources para el registro de servicios. Entre los más importantes podemos mencionar a MuleSource Galaxy y Registro de WSO2.

MuleSource Galaxy: Esta basado en un diseñador de repositorios para la gestión de artefactos de software basados en SOA. Entre ellos se incluye la configuración del ESB Mule, WSDL, archivos xml y configuración de Spring. Es una perfecta herramienta de registro cuando se utiliza ESB mule ya que se integra totalmente con ese producto.

Registro de WSO2: Esta diseñado para almacenar, catalogar, indexar y gestionar metadatos de empresa relacionados con artefactos SOA. Ambienta se incluye el control de versiones y su rapidez lo hace un buen candidato para sistemas empotrados.

El producto Galaxy tiene soporte para las mismas funcionalidades generales que el registro de WSO2, como puede ser la categorización de recursos, la monitorización y la gestión de ciclo de vida y de la dependencia. Además, su versión 1.5 incluye nuevas funcionalidades como la replicación (disponible solo la versión de pago) tiene soporte para scritps y una API de eventos.

Hay que decir que el producto de registro WSO2 es muy sencillo de utilizar y gana a Galaxy gracias a su mejor infraestructura para Atom/Rss y sus funcionalidades de control de versiones y de restauración de versiones anteriores. Las funcionalidades más atractivas de Galaxy se encuentran en la versión de pago mientras que la herramienta de registro de WSO2 es 100% libre y gratuita.

Cual utilizar? como todo en esta vida depende, Si usamos Mule hay que optar por la integración de sus productos por lo tanto en buena opción MuleSource Galaxy, en otros casos puede ser uno u otro. Yo pienso que WSO2 es 100% libre y gratuita, por esta razón y la facilidad de uso, creo que es mejor optar por la herramienta de registro de WSO2.

lunes, 2 de agosto de 2010

Libro Gratuito de Ruby y Rails

El espíritu del blog es compartir conocimiento y apoyar a quienes lo hacen. Por lo tanto dejo este link de libros gratuitos de Ruby:

http://everydayrails.com/2010/07/28/free-ruby-rails-books.html

La verdad no los leí pero ya vamos a tener tiempo ;)

viernes, 30 de julio de 2010

Cuantos lenguajes corren en la jvm?

Son varios, la verdad más de lo que imaginaba; y si no me creen miren el siguiente link:

http://www.is-research.de/info/vmlanguages

the Da Vinci Machine Project


La idea es simple que la jvm soporte otros lenguajes.

Para entender esto hay que detenerse en el proceso de compilación de java como ustedes sabrán, java compila en un código intermedio llamado byte code, este código intermedio es interpretado por la jvm y de esa forma java puede correr en cualquier plataforma que tenga una jvm, compilando solo una vez el código. Si creo un lenguaje que pueda compilar a byte code puedo compartir toda la plataforma java con sus librerías y frameworks gratis.

Este proyecto es una serie de extensiones a la JVM, de modo que pueda ejecutar lenguajes no-Java de manera eficiente, con un nivel de rendimiento comparable al de Java.

El énfasis está en completar el código de bytes existente y arquitectura de ejecución con extensiones de uso general.

Dejo links de proyecto:

http://openjdk.java.net/projects/mlvm/index.html

lunes, 26 de julio de 2010

Hay algo mal que no anda bien!!!

Estaba en yahoo mirando mi correo y por esas casualidades clicke en una funcionalidad que termino en error. Por suerte el error es muy descriptivo:


Algo no esta bien con yahoo. Aprovecho para decir que yahoo, no anda nada bien en Linux.

viernes, 23 de julio de 2010

Lenguaje de programación modernos

Un poco amarillista el titulo del post pero en los últimos años nos vimos bombardeados por nuevos lenguajes de programación como ruby, goovy, scala, ioke, python, etc. Y la verdad que están muy buenos.


Todo empezó con el bum de ruby, lenguaje script basado en smalltalk, que con railes parecía como que iba a conquistar el mundo. Pero otras plataformas no tardaron en copiar los beneficios del lenguaje para su plataforma así nació jruby, jython groovy (en java) y iron ruby y iron python (en .net).


Luego nació algo muy interesante la mezcla de paradigmas en particular la programación funcional con la programación orientada objetos, dando muy buenos lenguajes como scala, ioke o clojure en java y F# en .net.


En el blog se hablo de algunos de estos lenguajes:

http://emanuelpeg.blogspot.com/search/label/Clojure

http://emanuelpeg.blogspot.com/search/label/Ioke

http://emanuelpeg.blogspot.com/search/label/jython

http://emanuelpeg.blogspot.com/search/label/jRuby

http://emanuelpeg.blogspot.com/search/label/Lua

http://emanuelpeg.blogspot.com/search/label/Scala


Me quede pensando que esto esta buenísimo, la convivencia de diferentes paradigmas en un lenguaje, es raro que no se allá todavía inventado un lenguaje orientado a objeto y lógico como un prolog OO. Un ejemplo de esto es logtalk

¿Alguien conoce otro lenguaje multiparadigma?¿Alguien usa algun lenguaje multiparadigma?


viernes, 16 de julio de 2010

ESP y CEP con Esper!!


Las tecnologías emergentes como el Procesamiento de Eventos Complejos (Complex Event Processing o CEP) y el Procesamiento de Flujos de Eventos (Event Stream Processing o ESP) han comenzado a ocuparse de problemas de mayor complejidad que no podían resolverse con el procesamiento de eventos tradicional. Por ejemplo, con CEP se puede “analizar, correlacionar y resumir eventos de bajo nivel en eventos de más alto nivel adecuados para informar a las personas en términos humanos o para desencadenar procesos automáticos.”1 CEP y ESP emplean técnicas como la detección de patrones complejos en numerosos eventos, utilizando algoritmos de procesamiento de reglas para la correlación y abstracción de eventos, empleando jerarquías de eventos y relaciones entre los eventos. Los análisis de causalidad, membrecía, oportunidad y procesos impulsados por eventos son capacidades centrales de estas tecnologías.

ESP y CEP se consideran parte de una tendencia más extensa llamada EDA (event-Driven Architecture) EDA es un estilo arquitectónico, que esta centrado en comunicaciones asíncronas basadas en eventos. Es totalmente complementario a SOA y utiliza mensajes asíncronos en lugar de llamadas a funciones al estilo RPC, para realizar computación distribuida. Un evento es simplemente la acción de algo que está ocurriendo, bien sea un pedido, un aviso de entrega o la finalización del trabajo de un empleado. El sistema que registra el evento (tambien llamado sensor) genera un objeto de eventos que se envía mediante una notificación. El consumidor de la notificación o receptor puede ser otro sistema que por su parte, utilice el evento para iniciar alguna acción como respuesta. Aquí es donde el concepto de ESP entra en juego.

Esper es una implementación open source esto es para java, pero también viene una versión .net que se llama NEsper. Esper y NEsper permitir el rápido desarrollo de aplicaciones que procesan grandes volúmenes de mensajes entrantes o eventos. Esper y NEsper filtra y analiza eventos de diversas maneras, y responde a condiciones de interés en tiempo real.

Dejo link para mayor información:

http://complexevents.com/2007/07/24/how-event-processing-improves-business-decision-making/

http://esper.codehaus.org/

miércoles, 14 de julio de 2010

Atlassian recibe ronda de financiación por US $60 mill

Atlassian es una empresa dedicada a desarrollar productos con java muy exitosa. De ella ya hemos hablado en varios podcasts de javaHispano porque son un gran ejemplo de cómo construir un modelo exitoso de negocios alrededor del software: desarrollan productos que son gratuitos para proyectos open source y de pago para proyectos comerciales. La primera parte les ha permitido mejorar sus productos con el feedback de muchos usuarios y la segunda conseguir ingresos para vivir de ello.

Sus productos ya son una referencia en el mundo del desarrollo: Jira, Confluence, FishEye, Bamboo, etc. Con 20, 000 usuarios en todo el mundo y clientes del tamaño de Facebook y y Cisco, son una empresa consolidada.

Por primera vez, han salido a buscar financiación para expandir su negocio y presumiblemente para comprar algunas otras empresas y Accel ha accedido a financiar a la empresa con US $60 mill. Nada mal para una empresa de software y que prácticamente no tiene personal comercial, solo desarrolladores que ha sabido construir productos de calidad.

Si aún no lo has probado y tienes una empresa, puedes comprar una licencia starter desde US $10 para hasta 10 usuarios.

Esta noticia es de javahispano, lo que quiero agregar es lo importante del modelo de negocio Open source, y que ya es un hecho se puede ser rentable con productos open source. Esta es una visión que en otros post hemos señalado:

http://emanuelpeg.blogspot.com/2010/01/codigo-abierto-donde-hemos-estado-y.html
http://emanuelpeg.blogspot.com/2009/12/dan-pink-en-la-sorprendente-ciencia-de.html (mirar comentarios)
http://emanuelpeg.blogspot.com/2009/08/linux-como-plataforma-de-desarrollo.html
http://emanuelpeg.blogspot.com/2009/08/linux-crecio-un-234-entre-2007-y-2008.html

Creo que en Argentina, y debe ser en otras partes del mundo se ve este modelo de negocio como serio y que realmente puede dejar ganancias.

Ustedes que piensan ? Tener productos open Sources es rentable?

domingo, 11 de julio de 2010

Servicios y Gobierno SOA


Los servicios son funcionalidad necesaria para la empresa, es decir son funcionalidad expuesta a otros servicios, sistemas o una interfaz gráfica. Los cuales fueron concebidos para solucionar un requerimiento. Los servicios son los ladrillos de nuestra arquitectura SOA. Ellos pueden contener lógica de negoció, acceso a bases de datos, accesos a otros servicios, etc.

Los servicios están descriptos en una interfaz que indica como utilizarlos. Pero los servicios nunca exponen su funcionamiento; son una caja negra. Lo que permite cambiar un servicio fácilmente por otro, favoreciendo la mantenibilidad y agilidad de desarrollo. Los servicios exponen como se utilizan pero no exponen como funcionan.

Los servicios pueden acoplarse para formar nuevos servicios, que solucionan nuevos requerimientos, esto ayuda a que no se duplique el código. Los servicios son atómicos y sin estado lo que permite distribuirlos en diferentes maquinas favoreciendo la escalabilidad de los sistemas.

Los servicios por si solos son incompletos, necesitan una arquitectura que los mantenga y soporte sus ventajas. Por ejemplo a la hora de desarrollar un nuevo servicio ¿como se si no existe ya? O ¿si existen servicios que pueden ayudar? Por lo tanto debo tener un registro a donde registrar mis servicios, en el cual puedo buscar los servicios existentes.

El gobierno SOA es el conjunto de roles, políticas y procedimientos que sirven de guía para la adopción de la SOA. Al implementar los componentes tecnológicos de gobierno, está creando la infraestructura para soportar y aplicar estos roles, políticas y procedimientos en toda su SOA.

Luego de desarrollar los servicios hay que gestionarlos, la gestion de los servicios se le llama gobierno SOA.

Gobierno de SOA es una ampliación del gobierno de IT centrada en el ciclo de vida de los servicios y en las aplicaciones compuestas en una arquitectura orientada a servicios (SOA) de una organización. La función del gobierno de SOA es definir:
  • Derechos para tomar decisiones para el desarrollo, el despliegue y la gestión de nuevos servicios.
  • La supervisión y notificación de procesos para capturar y comunicar los resultados del gobierno. Debido a que las aplicaciones SOA están intrínsecamente fragmentadas, introducen nuevos retos de gobierno. No obstante, con políticas, principios, estándares y procedimientos adecuados, los empresarios pueden darse cuenta de todas las ventajas que ofrece la arquitectura orientada a servicios. Una plataforma de gobierno de SOA eficaz no sólo ayuda a los equipos de IT y negocio a identificar mejor qué proyectos contribuyen más a los objetivos empresariales, sino que también dotan de más facilidades a los empleados para trabajar y colaborar de forma más eficaz definiendo claramente sus roles y sus responsabilidades.

El Gobierno SOA pretende dotar de los mecanismos de control, procesos, procedimientos y métodos probados en la práctica para garantizar el orden en las decisiones que se tomen en una iniciativa SOA, evitando el caos en cualquier proyecto SOA que se plantee, logrando la efectividad y agilidad esperada en la transición hacia SOA.


El Gobierno se refiere a los procesos que una empresa establece para garantizar que las acciones realizadas se adhieren a las mejores prácticas, normativas, estándares y principios de arquitectura, con objeto de gobernar la adopción e implementación de SOA.

La ausencia del Gobierno SOA puede desembocar en los siguientes problemas:
  • El Programa SOA entrega resultados inconsistentes
  • Crecimiento caótico a nivel de infraestructura y servicios
  • Servicios con funcionalidad redundante
  • Disponer de servicios que no se pueden reutilizar en la organización
  • Inconsistencia en la identificación, diseño y uso de los servicios
  • No se definen métricas para cuantificar el éxito
  • Ausencia de coordinación entre proyectos
La definición de una Estrategia de Gobierno SOA proporciona la coherencia necesaria para todas las acciones que se lleven a cabo en un Plan de Adopción SOA, siguiendo un enfoque incremental de adopción en distintas fases para reducir riesgos, y proporcionando un modelo de gobierno que constituya un marco de referencia para las decisiones que se tomen.

Por lo tanto podríamos definir a SOA como la suma de servicios y gobierno SOA.

El Gobierno SOA comprende varias herramientas que permiten gobernar los servicios:
  • Registro de servicios, permite registrar nuestros servicios y consultar servicios existentes.
  • Bus de servicios o ESB (Enterprise Service Bus) facilita la comunicación entre diferentes servicios.
  • Orquestación y coreografía, herramienta que permite definir la interoperabilidad de los servicios.
  • Procesador de flujos de eventos o ESP(Event Stream Processing) herramienta para diseñar, gestionar y monitorizar los eventos que fluyen a traves de un entorno orientado a EDA(Event-Driver Architecture) dado.
  • Integración de aplicaciones empresariales o EAI (Enterprise Application Integration) facilita la integración con aplicaciones o bases de datos legacy.

No necesariamente se deben tener todos las herramientas descriptas para conformar el gobierno SOA. Se deben adoptar las herramientas que satisfagan las necesidades propias de la empresa que adopta SOA.

viernes, 9 de julio de 2010

Cumpleaños del Blog!!


9 de julio del 2009 fue el primer post de este blog y con él su concepción.

Tenemos 1 año de vida!!

No me había dado cuenta de que cumplimos años justo en el cumpleaños de mi patria.

Feliz cumple de la Patria y feliz cumple nuestro!! Agradezco a todos los que leen este blog y comentan. Saludos!!


Scala


Estuve leyendo un rato sobre este lenguaje, para resumir un poco sus características, es un lenguaje multipropocito y multiparadigma ya que mezcla la programación Orientada a objetos y la programación funcional, esta es una característica que lo hace muy interesante.

Otra cosa importante es que scala es compatible con java es decir que corre sobre jvm y puede utilizar jars.

Veamos un ejemplo de Quicksort:

def sort(xs: Array[Int]): Array[Int] = {
if (xs.length <= 1) xs
else {
val pivot = xs(xs.length / 2)
Array.concat(
sort(xs filter (pivot >)),
xs filter (pivot ==),
sort(xs filter (pivot <)))
}
}

Como podemos ver en el ejemplo es diferente a lo que estamos acostumbrados, dado que se mezcla con la programación funcional.
  1. El algorismo lo primero que hace es ver si el vector tiene 1 o 0 elementos si es así ya se encuentra ordenado, así que lo devuelve.
  2. Si tiene más elementos toma el elemento del medio como pivot y luego corta el vector en 3 los menores al pivot, los iguales y los mayores.
  3. Luego ordena los subconjuntos menor y mayor y así recursivamente.
  4. El resultado es la suma de los subvectores.

Vieron lo raro que filtra los menores y mayores podria usar el “.” es decir xs.filter(pivot ==). Esto es smalltalk-like como cualquier elemento es un objeto y todo usa objetos el indicador de llamadas a metodos puede ser el espacio o punto. De esta forma podemos hacer 1 + 1 o 1.+(1)

Otra característica es que al igual que ruby la ultima expreción ejecutada es el return de la función.

Esta muy bueno no? Alguien lo utiliza?

Dejo links:

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

domingo, 4 de julio de 2010

Apache Software Foundation Sponsorship Thanks!

Me resulta muy raro esta pagina de Apache. Lo raro es que aparezca Microsoft como Sponsor pero no solo eso si no que me parece que faltan organizaciones como Oracle, IBM, etc.

http://www.apache.org/foundation/thanks.html

Apache ODE

Apache ODE (Orchestration Director Engine) es un motor BPEL de ejecución de proceso, ejecuta proceso BPEL estándar. Su API permite extenderlo de muchas maneras y por lo tanto , no es limitado a utilizar únicamente SOAP. El motor es suficientemente ligero como para ser publicado mediante la integración empresarial de java JBI (Java business Integration) con Apache ServiceMix (un excelete Bus ESB de Apache). Apache ODE no posee herramienta de diseño pero se puede utilizar un plugin de eclipse para BPEL.

La licencia de Apache ODE es licencia Apache.

BPM

BPM (Business Process Management) es lo que normalmente llamabamos workflow, es decir es un a forma de representar los procesos, los cuales son seguidos por el sistema. Permitiendo en tiempo de ejecución modificar el workflow y que se aplique estos cambios sin volver a compilar ni a bajar o subir la aplicación.

BPM marca al sistema el orden de ejecución de procesos dando la flexibilidad para poder modificar este orden cuando se lo desee. Esto permite centrarse en la lógica de negocio dando el poder de decisión al usuario final el cual por medio de un editor puede modificar el workflow como crea más conveniente. Se centra en el negocio. Faculta a los individuos de cualquier rincón de una empresa para alcanzar un mayor éxito. Reúne a personas y sistemas. BPM es donde se condensan todas las elevadas ambiciones y mejores estrategias.

BPM es un concepto muy sencillo. Es un conjunto de métodos, herramientas y tecnologías utilizados para diseñar, representar, analizar y controlar procesos de negocio operacionales; un enfoque centrado en los procesos para mejorar el rendimiento que combina las tecnologías de la información con metodologías de proceso y gobierno.

El objetivo de una solución para la gestión de procesos de negocio es proporcionar, dentro de las TI, implementaciones automatizadas de procesos de negocio de la vida real, como por ejemplo los procesos de pedidos y cobros, o de gestión de reclamaciones. Combinada con una SOA, esta forma de proporcionar funcionalidades de TI, con una visión orientada a procesos.

La tecnología BPM es el resultado de muchos años de experiencia en desarrollo y aplicación; el producto de los avances más actuales en sistemas y procesamiento de información; la cumbre de todas las arquitecturas, lenguajes y protocolos informáticos. La tecnología BPM constituye un gran avance, y un nuevo paradigma en cuanto a flexibilidad, gestión y control de información y datos.

BPM, como práctica de gestión integral, es el resultado de la combinación de avances técnicos con métodos y prácticas establecidos, de un modelo empresarial centrado en el proceso.

La tecnología BPM incluye todo lo que necesita a la hora de diseñar, representar, analizar y controlar los procesos de negocio operacionales:
  • El diseño y modelado de procesos posibilitan que, de forma fácil y rigurosa, pueda definir procesos que abarcan cadenas de valor y coordinar los roles y comportamientos de todas las personas, sistemas y otros recursos necesarios.
  • La integración le permite incluir en los procesos de negocio cualquier sistema de información, sistema de control, fuente de datos o cualquier otra tecnología. La arquitectura orientada a servicios (SOA) lo hace más rápido y fácil que nunca. No es necesario desprenderse de las inversiones ya realizadas; todo se puede reutilizar.
  • Los entornos de trabajo de aplicaciones compuestas le permiten construir e implementar aplicaciones basadas en web casi de forma instantánea, completamente funcionales y sin necesidad de código.
  • La ejecución convierte de forma directa los modelos en acción en el mundo real, coordinando los procesos en tiempo real.
  • La supervisión de la actividad de negocio (BAM) realiza el seguimiento del rendimiento de los procesos mientras suceden, controlando muchos indicadores, mostrando las métricas de los procesos y tendencias clave y prediciendo futuros comportamientos.
  • El control le permite responder a eventos en los procesos de acuerdo a las circunstancias, como cambio en las reglas, notificaciones, excepciones y transferencia de incidentes a un nivel superior.

viernes, 2 de julio de 2010

Libros Gratuitos

IBM esta sacando una serie de libros gratuitos por la pinta parecen buenos, de diferentes temas obviamente relacionándolos con sus productos. Creo que es muy bueno que estas empresas distribuyan libros gratuitamente.

Dejo el link:

https://www.ibm.com/developerworks/wikis/display/db2oncampus/FREE+eBooks

lunes, 28 de junio de 2010

Agujero de seguridad grave en Spring

Me llamo la atención hace unos días en mvnrepository.com vi una nueva versión de spring sec02, bueno hoy leyendo java hispano me encuentro que se encontró un agujero de seguridad en su versión 2.5.6 y 3.0.0 esto por suerte se a solucionado. En la versión 3.0.0 se soluciona cambiando a la 3.0.3 y en el caso de usar 2.5.6SEC01 pasarse a 2.5.6SEC02.

Dejo el links de fuente:


En el articulo dice que no esta libre la versión 2.5.6SEC02 y 3.0.3 no den bola, es amarillismo.

Dejo el link a mvnrepository

viernes, 18 de junio de 2010

SCA

Podríamos definir una aplicación como un conjunto de componentes de software interrelacionados. Todos estos componentes están construidos bajo la misma o diferentes tecnologías. Estos componentes pueden correr sobre la misma maquina en un sistema operativo y sobre una misma plataforma o en diferentes procesos, diferentes maquinas con diferentes plataformas y sistemas operativos. Sin embargo una aplicación es organizada para esto es requerido: una forma de crear los componentes y un mecanismo para describir cómo los componentes trabajan juntos.

Service Component Architecture (SCA) define un enfoque general para realizar estas dos cosas. SCA es un estándar de OASIS originalmente creado por diferentes vendedores como BEA, IBM, Oracle, SAP, etc. La especificación SCA define como crear un componente y como estos componentes interactuan para formar una aplicación. Los componentes en SCA pueden ser construidos en Java o en otros lenguajes y además permite interactuar con otras tecnologia como JEE, Spring o BPEL. SCA define un mecanismo común de ensamblaje que indica como los componentes son combinados dentro de la aplicación.

Apache Roller

Apache Roller es una completamente equipada, multi-usuario servidor de blogs adecuado para sitios grandes y pequeños. Es un motor de blogs de Apache.

Roller es una aplicación web Java que debe ser capaz de ejecutar en cualquier servidor Java EE y cualquier base de datos relacional. En la actualidad, corre mejor en Tomcat y MySQL - pero puede correr en Glassfish, WebSphere, JBoss, Gerónimo, Derby, PostgresSQL, Oracle, etc.

Roller es una producto estable y lista-servidor en el blog es importante revisión tercero. Roller se distribuye con licencia Apache. Roller se graduó de la incubadora de Apache en marzo de 2007 y ahora es un proyecto oficial de Apache.

martes, 15 de junio de 2010

MyIbatis


MyIbatis conocido anteriormente como Apache iBATIS, tuvo varios cambios estos días. Cambio de nombre y abandono la fundación Apache esto es poco común, dado que la fundación Apache da importancia a el proyecto por solo pertenecer a la fundación. Es un total misterio el abandono de la fundación.

Cambiando de tema, muchos se pregunta que es MyIbatis bueno es como un ORM. Pero no es un ORM completo como alguien lo llamo una vez es un ORQ (object relation queries). Es decir que tenemos que escribir el sql y mapear nuestro objetos a esas queries y el framework se ocupa de setear los valores de la query al objeto y viceversa. Es decir no es un competidor de hibernate sino de jdbc.

Cuando necesitamos mayor rendimiento y estamos seguros que vamos a escribir queries mejor que cualquier ORM, o cuando heredamos un diagrama de tablas sumamente complicado, nos conviene utilizar MyIbatis.

viernes, 11 de junio de 2010

Tenemos nuevo diseño !!!

Gracias a una nueva funcionalidad de blooger y que me hice un tiempito le dimos un nuevo diseño y más vida al blog.

HTML 5 !!

Como deben saber Html en su versión número 5 a salido a la luz. A raíz de esto se desataron peleas y discusiones varias en el mundo web.

He encontrado este resumen que explica los alcances de html 5 y una comparativa con flash el rey de la interactividad web.

El link es el siguiente:


http://www.focus.com/images/view/11905/

martes, 8 de junio de 2010

Apache OFBiz


Apache Open For Business Project es un proyecto de código abierto licenciado bajo Apache License 2.0. Este proyecto enterprice Open source y como enterprice Open source entendemos : Open Source ERP, CRM Open Source, Open Source de E-Business / E-Commerce, Open Source SCM, MRP Open Source, Open Source CMMS / EAM, y así sucesivamente.
Seria es criollo el ERP de Apache totalmente libre.
Apache OFBiz es una base y punto de partida de soluciones fiables, empresa segura y escalable. Utilícelo out-of-the-box (OOTB) o incluso personalizar para satisfacer sus necesidades de negocios más exigentes. Con OFBiz , usted puede comenzar de inmediato y ir escalando a medida que su negocio crece, sin el gran despliegue y costos de mantenimiento de los sistemas tradicionales de automatización de la empresa.
Es
de código abierto bajo la licencia Apache 2.0 y conducido por una comunidad Apache OFBiz ofrece la flexibilidad de diseño y el acceso a código, esta es una solución en la que no está solo, sino que puede trabajar con muchos otros para hacer las cosas.




sábado, 5 de junio de 2010

Frases

"Los programas deben ser escritos para que la gente los lea y sólo incidentalmente, para que las máquinas los ejecuten."

---Abelson / Sussman

"Mucho del software hoy en día se parece a una pirámide egipcia: con millones de ladrillos apilados uno encima del otro, sin integridad estructural y hecho por pura fuerza bruta y miles de esclavos."

--Alan Kay

"Cualquier tonto puede escribir código que un ordenador entiende. Los buenos programadores escriben código que los humanos pueden entender."

--Martin Fowler

"Hay dos formas de diseñar software: la primera es hacerlo tan simple que obviamente no hay deficiencias y la segunda es hacerlo tan complicado que no hay deficiencias obvias. La primera forma es mucho más difícil."

--C.A.R. Hoare

"Si deseas empezar y desarrollar algo grandioso, no necesitas millones de dólares de capitalización. Necesitas suficiente pizza y Diet Coke en la nevera, una PC barata y trabajo y dedicación para realizar tu idea."

---John Carmack

La mejor forma de predecir el futuro es inventarlo.

--Alan Kay

El software y las catedrales se parecen mucho. Primero lo construimos, después rezamos.

–-Anónimo


viernes, 28 de mayo de 2010

Apache Ivy


Ivy es una herramienta para la gestión (registro, seguimiento, resolución y notificación) dependencias del proyecto. Se caracteriza por lo siguiente:
  • Flexibilidad y configurabilidad - Ivy es esencialmente independiente del proceso y no está vinculado a cualquier metodología o estructura. En su lugar, proporciona la necesaria flexibilidad y configurabilidad de adaptarse a una amplia gama de gestión de la dependencia y construir procesos.
  • Estrecha integración con Apache Ant. Ivy funciona particularmente bien con Apache Ant proporcionando un número de poderosos tareas Ant desde la resolución de dependencias para la presentación de informes y publicación de dependencia.

Si la pregunta es porque no usar Apache maven y la respuesta es simple: no siempre se puede usar maven. En un proyecto que ya usa Ant y ya fue construido. Un proyecto particular que no encuadra con la estructura propuesta por maven, en estos casos usar Ivy para resolver las dependencias es la mejor idea que se te puede ocurrir.
Ivy es de código abierto y liberado bajo una licencia Apache.


Apache Harmony - Open Source Java SE.

Apache Harmony es una open JDK si si ya se no esta certificada pero es interesante para comenzar. Esta jdk es para la gente que no confía demasiado en Oracle, por lo menos yo no confió.

Es interesante que Open Jdk sea más famosa (open jdk era una implementación impulsada por Sun) y más inmadura. Apache Harmony es una jdk que no certifica como Jdk, según las malas lenguas solo cuestión de política.

Y yo personalmente uso muchos productos de Apache y la verdad es que siempre tuve buenos resultados. Vamos a probar esta Jdk

viernes, 21 de mayo de 2010

Configurar una cache con Spring con ehcache


Saben como viene la mano? Yo no tengo ganas de ir a buscar a la base todas las veces los datos que me piden; por qué? Porque es más lento. Lo que nos conviene es usar una cache de datos. Como funciona esto? Fácil cada vez que yo deseo consultar un objeto lo guardo en un lugar, cuando alguien hace la misma consulta no vuelvo a ir a la base sino que lo busco de donde lo guarde “la cache” y si alguien guarda o modifica un objeto limpio la cache para que no traiga datos viejos.
Spring modules es nuestro mejor amigo para configurar cache en spring. Vamos a ver como podemos configurar la cache con anotaciones. Uso anotaciones porque me parece más descriptivo pero podría usar aop (va en gusto)
Primero en mi creo los siguientes beans:
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ehcache="http://www.springmodules.org/schema/ehcache"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springmodules.org/schema/ehcache http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd">

<ehcache:config configLocation="classpath:ehcache.xml" />
<ehcache:annotations>
<!—- para metodos cacheables -->
<ehcache:caching id="cache" cacheName="defaultCache" />
<!—- para metodos que borran la cache -->
<ehcache:flushing id="flushCache" cacheNames="defaultCache" when="before" />
</ehcache:annotations>
</beans>

Ahora bien debemos crear el archivo: ehcache.xml
<ehcache >
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"
/>
<cache name="defaultCache"
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"
/>

</ehcache>
Ahora con anotaciones indicamos que cacheamos y que borra la cache
@Cacheable(modelId="cache")
public List<T> buscarTodos() {
return this.getHibernateTemplate().find("from " +persistentClass.getName());
}

@Cacheable(modelId="cache")
public T buscarPor(Serializable id) {
return (T) this.getHibernateTemplate().get(persistentClass, id);
}

@Cacheable(modelId="cache")
public List<T> buscarPor(T ejemplo) {
return this.getHibernateTemplate().findByExample(ejemplo);
}

@Cacheable(modelId="cache")
public Long contarTodos() {
Query query = this.getSession().createQuery("select count(*) from "+persistentClass.getName());
return (Long) query.uniqueResult();
}
@CacheFlush(modelId="flushCache")
public void guardar(T entidadPersistible) {
this.getHibernateTemplate().save(entidadPersistible);
}

@CacheFlush(modelId="flushCache")
public void actualizar(T entidadPersistible) {
this.getHibernateTemplate().update(entidadPersistible);
}

@CacheFlush(modelId="flushCache")
public void guardarOActualizar(T entidadPersistible) {
this.getHibernateTemplate().saveOrUpdate(entidadPersistible);
}

@CacheFlush(modelId="flushCache")
public void borrar(T entidadPersistible) {
this.getHibernateTemplate().delete(entidadPersistible);
}
@CacheFlush(modelId="flushCache")
public void borrarPor(Serializable id) {
T entidadPersistible = this.buscarPor(id);
this.getHibernateTemplate().delete(entidadPersistible);
}

Si todo salió bien la aplicación va a usar la cache para estos métodos
Dejo las dependencias de maven:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.springmodules</groupId>
<artifactId>spring-modules-cache</artifactId>
<version>0.8</version>
<exclusions>
<exclusion>
<artifactId>gigaspaces-ce</artifactId>
<groupId>gigaspaces</groupId>
</exclusion>
<exclusion>
<groupId>jini</groupId>
<artifactId>jsk-lib</artifactId>
</exclusion>
<exclusion>
<groupId>jini</groupId>
<artifactId>jsk-platform</artifactId>
</exclusion>
<exclusion>
<groupId>jini</groupId>
<artifactId>mahalo</artifactId>
</exclusion>
<exclusion>
<groupId>jini</groupId>
<artifactId>reggie</artifactId>
</exclusion>
<exclusion>
<groupId>jini</groupId>
<artifactId>start</artifactId>
</exclusion>
<exclusion>
<groupId>jini</groupId>
<artifactId>boot</artifactId>
</exclusion>
<exclusion>
<groupId>jini</groupId>
<artifactId>webster</artifactId>
</exclusion>
<exclusion>
<groupId>jboss</groupId>
<artifactId>jboss-cache</artifactId>
</exclusion>
<exclusion>
<groupId>jboss</groupId>
<artifactId>jboss-common</artifactId>
</exclusion>
<exclusion>
<groupId>jboss</groupId>
<artifactId>jboss-jmx</artifactId>
</exclusion>
<exclusion>
<groupId>jboss</groupId>
<artifactId>jboss-minimal</artifactId>
</exclusion>
<exclusion>
<groupId>jboss</groupId>
<artifactId>jboss-system</artifactId>
</exclusion>
<exclusion>
<groupId>jcs</groupId>
<artifactId>jcs</artifactId>
</exclusion>
<exclusion>
<groupId>xpp3</groupId>
<artifactId>xpp3_min</artifactId>
</exclusion>
<exclusion>
<groupId>ehcache</groupId>
<artifactId>ehcache</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>

viernes, 14 de mayo de 2010

Apache Tuscany y Spring

Sigo experimentando con Apache Tuscany, hoy el objetivo es hacer un ejemplo con integración con spring. Mismo ejemplo que hicimos en : http://emanuelpeg.blogspot.com/2010/05/desarrollar-un-ejemplo-con-apache.html

Comenzamos escribiendo la interfaz:

@Remotable
public interface ExampleService {

String sayHello();

}

Su implementación :

@Service(ExampleService.class)
public class ExampleServiceImpl implements
ExampleService {

private String hello = "Holasss !!! \n";

public void setHello(String hello) {
this.hello = hello;
}

/**
* @see org.assembly.nornas.ExampleService#sayHello()
*/
@Override
public String sayHello() {
System.out.print("llamaron a Say");
return hello;
}

@Init
public void init() {
System.out.println("Starting with "+ExampleServiceImpl.class + " \n");
}

}

Ahora tenemos que configurar el beans de spring, en un archivo que llamaremos: appcontext-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sca="http://www.springframework.org/schema/sca"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/sca http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd ">


<bean id="service.example" class="com.elpaquete.ExampleServiceImpl">
<property name="hello" value="Hola desde Spring!!" ></property>
</bean>


<sca:service name="ExampleService"
type="org.assembly.nornas.sandbox.service.example.ExampleService" target="service.example" />


</beans>

Notaron que además de declarar el bean le indicamos a Apache Tuscany cual es la interfaz de nuestro bean que va a ser un componente de Apache Tuscany.

Ahora escribimos el archivo ExampleSpring.composite:

<?xml version="1.0" encoding="UTF-8" ?>

<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
xmlns:t="http://tuscany.apache.org/xmlns/sca/1.0"
targetNamespace="http://nornas"
xmlns:nornas="http://nornas"
name="Example" >

<component name="ExampleServiceComponent">
<implementation.spring location="spring-sandbox.xml" />

<service name="ExampleService">
<interface.java interface="org.assembly.nornas.sandbox.service.example.ExampleService"/>
<binding.ws uri="http://localhost:8080/nornas/ws" />
<t:binding.atom uri="http://localhost:8080/nornas/atom" />
<t:binding.jsonrpc uri="http://localhost:8080/nornas/jsonrpc" />
<t:binding.rss uri = "http://localhost:8080/nornas/rss"/>
<binding.sca />
</service>

</component>


</composite>

Notaron que la implementación del componente no se indica clase si no el archivo appcontext-spring.xml, Apache tuscany va a leer y buscar de ahí la implementación.

Ya lo tenemos, ahora vamos a hacer la clase main:

public class MainSpring {

public static void main(String[] args) throws IOException {

System.out.println("Starting ...");
SCADomain scaDomain = SCADomain.newInstance("ExampleSpring.composite");
System.out.println("Example in "+scaDomain.getURI());
System.in.read();
System.out.println("Stopping ...");
scaDomain.close();
System.out.println();

}

}

Si todo salio bien, en http://localhost:8080/nornas/ws?wsdl va a estar wsdl de su web service soap.

Por ultimo las dependencias de maven:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6.SEC01</version>
</dependency>


<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-sca-api</artifactId>
<version>1.6</version>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-core-spi</artifactId>
<version>1.6</version>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-policy-security</artifactId>
<version>1.6</version>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-host-embedded</artifactId>
<version>1.6</version>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-data-api</artifactId>
<version>1.6</version>
</dependency>

<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
<version>1.5.3</version>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-java-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-atom-abdera</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-rss-rome</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-ws-axis2</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-jsonrpc-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-rmi-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-resource-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-http-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-host-jetty</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-spring</artifactId>
<version>1.6</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-spring-runtime</artifactId>
<version>1.6</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>