Translate

jueves, 30 de diciembre de 2010

WSO2 Business Process Server




Estuve probando WSO2 Business Process Server (BPS) y quede gratamente sorprendido. No tengo experiencia en soluciones BPEL pero por lo pronto este producto me gusto.

WSO2 Business Process Server (BPS) es un Open Source Business Process Server fácil de usar que ejecuta procesos de negocios escritos siguiendo WS-BPEL estándar.

WS-BPEL esta emergiendo como un estándar por defecto para componer múltiples servicios asíncronos o síncronos, dentro de un flujo de procesos colaborativo y transaccional que incrementa la flexibilidad y agilidad de nuestra SOA (Service Oriented Architecture).

WSO2 BPS esta formado por Apache ODE e incluye una interfaz administrativa basada en la Web y funcionalidades de simulación. Además disponible con licencia Apache v2.

La versión actual de BPS es la 1.1.1

Dejo Link:

http://wso2.com/products/business-process-server/

lunes, 27 de diciembre de 2010

La propiedad intelectual tiene más valor cuando se comparte

Me gusto este post así que decidido compartirlo:

Más de Erlang

Continuando con el post: http://emanuelpeg.blogspot.com/2010/12/erlang.html vamos a seguir aprendiendo algo de erlang.

El case:

1> Animal = "dog".
2> case Animal of
2> "dog" -> underdog;
2> "cat" -> thundercat
2> end.
underdog

3> case Animal of
3> "elephant" -> dumbo;
3> _ -> something_else
3> end.
something_else

el _ es como el “default” de c, c++, java, etc...

El si es un tanto diferente a lo que conocemos, el si puede tener varias condiciones y varios resultados:

8> X = 0.
9> if
9> X > 0 -> positive;
9> X < 0 -> negative;
9> true -> zero
9> end.

Similar a javascript se puede asignar una función a una variable:

16> Negate = fun(I) -> -I end.
#Fun

17> Negate(1).
-1
18> Negate(-1).
1

Podemos usar funciones con listas

1> Numbers = [1, 2, 3, 4].
[1,2,3,4]
2> lists:foreach(fun(Number) -> io:format("~p~n", [Number]) end, Numbers).
1
2
3
4
ok

lists:foreach permite aplicar una función a cada elemento de una lista.
Si queremos filtrar los menores a 3 por ejemplo, es muy facil con lists:filter :

11> Small = fun(X) -> X < 0 end.

12> lists:filter(Small, Numbers).
[1,2]

EL lenguaje también provee una forma de saber si todos los elementos de una lista cumplen con un filtro:

15> lists:all(Small, [0, 1, 2]).
true
16> lists:all(Small, [0, 1, 2, 3]).
false


o si alguno lo cumple:

17> lists:any(Small, [0, 1, 2, 3]).
true
18> lists:any(Small, [3, 4, 5]).
false

Con foldl se puede hacer que una variable sea mantenida mientras la función esta iterando por la lista:

28> Numbers.
[1,2,3,4]
29> lists:foldl(fun(X, Sum) -> X + Sum end, 0, Numbers).
10

Como podemos ver la variable Sum se va pasando por cada ejecución de la función que acumula, y al comenzar la ejecución Sum = 0.
Hasta aquí hemos recorrido a vuelo de pájaro Erlang, un lenguaje original que nos muestra que se pueden hacer las cosas de diferente modo.

lunes, 20 de diciembre de 2010

Frase

Me gusto mucho esta frase y la quiero compartir:

La complejidad es uno de los principales problemas de la tecnología informática. Y que una y otra vez caemos en el error de que para resolver la complejidad lo que hace falta es todavía más complejidad.
-Donald Ferguson

Totalmente de acuerdo!!

domingo, 19 de diciembre de 2010

Erlang


Ya hemos hablado de erlangs en otros post, vamos a hacer un repaso y luego desarrollar ejemplos.

Erlang es un lenguaje de programación concurrente y un sistema de ejecución que incluye una máquina virtual y bibliotecas.

