Jonathan LALOU recommends… Denis PIHAN
I wrote the following notice on Denis PIHAN‘s profile on LinkedIn:
I worked under Denis’ indirect management. Denis is one of the most valuable professionals I have worked with. His knowledge is wide and impressive. Developer, architect, team leader, COO… He has gone up all the stairs. Nothing can stop him. His skills are numerous. Denis inspires trust. His pieces of advice are searched and followed by the tens of peoples who have worked with him. And do not let me forget to mention the enjoyment of listening to Denis’ Aussie accent!
Depart du pole PrimeBrokerage de BNPParibas
Le roman de PrimeWeb
Au debut, il n’y avait rien. Puis Denis crea PrimeWeb en semaine (et coda PrimeRisk le soir et le week-end). Quelques annees plus tard, il en confia la garde a un jeune padawan devenu maitre Jedi, Ludovic.
J’entrai dans la confrerie de l’anneau PrimeWeb en mars 2007. Je fus forme par mon maitre, Jean-Philippe, qui fit de moi ce qu’il etait: un cow-boy. Puis Jean-Philippe s’en alla fonder une autre confrerie, bien qu’il reapparut plus tard par hasard sur nos aggregateurs RSS. Il fut suivi par Marouane qui, lasse de tous ses voyages en Peugot 404, prefera s’installer au pays de Yabiladi. A cette meme epoque, la confrerie s’elargit: ce fut la glorieuse epoque de plusieurs elfes, nains, hobbits, humains et geeks (plus ou moins refoules).
• PYC « c’est quoi ce bousin?!?! »
• Lamine, Bisounours syndique CGT, qui, negligeant le danger, assuma son devoir, et se retrouva au beau milieu du manifestation du Front National pour rejoindre son poste. Lamine n’a toujours pas reussi a me battre a Street Fighter 😉
• Kim Quoc, le roi du Wicket, Bisounours syndique FO.
• Nico Gri, dit “Bart”, le Birt-master.
• Nico Mi, dit “Kiki”
• Nico Ma, le celebre touilleur express, Gentil Organisateur du 1er Devoxx France.
• Karim le chevalier du CNAM.
• Guillaume D., sa Mule et son commercial.
• Pierre-Matthieu, le premier intraboy.
• David, dit “Lyteh”, l’heritier intraboy, exile au Canada.
• Morad, le Kaiser, qui renonca a son ambition de devenir le troisieme intraboy.
• Jieren le crackeur de Wii
• AbdelAziz le discret.
• Hicham au pull violet.
• Jean-Luc,qui sut admirablement prendre la releve de Lamine en portant une echarpe en plein mois d’aout.
Les discussions, melant la philosophie et la geopolitique de la Terre du Milieu, etaient animees: Sarko allait-il nettoyer la France au Karcher? Pourquoi au XXIe siecle IntelliJ IDEA ne compilait pas continuellement en arriere-plan alors qu’Eclipse en etait capable depuis plusieurs annees? Combien de cafes peut-on prendre avant qu’IDEA et WebLogic ne bootent? Est-il possible de lancer une Mule dans un WAR? Qui, de Nico Mi ou Lamine, serait en retard au cours du CNAM le jeudi soir? La main de Thierry Henry jetait-elle le sceau de l’infamie sur Domenech et ses 11 charlots?
PrimeWeb c’etait aussi une mafia: des echanges informels de tours de prod, des extorsions de croissants sous pretexte de build rouge, des punitions sous forme de templates a migrer vers BIRT pour les recalcitrants a l’autorite du chef…
Tout ce petit monde quitta le quartier de l’Opera pour la populaire Barbes. On etait jeunes, on etait beaux, on etait dans un quartier de riches, pres de Surcouf et de Monoprix ; on se retrouvait dans un quartier ou des dizaines de vendeurs a la sauvette, plus ou moins agressifs, repetaient a longueur de journee “Malboro! Malborooooooooooooo! Leggggggeeeeend!”.
L’equipe s’agrandit encore et accueillit des BAPI. Le « PI », loin d’etre une lettre grecque fortement utilisee en mathematique, c’etait pour un « Program Interface », pas tres politiquement correct. Aussi les BAPIs perdirent leur PI et ne furent plus que des BAs. Citons Manu « chemise ouverte », FFK « Milouse », Elodie et Damien.
Notre bebe, PrimeWeb, avait bien grandi. Nos petits freres de MyBook quitterent le navire et eurent leur propre repo SVN. Ludo, le maitre, decida de son cote d’affronter de nouveaux defis loin du code. Nous accueillimes alors de nouveaux maitres de l’anneau: Ronan et Matthieu.
PrimeWeb ce furent de bons moments… et puis il y avait la prod… et puis il y avait la prod BofA… Et puis on croisait parfois quelques boulets (TdDdS, Bouledogue, Caniche, YF «je veux, dans 5′, et j’appelle le client, le report, et j’appelle, dans 5′, avec le report, le client », et compagnie)
Chaque padawan ayant bien grandi, decida de suivre sa voie de Jedi de son cote. Bientôt, seuls Abdel et moi-meme restames du canal historique, pour maintenir la plate-forme en dessus de l’eau. Bien qu’aspires a batir une nouvelle communaute de l’anneau avec d’autres Jedis a NYC et Mumbai, nous ne perdimes pas de vue notre mission: faire bouffer du CSV et du PDL a PrimeWeb pour qu’il recrache du PDF a des clients qui de toute facon ne lisaient quasiment jamais les rapports.
Et puis Abdel, « le meilleur d’entre nous », nous quitta. Nicolas A. et Brice reprirent le bebe.
Les historiens du code s’interrogeront probablement sur la source de ce curieux phenomene sociologique: par rapport au reste de la population francaise, tout individu nomme « Nicolas » a 800% de chances supplementaires d’atterrir sur PrimeWeb.
A mon tour, j’explorais d’autres horizons.
Je parcourais diverses contrees, dont PrimeDB, le mysterieux rivage dont le code est genere et ecrase toutes les nuits.
Enfin, j’arrivai vers mon nouveau havre: la PRSL. Et je fis la connaissance de mes nouveaux camarades: JP, Vincent, MT, Andre, Yves et… les Padawans de Mumbai. De sacres padawans. Je pus leur transmettre ma passion de la litterature Chuck Norris, la peinture Bruce Willis et la sculpture Sylvestre. Nous batimes notre chef-d’oeuvre: la Mule dans Weblo soutenu par MQ.
(je nie publiquement toute responsabilite quant au choix de MQ: ce n’etait pas mon idee ; pour une idee geniale, c’etait une idee geniale…)
Or, apres 604 JIRAs traites, 3643 commits sur le repo PrimeWebSVN (sans compter les commits sur feu le repo PrimeWebCVS et le repo US), 14464 fichiers impactes, 243702 lignes creees, 2900 pages manuscrites, comme tout cow-boy qui se respecte, vient un temps ou il faut se diriger vers le soleil couchant.
• Merci a Ludo et Denis qui m’ont donne ma chance et m’ont permis de progresser dans tous les domaines.
• Merci a Karim, Kim, Lamine, les Nico: plus que des collegues: de vrais amis fideles.
• Merci a Jean-Pierre, un gars formidable, aussi bien humainement que techniquement ;-).
• Merci a Pascal et Antoine qui auront reussi a me faire partir avec le sourire.
• Merci a Vincent, un petit jeune qui code bien. Tu codes tres bien meme Vincent, tu apprends vite et tu bosses bien, bravo! Tu merites amplement d’etre considere comme le cow-boy de la PRSL!
• Merci a tous, j’espere n’oublier personne: Guillaume, Emma-Gab, Yves, MT, Pascal, Latifa, Georgette, Martial, Lisa, Sylvia, Manu, Fabrice, Brice, Christophe, Nico A, les BAs, Francois L. pour ses polemiques, les RAs, les RMs, Marie, Agnes et les OPs.
• Et bien sur merci a Ronan pour avoir fait le max pour m’envoyer au pays du Coca-Cola, des hamburgers et de Rambo. Ronan est un excellent manager, bonne continuation a lui dans la constitution de la plateforme globale!
Je vous rends l’Ocarina. Et ainsi se clot le roman de PrimeWeb.
5 mars 2007 – 30 mars 2012
Jonathan
When WebLogic always routes on the same node of the cluster…
Case
Since a couple of days I have met the following issue on my WebLogic server: one application is deployed on a cluster, which references two nodes. Load-balancing (in Round-Robin) is activated for JMS dispatching.
- Yet, all JMS messages are received only by one node (let’s say “the first”), none is received by the other (let’s say “the second”).
- When the 1st node falls, the 2nd receives the messages.
- When the 1st node is started up again, the 2nd keeps on receving the messages.
- When the 2nd node falls, the 1st receives the messages
- and so on
Fix
In WebLogic console go to JMS Modules
. In the table of resources, select the connection factory. Then go to the tab Configuration
and Load Balance
. Uncheck “Server Affinity Enabled
“.
Now it should work.
Many thanks to Jeffrey A. West for his help via Twitter.
MissingResourceException / Mule / i18n
The following error is among of the most hated ones in Mule ESB:
[java]java.util.MissingResourceException: Can’t find bundle for base name META-INF.services.org.mule.i18n.core-messages, locale en_US[/java].
I am not going to describe how to fix it, since several and various reasons may induce it. Anyway, here is an action plan to track and isolate the bug when it happens.
Usually, this MissingResourceException
hides the actual error, instead of encapsulating and throwing it. For instance, consider the following stacktrace:
[java]Can’t find bundle for base name META-INF.services.org.mule.i18n.core-messages, locale en_USjava.util.MissingResourceException: Can’t find bundle for base name META-INF.services.org.mule.i18n.core-messages, locale en_US
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1427)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1250)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:952)
at org.mule.config.i18n.MessageFactory.getBundle(MessageFactory.java:211)
at org.mule.config.i18n.MessageFactory.getString(MessageFactory.java:181)
at org.mule.config.i18n.MessageFactory.createMessage(MessageFactory.java:108)
at org.mule.config.i18n.MessageFactory.createMessage(MessageFactory.java:59)
at org.mule.config.i18n.CoreMessages.initialisationFailure(CoreMessages.java:400)
at org.mule.module.scripting.expression.AbstractScriptExpressionEvaluator.getScript(AbstractScriptExpressionEvaluator.java:93)
at org.mule.module.scripting.expression.AbstractScriptExpressionEvaluator.evaluate(AbstractScriptExpressionEvaluator.java:54)
at org.mule.expression.DefaultExpressionManager.evaluate(DefaultExpressionManager.java:274)
at org.mule.expression.DefaultExpressionManager.evaluate(DefaultExpressionManager.java:210)
at org.mule.expression.DefaultExpressionManager.evaluate(DefaultExpressionManager.java:170)
at org.mule.transformer.simple.MessagePropertiesTransformer.addProperties(MessagePropertiesTransformer.java:165)
at org.mule.transformer.simple.MessagePropertiesTransformer.transformMessage(MessagePropertiesTransformer.java:93)
at org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:145)
at org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:93)
at org.mule.DefaultMuleMessage.applyAllTransformers(DefaultMuleMessage.java:1305)
at org.mule.DefaultMuleMessage.applyTransformers(DefaultMuleMessage.java:1265)
at org.mule.DefaultMuleMessage.applyTransformers(DefaultMuleMessage.java:1258)
at org.mule.transformer.AbstractTransformer.process(AbstractTransformer.java:118)
at org.mule.processor.ExceptionHandlingMessageProcessor.process(ExceptionHandlingMessageProcessor.java:25)
at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:185)
at org.mule.transport.AbstractReceiverWorker$1.doInTransaction(AbstractReceiverWorker.java:126)
at org.mule.transaction.TransactionTemplate.execute(TransactionTemplate.java:116)
at org.mule.transport.AbstractReceiverWorker.doRun(AbstractReceiverWorker.java:149)
at org.mule.transport.AbstractReceiverWorker.run(AbstractReceiverWorker.java:64)
at org.mule.work.WorkerContext.run(WorkerContext.java:309)
at org.mule.work.SyncWorkExecutor.doExecute(SyncWorkExecutor.java:41)
at org.mule.work.MuleWorkManager.executeWork(MuleWorkManager.java:251)
at org.mule.work.MuleWorkManager.doWork(MuleWorkManager.java:175)
at org.mule.transport.jms.MultiConsumerJmsMessageReceiver$SubReceiver.onMessage(MultiConsumerJmsMessageReceiver.java:326)
at com.ibm.mq.jms.MQMessageConsumer$FacadeMessageListener.onMessage(MQMessageConsumer.java:399)
at com.ibm.msg.client.jms.internal.JmsMessageConsumerImpl$JmsProviderMessageListener.onMessage(JmsMessageConsumerImpl.java:1023)
at com.ibm.msg.client.wmq.internal.WMQAsyncConsumerShadow.honourNoLocal(WMQAsyncConsumerShadow.java:566)
at com.ibm.msg.client.wmq.internal.WMQAsyncConsumerShadow.consumer(WMQAsyncConsumerShadow.java:400)
at com.ibm.mq.jmqi.remote.internal.RemoteAsyncConsume.driveConsumer(RemoteAsyncConsume.java:1527)
at com.ibm.mq.jmqi.remote.internal.RemoteDispatchThread.run(RemoteDispatchThread.java:395)
at com.ibm.msg.client.commonservices.workqueue.WorkQueueItem.runTask(WorkQueueItem.java:209)
at com.ibm.msg.client.commonservices.workqueue.SimpleWorkQueueItem.runItem(SimpleWorkQueueItem.java:100)
at com.ibm.msg.client.commonservices.workqueue.WorkQueueItem.run(WorkQueueItem.java:224)
at com.ibm.msg.client.commonservices.workqueue.WorkQueueManager.runWorkQueueItem(WorkQueueManager.java:298)
at com.ibm.msg.client.commonservices.j2se.workqueue.WorkQueueManagerImplementation$ThreadPoolWorker.run(WorkQueueManagerImplementation.java:1220)V.
[/java]
In IntelliJ IDEA, do Analyse
> Analyse Stacktrace...
> paste the trace (I have been shown the same tool for Eclipse, somewhere in the Console view). Now you can navigate easily in the code. Then you can notice, line #11, that the Exception you receive is raised by AbstractScriptExpressionEvaluator
.
The corresponding piece of code is:
[java] try
{
script.initialise();
}
catch (InitialisationException e)
{
throw new MuleRuntimeException(
CoreMessages.initialisationFailure("An error occurred initialising script."), e);
}[/java]
Add a breakpoint at the level of the throw
. Start the debugger, reproduce the bug. In the debugger, you can see the actual error, that is hidden in the stacktrace. In my case, it was a:
[java]org.mule.api.lifecycle.InitialisationException: Scripting engine ‘groovy’ not found. Available engines are: [com.sun.script.javascript.RhinoScriptEngineFactory@3d2227][/java]. Without the debugger, it would have been hard to guess that the original MissingResourceException
was linked to a missing Groovy resource ;-).
Sonar / Synchronization on interned XYZ could lead to deadlock
How to fix the Sonar’s following report?
[java]Multithreaded correctness – Synchronization on interned String could lead to deadlock [/java]
Replace lock on String
with a lock on an immutable and/or non-serializable object, ie a simple Object
.
Eg:
Replace:
[java] synchronized ("myString") {…}[/java]
With:
[java] synchronized (myObject) {…}[/java]
Sonar / Inefficient use of keySet iterator instead of entrySet iterator
How to fix the Sonar’s following report?
[java]Performance – Inefficient use of keySet iterator instead of entrySet iterator[/java]
The report is explicit: replace loop on keySet
with a loop on entrySet
, which is faster
Eg:
Replace:
[java]for (Integer key : stressList.keySet()){
Stress stress = stressList.get(key);
}[/java]
With:
[java]for (Map.Entry<Integer, Stress>integerStressEntry : stressList.entrySet()){
Stress stress = integerStressEntry.getValue();
}[/java]
Yet, if you need only keys or only values of your Map
, then use rather keySet()
or values()
.
Sonar / Constructor Calls Overridable Method
How to fix the Sonar’s following report?
[java]Constructor Calls Overridable Method [/java]
In the constructor of your class, assign the parameters to the right fields using the ‘=’ operator, and not the setXXX() methods. Indeed, the latter may be overriden by subclass.
Eg:
Replace:
[java]public Constructor(Param param){
setField(param);
}[/java]
With:
[java]public Constructor(Param param){
this.field = param;
}[/java]
Sonar / Dead store of null to local variable
How to fix the Sonar’s following report?
[java]Dodgy – Dead store of null to local variable[/java]
Remove assignments at null
of local variables that will not be read. Since Java 6, they have no interest and no effect on garbage collector.
Eg: remove the last assignment, in the line#4 [java]void foo(){
String goo = "hello world";
(…)
goo = null;
}[/java]
Twitter within GoogleReader
Let’s say immediatly there is no miracle solution and it required a bit of work…
If the title is not explicit enough, the goal of this post is to give a way to include Twitter flow within your GoogleReader. IMHO, the main features of GoogleReader over regular Twitter are the following:
- posts are stored on long term
- posts can be searched or filtered by keywords
- easy integration with Google Plus share button
- ability to give a priority to feeds (as in Google Plus’s circles)
- a simple interface to monitor all feeds
Unlike, following Twitter accounts on Google Reader (or even any other RSS aggregator) makes you lose the real time feature of Twitter.
This said, how to include your Twitter follow list within Google Reader syndication?
- For each of the accounts you follow on Twitter, get the userId.
- The easiest is to select a tweet > right click > source code > search the attribute “data-user-id”, get the associated number, eg: 813286 for @BarackObama, 50055701 for @MittRomney and 248309482 for my prefered one: @John_the_Cowboy ;-).
- Alternatively, you can request the following service: http://www.idfromuser.com
- In Google Reader, add a feed:
https://twitter.com/statuses/user_timeline/XYZ.rss
. Replace “XYZ
” with the actual number retrieved before
Of course, this is not easy at all, as said in the disclaimer above. It is long, takes much time, and can become fastidious if you follow tens of people. Anyway, Google Reader users are geeks rather than newbies. You may create a Groovy script of setup a Mule instance to automatize de process ;-).
I suggest you to create one or many folders to gather the Twitter feeds.
Move AVD default location on Windows
Two days ago, I twitted this:
Windows I hate you “PANIC: Could not open AVD config file”
Indeed, I tried to run an AVD (Android Virtual Device) from IntelliJ IDEA, in order to test my Android application. So far, I always ran AVD from KUbuntu, but a specific need I had to run on Windows Seven. The emulator could not start, because it was searching the actual AVD img file in the default folder, eg C:\Documents and Settings\<yourLogin>\.android\avd
on Windows XP. Unfortunately, the folder could not be retrieved (a story of French special characters, such as ‘é’, ‘è’, ‘ç’, etc.).
Therefore, the question is: on Windows, how to change AVD default location?
I tried many more or less tricky solutions, but the simplest is the following:
- close IDEA and AVD Manager
- create an environment variable
ANDROID_SDK_HOME
(keys Windows + Pause), pointing to your target folder, eg:D:\workarea\honeycomb-sdk
- create a
.android
subfolder, eg:D:\workarea\honeycomb-sdk\.android
- if Windows does not allow you to create a folder of which name starts with a dot, then create it through Cygwin’s
mkdir
.
- if Windows does not allow you to create a folder of which name starts with a dot, then create it through Cygwin’s
- startup IDEA