Blogounage

Aller au contenu | Aller au menu | Aller à la recherche

vendredi 30 janvier 2009

Java User Group Toulouse

Via Sami, j'apprends ce matin que ça y est, le JUG Toulouse est né. Je me suis d'ores et déjà inscrit à liste de diffusion.

J'espère que je trouverai le temps de participer à ce groupe malgré les importants travaux à faire dans la maison que nous venons d'acheter.

PS : Sami, merci encore pour la bétonnière :-).

lundi 22 décembre 2008

Drop sequences for Oracle

Adam already showed how to generate all the drop table statements (impossible to trackback):

SELECT 'drop table '||table_name||' CASCADE CONSTRAINTS;' FROM USER_TABLES

As I just needed to drop sequences, based on Adam's query, here's the necessary:

SELECT 'drop sequence '||sequence_name||';' FROM USER_SEQUENCES;

Quite straightforward indeed.

Hope this helps.

vendredi 28 novembre 2008

À quelle vitesse vous tapez ?

41 mots

Speed test

vendredi 17 octobre 2008

L'image du jour

Reçu ça il y a quelques jours, ça m'a beaucoup fait rire : tapette.jpg

mardi 30 septembre 2008

Leçon de politique politicienne à l'américaine

Je viens de lire cet article du monde à propos du rejet du plan Paulson. Très fort, ce Douglas Holtz-Eakin...

Si M. McCain a évité de s'en prendre trop frontalement à Obama, son conseiller économique, Douglas Holtz-Eakin, n'a pas pris de pincettes.

Si l'adoption du plan de relance a échoué, explique-t-il, c'est "à cause de Barack Obama et des démocrates, qui mettent la politique avant le pays". [...] Sur les 433 élus de la Chambre basse, 228 ont voté contre, dont 133 républicains et 95 démocrates.

Refaisons le compte, d'après wikipedia, la chambre des représentants des États-Unis, aussi appelée chambre basse, est composée de 435 membres, répartis comme suit :

  • Républicains : 202 sièges
  • Démocrates : 233 sièges

Et on nous dit donc qu'ont voté contre le plan Paulson :

  • 133 républicains
  • 92 démocrates

Comptons les votes pour :

  • Républicains : 69 votes, soit 34% des républicains
  • Démocrates : 141 votes, soit 60% des démocrates

En résumé, Douglas Holtz-Eakin, républicain, accuse les démocrates qui ont voté massivement pour (autant en nombre qu'en pourcentage) d'avoir fait échouer le plan Paulson... C'est pas un rien malhonnête, ça, mon petit monsieur ?

mercredi 10 septembre 2008

Citation du soir, bonsoir !

Écoutant la radio, je vous la livre ici. Laurent Gerra imite Le Pen et parle de sa femme. Ça donne en gros :

À l'âge où je l'ai ramassée, elle n'avait déjà plus la nurserie, il ne lui restait plus que la salle de jeux.

Finesse, quand tu nous tiens :-).

dimanche 13 juillet 2008

How to retrieve the Hibernate Session from the EntityManager interface

Well, as I myself fell into this stupid gap, I guess I'll try to help. I was quite pushed in this trap by a fallacious part of the jboss documentation :

@PersistenceContext EntityManager entityManager;
public void someMethod();
{
  org.jboss.ejb3.entity.HibernateSession hs = (HibernateSession)entityManager;
  org.hibernate.Session session = hs.getHibernateSession();
}

Let's be clear : this is totally WRONG! Yes, it will work under JBoss, but as there's a standard way to do this, this is not the right way to do this.

In fact, there's a dedicated method that lets you retrieve the underlying persistence manager : EntityManager.getDelegate(). If you read this method's javadoc, you'll see the following :

/**
 * Return the underlying provider object for the EntityManager,
 * if available. The result of this method is implementation
 * specific.
 * @throws IllegalStateException if this EntityManager has been closed.
 */

public Object getDelegate();

And the "underlying provider", for Hibernate, is obviously the Hibernate Session instance...

So, the right way to retrieve the Session is something like the following instead :