El subconjunto de programación secuencial de Erlang es un lenguaje funcional, con evaluación estricta, asignación única, y tipado dinámico. Fue diseñado en la compañía Ericsson para realizar aplicaciones distribuidas, tolerantes a fallos, soft-real-time y de funcionamiento ininterrumpido. Proporciona el cambio en caliente de código de forma que éste se puede cambiar sin parar el sistema. Originalmente, Erlang era un lenguaje propietario de Ericsson, pero fue cedido como software de código abierto en 1998. La implementación de Ericsson es, principalmente interpretada pero también incluye un compilador HiPE (sólo soportado en algunas plataformas).

La creación y gestión de procesos es trivial en Erlang, mientras que, en muchos lenguajes, los hilos se consideran un apartado complicado y propenso a errores. En Erlang toda concurrencia es explícita.

Bueno vamos a bajarnos el runtime de http://www.erlang.org/download.html esto para windows, si estan en linux es más fácil instalarlo por ejemplo en debian es así “apt-get install erlang”, y listo!

Se puede escribir codigo en un archivo .erl y luego compilarlo opteniendo el .beam (ejecutable) nosotros vamos a usar la consola.

Escribimos en la consola erl o werl(para windows)

erl
Erlang (BEAM) emulator version 5.4.13 [source]
Eshell V5.4.13 (abort with ^G)
1>

1> % Este es un comentario
2> 2 + 2.
4
3> 2 + 2,0.
4,0

Veamos las listas:
4> [1, 2, 3,4]
[1, 2, 3,4]

No se puede hacer operaciones con diferentes tipos por ejemplo la suma:

5> 4 + "string".
** exception error: bad argument in an arithmetic expression
in operator +/2
called as 4 + "string"

Las variables deben comenzar con mayuscula:

7> Var = 1.
1
8> Var = 2.
=ERROR REPORT==== 8-Jan-2010::11:47:46 ===
Error in process <0.39.0> with exit value: {{badmatch,2},[{erl_eval,expr,3}]}
** exited: {{badmatch,2},[{erl_eval,expr,3}]} **
8> Var.
1
Como se puede ver solo se puede asignar un valor a una variable una vez; esto es asi porque Erlang es un lenguaje funcional.

Un símbolo es una palabra en minuscula (en la mayoria de los lenguajes que lo implementa) que sirve para representar algo. En Erlang el símbolo se denomina atoms.

9> red.
red
10> Pill = blue.
blue
11> Pill.
blue


Las listas son un conjunto de elementos que pueden tener diferente tipo y longitud:

13> [1, 2, 3].
[1,2,3]
14> [1, 2, "three"].
[1,2,"three"]
15> List = [1, 2, 3].
[1,2,3]

Tuples es una lista fija y heterogénea:

18> {one, two, three}.
{one,two,three}
19> Origin = {0, 0}.
{0,0}

Estas estructuras pueden convinarse:

20> {name, "Spaceman Spiff"}.
{name,"Spaceman Spiff"}
21> {comic_strip, {name, "Calvin and Hobbes"}, {character, "Spaceman Spiff"}}.
{comic_strip,{name,"Calvin and Hobbes"},
{character,"Spaceman Spiff"}}

24> Person = {person, {name, "Agent Smith"}, {profession, "Killing programs"}}.
{person,{name,"Agent Smith"},
{profession,"Killing programs"}}

Para obtener valores de la persona podemos hacer lo siguiente:

25> {person, {name, Name}, {profession, Profession}} = Person.
{person,{name,"Agent Smith"},
{profession,"Killing programs"}}
26> Name.
"Agent Smith"
27> Profession.
"Killing programs"

Se entiende? Obtenemos los valores en Name y Profession por medio de patrones de coincidencia.
Y con patrones de coincidencia se puede hacer más cosas:

28> [Head | Tail] = [1, 2, 3].
[1,2,3]
29> Head.
1
30> Tail.
[2,3]
32> [One, Two|Rest] = [1, 2, 3].
[1,2,3]
33> One.
1
34> Two.
2
35> Rest.
[3]

Si no hay suficientes elementos en la lista el patrón no funciona:

6> [X|Rest] = [].
** exception error: no match of right hand side value []

Erlang es dinámicamente tipado, Erlang puede enlazar tipos en runtime. Vamos a hacer una función para esto vamos a hacer un modulo. Yo uso debian pero para windows debe ser parecido.
Salimos del runtime Ctrl + G.
Escribimos:
nano basic.erl
En nano escribimos el siguiente código:

