Dream Theater: The Spirit Carries On

Je partage avec vous le petit documentaire en 3 parties que Dream Theater a produit lors des auditions pour le choix d’une nouveau batteur (Mike Portnoy ayant quitté).

Simplement mentionner à quel point j’ai été impressionné par le professionnalisme des musicien du groupe, et aussi des participants.  La simplicité, et le respect, irradiait de ces auditions.

À mesure qu’on regarde, on est nerveux, et à la fois admiratif pour ces batteurs, qui avouons-le ont les couilles de se présenter là pour remplacer Mike Portnoy … juste le dire donne le vertige.

Aussi ça m’a permis de découvrir la personnalité des autres membres du groupe.  J’ai souvent regardé DT à travers le prisme de la forte présence de Portnoy.  J’ai adoré et je recommande à tous, fan ou pas du groupe.  C’est un chouette documentaire démontrant comment ce genre d’auditions au sommet se déroule.

Bref, sans plus tarder:

 

Posted in Général | Tagged , | Leave a comment

Au chef de l’ADQ

Vous savez M. Deltell, je trouve un peu gênant que vous jappiez que des gens (leaders syndicaux) prennent position sur la place publique avec l’argent des contribuables (déductions pour cotisations syndicales).

 

En 2009, vous, l’ADQ, avez reçu de l’état un peu moins de quatre-cent-mille dollars(Source: DGEQ), je n’ai pas les données pour 2010. Avec cet argent vous avez organisé un congrès et pris position dans la société sur des enjeux. Or je n’ai pas voté pour vous.

 

Qu’on soit clair: je crois aussi que le monde syndical a besoin de réforme.  Mais ce n’est pas de la politique que vous faite, c’est une chasse aux sorcière, un inquisition.  Je le déplore.

 

Alors calmez votre hargne svp. Nous sommes au Québec ici, pas au Wisconsin.

 

Si vous voulez moins d’état, et plus d’imputabilité sur ceux qui prennent position, je vous suggère fortement de cesser d’émettre des reçus** lors de votre prochaine campagne de financement.  Comme ça vous pourrez pleinement jouir de votre liberté de parole, et me laisser m’assoir tranquille dans mon jardin sachant que je n’ai pas financé ce jappement désagréable qui trouble ma quiétude.

 

Cordialement

JS.

** Au Québec, chaque contribution politique personnelle est remboursée à 75% par le gouvernement, via un crédit d’impôt, jusqu’à concurrence de 400$. (Source: DGEQ)


Posted in Général | Tagged | Leave a comment

La bande passante au Québec: surchauffe (des esprits) en vue!

Il y a au Québec une incohérence (ou une incompréhension totale) du futur du marché de la consommation en ligne de contenu numérique. Manque de synergie entre les intervenants (FAI, éditeurs de contenu)? Sais pas, mais ça commence à me provoquer de sérieuses crampes intestinales.

Équation de départ

On nous veut consommateur (legit svp) de contenu numérique en ligne, musique, télé, films, logiciels, etc. En même temps, on restreint les forfaits de bande passante (déjà faméliques), tant en vitesse qu’en limite de télé-chargement/versement.

Scénario

je possède une connexion 7,5 Mbits/sec chez Vidéotron que je paye un montant approximatif de 45$/mois. J’ai branché à mon téléviseur un terminal Apple TV afin d’avoir accès à la bibliothèque numérique du iTune Store (c’est pratique et plus jolie que la jeune fille avec des broches de mon club vidéo).

En bon petit soldat du capitalisme je télécharge légalement, via le bidule d’Apple, la saison 3 de Battlestar Galactica, achetée au montant de 43,99$. Or voilà, les 19 épisodes pèsent au total ~12 Go ce qui me fait dépasser ma limite de téléchargement chez mon fournisseur qui était déjà atteinte. Donc 12 Go x 0.00776$/Mo excédentaire = 93,12$ ce qui est foutrement trop: dans un tel cas Vidéotron plafonne les frais à 30$.

Constat

Je paye pour ma bande passante.
Je paye pour mon contenu numérique.
Je paye pour l’excédent que me cause ma consommation de contenu numérique.

Question

Veux-t-on que je consomme en ligne, ou veux-t-on simplement avoir ma peau??

Épilogue

J’appelle Vidéotron pour papoter de ces choses qui me turlupine. La dame est très gentille, mais n’a cure de mes récriminations, et semble vouloir me proposer un autre forfait, plus adapté (et plus cher), à mon rythme de consommation en ligne.

Elle me propose le plan INTERNET HAUTE VITESSE EXTRÊME (10 Mbits/sec + 100Go de capacité de téléchargement combiné) pour 23$ de plus par mois. Bon j’y gagne en vitesse, et je respire un peu plus question consommation. Mais après un coup d’oeil rapide, je bondis de stupéfaction. Le plan INTERNET HAUTE VITESSE EXTRÊME PLUS (une coche au dessus du précédent) a un débit de 20 Mbits/sec, mais une capacité de téléchargement combiné de 30 Go. huh?

Avant d’opter pour le plan EXTRÊME, je souligne la bêtise précédente au passage. La représentante qui n’a vraiment pas le goût de m’entendre rouspetter, m’envoi que le plan EXTRÊME PLUS donne de la super vitesse, pas de la capacité.

