lunes, 14 de enero de 2008

Interoperando con Ikvm

Interoperabilidad. Qué palabra tan bonita, y ¡que bien suena! Es una de las múltiples palabras que utilizan los comerciales informáticos (podríamos escribir una enciclopedia) a la hora de "vender proyectos". En el mundo de la programación casi siempre se relaciona interoperabilidad con una batalla campal entre Microsoft .NET y Java, las dos plataformas reinas del mundo de la programación informática. Se han escrito ríos (más bien océanos) de tinta con estudios comparativos entre estos dos poderosos frameworks, siempre intentando desestabilizar o buscar puntos débiles en uno u otro bando.

Este contencioso internacional de la programación tiene pinta de seguir abierto "per secula seculorum" (es como Irak, Palestina, Afganistán y estos países...), complicando enormemente la vida a los programadores, generando desconfianza en las empresas cliente, y emborronando el ya de por sí maltrecho mundo de la informática en general. Siempre se oye hablar de herramientas bridge o cross-platform que a cambio de un buen puñado de dólares prometen el oro y el moro en cuanto a interoperabilidad se refiere. Para el caso concreto de limar asperezas entre .NET y Java, acabo de descubrir el proyecto opensource Ikvm. Una vez más, me quito el sombrero ante proyectos desinteresados de este tipo que alumbran el oscuro mundo de la interoperabilidad. A grandes rasgos, el proyecto Ikvm:
  • incluye una implementación .NET de una Java Virtual Machine
  • permite utilizar librerías java desde aplicaciones .NET
  • facilita el desarrollo de aplicaciones .NET en Java
Sobre todo me llamó la atención el segundo punto, el poder "jugar" con una librería de Java desde una aplicación .NET. Hay muchas librerías potentes de Java que no tienen su implementación en .NET; es en estos casos donde Ikvm puede echarnos una mano (¡y no al cuello!). Así que nada, me he bajado la conocida librería de data mining Weka, en formato .jar y aquí os detallo la experiencia religiosa que he tenido con Ikvm:
  • Lo primero de todo es convertir con el comando ikvmc la librería weka.jar a weka.dll, libreria directamente accesible desde .NET:
En la siguiente imagen se puede apreciar que la nueva librería weka.dll ocupa casi el doble que la original weka.jar, pero bueno, estamos en versión beta, ¿verdad? ;-)

  • El siguiente paso es abrir un proyecto con Visual Studio o MonoDevelop (si utilizamos MONO), y añadir una referencia a la recien creada weka.dll y otra a la librería propia de Ikvm denominada IKVM.OpenJDK.ClassLibrary.
  • Una vez aquí, el límite lo pone vuestra imaginación. Toda la funcionalidad de una compleja librería Java fácilmente accesible desde el entorno .NET. Como si queréis empezar a probar redes bayesianas de Weka...¡todo vuestro!
Os puedo asegurar que un colega del curro ha utilizado satisfactoriamente Weka desde una aplicación .NET. ¿Rendimiento? No he realizado ningún test, pero todo sabemos que esta clase de "puentes" siempre conllevan cierta penalización; no va a ser todo gratis ;-)

SaludoX.


11 comentarios:

Unknown dijo...

has cambiado algo en el feed?
ya no llegan los posts completos...

(has visto? un comentario y sin tener que hablar de sexo y/o furgol)

Miguel Loitxate "Lonifasiko" dijo...

Nada, tenía el feed en modo "corto", para obligarte a pinchar en el título del post desde tu RSS reader, acceder al post completo (¡si te interesa claro!), para que luego hagas click en los anuncios y tenga una jubilación dorada ;-)

Te haré caso, acabo de cambiar el feed de nuevo a modo "completo"...

SaludoX.

Anónimo dijo...

Oscar: Buenas tardes, tengo un problema: estoy haciendo uso del Ikvm precisamente para ejecutar algoritmos de aprendizaje de redes bayesianas del weka; pero cuando instancio un objeto de las librerias de java, como la java.io, se produce el siguiente error:
"No se puede cargar el archivo o ensamblado 'IKVM.Runtime, Version=0.36.0.5, Culture=neutral, PublicKeyToken=13235d27fcbfff58' ni una de sus dependencias. El sistema no puede hallar el archivo especificado.
"; no se q es... pueden ayudarme?? de ante mano por cualquier ayuda GRACIAS... estoy trabajando con VS.Net 2005 y C#.