-module(basic).
-export([mirror/1]).
mirror(Anything) -> Anything.

Salimos y guardamos. Luego escribimos erl en la consola.
Y por ultimo compilamos:

1> c(basic).
{ok,basic}

La función mirror solo devuelve lo que pasamos como parámetro. Pueden ver que el operador -> simplifica el return.

5> mirror(smiling_mug).
** exception error: undefined shell command mirror/1
6> basic:mirror(smiling_mug).
smiling_mug
6> basic:mirror(1).
1
Vemos que hay que ingresar el nombre del modulo.

-module(matching_function).
-export([number/1]).
number(one) -> 1;
number(two) -> 2;
number(three) -> 3.

En la siguiente función se puede ver la influencia de Prolog en Erlang.
Por ultimo implementemos factorial y figonacci :

-module(yet_again).
-export([another_factorial/1]).
-export([another_fib/1]).
another_factorial(0) -> 1;
another_factorial(N) -> N * another_factorial(N-1).
another_fib(0) -> 1;
another_fib(1) -> 1;
another_fib(N) -> another_fib(N-1) + another_fib(N-2).

Hasta aca vimos muy por arriba Erlang en proximos post vamos a seguir hablando.

Dejo links:

jueves, 16 de diciembre de 2010

Google regala los productos de Instantiations a la Fundación Eclipse

Siempre quise programar en GWT ahora se me va a ser más fácil con los productos que google regalo a la comunidad de eclipse por ende a nosotros.

Google ha donado WindowBuilder Pro (que incluye Swing Designer, SWT Designer y GWT Designer) y CodePro Profiler a la comunidad de código abierto y que en la primera mitad de 2011 pasarán a ser nuevos proyectos de Eclipse.

Estos productos nos ayudan a desarrollar de forma fácil interfaces gráficas con java y eclipse.

Que grande google!!!

Dejo links:

http://googlecode.blogspot.com
http://code.google.com/javadevtools/eclipse-donation-faq.html.

miércoles, 15 de diciembre de 2010

Masterbranch

Masterbranch es una pagina que contiene los cv de los programadores que participan en proyectos de software libre.

Lo que hace es recorrer los repositorios buscando info de los commiters y de esta forma tiene un banco de cv de gente que programa y si queda duda mira los commit del repositorio.

Muy buena idea, la verdad; también tiene la opcional de registrarse.

Dejo el link:

http://www.masterbranch.com


jeje

domingo, 5 de diciembre de 2010

Clojure


Clojure es Lisp en JVM. Es decir entendiendo Clojure entenderemos List, y entendiendo List entenderemos Clojure. Después de Fortran, List es el lenguaje más viejo. List es un lenguaje funcional pero no es un lenguaje puramente funcional.

Una de las más importantes características de Clojure es que corre en la JVM.

Deben bajar la consola para Clojure de http://clojure.org/ y empecemos haciendo un Hola Mundo!

user=> (println "Hola Mundo!")
Hola Mundo!
nil


Veamos llamadas a funciones:

user=> (- 1)
-1
user=> (+ 1 1)
2
user=> (* 10 10)
100
user=> (mod 5 4)
1
user=> (/ (/ 12 2) (/ 6 2))
2
user=> (+ 2 2 2 2)
8
user=> (- 8 1 2)
5
user=> (/ 8 2 2)
2
user=> (+ 3.0 5)
8.0
user=> (+ 3 5.0)
8.0

Clojure maneja los tipos de java:

user=> (class true)
java.lang.Boolean
user=> (class (= 1 1))
java.lang.Boolean

Podemos usar el condicional:

user=> (if true (println "True it is."))
True it is.
nil
user=> (if false (println "true") (println "false"))
false
nil

Veamos las listas:
user=> (list 1 2 3)
(1 2 3)
user=> '(1 2 3)
(1 2 3)

vectores:
user=> [:hutt :wookie :ewok]
[:hutt :wookie :ewok]

Mapas:
user=> {:chewie :wookie :lea :human}
{:chewie :wookie, :lea :human}

Definir funciones:
user=> (defn force-it [] (str "Use the force," "Luke."))
#'user/force-it
y usarla:
user=> (force-it)
"Use the force,Luke."

