lunes, marzo 15, 2010

R-Eclipse 1.0

Hace un tiempo comencé a construir un entorno de desarrollo integrado (IDE) para el lenguaje de programación R, y finalmente he decidido liberar una primera versión. El componente dista mucho de ser perfecto (y completo) pero sinceramente me siento muy orgulloso del trabajo realizado.

La herramienta está basada en la arquitectura de plugins de Eclipse, constando de cinco módulos (plugins/bundles) que a continuación describo de manera muy resumida:
  • Plugin r.core: núcleo de la aplicación. Incluye el analizador léxico y sintáctico del lenguaje, infraestructura básica para la construcción y recorrido del AST, indexado, mixin parsers, etc.
  • Plugin r.completion: añade a la herramienta la capacidad de realizar la compleción de código.
  • Plugin r.formatter: añade a la herramienta la capacidad de ordenación e indentación del código fuente.
  • Plugin r.launching: añade a la herramienta la capacidad de ejecución integrada de los programas R.
  • Plugin r.ui: contiene la mayor parte de componentes gráficos de la herramienta. Gestión de preferencias de formateo/indexación, editor R, preferencias de compleción de código, resaltado de palabras reservadas, templates, etc
  • Adicionalmente existe un módulo de documentación que contiene información de diversa índole
He utilizado maven como herramienta de gestión de dependencias y control del proyecto aunque en este mismo instante está un poco "manga por hombro" puesto que he estado haciendo varias pruebas para la generación de la feature final mediante  Buckminster.

Soy consciente de la existencia de varios bugs (y todos los que yo no habré detectado :) ) y de muchas características que podrían añadirse para mejorar la herramienta. A continuación resumo una pequeña lista de defectos/mejoras:
  •  Tal y como indicaba anteriormente, intentaré migrar por completo a Buckminster.
  • Añadir más pruebas (tanto unitarias como de integración)
  • Mejorar la compleción de código: ampliar los lugares donde se habilita la compleción del mismo y mejorar algunas de las características ya existentes.
  • Inclusión de un motor de ejecución remoto, de modo que se permita configurar un intérprete en una máquina diferente que sea capaz de ejecutar nuestros scripts R.
  • Inclusión de una consola interactiva. En la actualidad la consola simplemente integra los resultados de las ejecuciones de nuestros scripts, pero no permite la interactividad.
  • Incluir un depurador de código. Puede que sea la más complicada, pero, personalmente, creo que es la características más interesante junto con la ejecución remota descrita en el punto anterior.
  • Programación visual: diagrama R integrado. Creación de un diagrama que nos permita construir nuestros programas de manera gráfica mediante una paleta de funcionalidades. Estaría basado en Eclipse GMF y puede que entonces también se distribuyera la herramienta como cliente rico (Eclipse RCP)
  • . . . . 
Se puede obtener acceso al código fuente en modo lectura desde la siguiente URL: http://reclipse.googlecode.com/svn/trunk/. Si alguien quiere participar le puedo dar acceso al repositorio en modo escritura.

Hasta pronto!

PD: en la siguiente entrada añadiré unas capturas de pantalla para que se pueda tener una perspectiva general de la herramienta

Probando con Marick

El pasado sábado tuve la ocasión, y suerte, de asistir al evento Probando con Marick y, verdaderamente,  resultó muy entretenido.

En la primera parte del evento, y partiendo de una aplicación que había desarrollado para su  mujer, escenificó (mediante alguno de los asistentes que allí nos encontrabamos), un fujo de ejecución de una de las características que ya estaban implementadas, haciendo hincapié en el proceso de testing unitario y hablando acerca de como los mocks resultan de gran ayuda para llevar a cabo este tipo de pruebas. La segunda parte de la charla estuvo más centrada en conversar con él acerca de diferentes enfoques a la hora de llevar a cabo un desarrollo software.

Trabajo de un modo similar al descrito en su charla desde hace tiempo por lo que no me sorprendió nada de lo que contó; aunque nunca está mal oirlo de boca de uno de los gurús de la materia :).

Para quienes no lo conozcan, Brian Marick, es uno de los firmantes del Agile Manifesto y  un miembro activo de la comunidad ágil internacional.

Desde aquí, me gustaría agradecer a José Manuel Beas su esfuerzo por que iniciativas de este tipo prosperen en este país. Desde aquí te brindo mi ayuda para cualquier cosa en la que te pueda echar un cable.