using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using weka.classifiers.bayes.net.search.local;
using weka.classifiers.bayes;
using weka.core;
using weka.classifiers.bayes.net.estimate;
using java.io;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string filename = "C:/Archivos de programa/Weka-3-4/data/labor.arff";
BayesNetEstimator bne = new BayesNetEstimator();
K2 k = new K2();
Label1.Text = k.globalInfo().ToString();
Instances instances;
FileReader reader = new FileReader(filename);//aqui se produce el error
instances = new Instances(reader);
BayesNet bn = new BayesNet();
bne.setAlpha(0.5);

}
}

Anónimo dijo...

Oscar: me faltaba incluir la referencia del Runtime.dll de ikvm...jejeje gracias...

Anónimo dijo...

Buenas Oscar,

En el mini-ejemplo que yo publico en el post no pruebo a cargar un fichero ni toco funcionalidad de "las típicas clases Java" de toda la vida (java.io, java.lang, etc.), de ahí que sólo incluyo la DLL convertida de Weka, y la de OpenJDK, necesaria para compilar.

Pero sí, como bien has descubierto y comentas, se ve que es necesario incluir la DLL del runtime para hacer uso de las típicas clases Java.

Ya veo que andas utilizando Weka desde ASP.NET. ¡Qué campeón!

Gracias por iluminarnos y saludoX.

Unknown dijo...

Buenos días a todos, yo llevo unos días intentando acceder a hibernate. Tengo mi proyecto java que inserta modifica elimina y recupera datos de la base de datos sql 2005 a traves de hibernate, pero cuando lo intento hacer desde Visual Studio 2005 me da error. Tengo incluidas las referencias:
ikvm.gnu.classpath
ikvm.openjdk.classlibrary
ikvm.Refelction.Emit
ikvm.Runtime
ikvm.Runtime.jni
miJarconvertidoenDll
JVM
spring
pero aun así me da el siguiente error: The type initializer for 'org.springframework.util.ClassUtils' threw an exception.
Por favor ayuda.

Anónimo dijo...

Buenas Javier, siento no poder ayudarte mucho ya que el escenario que describes es bastante más completo y complejo que las humildes meras pruebas de interoperabilidad que yo y mi equipo hemos realizado con IKVM.

Por la referencias que añades a tu proyecto, deduzco que estás intentando cargar la librería (.jar) de Spring vía Reflection. Sinceramente, nunca lo he probado, pero puede ser que la librería IKVM.Reflection no esté todavía del todo fina. Quizás estoy diciendo tonterías, pero ¿has probado a convertir el .jar del framework Spring a formato .dll?

Ya ves que no te puedo ayudar mucho más, quizás lo suyo sea preguntar en la mailing list del proyecto IKVM, o probar alguna otra "solución puente" similar, como Ja.NET.

Ya nos comentarás si finalmente consigues resolver el problema.

Muchas gracias y saludoX.

Unknown dijo...

¿Existe alguna posibilidad de utilizar estas librerías para interoperar Swing con Windows Forms?
¿Alguien ha realizado alguna prueba de este tipo?

Anónimo dijo...

Buenas Juan Carlos,

La verdad es que nosotros no hemos realizado ese tipo de pruebas de interopeabilidad entre Swing y Windows Forms, sino que han sido pruebas más orientadas a aprovechar desde .NET cierta funcionaldad Java encapsulada en .jar.

De todos modos, tu pregunta me ha abierto la curiosidad, principalmente porque no le veo demasiado sentido a interoperar entre librerías de controles de Java y .NET, supongo que tiene que estar justificadísimo..., por ejemplo algún control gráfico o funcionalidad concreta no implementada sobre alguna de las dos plataformas...

Total, que me he ido a la página de IKVM, donde comentan "AWT and Swing are not presently functional. This is a low priority item for the project developers". En otras palabras, que la interoperabilidad con AWT y Swing no funciona (lo digo sin haber probado...) y que no es un tema prioritario dentro del roadmap del proyecto IKVM.

Siento darte yo esta mala noticia, pero me sigue picando la curiosidad: ¿Se puede saber para qué necesitas interoperar entre Swing y Windows Forms? Debe der "grave" ;-).

Gracias por el comentario.

SaludoX.

Anónimo dijo...

Hola, yo también estoy intentando usar weka desde vwd2008, y mi problema es que no se como agregar la referencia de IKVM.OpenJDK.ClassLibrary.

me pueden ayudar ?

Anónimo dijo...

Yo también estoy intentando agregar la referencia ClassLibrary pero no se de donde pillarla, he conseguido generar el weka.dll, pero la otra, ni idea.