Este es un pequeño y humilde paseo por Clojure, si deben aplicar programación funcional en una aplicación Java es la herramienta justa.

Dejo links:
http://clojure.org/

Io

Io es un lenguaje de programación prototipado inspirado en Smalltalk, Self, NewtonScript, Act1, LISP y Lua.

Io es prototipado. Existen varias formas de implementar la programación orientada a objetos, la más conocida es por medio de clases. La otra no tan conocida es por prototipos donde no nos preocupamos por las clases sino por los objetos, y estos objetos se pueden duplicar o clonar. De esta forma funciona la programación orientada a objetos en Javascript.

Veamos un hola mundo hecho en io, luego de instalarlo desde el siguiente sitio: http://iolanguage.com/
En la consola hacemos Io y luego escribimos:
“Hola mundo” print
Y va imprimir “Hola mundo”, como vemos el string envía un mensaje de que se imprima.

Veamos como crear un objeto:
Vehiculo := Object clone
Vehiculo no es una clase, sino es un objeto tipo “template” que se utiliza para crear otros objetos.
Vehiculo descripcion := “Es un vehiculo”
descripcion es una propiedad del Vehiculo. Las propiedades son vectores clave valor, similar a Javascript.

Y si ejecutas
Vehiculo descripcion
El resultado sera “Es un vehiculo” como era de esperar. En realidad un objeto es una lista que contiene propiedades y metodos.

Io> Vehiculo slotNames
==> list("type", "descripcion")

Como vemos el objeto tiene una propiedad tipo:

Io> Vehiculo type
==> Vehicle
Io> Object type
==> Object

Como podemos ver Vehiculo es un tipo, una idea que resalto es que los typos no son clases sino objetos. El objeto Vehiculo es un tipo.
Ahora vamos a construir un Auto usando herencia:

Io> Auto := Vehiculo clone
==> Auto_0x100473938:
type = "Auto"
Io> Auto slotNames
==> list("type")
Io> Auto type
==> Auto
Ahora vamos a hacer un ferrari B)

Io> ferrari := Auto clone
==> Auto_0x1004f43d0:
Io> ferrari slotNames
==> list()

ferrari no es un tipo, como sabe Io cual es un Tipo y cual no, por convención los tipos comienzan con mayúscula.

Io> ferrari type
==> Auto

Ni clases, ni modulos, ni interfaces, solo Objetos!

En Io es fácil hacer metodos:

Io> method("este es un metodo." println)
==> method(
“este es un metodo." println
)

Los metodos son objetos:

Io> method() type
==> Block

Podemos asignarle un metodo a el Auto
Io> Auto manejar := method("Manejando manejando voy!" println)
==> method(
"Manejando manejando voy!" println
)

Io es un lenguaje simple y potente que nos permite comprender como funcionan los lenguajes prototipados. Aprender Io nos ayuda a entender Javascript o Haskell.

Para mayor información ver:

jueves, 25 de noviembre de 2010

Apache Wave In A Box

Cuando Wave fue abandonado, se comentaba que Google liberaría el proyecto con el nombre de Wave In A Box, pero sin seguir desarrollándolo. Pus bien, hoy Wave In A Box ya tiene a alguien que le empuje: la fundación Apache.

La fundación va a alojar el proyecto junto a los demás y va a impulsarlo con un equipo de desarrollo al igual que se hace con el servidor Apache. El producto se llamará Apache Wave In A Box, y la idea es que sirva para que cualquiera lo pueda instalar en un servidor sin problemas.

Según Apache, adoptan Google Wave porque hay bastante gente interesada en la continuidad del proyecto. Entre ellos están la recién comprada Novell, SAP o incluso la Marina de los EEUU.

Aunque Google Wave no tuvo una muy buena acogida, su tecnología es muy buena y compleja, y merece la pena ser guardada y desarrollada. Habrá que ver cómo evoluciona ahora Apache Wave y el tratamiento que le da la fundación Apache, y si consigue que Wave sea más aceptado de lo que lo fue con Google.

Dejo link:

http://wiki.apache.org/incubator/WaveProposal

miércoles, 24 de noviembre de 2010