Es una actualización aprisa y corriendo que me tengo que ir a clase!!

Hasta pronto!

lunes, marzo 08, 2010

AOP Pointcuts theory

Hace tiempo habíamos hablado acerca del modelo de joint point ofrecido por AspectJ, concretamente en estas dos entradas: Joint Point I y Joint Point II.

En los dos posts anteriores indicabamos que un join point no es más que un punto de ejecución en un sistema. Así por ejemplo, el acceso al campo de una clase, la ejecución de una función o una sentencia for son ejemplos de join points. AspectJ solamente expone un subconjunto de todos los posibles joint points, limitando de este modo, el acceso a las construcciones más estables.

Los pointcuts son construcciones que nos permite seleccionar joint points y recuperar su contexto. Veamos algunas de las características principales:
  • Los pointcuts especifican un criterio de selección. Utilizaremos tipos, campos, métodos, anotaciones, etc para generar dichas definiciones. También podremos establecer condiciones en tiempo de ejecución que tendrán que cumplirse en el joint point seleccionado.
  • Los joint point disponen de información en tiempo de ejecución. Determinados pointcuts pueden recolectar dicha información y pasársela al advice. Por ejemplo, la llamada a un método de un objeto tendrá disponible el propio objeto que realiza la llamada y los argumentos que se están pasando.
  • En el caso del lenguaje Java, todos los elementos que componen un programa tienen una signatura. La utilización de patrones para dichas signaturas permiten a los pointcuts especificar las reglas de selección de los joint point que se desean capturar.
Los párrafos anteriores resumen de manera breve, y teórica, las características principales de los pointcuts. En la siguiente tabla se resumen las categorías principales de joint points expuestos por AspectJ.

Categorías de joint points expuestas por AspectJ (resumen)
Categoría Joint Point Expuesto Código que representa
Método Execution Cuerpo del método
Método Call Invocación del método
Constructor Execution Ejecución de la lógica de creación de un objeto
Constructor Call Invocación de la lógica de creación de un objeto
Acceso a un campo Read Lectura de un objeto o el campo de una clase
Acceso a un campo Write Escritura de un objeto o el campo de una clase
Proceso de excepciones Handler Bloque catch para manejar una
excepción
Inicialización Class init Proceso de carga de una clase (class
loading
)
Inicialización Object init Inicialización de un objeto en un constructor
Inicialización Object pre-init Pre-inicialización de un objeto en un constructor
Advice Execution Ejecución de un advice

En la siguiente entrada (espero que sea lo más pronto posible :) ) analizaremos en detalle la estructura sintáctica de los pointcuts, haciendo especial hincapié en las signaturas.

Hasta pronto!

PD: Últimamente mi tiempo escasea (por llamarlo de alguna manera) pero eso dará para una nueva entrada.

domingo, febrero 14, 2010

La vuelta al cole


Como ya os comentaba en el post anterior (si es que se puede llamar así :( ) últimamente el tiempo se ha convertido en un bien escaso. No sé cómo demonios me las apaño pero nunca tengo tiempo a hacer/terminar todas las cosas que me he propuesto.

El motivo principal de esta entrada era contaros que me han aceptado en un posgrado de la politécnica de Madrid y que a partir del miércoles 17 de febrero regresaré a las clases de manera oficial. Si alguien me preguntase cuáles son las motivaciones que me han llevado de nuevo a la facultad no estoy seguro cuál sería la respuesta; puede que algo tan simple como un "me apetece". En principio parece muy interesante y, aunque compaginarlo con el trabajo implicará grandes esfuerzos, estoy dispuesto a intentarlo. Ya os iré contando qué tal son las clases y cómo me voy defendiendo.

Cambiando de tema,  había estado pensando en comprarme un netbook (no es una necesidad imperiosa, es más bien un capricho :) ). ¿Alguno me puede dar alguna recomendación? Había pensado en un DELL pero me da rabia tener que pagar la licencia de Windows. Agradecería cualquier tipo de consejo y/o sugerencia.

Hasta pronto!

viernes, febrero 05, 2010

Sin demasiado tiempo

Estos últimos días he estado bastante atareado y no he tenido ocasión de escribir nada en el blog. Espero que esta tarde y el fin de semana tenga un hueco para redactar alguna entrada nueva.

Tendré que sacar tiempo de algún sitio :).

Hasta pronto!

