Archive for the ‘Uncategorized’ Category

Vert.x – Async architectures presentation
February 13, 2015

I gave this presentation on 2014, in Japan at Rakuten and in Buenos Aires at IT Crowd Argentina Talks.

Hope you enjoy it.

Turn your Java apps Gnome-Shell friendly
August 30, 2011

The Problem

When you try to add a java application as favorite into the Gnome Shell‘s lateral dock and run it you’ll end up having duplicated icons, one for the launcher and one for the running app. This happens b/c the shell uses an application based system for grouping tasks, so the idea is, if you add an application as a favorite launcher and you start it you’ll end having that launcher icon highlighted. Internally the shell matches the running process with the Exec clause of the .desktop file .
This works well except for applications running inside a VM or being interpreted b/c those will share the same running process. On that situation the shell inspects the WM_CLASS X Window property [1] and matches it with the full name of the desktop file. E.g. if your applications has the WM_CLASS set as “mySwingApp”, for this to successfully matched in the dock with its launcher, that launcher must be called mySwingApp.desktop located according XDG.

Note: for inspecting that value on any window you just need to run xprop WM_CLASS and click into the target window

Why is this happening?

Even if you are creating a swing application from scratch there is no easy way to tweak that X Window property using plain and portable APIs. Taking a look into openjdk sources, this is how them manages it

String mainClassName = null;

StackTraceElement trace[] = (new Throwable()).getStackTrace();
int bottom = trace.length - 1;
if (bottom >= 0) {
    mainClassName = trace[bottom].getClassName();
}
if (mainClassName == null || mainClassName.equals("")) {
    mainClassName = "AWT";
}
awtAppClassName = getCorrectXIDString(mainClassName);

As you may note what is used for this value is the name of the class running the Swing main loop.

Da solution

Digging around the web I founded a java agent and a pretty similar explanation on what’s going on.
So what I did was to fork that agent and improve it a little bit. What I did was to move it into a maven structure and remove its packaging as a fat-jar (I’m radically against fat-jars as you can see in my comments here).

The forked project is located in my github here:
https://github.com/diega/window-matching-agent
and please take a look to the README there

A practical example

My first motivation on doing this was based on IntelliJ IDEA so I’ll paste here my environment.

  • Download the agent-1.0.jar and put it wherever you want (I put it into IntelliJ’s bin/ folder)
  • Edit the file bin/idea.vmoptions adding this line

    -javaagent:agent-1.0.jar=intellij-ultimate

  • Create the file ~/.local/share/applications/intellij-ultimate.desktop with the following content

    [Desktop Entry]
    Version=10.5.1
    Name=IntelliJ IDEA Ultimate Edition
    Comment=The Most Intelligent Java IDE
    Categories=Applications;Development;
    Encoding=UTF-8
    Exec=env IDEA_CLASSPATH\=../lib/asm.jar /home/diego/bin/ideaIU-10.5/bin/idea.sh
    GenericName=IntelliJ
    Icon=/home/diego/bin/ideaIU-10.5/bin/idea128.png
    MimeType=text/x-java
    Terminal=false
    Type=Application
    URL=http://www.jetbrains.com/idea
    

Latest notes

If you download the agent-1.0.jar into another location (or with another name) you must adjust the -javaagent: parameter.
Of course, change the path in the Exec entry to point to your own executable.

Hope this helps somebody, it took me a while to figure out the-right-things-to-do™ :)


[1]: Application Based GNOME 3

Drools Abstract Persistence Layer
January 28, 2011

Introduction

On the past two months, and under Intalio’s sponsorship, I’ve been working adding a new persistence layer into Drools. The main goal of this is to support Berlkey DB as persistent backend. Added abstractions are on that direction.
The approach for this task was to work on top of the current drools-persistence-jpa module. Is assumed this module is tested enough (through junit or merely day-to-day usage) and this is the one who defines the semantics which drools persistent applications should attach.

Little background on managing persistence

When you use the engine in a regular way, you obtain the ksession through the kbase and it doesn’t know anything about how to persist its state. To provide the ksession with persistence capabilities Drools makes use of the command pattern. That way, instead of creating it directly from the kbase you go through a factory which will return a decorator which will handle how and where the state is persisted. Being a decorator, at this point, will be totally transparent to the user whether or not the state is persisted.