¿Porque optar por soluciones Open Sources a la hora de desarrollar?

Como principal ventaja del software Open Sources se pensaría en el bajo costo dado que se relaciona Open Sources como gratis y esto no es así. Es un error pensar en el Open Sources como una solución barata dado que el software puede tener costo, pero además el software tanto Open Sources como comercial tiene costos ocultos. Como costo oculto podríamos nombrar la falta de soporte, o falta de documentación. Estos costos ocultos hay que tenerlos en cuenta a la hora de optar por un software.

El uso de frameworks open sources para el desarrollo de aplicaciones trae aparejado muchos beneficios que dependen de la comunidad que respalde el framework; cuanto mayor es la comunidad mayor va a ser el soporte, la documentación, calidad y los usuarios que usan el framework:

  • Soporte: El soporte brindado puede ser mayor a una aplicación comercial y la información suministrada por foros de problemas es basta.

  • Documentación: Si bien no es común que un software open source este bien documentado, la información suministrada por blogs, foros, libros es mayor que productos comerciales.

  • Calidad de código: La calidad del código de framework open source es mayor ya que el código es visto por decenas de programadores y revisados por una comunidad de usuarios.

A la vez existen beneficios intrínsecos del software open sources:

  • Usar el programa: podemos usar el programa sin ninguna restricción, ni siquiera comecial ya que podemos vender nuestro desarrollo, pero una restricción es que debemos incluir el código fuente en la venta.

  • Libertad de aprender: podemos aprender del código fuente, aprender como fue hecho el framework y saber como realmente funciona. De esta forma el grupo de trabajo no esta limitada a ver solo la documentación sino que puede debugear el código fuente y palpar lo que hace realmente.

  • Libertad de modificar: Si existe un bug, es posible corregirlo y publicar su corrección para que se encuentre en futuras versiones. Además podemos extender el framework como queramos, desarrollando nueva funcionalidad que luego podemos publicar para que la comunidad la pruebe y use.

Estas ventajas no son menores, dado que el conocimiento es el arma más importante en un grupo de desarrollo informático y el open source permite cultivar el conocimiento, dando nos el privilegio de leer las lineas de código y ver como funciona.

Apostar a el software open source es apostar al capital humano, con un grupo consolidado puede aprender y desarrollar mejor a partir del código fuente. Los desarrolladores aprenden como funciona el framework viéndolo funcionar.

Utilizar software Open Source no solo beneficia a quien lo usa sino a toda una comunidad.

martes, 23 de noviembre de 2010

Spring Dynamic Modules for OSGi(tm) Service Platforms

Spring Framework es el principal contenedor de aplicaciones Java / JEE. Proporciona un contenedor ligero y un modelo de programación no invasiva, esto es posible gracias al uso de la inyección de dependencia, AOP, abstracciones y portátiles servicio. La Plataforma de Servicios OSGi ofrece un entorno de ejecución de aplicaciones dinámicas en las que los módulos (paquetes) puede ser instalado, actualizado, eliminado sobre la marcha. También cuenta con un excelente apoyo para la modularidad y control de versiones.

Spring DN hace que sea fácil crear aplicaciones que se puedan implementar en un entorno de ejecución de OSGi, y que pueden aprovechar los servicios que ofrece el marco OSGi

Spring DN es un proyecto para hacer más fácil la construcción de aplicaciones que corren en un framework OSGI. Una aplicación hecha con spring DN provee un perfecto camino para la separación de la aplicación en módulos. usando OSGI podemos levantar en caliente un modulo y a la vez tener diferentes versiones de los modulos levantado.
OSGi 4.2 introduce the Blueprint Service especificación basada en Spring Dynamic Modules.

Dejo el link:

lunes, 22 de noviembre de 2010

Apache Aries


El proyecto Aries ofrecerá un conjunto de componentes enchufables (plugins) Java que permite a una aplicación empresarial utilizar estos plugins usando modelo de programación OSGi . Esto incluye la implementación y extensión de las especificaciones definidas por OSGi Alliance Enterprise Expert Group (EEG)

Apache Aries nos permitirá consumir por medio de OSGI módulos que nos brinden la persistencia JPA por ejemplo. Pluging que le den valor agregado a la aplicaciones o frameworks que nos ayuden a desarrollar podrán ser utilizados usando OSGI.