viernes, enero 22, 2010

Desilusión

Llevo un par de días en los que no estoy durmiendo demasiado bien (algo muy raro en mi :) ) así que aquí estoy leyendo un poco y viendo la tele hasta que llegue la hora de ir a trabajar.

Últimamente tengo un montón de cosas en la cabeza: la posible vuelta a la Universidad (cuando lo tenga decidido escribiré otro post relativo a este tema), la búsqueda de una casa, . . .  y el trabajo. Y creo que es este último el que me está quitando el sueño. Cuando decidí regresar a Madrid lo hice con la firme convicción de seguir creciendo, tanto personal como profesionalmente, y de momento las cosas no están siendo como yo pensaba ni muchísimo menos, es más, creo que en lugar de caminar hacia adelante estoy retrocediendo.

¿Y por qué tengo esta sensación me pregunto? Básicamente porque no se están cumpliendo ninguna de las cosas que me habían dicho; tengo menos responsabilidades y capacidad de decisión que cuando estaba en Gijón así que . . . .

La primera medida es que no pienso hacer ni un minuto de más, pero ni uno solo. En otras ocasiones hemos hecho horas y horas de más (fines de semana incluidos) que no han tenido ningún tipo de recompensa. Lo que no de tiempo a hacerse no es mi problema, que se las apañen.

Voy a centrarme en las cosas que me interesan y que me permitan seguir creciendo haciendo lo que más me gusta: puede que regrese a la Universidad y voy a poner en marcha un par de proyectos que tenía en mente.

Por último, voy a considerar seriamente una interesante oferta que tengo sobre la mesa.

Ya sé que no son horas de estar levantando, ni mucho menos de soltar este auténtico rollo, pero simplemente me apetecía escribirlo, y para eso el blog es mío :).

No os preocupéis, enseguida volverán las cosas aburridas: más Groovy (AST Transformations, DSL, ...), una serie de posts dedicados a la construcción de aplicaciones web basadas en OSGI, intentaré continuar con la serie de post dedicados a AspectJ comenzada hace tiempo, . . . y alguna cosilla más.

Bueno, voy a ir duchándome y esas cosas que dentro de un rato tengo que salir para ir cogiendo el metro.

Hasta pronto!

PD: esta tarde la gordita y yo iremos a una feria de la vivienda de segunda mano que se celebra en el palacio de congresos. Los pisos que allí se expongan deben presentar un precio reducido entre un 30 y un 40% respecto a su valor de tasación máximo en 2006. Ya os contaré a la vuelta.

jueves, enero 21, 2010

El segundo mundo

Este es el título del libro que estoy leyendo actualmente. Un viaje a lo largo de todo el mundo mostrando cómo el dominio estadounidense se está viendo reemplazado por un mercado geopolítico en el que tanto China como la Unión Europeoa compiten con Estados Unidos para configurar el nuevo orden mundial en sus propios términos. Todavía no he terminado de leerlo pero la verdad que hasta el momento me está gustando bastante.

Aquí os dejo un enlace al libro: El Segundo Mundo, y un enlace a la bibliografía del autor: Parag Khanna.

Hasta pronto!

domingo, enero 17, 2010

AIGUANTULIVINAMERICA

Ayer por la noche la gordita y yo estuvimos en el teatro de La Chocita del Loro para ver en directo uno de los últimos monólogos de Goyo Jiménez, AIGUANTULIVINAMERICA. Sinceramente, no tengo palabras para describir el arte que tiene el tío: gracioso, ameno, espontáneo, interactuando con el público, infinidad de recursos, . . ., en fin, un fuera de serie. Lo conocía de ver sus monólogos en YouTube, pero, desde luego, el directo supera con creces todos los vídeos que había visto hasta el momento.

A lo largo de su actuación realiza una comparativa de las vidas españolas respecto a sus homólogas americanas, explicando los motivos por los que éstas últimas son mucho mejores. Dos horas de diversión ininterrumpida altamente recomenbables.

Por si a alguien le interesa, nosotros compramos las entradas en Atrápalo con unos diez días de antelación aproximadamente, y nos costarón 16€/persona. El próximo martes iremos a la sala Joy Slava para ver en directo a varios de los monologuistas de Paramount Comedy.

Hasta pronto!

PD: Ayer he conocido una tienda de gominolas en la calle Fuencarral para quitar el hipo. La tienda es muy cara (creo que a 1.80€ los 100 gramos) pero desde luego son las mejores gominolas que he comido en la vida.

