domingo, abril 18, 2010

Some signatures examples

En la última entrada dedicada a AOP (podeis verla aquí ) analizamos de manera teórica las características básicas del lenguaje de definición de pointcuts. A continuación realizaremos una serie de ejemplos que intentarán clarificar los conceptos teóricos vistos en anteriores entradas.

  • Signaturas de tipos
Table 1.2. Ejemplos de signaturas de tipos
Patrón de la signaturaDescripciónEjemplos de tipos concordantes
AstVisitorEl tipo AstVisitorSólo el tipo AstVisitor concuerda (ni tipos base ni derivados)
*AstVisitorCualquier tipo cuyo nombre termine en AstVisitorPor ejemplo, HighlightingAstVisitor o SemanticAstVisitor concuerdan con el patrón
java.*.DateEl tipo Date en cualquier subpaquete directo del paquete javajava.util.Date o java.sql.Date son ejemplos de tipos concordantes
javax..*Cualquier tipo en el paquete javax y en sus subpaquetes (tanto directos como indirectos)Cualquier tipo en el paquete javax.security así como cualquiera de sus subpaquetes indirectos como javax.security.auth.login
javax..*ModelTodos los tipos en el paquete javax (subpaquetes directos e indirectos) cuyo nombre termine en Model, y todos los subtipos de estos.TableModel, TreeModel y sus subtipos como DefaultTreeModel oDefaultTableModel.



  • Signaturas de tipos: anotaciones
Table 1.3. Ejemplos de signaturas de tipos: anotaciones
Patrón de la signaturaDescripciónEjemplos de tipos concordantes
@Secured UserEl tipo User anotado con la anotación Secured@Secured class User{. . .}
@Entity *Cualquier tipo anotado con la anotación Entity@Entity class Section {. . .},@Entity class Report {. . .}
@Transactional* Manager+El tipo Manager y cualquiera de sus clases derivadas que estén anotados con una anotación cuyo nombre comience por Transactional@TransactionalDefault class Manager{},@TransactionalOracle class OracleManager extends Manager{}




  • Signaturas de tipos: generics
Table 1.4. Ejemplos de signaturas de tipos: generics
Patrón de la signaturaDescripciónEjemplos de tipos concordantes
Map El tipo Map cuyo primer argumento genérico está fijado a Integer y el segundo aStringEn este caso únicamente concordará el tipo Map
*Cualquier tipo genérico cuyo único argumento genérico sea de tipo UserCollection,List, . . .
CollectionEl tipo Collection con un parámetro de tipo User o derivadoCollection, Collection, . . .
CollectionEl tipo Collection, cuyo parámetro será uno de los tipos base de UserCollection, Collection, asumiendo que, User extiende o implementa, directa o indirectamente, Serializable y BaseUser


  • Combinando pointcuts: operadores
Table 1.5. Signaturas de tipo: operadores
Patrón de la signaturaDescripciónEjemplos de tipos concordantes
!CollectionCualquier tipo excepto CollectionUser,Model, List (aunque sea subclase de Collection)
Set || MapLos tipos Set o MapLos tipos Set y Map únicamente
!@TransactionalCualquier tipo que se encuentre anotado por la anotación Transactionalclass NonTransactionalManager{}
@Serializable @Encrypted *Cualquier tipo que se encuentre anotado por las dos anotaciones@Serializable @Encrypted class UserCredentials{}
(@Serializable || @Encrypted) *Cualquier tipo que esté anotado por alguna de las dos anotaciones@Serializable class User {}


  • Signaturas de métodos y constructores
Table 1.6. Signaturas de métodos
Patrón de la signaturaDescripciónEjemplos de métodos concordantes
public void User.set*(*)Cualquier método público de la clase User cuyo nombre comience por set, cuyo tipo de retorno sea void, y que espere un único argumentoclass User{ public void setName(String name){} }
public void User.*()Cualquier método público de la clase User cuyo tipo de retorno sea void y que no espere argumentosclass User { public void updateInfo(){}}
public * User.*()Cualquier método público de la clase User que no espera argumentos y retorna cualquier tipoclass User{ public UserInfo getUserInfo(){}}
public * User.*(..)Cualquier método público de la clase User que retorna cualquier tipo, y espera cualquier número y tipo de argumentos (incluido cero)class User{ public UserInfo getUserInfo(){},public Date updatesBetween(Date first,Date last){}}
* *.*(..) o * * (..)Cualquier método independientemente de su tipo, del tipo de retorno, de su nombre y de los argumentos que espereCualquier método del sistema
!public * User.*(..)Cualquier método que no sea público (privado,protegido o paquete)class User {protected getUserInfo(){}}
* * (..) throws Recognition ExceptionCualquier método que declare que puede lanzar una excepción de tipoRecognitionExceptionclass AntlRBasedParser { public void parser(String file) throws RecognitionException}
* User+.*(..)Cualquier método en la clase User y sus subclasesclass UserDetails extends User {}
User UserService.*(..)Cualquier método del tipo UserService cuyo tipo de retorno sea User. Si alguna de las subclases sobrescribe el tipo de retorno con un subtipo de User (mediante el tipo de retorno covariante introducido en Java 5) también será seleccionado.class UserService{public User retrieveUser(String name){}} class DetailUserService extends UserService{public DetailedUser retrieveUser(String name){}}