@PersistenceContext EntityManager entityManager;
public void someMethod();
{
  org.hibernate.Session session = (Session)entityManager.getDelegate();
}

Under JBoss, using this code won't make a big difference. But using the standard way will let you run your code under several appservers (namely, it works like a charm[1] under JBoss 4.2.2.ga and Glassfishv2ur1 for example). If you use the bad way above, this will just crash under Glassfish, for example...

I reported the corresponding documentation bug in the JBOSS tracker.

Hope this helps...

Notes

[1] ça, c'est pour Seb

Comment gérer la rétro-compatibilité avec l'API d'Eclipse

Dans cet article, Eugene présente un cas où une API évolue. Une méthode est ajoutée qu'il serait bien de pouvoir utiliser. Problème : le faire rendrait le code non rétrocompatible. Donc, pour le faire tout de même sans casser la compatibilité, il utilise la reflection. Et pour le faire proprement, il met en œuvre un Proxy afin que ce code soit bien externalisé.

Une solution très classe de la part d'Eugene Kuleshov.

lundi 30 juin 2008

Comment réinitialiser manuellement les pages chargées par firefox au démarrage

Si, comme moi depuis 10 minutes, vous êtes dans l'impossibilité de relancer Firefox parce que la page sur laquelle vous étiez provoquait un plantage de FF, ce qui suit est pour vous.

Dans les options de Firefox, vous pouvez demander à ce que celui-ci réouvre les onglets ouverts avant la dernière fermeture (Onglet Général, le premier combobox). Une fois cette option sélectionnée, mon firefox qui gelait avait pour bonne idée de redémarrer sur la page en question et de regeler...

Et là, bizarrement, la proposition de "restaurer les onglets" ou de "démarrer une nouvelle session" n'était même pas offerte. Donc, bien bien bloqué.

La solution que j'ai trouvée est la suivante :

  • Tuez firefox
  • dans votre répertoire profile (dans quelque chose comme $HOME/.firefox/1d5s1.default sous Linux ou C:\Documents and Settings\votreuser\Application Data\Mozilla\Firefox\Profiles\1d5s1.default sous windows), supprimez simplement le fichier sessionstore.js.
  • Relancez firefox...

Voilà, en espérant que ça serve...

mardi 24 juin 2008

Quelques déclarations XSD ou DTD de formats XML connus

C'est le genre de chose qu'il est sympathique d'avoir écrit en tête de ce type de fichier pour disposer de l'auto-complétion XML dans son IDE favori. Lorsque j'utilise un nouveau format XML, la première chose que je cherche est en effet à ajouter cet entête pour me faciliter la vie (et aux autres une fois commité :)).

Note : dans la liste ci-dessous, je ne mets pas le prologue XML pour gagner en concision. Toutefois, ça ne fait jamais de mal de le mettre. Personnellement j'essaie de le mettre systématiquement.

Hibernate : mappings hbm.xml

Même s'il vaut mieux à mon avis passer aux annotations lorsqu'on en a la possibilité, voici une déclaration de DTD qui fonctionne chez moi pour ceux qui ont encore des mappings hibernate à la sauce XML :

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="net.batmat.domaine">
...
</hibernate-mapping>

Java Persistence : persistence.xml

Pour ceux qui utilisent Java Persistence, cette "sous-spécification" des EJB3 devenue une spécification autonome dans sa version 2 :

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
                http://java.sun.com/xml/ns/persistence
                http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

        version="1.0">

...
</persistence>

Spring : fichier de contexte XML

Depuis la version 2, ils ont subdivisé leur format XML en différents namespaces. Voici un exemple fonctionnel qui met en œuvre un certain nombre de ces espaces de nommages XML. Je laisse en exercice le passage à Spring 2.5 (que nous utilisons, d'ailleurs, mais on n'a pas mis à jour le XML) ou l'ajout d'un autre namespace dont vous auriez besoin :-).

<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
                http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                http://www.springframework.org/schema/util
                http://www.springframework.org/schema/util/spring-util-2.0.xsd
                http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
>

...
</beans>

Maven : pom.xml