Abstracting persistence

As the name dictates, drools-persistence-jpa module is heavily oriented to JPA usage. Then, what we have made here was to clean up the use of JPA interfaces and move them into this module.

The most used interface by JPA is the EntityManager, this one was abstracted by the PersistenceContext interface which now has specific methods for persisting SessionInfo’s and WorkItemInfo’s.
Internally Drools uses different scopes for dealing with persistenceContext’s, one for the whole application and one for each command. This behaviour has also been abstracted into PersistenceContextManager.

Persistence layer before refactor

Persistence layer before refactor


Persistence layer after refactor

Persistence layer after refactor

Backward compatibility

Other important aspect of this refactor is that maintains backward compatiblity. That means that, for the moment, you shouldn’t notice any difference if you already have your JPA application running. Current way to configure the ksession is still the same but we’ll add some new in the future, which, I wish, will end up being more polish and abstract.

JBPM5

This persistence refactor also applies for jbpm5 which now have a ProcessPersistenceContext and a ProcessPersistenceContextManager.

What’s next

In a comming post I’ll show a reference implementation on the top of a regular HashMap.

Haz lo que yo digo nomás
February 20, 2009

Hablando con John Stowers sobre lo que creí era una violación de la EULA de facebook en un bichito que tiene que se llama facebook-notify me hace notar lo poco que se preocupan ellos mismos por ser consistentes con lo que piden.
Básicamente te instan a no distribuir tu secret_key con la aplicación desktop que desarrolles ya que teóricamente implicaría algunos compromisos de seguridad sobre tu plataforma. Sin embargo en su toolbar es exactamente lo que hacen.
Para verlo:

$ wget http://developers.facebook.com/toolbar/facebook_firefox-1.2.2.xpi
$ unzip facebook_firefox-1.2.2.xpi -d facebook_toolbar
$ cd facebook_toolbar
$ grep secret -r *

Y voilà ahí tenemos

components/facebook.js: this._secret = ‘c9646e8dccec4c2726c65f6f5eeca86a’;

Cabe destacar que al menos los desarrolladores son razonables y llamaron a este atributo “secret” ;)

De chicas de recursos humanos I
October 29, 2008

From: Veronica Gimenez
Date: 2008/10/24
Subject: Oportunidad laboral en Globant!
To: xxxxxxx@dc.uba.ar

Diego, como estas?

Soy Verónica Gimenez, actualmente me encuentro trabajando en Globant.

Globant esta creciendo mucho y actualmente tenemos varias posiciones abiertas. No quería dejar pasar la oportunidad de comentarte acerca de las búsquedas laborales que estamos haciendo, ya que creo que los proyectos que estamos lanzando pueden interesarte mucho, tanto para hacer desarrollo en Java, como para Lideres técnicos o arquitectos. Tenemos una gran variedad de proyectos, partiendo desde aplicaciones para clientes de la industria del turismo hasta el desarrollo de videojuegos para Electronic Arts. Como verás, la oferta es muy variada realmente!
No me gustaría encasillarme y contarte solamente un proyecto, ya que según el perfil técnico que tengas (el cual lo vamos a poder evaluar en una entrevista técnica) veremos en cuál de estos proyectos “fittea” mejor tu perfil.
Si estas interesado en avanzar con el proceso de selección, me gustaría que me envíes tu CV para poder coordinar una entrevista.
Quedo a la espera de tu respuesta.

Muchas gracias.

Saludos

Respuesta feliz:
verónica, es la tercera vez que recibo el mismo template de globant.
Queda bastante feo. Realmente me parece mejor que blanqueen que es un
template. Por otro lado, no usen la palabra “fittea” no los hace
distinguirse de ninguna manera, es más efectivo que en las entrevistas
convenzan a la gente que los proyectos que tienen se los han ganado en
función de buenas implementaciones y seriedad pasada y no en función
de ‘conseguir clientes’ en respuesta a favores, por amiguismo o por
lobby.
Saludos y espero que sigan bien.
Gracias por contactarme.

Todavía sin respuesta

Synaptics Touchpad en Debian
August 17, 2008

Finalmente pude hacer funcionar el driver Synaptics con mi touchpad.
Había que agregar en el xorg.conf