La signatura en el caso de los constructores difiere de la signatura de métodos en los siguientes aspectos:
  • Los constructores no tienen tipo de retorno por lo que no se permite utilizar el valor de retorno en la especificación de un pointcut de este tipo.
  • Dado que los nombres de los constructores no pueden ser libres (tienen que utilizar el mismo nombre de la clase), la parte de la signatura destinada al nombre será sustituida con la palabra new.
  • Por último, puesto que los constructores no pueden ser estáticos, no se podrá utilizar la palabra reservada static
  • Signaturas de campos
Table 1.7. Signaturas de campos de clase
Patrón de la signaturaDescripciónEjemplos de campos concordantes
private String User.usernameCampo privado (tanto campo de una instancia como estático) de la clase Userclass User { private String username;}
* User.*Cualquier campo de la clase User independiente de sus calificadores, tipo y nombre.class User{private String username;protected int credits;private UserDetails details;}
* User+.*Cualquier campo de la clase User y todas sus subclases, independientemente de sus calificadores, tipo y nombre.El ejemplo de la fila anterior o class SpecificUser extends User {private String address;}


sábado, abril 10, 2010

Software Disasters

De sobra es sabido por todos que algunos desastres históricos han sido ocasionados por errores en el software.

La siguiente presentación resume alguno de los más conocidos y describe, de manera concreta, dos ejemplos: un fallo de división en un chip de Intel, y un fallo en un sistema de detección de misiles americano.


Hasta pronto!

miércoles, marzo 31, 2010

Cerrado por vacaciones

Últimamente, en la medida que el poco tiempo que tengo me lo permite, había vuelto a postear con una frecuencia que podríamos calificar de "aceptable" :).

Lamentándolo mucho (realmente no, pero queda bien eh?? jejejej) esta misma tarde me marcho de vacaciones a Stuttgart y Berlín hasta la próxima semana por lo que posiblemente no tengais noticias mías hasta finales de la próxima semana.

Hasta pronto!

Migue

Si todo va bien seguiré actualizando twitter y similares para no perder las buenas costumbres :)

jueves, marzo 25, 2010

AOP Pointcuts Definition

Durante entregas anteriores hemos analizado los beneficios de la orientación a aspectos, su Hype Cicle, o el modelo de joint point entre otras características. El conjunto formado por el post actual y el siguiente analizarán los conceptos básicos de los pointcuts junto una serie de sencillos ejemplos.

Inicialmente, deberíamos tener claros los siguientes conceptos:
  • Pointcuts anónimos o con nombre: Se permite la declaración de pointcuts de cualquiera de los dos tipos. Los primeros son similares a las clases anónimas, y por tanto se definen en el lugar en el que se van a utilizar. En el caso de los segundos, podremos referenciarlos desde múltiples lugares, permitiendo de este modo su reutilización.
  • Operadores: AspectJ proporciona el operador unario de negación (!) y dos operadores binarios: && y ||, gracias a los cuales se permite construir reglas de matching complejas mediante la combinación de pointcuts más sencillos. Tanto la semántica como la precedencia es la misma que en el lenguaje Java. Así por ejemplo, en el caso del operador binario &&, se seleccionarán aquellos joint points que concuerden con los dos pointcuts que actúan como operando.
Las signaturas son la base de la definición de los pointcuts. El lenguaje debe facilitar una manera sencilla que permita definir criterios de selección sobre los diferentes aspectos transversales que estamos implementando. En el caso de AspectJ, se utilizan expresiones regulares (wildcards) en combinación con las signaturas. Los siguientes wildcards son soportados:
  • * especifica cualquier número de caracteres, exceptuando el punto (.). En la signatura de un tipo denota una parte de un tipo o de un paquete. En otros patrones denota una parte del nombre (por ejemplo en métodos o campos).
  • .. determina cualquier número de caracteres, incluyendo en este caso cualquier número de puntos (.). En la signatura de un tipo representa cualquier paquete o subpaquete. En la signatura de un método representa cualquier número de argumentos.
  • + denota cualquier subtipo de un tipo determinado.
Hasta este momento hemos estudiado, de manera resumida, los elementos básicos para la definición de los pointcuts; en la siguiente entrada describiremos, a través de una serie de ejemplos, los diferentes patrones de signaturas ofrecidos por AspectJ que pueden ser utilizados para seleccionar diferentes joint points.

Hasta pronto!

martes, marzo 16, 2010

R-Eclipse: some screenshots

En el post anterior comentaba someramente la arquitectura y componentes de R-Eclipse además de las principales herramientas que he utilizado durante el desarrollo del mismo. En esta entrada os mostraré algunas capturas de pantalla que ilustran el aspecto general del IDE así como alguna de sus funcionalidades más relevantes.

  • Inclusión de un nuevo intérprete en el entorno:

  • Primera página en la creación de un proyecto R:

  • Compleción de código: Intellisense y plantillas

  • Outline view

  • Script explorer

  • Editor de código fuente R

  • Ejecuciones de tipo R

Las capturas anteriores dan una idea general de las funcionalidades principales del entorno de desarrollo (podéis acceder a más capturas de pantalla en el módulo de documentación disponible en el sistema de control de versiones).

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