miércoles, enero 06, 2010

Primer post del año

Día de Reyes y aquí estoy sentado en el sofá leyendo uno de los múltiples libros que tengo pendientes. Parece ser que este año me he portado bastante bien porque los Reyes Magos me han dejado unos cuantos regalos: chaqueta y jersey de G-Star, un pijama, un máquina para cortar el pelo ( y la barba :) ), un juego de sumiller, un lector de DNIe ( y varios tipos de tarjetas) y algo de dinero; la verdad es que no me puedo quejar.

Como ya os había comentado en una entrada anterior, he pasado las Navidades en casa de mis padres, intentando aprovechar al máximo los pocos días disponibles: he pasado bastante tiempo con mi familia y los peques, he quedado con Andre,Moreno y Vicio, con mis amigos de Lastres (por fin he conocido el Rancho Chico), . . . no sé, realmente me han resultado fructíferas estas vacaciones.

Y ahora que las Navidades ya se han terminado comienzo el año con energías renovadas y ganas de poner en marcha alguna de las ideas que me rondan por la cabeza. Puede que dentro de poco se avecinen cambios pero tampoco quiero adelantarme a los acontecimientos.

Para terminar os dejo alguna foto que Ita y yo hicimos con los peques cuando estuvimos en Mercaplana:








Hasta pronto!

miércoles, diciembre 23, 2009

Año viejo. Año nuevo

Posiblemente este sea el último post del año puesto que mañana me quedo de vacaciones y en casa de mis padres no dispondré de conexión a Internet. Si alguien me necesita que recurra al viejo truco del teléfono móvil.


Antes de continuar con el post me gustaría deciros que ya he recibido mi regalo de Papa Noel que me ha hecho la gordita:  Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages


No se ha liberado todavía (posiblemente en Enero) pero de esta manera iré recibiendo todas las actualizaciones del libro a medida que se vayan realizando. Tengo que terminar un par de lecturas que tengo a medias aunque no se si podré esperar para comenzar a leerlo :).


En primer lugar quería desearos desde aquí una Feliz Navidad y año nuevo, que disfruteis mucho de estos días de vacaciones (aquellos que podais disfrutar de ellos) en compañía de vuestra gente.


No suelo hacer los típicos propósitos de año nuevo, aunque si voy a dejar por escrito las cosas que me gustaría hacer el próximo año. Si logro cumplirlas, bienvenido sea, aunque si no las realizo tampoco pasará nada :).



  1. Pasar mucho más tiempo con la gordita (esta es la más importante)
  2. Viajar a Japón
  3. Regresar a Alemania (para ésto ya tenemos billetes :) )
  4. Intentar quedar lo máximo posible con los amigos que ahora no están tan cerca (esto también es muy importante)
  5. Comenzar las clases del Máster (esto no depende de mi directamente, sino de la Politécnica de Madrid)
  6. Continuar con la construcción de R-Eclipse: soporte para intérpretes remotos y construcción de un depurador.
  7. Comenzar el desarrollo de Visual-R, una herramienta gráfica para el desarrollo de aplicaciones R. La idea es que se complemente con R-Eclipse de manera sencilla. Estará basada en EclipseRCP, GMF,EMF, GEF,Spring,Maven, etc. Lo voy a liberar así que si alguien se anima y quiere participar no tiene más que decírmelo.
  8. Terminar de darle caña a Erlang que cada día que pasa me gusta más. (también debería continuar con Scala que hace tiempo que lo tengo parado)
  9. Leer todos los libros que tengo pendientes. No los enumero porque se me haría un post eterno :)
  10. Ver todos los videos que me he bajado de InfoQ, para ello el Itouch será un inestimable compañero de viaje.
Repaso la lista y me parece que son demasiadas cosas (más algunas que no he puesto). Esperemos que dentro de un año me pueda sentar frente al ordenador y pueda revisar cuáles he llevado a cabo y cuáles se han quedado en el tintero.

Ya me despido que es demasiado tarde y mañana, bueno hoy :), tengo que madrugar. Desearos de nuevo unas felices fiestas y todo lo mejor para el próximo año.

Un abrazo!

Migue

domingo, diciembre 20, 2009

Groovy Metaprogramming: Categories (I)