Section "ServerLayout"
Identifier "Default Layout"
Screen "Default Screen" 0 0
InputDevice "Generic Keyboard"
InputDevice "Synaptics Touchpad"
EndSection

para indicarle que utilice como InputDevice el touchpad. Sin esta sección utiliza ‘mouse’ por defecto.

Recuperando info I
July 7, 2007

Mi querida primer compu, melón decide agonizar una vez más.
Solo que en esta ocasión está en juego un CVS con relativa data importante.
Los síntomas eran claros y su fin era inminente, pero los backups a conciencia parecen no ser siempre una opción razonable (?). Durante los últimos dos meses el disco rígido principal de esta nos endulzaba el oído con un

tuiiiiiiiiiiiiiiiiiií-tac  tuiiiiiiiiiiiiiiiiiií-tac 

(mis amigos describieron este sonido como el de un respirador artificial, no puedo constatar este hecho por nunca haber tenido la dicha de cruzarme con uno).
Hasta que (tras varios cortes de luz producto de esta crisis energética)…

GRUB loading stage 1.5

GRUB loading, please wait
Error 2

:'( años de compañía tirados a la basura
Así que casi casi me puse a hacer un micro-review de cada GNU/linux live cd de rescate que encontré. A la izquierda una lista de los que fui probando.
Igualmente hay que tener en cuenta que esta

Pentium 166 MMX

no bootea desde CD, así que el primer desafío era encontrar en los confines de mi memoria el famoooooso diskette que alguna vez me permitió bootear cualquier cosa (y realmente es así, te levanta lo que tengas =-o). Después de algún infructuoso mensajes de texto con Marta Rich recuerdo lo importante… http://btmgr.sourceforge.net/ <- Boot Manager
Mini resumen de cada live cd:

  • systemrescuecd: la última versión (0.3.x) no funcionaba en mi pentium viejita, solo en i686, así que me bajé uno más viejo (0.2.19) y con esta distro funcionando pude hacer fsck /dev/hda y luego de muuuuuuchos enters para arreglar cada iNode perdido (no -a cuando está muy fachuteado te dice que lo hagas de manera ‘manual’), estaba con condiciones de montar la partición de nuevo.
  • debian-livecd: yo muy contento con bootear un debian posta en cd, muy copado… levantó bien, pude configurar la placa de red, fdisk -l de los discos, monto mis particiones, peeeeeeeeero… no tiene ssh, apt-get update me tiraba “bus error”, me bajo el paquete wput en un diskette, lo instalo bien con dpkg -i pero la verdad ponerme a aprender/configurar un servidor ftp, ni ganas. Aparte estaba todo el tiempo con la idea que mi disco iba a estallar en cualquier momento (la cantidad de sonidos raros que cada tanto hacía este rígido no tiene nombre).
  • (R)escue (I)s (P)ossible y Trinity eran muy complicados, con unos menues de booteo infinitos, un embole (incluso el segundo nunca terminó de bootear).
  • Finalmente doy con el bienamado Damn Small Linux, que me permitió bootear lo más bien (con la opción DSL 2 al ppio te levanta solo consola). Tiene ssh así que pude copiar todo de diez mil.

Lo que me queda ahora es ver qué hago con los discos estos que parecen querer morir pero yo no los dejo descansar en paz.
Lo importante es que la data está a resguardo.

Detalle de la foto: la compu destartalada, un disco rídigo sobre una lectora de CD (que a su vez estaba encima de otro disco rígido y este sobre un CD de Bach), una diskettera prestada y, asomándose, el pelo de Vegetta y el de el Negro que se quedó haciendo el aguante

Locking NFS
May 5, 2007

Nos volvimos locos viendo por qué los ejemplos de jackrabbit no andaban tirando un “No locks available” (incluso con la JVM de Sun 1.5.0_08 decía “Permission denied”) y resulta que es porque NFS (manera sobre como montamos los homes en mi trabajo) no soporta el filelocking que necesitaba una de las clases fundamentales…
En la lista de eclipse sale una explicación un poco más simpática del problema proponiendo soluciones… http://dev.eclipse.org/newslists/news.eclipse.newcomer/msg11812.html.
Para fijarse si anda hagan algo tan simple como:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileLock;