Celui-là, il est sacrément pratique vu la taille du truc :

<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/maven-v4_0_0.xsd"
>

...
</project>

Voilà déjà pour cette fois. Une fois cet entête ajouté, dans Eclipse par exemple, tapez juste "<" quelque part et vous verrez la liste des balises apparaître et leur documentation si les auteurs l'ont indiquée (après qu'Eclipse ait pu récupérer le XSD sur Internet, bien sûr) : Auto-complétion du XML avec Eclipse

Si vous en avez d'autres, n'hésitez pas à les poster (ou à les demander, si je suis dans un bon jour) dans les commentaires.

Update 01/10/2008, ajout du application.xml des EAR :

<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" 
     "http://java.sun.com/dtd/application_1_3.dtd">

<application id="mon appli">
...
</application>

mercredi 4 juin 2008

FIA : les œillères de la connerie

Sans déconner, c'est pas un ramassis de neuneus à la FIA ?

Lorsque Sébastien Loeb, le multiple champion du monde de rally, monte une fois de plus sur un podium sans prendre soin de passer devant les maquilleuses auparavant, il est des gens assez chiants pour trouver à redire ! Surinder Thatti, via Libé :

Je me dois d’exprimer mon opinion à propos du piètre passage de Sébastien Loeb à la TV lors de l’arrivée du rallye du Mexique. Il n’était pas rasé, dépenaillé avec une chevelure négligée.

Jusque là, rien d'anormal. Il y a plein de gens aux mœurs différentes sur la planète. Ça peut éventuellement se comprendre.

Là où j'hallucine, c'est lorsqu'un débile de la direction de la Fédération Internationale de l'Automobile, j'ai nommé Morrie Chandler, se dit que vraiment oui, c'est pas normal, c'est une honte aux vrais mâles et tout et tout :

Malheureusement, ce n’est pas un problème propre à notre sport, vu que la même chose arrive dans le football et d’autres sports de "mâles". Bien sûr, ces personnes sont une insulte aux vrais mâles Ma seule solution c’est que nous suggérions à ISC (NDLR: International Sportsworld Communicators, la société détentrice des droits commerciaux et de retransmission) qu’ils aient la couverture à laquelle ils ont droit en tant que vainqueurs, mais sans gros plans et sur un laps de temps réduit.

Comme le dit Libé, après les récentes révélations au sujet de Max Mosley et ses frasques sado-masochistes nazi, il y a de quoi se demander dans quelle réalité des types comme Chandler vivent ! Qu'un champion soit pas très frais et un peu ébouriffé après une course de plusieurs heures et le port d'un casque, ça c'est inadmissible.