Groovy nos ofrece un amplio conjunto de técnicas de metaprogramación: Categories, Interceptors, metaclases, etc. A lo largo de una serie de posts analizaremos en detalle algunas de las características anteriores: comencemos por las Categories.


En muchas ocasiones es necesario que alguna clase que no está bajo nuestro control disponga de métodos adicionales. Gracias a las Categories, Groovy introduce esta funcionalidad en el lenguaje (la ha tomado prestada de Objective-C). El propio lenguaje incorpora alguna Category como DOMCategory o ServletCategory, de la cual vamos a ver algún sencillo ejemplo.

El principal objetivo de ServletCategory persigue que los atributos de objetos que implementan el Servlet API puedan ser tratados como properties dado que no siguen las convenciones establecidas por JavaBeans.

En el ejemplo de GroovyServlet visto en un post anterior (Groovlets), analizamos cómo nuestros scripts Groovy podían actuar como servlets, permitiéndonos realizar accesos mediante properties contra el objeto de la request. Para conseguir ésto, desde el código Java, se invoca a GroovyCategorySupport de un modo similar al siguiente:


Closure closure = new Closure(gse) {
   public Object call() {
       try {
           return ((GroovyScriptEngine) getDelegate()).run(scriptUri, binding);
       } catch (ResourceException e) {
           throw new RuntimeException(e);
       } catch (ScriptException e) {
           throw new RuntimeException(e);
       }
   }
};
GroovyCategorySupport.use(ServletCategory.class, closure);


Gracias al código anterior podríamos acceder mediante su nombre a diversos componentes como la session o la request:

if (session.count == null) session.count = 1;
en lugar de acceder a través del API:

if (session.getAttribute("count") == null) then session.setAttribute("count", 1);
Con este pequeño ejemplo hemos visto qué son y cómo podemos utilizar las Categories proporcionadas por el lenguaje pero . . . ¿Cuáles son los pasos a seguir si deseamos crear nuestras propias Categories?
Asentemos los conocimientos que hemos adquirido en esta entrada para generar nuestras propias construcciones en el siguiente post :).

Hasta pronto!

viernes, diciembre 18, 2009

Un paso atrás

Ya han pasado quince días desde que he regresado a Madrid y me gustaría hacer un pequeño balance en voz alta de cómo están siendo las cosas hasta este momento.

La nueva vida aquí con la gordita no dista mucho de la que hacíamos en Gijón e intentamos aprovechar al máximo el poco tiempo que tenemos disponible: un finde en Valencia, una cata de cacique 500 en casa de unos amigos, de cañitas siempre que podemos, nos hemos comprado unos billetes para Berlín y Stuttgart por Semana Santa, el otro día estuvimos comiendo en el Viavélez, . . . seguro que se me olvida algo :) .

También es cierto que regresar a Madrid ha tenido cosas sus efectos "negativos", y ahora tenemos un poco más lejos al "Fori" y a Martita, a Andre y Moreno, a Vicio, . . .. Será algo a los que nos tendremos que ir acostumbrando con el paso del tiempo. ¡Os echo de menos!

Por último, y es el tema por el que estoy un poco preocupado, el trabajo. Uno de los motivos por los que decidí regresar a Madrid fue la de intentar darle un nuevo empujón a mi carrera e intentar seguir mejorando al máximo. Pues bien, tal y como reza el título del post, me parece que estoy caminando hacia atrás y las cosas no están siendo ni mucho menos como yo esperaba. Me siento engañado y eso es algo que no soporto en absoluto. No voy a extenderme demasiado respecto a este tema porque, sinceramente, estoy bastante, decepcionado y sé que si continuo escribiendo me voy a poner de más mala leche todavía si cabe.

Para terminar, que se está haciendo tarde, voy a hacer un propósito de intenciones :). Voy a intentar escribir todos los días en el blog sobre las cosas que más me gustan: arquitectura de software, lenguajes de programación, libros, frameworks, diseño, calidad, etc. De vez en cuando haré algún post de este calibre para contaros como continuan las cosas o si tengo alguna novedad.

Un abrazo!

Migue

miércoles, diciembre 16, 2009

Groovlets

Me imagino que la gente dedicada al desarrollo web estará acostumbrada al concepto de servlet, y posiblemente, hayan escrito muchos de ellos.

Voy a mostraros una forma sencilla de escribir y configurar servlets en el lenguaje Groovy. Esta funcionalidad compilará nuestros archivos .groovy en el bytecode correspondiente, cargará la clase, y la cacheará, hasta que se produzca un cambio en el archivo groovy inicial.