public class TestingLock {

public static void main(String[] args) {
FileLock lock = null;
try {
lock = new RandomAccessFile(new File("lock"), "rw").getChannel().tryLock();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}

Descartado que sea un problema de la JVM de sun, gcj tampoco funciona. Es claramente una deficiencia del sistema de archivos, aunque el error es bastante críptico.

Twin USB Joystick
April 30, 2007

Me compré hace unos días joysticks bastante baratos, u$s9.50 el par (claro que esto me enteré después de pedir dos -que el vendedor entendió que eran dos pares- y felizmente ahora tengo cuatro). El tema es que en mi Ubuntu Feisty Fawn 7.04 (nunca voy a entender la numeración que ubuntu le pone a sus versiones) no andaba. En realidad andaba “más o menos”. Lo que ocurría fundamentalmente era que me lo reconocía como uno solo en lugar de dos. El joystick es raro, de uno de ellos sale un cable que se conecta al segundo y de éste aparte sale el cable usb (o sea, dos joysticks un usb). Indignado por esta falencia y casi al punto de venderlo (a mis amigos con Windows les habían gustado bastante xD) intenté arreglarlo… Y lo mejor es que pude :D Ahora cuento más o menos cómo hice.
Primero que todo leí este INCREÍBLE documento The Linux Kernel Module Programming Guide hasta el capítulo 7 (este cap seguro que también es interesante pero con lo anterior ya me sirvió para lo que quería, después lo leo). Y después Tincho me pasó un post de un flaco que tenía un problema igual pero para otro tipo de joystick pero que la solución terminó siendo la misma. El post de este flaco es Hardware: SmartJoy Dual Plus USB adapter, de hecho van a encontar unas preguntas mías al final de cosas que no me salían en el camino :P.
Un par de cosas de mi entorno donde este parche SI anda.

  • fijarse en la config con la que fue creado el kernel si el módulo usbhid fue compilado como tal o integrado al kernel (en mi máquina lo hice con cat /boot/config-2.6.20-15-generic | grep CONFIG_USB_HID, y por suerte estaba el =m que me fue indicando que era posible reemplazarlo, al menos de la manera que iba aprendiendo)
  • en algún módulo que tengamos seguro fijemenos el vermagic, en mi caso usé modinfo usbhid que tiene que ser igual al uname -r + EXTRAVERSION seteada en el makefile de los sources (grep EXTRAVERSION /usr/src/linux-source-2.6.20/Makefile) si esto no es igual probablemente no tengamos los sources posta del kernel que estamos corriendo

Después de esto copié el directorio de los drivers que necesitaba a mi entorno de desarrollo local. El driver está en /usr/src/linux-source-2.6.20/drivers/usb/input y ajustamos el makefile para no independizarnos de las variables que fueron utilizadas en la compilación posta de todo el sistema. Ésto se hace mirando el Makefile y el config del kernel y reemplazando las variables a mano del Makefile del módulo. Mi Makefile en el entorno de desarrollo quedó

usbhid-objs := hid-core.o
usbhid-objs += hiddev.o

obj-m += usbhid.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Después de esto se aplica mi parchecito que lo subí al launchpad de Ubuntu en https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.20/+bug/111146. Solo queda correr make y si todo sale bien tenemos un usbhid.ko. Sacamos el que está cargado en el kernel #rmmod usbhid y agregamos el nuestro #insmod usbhid.ko.
Enchufás el joystick y vas a ver que en /dev/input ahora están los dos, el /j0 y el /j1 :-D
Espero que a alguien le sea útil y cualquier sugerencia es bienvenida.
Salud!

edit: prestar atención a los comentarios de mi bugreport en launchpad que muestran un módulo mucho más complejo que le agrega incluso forcefeedback a estos joy, yo todavía no lo probé

There i am
August 10, 2006

Este es el primer post de mi blog paralelo. Paralelo a mi primer amor blogal LoCoLoGía dónde voy a volcar todos esos proyectos 100% infructuosos y su desarrollo hasta la futil desaparición.
Será como un wiki hablado, bastante aburrido y sin comparación alguna con su hermano mayor antes mecionado.
Como los que supongo vendrán, este post está totalmente hueco de contenido, diversión y sentimiento por lo que no veo necesidad alguna de continuarlo.

Sois bienvenidos a espiar en mi costado más negado, la nerded.