Bref, on vous donne une ferrari (très relatif), mais en même temps on vous confine à rouler uniquement jusqu’au dépanneur du coin. Ok, fine!, je vais arriver au dépanneur crissement vite, mais est-ce qu’une telle conception des choses démontre que l’industrie est au diapason de ce qui se passe?

À quand un peu de vision?

JS.

Posted in Général | Tagged , | 6 Comments

A Brief History of Java

Chouette présentation de la genèse et âge d’or de Java, pimenté de hauts faits de l’actualité.

Tagged , | Leave a comment

OSGi: jumping through classoading hoops

To set the context of this post, let’s have a look at the original use case leading to the problem that caused the solution.

The use case

I wanted to use the Rome library to consume/produce RSS/Atom feeds. I have used it before on traditional JEE projects, but never in an OSGi container.

The environement

I am using Fuse ESB 4.1, Progress’ commercial distribution of Apache ServiceMix 4 OSGi runtime, based on Apache Felix. The JAX-RS implementation used is Apache CXF v2.2. All of this running on my macbook pro, under Java 1.6.

I deployed Rome 1.0 jar in Fuse ESB 4. This jar contains the necessary metadata in it’s manifest to be deployed in an OSGi container.

The code

To simplify things, let’s assume a JAX-RS resource class publishing a feed:

SyndFeed feed = new SyndFeedImpl();
feed.setFeedType("rss_2.0");

feed.setTitle("Sample Feed (created with ROME)");
feed.setLink("http://rome.dev.java.net");
feed.setDescription("This feed has been created using ROME (Java syndication utilities");

// ... add entries

StringWriter sw  = new StringWriter();
SyndFeedOutput output = new SyndFeedOutput();
output.output(feed, sw);

return Response.ok(sw.toString()).build();

This code is deployed as an OSGi bundle, depending on CXF, JAX-RS spec, and Rome (among other things).

The problem

When I run this code and call the URL for this resource, I get a strange exception, referring to the SyndFeedImpl class not initializing correctly. What? I only called the default constructor, what’s wrong with that??

org.apache.cxf.interceptor.Fault: Could not initialize class com.sun.syndication.feed.synd.SyndFeedImpl
	at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:148)
	at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:114)
	at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:122)
	at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:70)

... [snip]

Digging through Rome source code, I found that all the plugins (I/O components + various helper implementations) are specified in a properties file somewhere on the classpath (some poor man’s DI). Rome reads this file so it can instantiate these classes. But to do so, it needs to ask a classloader to load them first. Let’s have a look at how this is implemented:

PropertiesLoader loader = (PropertiesLoader)
    clMap.get(Thread.currentThread().getContextClassLoader());
    if (loader == null) {
        try {
            loader = new PropertiesLoader(MASTER_PLUGIN_FILE, EXTRA_PLUGIN_FILE);
            clMap.put(Thread.currentThread().getContextClassLoader(), loader);
        }
        catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }
    return loader;

So here, we can clearly see that while reading the plugins configuration, it stores these properties alongside the classloader to be used to load the classes. The classloader used is Thread.currentThread().getContextClassLoader().

BAM!

At runtime, when inspecting what this classloader resolves to, we find that it is set to:

System.out.println(Thread.currentThread().getContextClassLoader().toString());
$ [Apache ServiceMix CXF Transport for OSGi (org.apache.servicemix.cxf.transport.osgi)]

Which is the classloader for an entirely different bundle. However, to achieve true modularity, OSGi’s architecture tells us (section 3.4 second par.) that for each bundle there is one classloader. So Rome cannot load and instantiate its plugins (dynamically in this case).

Solution 1

Procrastinate, and by doing so, bill your client even more.

Solution 2

Open up Rome’s maven project in Netbeans, and fix the code. But isn’t classloading stuff a complicated matter? it depends. One easy way to fix it, is to figure out how OSGi is working. When it is installing a bundle, even before resolving this bundle’s dependencies, the framework creates a classloader, a private & cozy place where the bundle’s classes will not get disturbed/shadowed by others (read: jar hell). This classloader is the only one who can load classes from this bundle, since it’s the only one seeing them (not entirely true, but anyways).

So, it’s easy to ask a class for it’s classloader, by simply doing something like:

ClassLoader cl = this.getClass().getClassLoader();

So now, If I change the code to use this classloader, and I inspect what it resolves to, I get:

System.out.println(this.getClass().getClassLoader().toString());
$ [211.0]

Which represents Rome bundle ID inside of Fuse ESB 4, and is exactly what we want. With this classloader, Rome will be able to find its plugins implementation classes.

Conclusion

I opted for solution 2 ;) Which solution forced me to recompile a special Rome version and store it in our internal Maven repo.

I learned that sometimes, there’s more to osgifiying a jar than just providing a nice manifest. Enterprise systems developers must be aware of that sort of stuff before just adding a jar to a project.

Maybe other solutions would have been viable: Equinox buddy visibility manifest headers? Dynamic-imports? (althought I read somewhere that this must be used as a last resort solution as it breaks OSGi modularity principles).

I’d be happy to hear other point of views.

JS.

Tagged , , | 7 Comments