El primer paso que vamos a dar es añadir el soporte para los Groovlets, para lo que necesitaremos añadir en el archivo web.xml de la aplicación web el siguiente fragmento de código:


<servlet><servlet-name>Groovy</servlet-name>
<servlet-class>groovy.servlet.GroovyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Groovy</servlet-name>
<url-pattern>*.groovy</url-pattern>
</servlet-mapping>
Ahora estamos en disposición de escribir un servlet en el lenguaje Groovy (llamemoslo hello.groovy). Veamos un ejemplo sencillito:



if (!session) {
  session = request.session(true)
}

if (!session.counter) {
      session.counter = 1
}

html.html {    // utilizamos del MarkupBuilder 
               // para construir una página tonta de respuesta
  head {
      title("Esto es un Groovy Servlet")
  }
  body {
    p("Bienvenido, ${request.remoteHost}: ${session.counter}! ${new Date()}")
  }
}


// incrementamos el contador en la session
session.counter = session.counter + 1

En el servlet (groovlet) anterior existen una serie de variables implícitas tales como, request, response, context, application, session, params, headers, out, sout y html.

Un paso adicional de configuración, sumamente importante, para poner nuestro groovlet en marcha, consiste en incluir las dependencias necesarias. La opción más sencilla es incluir el archivo groovy-all-XXX.jar en el directorio WEB-INF/lib de la aplicación web.

Si, por ejemplo, colocamos los archivos .groovy en el raiz de nuestra aplicación el servlet de groovy se encargará de compilar los archivos. En el caso de tomcat podríamos editar el archivo tomcat/conf/server.xml del siguiente modo:




<Context path="/groovy" docBase="c:/groovy-servlet-base"/>



Podríamos acceder al archivo creado anteriormente mediante la siguiente ur:l http://localhost:8080/groovy/hello.groovy


Hasta pronto,
Migue

martes, diciembre 01, 2009

No Internet

Estoy a la espera de que nos instalen la conexión ADSL y el teléfono fijo en casa así que hasta que no llegue dicho momento sólo podré postear alargando un poco la estancia en la oficina. Esperemos que nos hagan pronto la instalación.

Por si a alguien no se lo había comentado, he regresado a Madrid, a ver que pasa. De momento las cosas no han empezado demasiado bien, y me parece que me han tomado por tonto, ya veremos a ver que pasa . . .

Hasta pronto!

sábado, noviembre 28, 2009

Por fin

Ayer, después de tres largos años que terminé la carrera, por fin entregué el proyecto. Ha sido, y soy sincero, un tiempo en el que no ha habido un único día en el que me fuese a la cama sin pensar en que lo tenía pendiente, que me debería poner en serio, pero por una cosa u otra nunca lo hacía. En unas ocasiones el trabajo, en otras que las ganas escaseaban, de nuevo el trabajo :), etc, etc,etc.

Cuando este verano comenzamos la jornada continua me propuse que, costara lo que costara, me pondría en serio,y, así ha sido; por fin lo he terminado. Además, y a  nadie le amarga un dulce, me han calificado con matrícula de honor, con la que la alegría ha sido un poquito mayor :).

Desde aquí, y aunque ya lo he hecho en persona, me gustaría darle las gracias a mis padres por insistir hasta la saciedad para que terminase; muchas gracias! Y como no a Iratxe, porque sin ella todo estoy seguro de que todo ésto no hubiese sido posible.

También me gustaría agradecer a Luciano, mi director de proyecto, la paciencia que ha tenido conmigo, cambiándole de proyecto cada dos por tres jajaja.

Muchas gracias a todos!!

Hasta pronto

PD: tal y como os comentaba en algún post anterior ahora le dedicaré más tiempo al blog así que a ver si logro hacer de este pequeño sitio en Internet un poquito más interesante

lunes, noviembre 23, 2009

Análisis de Redes Sociales

Las redes sociales y el análisis de la mismas se han convertido en algo muy popular. Asi por ejemplo, aplicaciones como Twitter,Facebook o Linkedin han adquirido una popularidad desmesurada en los tiempos que corren. Personalmente, y esta es mi humilde opinión, creo que debería hacerse un uso controlado de las mismas (del mismo modo que el resto de Internet, claro está), puesto que ,aunque pueden ser una herramienta sumamente beneficiosa, un uso inadecuado de las mismas podría acarrear grandes problemas. De todos modos,aunque relacionado con las redes sociales, éste no era el asunto inicial de esta entrada (podríamos hablar horas acerca de ésto).