Par contre, que le président de toute la fédé s'amuse en privé à papoter en allemand avec des prostitués qui le traitent comme un prisonnier, là c'est le black out. (Précisons que Max Mosley n'est pas allemand et que son père avait créé l'Union Fasciste Britannique, le deuxième point peut donner une idée de l'origine de ce genre de fantasme...)

Et nouvelle fraîche : Max Mosley a donc bien été réélu hier à la tête de la FIA.

Plutôt douteuse cette histoire, vous avouerez...

mercredi 28 mai 2008

40 000 ans de prison

En triant mes vieux mails, je viens de me marrer un bon coup. Merci à Yoyo sur ce coup-là :

mardi 5 février 2008

Danseuse : quel côté de votre cerveau utilisez-vous le plus ?

Je viens de recevoir cette image par mail, je vous mets le texte explicatif, sans préjuger de la véracité des propos. Ce qui est sûr, c'est que le résultat parmi les collègues que j'ai autour de moi est déroutant. Certains voient tourner cette danseuse dans un sens, d'autres dans l'autre sens, d'autres la voient changer régulièrement...

Nous utilisons les hémisphères gauche et droit de notre cerveau pour des tâches bien différentes. Pas étonnant dès lors, que notre caractère détermine l'hémisphère que l'on sollicite le plus souvent. Ca vous laisse dubitatif ? Faites le test ! Le test est simple. Regardez cette danseuse et dites-nous dans quel sens elle tourne.

Pour une grande majorité, la danseuse tourne dans le sens contraire des aiguilles d'une montre; ceux-là utilisent surtout l'hémisphère gauche. Pour les autres en revanche, elle tourne dans le sens des aiguilles d'une montre ; ces derniers utilisent plus souvent l'hémisphère droit.

Mais qu'est-ce que cela signifie ?

* L'hémisphère gauche du cerveau est le côté de la logique, des sciences et des faits purs et durs. Vous faites attention aux détails, aux mots que vous utilisez et reconnaissez des patrons. Vous êtes ancré dans la réalité, et vous basez sur ce que vous savez et comprenez. Vous vous préoccupez du présent, et du passé et avez tendance à ne prendre aucun risque. Vous êtes concret et élaborez des stratégies.

* L'hémisphère droit du cerveau est caractérisé par les sentiments, l'imagination, la philosophie et la religion. Vous vous préoccupez des images, des symboles et des concepts. Vous n'avez pas besoin de tout savoir ; parfois, il vous suffit de croire. Vous êtes compréhensif, impulsif et prenez des risques. Vous êtes plus préoccupé par l'avenir que par le passé.

Personnellement, jusqu'à présent, ça ne tourne QUE dans le sens des aiguilles d'une montre.

samedi 2 février 2008

Optimisation GWT 1.4

Wouah, je viens de regarder l'interview de Bruce Johnson par InfoQ à propos de GWT.

Bruce explique les nombreuses optimisations qu'ils effectuent au niveau du compilateur GWT. Il explique notamment qu'ils (les développeurs GWT) cherchent sans cesse à optimiser le compilateur, pour cela il comparent par exemple les requêtes qu'une webapp classique effectue vers le serveur et les requêtes que GWT fait.

Et en exemple, autour de la dixième minute, il explique l'optimisation concernant les images : l'ImageBundle. Dans une application classique, il y a des dizaines d'images, souvent toutes petites (icônes, fonds...). Le problème, c'est que le navigateur, même pour se voir répondre que l'image est à jour ouvre très souvent des connexions, d'autant plus qu'il y a d'image ! Ça peut créer (dixit Bruce) une contention en raison du grand nombre de sockets ouvertes côté serveur.

Et bien si vous utilisez cet objet ImageBundle, GWT construit côté serveur une image composite. Comme ça, le navigateur n'a qu'une seule image à télécharger puis vérifier, et les morceaux sont déconstruits côté client en récupérant les bouts de la grosse image et en les plaçant au bon endroit (cf. 10m40s). C'est quand même génial comme idée.

Bon après, il faut que la machine sur laquelle le navigateur tourne dépote d'autant plus, mais on n'a rien sans rien.

PS : Ce que je viens de dire n'est que le reflet de ce que j'ai compris de l'interview. Je n'ai pas testé cette fonctionnalité.

Ça y est, @Override fonctionne enfin comme je l'ai toujours voulu :-)

Depuis Java 5, les annotations ont été ajoutées. L'une des premières a été @Override, une annotation destinée à informer le compilateur que la méthode ainsi annotée redéfinit une méthode parente.

Le problème, c'est qu'en Java 5, cette annotation ne pouvait être utilisée que sur des méthodes en provenance d'une classe parente, pas d'une interface.

Je l'ignorais jusqu'à hier soir, mais en posant la question de la justification de ce choix d'implémentation sur ma liste de diffusion favorite, c'est mon ancien prof de Java et de Génie Logiciel qui m'a répondu que c'était possible depuis Java 6. Cf. le blog de Peter Ahé.

En clair :

public interface MonInterface
{
        void methode();
}

class MonImpl implements MonInterface
{
        // L'annotation suivante est valide depuis Java6, mais produit à la compilation le
        // message suivant en Java5 :
        // "The method methode() of type MonImpl must override a superclass method"
        @Override
        public void methode()
        {
        }
}

Ça fait un outil de plus pour augmenter la qualité du code, en l'occurrence en diminuant le risque de se retrouver avec du code mort.

- page 2 de 21 -