OSGi es una tecnología de modularidad madura de Java, que es muy usado en muchos ambientes, pero, en el ámbito empresarial, ha sido tradicionalmente más explotados por la parte interna, infraestructura runtime. Esto es principalmente debido a la falta de un claro modelo de programación empresarial OSGi, y la falta de aplicación e implementación de OSGi para la tecnología JEE.
Especificaciones OSGi son dictadas y mantenidas por la OSGi Alliance, que reconoce este estado de cosas hace varios años y estableció un grupo de expertos en aplicaciones enterprice dentro de la Alianza para centrarse específicamente en las necesidades de aplicaciones empresariales. El objetivo de este proyecto es entregar implementaciones de código abierto de estas tecnologías centradas en la aplicación para permitir el desarrollo de componentes, en beneficio de la modularidad de OSGi en combinación con modelos de programación basados en estándares, que pueden ser desplegados en tiempo de ejecución.

Es un objetivo del proyecto Aries proporcionar un hogar natural para las implementaciones de código abierto de las actuales y futuras especificaciones OSGi EEG, incluyendo la oportunidad para el desarrollo colaborativo de pruebas de cumplimiento, y un entorno para demostrar la composición de estas tecnologías y explorar áreas EEG donde carecen de cobertura de las especificaciones. Otro objetivo de este proyecto es aprovechar la experiencia adquirida a informar a las contribuciones a OSGi requisitos EEG y documentos de especificaciones.

Apache Aries esta en la incubadora esperemos que pronto salga de ahí y nos sorprenda con nuevos módulos para nuestra aplicación.

OSGI y SCA


Antes de empezar vamos a describir estas tecnologías.

OSGI (Open Services Gateway Initiative), podríamos definirlo como un sistema (o framework) modular para Java que establece las formas de crear módulos y la manera en que estos interactuaran entre sí en tiempo de ejecución. OSGI intenta solventar los problemas del tradicional "classloader" de la máquina virtual y de los servidores de aplicaciones Java. En OSGI, cada módulo tiene su propio classpath separado del resto de
classpath de los demás módulos.

SCA (Service Component Architecture) 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 interactúan 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 tecnologías 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.
El objetivo de SCA es a nivel alto o de negocios en ca
mbio el objetivo de OSGI esta centrado en la modularidad por lo tanto es de más bajo nivel.

Los Micro-Kernels se volvieron cada vez más populares (jboss, glassfish, ...). OSGi ha estandarizado muchos de los "servicios del núcleo" (registro, configuración, aprovisionamiento) de móviles, y ahora comienza a entrar en la empresas. Considerando que el enfoque JEE fue en la infraestructura de middleware, OSGi provee muchas ventajas que quedaban a cargo de los desarrolladores. La Carga dinámica (Dynamic loading) de OSGi hace perfecto los micro-núcleo, dado que no es necesario bajar el servidor para cargar un modulo, el nucleo tiene solo lo necesario y los módulos se van cargando a medida que se los demande.

La composición de los servicios/componetes se llevará a cabo y se expone como un servicio de negocios con múltiples puntos finales. Este es el lugar donde podemos ver que la pareja OSGi / SCA aporta mucho y ayuda a centrarse en su negocio. Módulos OSGi para gestionar los componentes técnicos para mantener los principios DRY (Don't Repeat Yourself) y SCA para exponer punto final de negocios con conexión automática y la seguridad habilitada.


Este esquema tomado de la página de Apache Tuscany expresa como SCA cablea los servicios de negocio. Como SOA típico, expondrá su "contrato". Dentro de SCA, va a configurar, además, cómo quieres que lo exponga (usando RMI, WS o cualquier tipo de protocolo).
Al hacerlo, le permiten decidir el protocolo en la fase de implementación, no en la fase de desarrollo. Esto hace que su software sea muy flexible y le permiten centrarse en el código de negocio.

Gestión de módulos y componentes y hay dependencias requieren el uso de una herramienta automatizada (Maven, nexus).

Apache Tuscany es una implementación de SCA que en su versión 2.0 traera el esquema OSGI. Apache Tuscany 2.0 fue totalmente reescrito para soportar OSGi.