Hace poquito, para estrenar de manera oficial el entorno de desarrollo integrado que he construido para R (os contaré alguna cosilla relacionada con dicho entorno en el futuro), he escrito un pequeño programa que realiza un análisis de redes sociales.

El programa es bastante sencillo. Os resumo de manera esquemática lo que realiza:

  • Recupera los últimos N twetts que contengan la etiqueta TAG.
  • A partir los anteriores N twetts, recupera los usuarios (eliminando repetidos) que han realizado dichos twetts.
  • Para cada uno de los usuarios anteriores recupera su red de contactos (siempre y cuando su red no esté protegida).
  • Con toda la información anterior, realiza la construcción de una red en la que se pueden como se relacionan entre sí todos los contactos.
Es un análisis bastante sencillo (mis conocimientos de estadística/matemáticas son prácticamente nulos), pero me ha servido para probar el entorno recién construido así como para enseñar un poco las capacidades de R y las ventajas que aporta su utilización.

A continuación os pongo algunas imágenes de los resultados obtenidos.

La siguiente red está construida a partir de los últimos 10 twitts que contenían el tag eclipse:



En esta ocasión la red está construida a partir de los últimos 10 twitts que contenían el tag rstats:

En este último ejemplo la red está construida a partir de los últimos 10 twitts que contenían el tag erlang:

Podeis obtener una copia de trabajo desde la siguiente URL del servidor subversion en el que se encuentra alojado:

https://reclipse.googlecode.com/svn/DemoProject/trunk/demo-r-module/source/twitter/Twitter-SNA.R

Hasta pronto!

viernes, noviembre 20, 2009

JDT Weaving Service (y II)

Tal y como os había prometido en el post anterior, ahora os dejo un pequeño proyecto con un único archivo que contiene un programa de ejemplo del lenguaje que nos hemos inventado en la entrada previa.

Podeis obtener una copia de trabajo desde la siguiente URL del servidor subversion en el que está alojado:

http://reclipse.googlecode.com/svn/trunk/com.blogspot.miguelinlas3.ajdt.demoexample

Gracias al plugin cosntruido en la entrada anterior, el archivo de código fuente obtenido en el checkout anterior se visualizaría del siguiente modo:


Como veis, hemos integrado nuestro lenguaje de ejemplo en el modelo JDT de Eclipse de una manera relativamente sencilla.

Posiblemente ahora comienze a tener algo más de tiempo libre así que intentaré aumentar la frecuencia de los posts. Puede que en las siguientes entradas cambiemos un poco estas últimas entradas dedicadas a los lenguajes y sus entornos y veamos algo más "empresarial".

Hasta pronto!

miércoles, noviembre 18, 2009

JDT Weaving Service

Tal y como comentabamos hace uno o dos posts, algunos equipos como AJDT o Scala IDE construyen el entorno de desarrollo para Eclipse basándose en el servicio de tejido de JDT (JDT Weaving Service).

Vamos a realizar un pequeño ejemplo para nuestro lenguaje (ficticio) de programación Demo, que corre sobre la máquina virtual de Java, integrándolo en el modelo JDT (voy a asumir que se disponen de una serie de conocimientos básicos de Eclipse).

En primer lugar necesitaremos tener disponibles las siguientes dependencias en nuestro entorno de desarrollo:
  • Eclipse 3.5 o superior.
  • AJDT 1.6.4 o superior (http://download.eclipse.org/tools/ajdt/35/update).
  • Servicio JDT de weaving debe estar activado.

Con el objetivo de facilitar el seguimiento de este pequeño ejemplo creo que será mejor disponer del proyecto desde el principio, por lo que, desde vuestro cliente subversion preferido obteneis una copia de trabajo desde la siguiente dirección:

http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.ajdt.demo/trunk/

(y haceis un Import del proyecto en el Eclipse si habeis obtenido la copia de trabajo desde un cliente externo).

Una vez disponemos del proyecto accederemos al archivo plugin.xml y veremos los siguientes puntos de extensión:

Los puntos de extensión org.eclipse.contribution.weaving.* nos permiten extender el modelo JDT, integrando en él los componentes de nuestro lenguaje.

La clase principal es DemoSourceProvider, la cual contribuye al modelo mediante el punto de extensión org.eclipse.contribution.weaving.jdt.sourcetransformer.

El objetivo principal de la clase anterior consiste en traducir nuestro lenguaje (completamente absurdo :) ). Si la definición de un archivo de código fuente de nuestro lenguaje fuese algo como lo siguiente:

name: MyDemo {
x: 10
y: 5
z: 12
}

el traductor intentará convertirlo en algo como lo que sigue:

class MyDemo {
int x= 10;
int y= 5;
int z = 12;
}

Intentad darle un vistazo al código (son cuatro clases con muy poco código) y mañana os dejaré un proyecto de ejemplo que haga uso de esta construcción para que veais que realmente se integra nuestro absurdo lenguaje!

Hasta pronto!

viernes, noviembre 13, 2009

Definición de DSL

Los DSL's son lenguajes de programación específicos desarrollados para resolver problemas en un dominio especializado.

El dominio anterior podría ser multitud de cosas diferentes, por ejemplo, podría ser relativo a la industria: inteligencia analítica, banca, seguros, marketing, . . . o relativo a la tecnología: JEE,.Net, servicios de mensajes, arquitectura o bases de datos.

Existe tres tipos diferentes de DSL: externos, internos, y workbench languages
donde cada uno de los anteriores tiene una audiencia definida, y, por normal general, no suelen solaparse:
  • Los DSL externos utilizan un lenguaje diferente al de la aplicación que los está utilizando. Generalmente tienen un lenguaje específico, aunque en otras ocasiones, utilizan otra sintáxis diferente (XML es el ejemplo más claro). Algunos ejemplos de DSL externos que seguramente os puedan sonar son: SQL,awk o los ficheros xml de configuración de herramientas como Hibernate o Spring.
  • Los DSL's internos utilizan el mismo lenguaje de propósito general más utilizado en el sistema, aunque haciendo un uso limitado del mismo. Se utiliza un subconjunto de las construcciones del lenguaje, enfocadas a un aspecto determinado de la aplicación. Tanto Groovy como Ruby han generado una gran cultura en la construcción de DSL's. Mucha gente ve los frameworks más populares asociados a los dos lenguajes anteriores (Grails y Rails) como una colección de DSL's.
  • Language Workbenches (este término ha sido acuñado por Martin Fowler) son IDE's diseñados para la construcción de DSL's. Estas herramientas permitirán definir la sintaxis del lenguaje, junto a editores y generadores. Los primeros nos permitirán disponer de sofisticados entornos de programación para los DSL's, de manera idéntica a los actuales IDE's. Ejemplos de este tipo pueden ser los proyectos de eclipse de GMF o las herramientas de ANTLR para Eclipse.
En próximos post intentaremos profundizar en el tema.

Hasta pronto!

jueves, noviembre 05, 2009

New Languages. Building IDE's

En los últimos años han surgido muchos lenguajes similares a Java que se ejecutan sobre la propia máquina virtual de este último (JVM) lo cual es un indicador bastante fiable de cual será el futuro del desarrollo de aplicaciones sobre esta plataforma.

Sin embargo, Eclipse y su solución JDT, no ofrecen soporte para la integración de estos nuevos lenguajes en su modelo subyacente. Por ejemplo, no existe un modo de incluir jerarquías de tipos,jerarquías de llamadas, etc de manera directa.

Una aproximación utilizada por muchos entornos de desarrollo de lenguajes actuales, como por ejemplo el caso de Scala, es la utilización de servicio de tejido de JDT. Las características principales son:

  • Utiliza AspectJ añadiendo puntos de unión al modelo JDT
  • Se encapsula en puntos de extensión de Eclipse, haciéndolo extensible a terceras partes.
  • Utiliza un proyecto de Eclipse conocido como Equinox Aspects que soporta el proceso de tejido en tiempo de carga en un entorno OSGI.
La construcción de entornos de desarrollo para otro tipo de lenguajes, que podríamos denominar de scripting, como puede ser JavaScript,Python,Tcl o Ruby se puede basar en un enfoque diferente al anterior, mediante el uso del proyecto DLTK de Eclipse (www.eclipse.org/dltk).

En próximas entradas analizaremos las claves de la construcción de un IDE para el lenguaje de programación R (www.r-project.org).

Hasta pronto!