Please adopt Firefox

En vrac

Avec un titre à la manière du standblog, encore quelques déconnades supplémentaires…

Je sais, je poste beaucoup de blogounettes en ce moment. Mais en même temps, ça me reflète plus moi tel que je suis, dirons-nous. Donc, ça va en fait.

Comme dit Vincent, je devrais ptête renommer ce blog le Blog-Minute… En fait, non, ça ne conviendrait pas pour les quelques billets qui prennent nécessairement plus d’une minute à écrire et même à lire :-).

En vrac, donc.

Celles du jour :

  • “Pour être photogénique, essuyez vous avec des pellicules hygiéniques.”
  • À force de parler de Cahier des Charges, le CDC… Ben, paf, CDTC…

Pour finir, voilà la une du journal que nous avons créé lors d’un exercice de notre dernier séminaire de communication. Que ceux qui pouvaient se demander si Vincent ou nous ennuyions en IR , ben on se marre bien quand même.

Vous pourrez noter qu’une partie de la prose présente dans cette image n’est pas des plus flatteuses. Je n’en suis pas le coupable :).

Joke 2EE

Bon, ne vous attendez pas à trouver quelque chose d’intéressant techniquement dans ce billet…

Aujourd’hui en TD de J2EE :

  • “…stmt.executeKerry…”
  • “… Si java bien, c’est JavaBean !”

Bon, allons nous pendre.

Robots pas copains...

Via /., on apprend que l’armée américaine fait actuellement des tests de robots équippés de fusils… Il me semblait que la première loi de la robotique parlait d’autre chose.

Personnellement, ça me fait penser à Robocop 2 (je crois), lorsqu’ils tentent de remplacer Robocop par un robot qui finit par tuer (ou plutôt exploser à coup de balles) le mec censé servir de cobaye pour la démonstration…

Vive les formats ouverts

Ce soir, je devais faire un diagramme de package UML. J’utilise dia pour ce faire, je le trouve simple d’utilisation, il est générique et très puissant.

J’avais 26 use cases à saisir. Or, ils se ressemblaient beaucoup :

  • Ajouter Bidule

  • Modifier Bidule

  • Supprimer Bidule

  • Ajouter Machin

  • Modifier Machin

  • Supprimer Machin

  • Ajouter Truc

  • Modifier Truc

  • Supprimer Truc

Comme je ne voulais pas saisir ces nombreux use cases identiques, je me suis dit que je pourrais sûrement trouver un moyen de diminuer la lourdeur de la tâche.

L’importance des formats ouverts… Un peu comme OpenOffice.org qui zippe en fait dans une seule archive les différents fichiers qui composent un document, dia compresse en gzip un fichier XML dans lequel il stocke les différents composants utilisés.

Comment j’ai su que le format de dia était du gzip ?

Non, je ne suis pas allé chercher sur le site de DIA. La commande file est très utile. Elle se fout totalement de l’extension d’un fichier : elle regarde le contenu et tente d’en déterminer le type. C’est très utile :

baptiste@presario:~$ file GRessources.dia
GRessources.dia: gzip compressed data, from Unix
baptiste@presario:~$ file GRessources.dia
GRessources.dia: gzip compressed data, from Unix
baptiste@presario:"~$ mv tomcat.pdf tomcat
baptiste@presario:~$ file tomcat
tomcat: PDF document, version 1.3

J’ai donc décompressé ledit fichier GRessources.dia et j’ai cherché la chaîne de caractère d’un premier use case que je venais d’ajouter : Ajouter Bidule. Je l’avais volontairement fait pour retrouver dans le XML la balise qui m’intéressait. Ce fut chose faite, et après une courte recherche, on parvient à isoler l’élément désiré. Voici à quoi ressemble un cas d’utilisation stocké en XML dans le format de fichier de DIA :

<dia:object type="UML - Usecase" version="0" id="O51">
    <dia:attribute name="obj_pos">
      <dia:point val="9.98956,28.3"/>
    </dia:attribute>
    <dia:attribute name="obj_bb">
      <dia:rectangle val="9.98956,28.3;16.6896,30.5333"/>
    </dia:attribute>
    <dia:attribute name="elem_corner">
      <dia:point val="9.98956,28.3"/>
    </dia:attribute>
    <dia:attribute name="elem_width">
      <dia:real val="6.7000000000000002"/>
    </dia:attribute>
    <dia:attribute name="elem_height">
      <dia:real val="2.2333333333333334"/>
    </dia:attribute>
    <dia:attribute name="line_colour">
      <dia:color val="#000000"/>
    </dia:attribute>
    <dia:attribute name="fill_colour">
      <dia:color val="#ffffff"/>
    </dia:attribute>
    <dia:attribute name="text_outside">
      <dia:boolean val="false"/>
    </dia:attribute>
    <dia:attribute name="collaboration">
      <dia:boolean val="false"/>
    </dia:attribute>
    <dia:attribute name="text">
      <dia:composite type="text">
        <dia:attribute name="string">
          <dia:string>#Modifier un Bidule#</dia:string>
        </dia:attribute>
        <dia:attribute name="font">
          <dia:font family="sans" style="0" name="Helvetica"/>
        </dia:attribute>
        <dia:attribute name="height">
          <dia:real val="0.59999999999999998"/>
        </dia:attribute>
        <dia:attribute name="pos">
          <dia:point val="13.3396,29.6167"/>
        </dia:attribute>
        <dia:attribute name="color">
          <dia:color val="#000000"/>
        </dia:attribute>
        <dia:attribute name="alignment">
          <dia:enum val="1"/>
        </dia:attribute>
      </dia:composite>
    </dia:attribute>
    <dia:childnode parent="O1"/>
  </dia:object>

Oui, bon j’avoue qu’au premier abord, ça peut sembler compliqué. Mais en fait, on s’en fiche. Bien entendu, on travaille sur une copie du fichier dia original pour éviter les risques :-). On croise les doigts en recopiant tout ça et en changeant la chaîne qui nous intéresse (ici, Modifier un Bidule) en celle qu’on veut pour le nouveau use case.

Si on connait un tout petit peu le XML, on remarque le id=“051”. En XML, un id doit être unique dans le fichier, on change donc ça en un autre qui n’existe pas encore (052 par exemple) et on sauvegarde le tout.

Recompressez le fichier modifié, $gzip votrefichier va vous générer un votrefichier.gz. Renommez le en votrefichier.dia pour faire propre et ouvrez le avec DIA…

Vous voyez votre nouveau use case, la copie que vous venez de faire, au dessus de l’original. C’est normal puisque vous avez gardé les mêmes paramètres de positionnement ^^.

Voilà, j’espère que ça pourra vous être autant utile qu’à moi, bonne nuit.

Comment savoir qui utilise un périphérique ?

C’est un problème que je rencontre assez fréquemment. Je n’utilise pas encore ALSA, je suis toujours à OSS par manque de temps pour changer, c’en est peut-être la cause. Bref, lorsqu’un logiciel plante il peut arriver qu’il subsiste en mémoire sans qu’on s’en aperçoive et occupe /dev/dsp…

Et là, paf, lorsqu’on essaie d’écouter de la musique, et ben non !

Comment faire pour retrouver ce fichu processus qui m’empêche de faire qu’est-ce que je veux ?

fuser ou lsof vous listent les processus en cours d’utilisation :

Exemple :

baptiste@presario:~$ fuser -v /dev/dsp

                     USER        PID ACCESS COMMAND
/dev/dsp             baptiste   4414 f....  xmms
                     baptiste   4416 f....  xmms
                     baptiste   4417 f....  xmms
                     baptiste   4418 f....  xmms
                     baptiste   4577 f....  xmms
                     baptiste   4578 f....  xmms
baptiste@presario:~$ lsof  /dev/dsp
COMMAND  PID     USER   FD   TYPE DEVICE SIZE  NODE NAME
xmms    4414 baptiste   11w   CHR   14,3      80916 /dev/dsp
xmms    4416 baptiste   11w   CHR   14,3      80916 /dev/dsp
xmms    4417 baptiste   11w   CHR   14,3      80916 /dev/dsp
xmms    4418 baptiste   11w   CHR   14,3      80916 /dev/dsp
xmms    4577 baptiste   11w   CHR   14,3      80916 /dev/dsp
xmms    4578 baptiste   11w   CHR   14,3      80916 /dev/dsp

Je vais essayer d’ajouter un billet dans cette catégorie plus régulièrement à partir d’aujourd’hui.

Et encore une !

M’en fous, c’est pas moi d’abord, Vincent !

La blague d’aujourd’hui. Un pote (Gab, encore…) s’est pris un plafonnier sur la figure hier soir, ça lui a pratiquement pété ses lunettes, alors v’lan :

“Borgne to be alive”

Software Development

Je me rends compte que vous êtes certainement nombreux à ne pas connaître le bliki de Martin Fowler. Comme il l’indique lui-même et comme le nom de la chose peut le faire comprendre, c’est un croisement entre un wiki et un blog :-).

Ce grand architecte donne son point de vue sur différentes pratiques du développement logiciel et sur des patterns. Ce que j’apprécie particulièrement, c’est qu’il agrémente toujours sa prose de quelques exemples de code clair qui permettent de mieux comprendre le sujet en cours. De plus, on sent très nettement qu’il ne fait pas de la conception pour faire de la conception, l’étude qu’il effectue est issue d’une réflexion destinée le plus souvent à solutionner un problème récurrent que lui ou son entourage rencontre dans son travail.

Je le lis maintenant depuis 7 mois. Je l’ai découvert lorsque je cherchais des informations sur le design pattern Inversion de contrôle et que je suis tombé sur cet article de Sami Jaber. Dans cet article, ce dernier explique le pattern et donne en exemple l’utilisation de Spring. Sami cite Martin en référence.

Bref, si vous vous intéressez à la programmation en général et que vous aimez connaître la vision des autres sur l’informatique, le bliki est une ressource à suivre. Syndiquez, syndiquez vous qu’y disaient !

Faut pas perdre la main

C’est comme la peau de l’ours, il faut pas la vendre… Non, il FAUT PAS !

Hier soir, ou plutôt ce matin très tôt, Bryce a cracoté, mais m’a bien fait rire :

“LDAP sur des bambous et la la la la”

Et Alexis ce soir :

Blague getBlague()
{
   return null;
}

Ahhh, les gens, c’est plus ce que c’était… Aujourd’hui, tout va à vélo, c’est moi qui vous le dit.

Hibernate

Via a19s, j’apprends il y a quelques minutes que la traduction en français de la documentation de ce formidable outil de mapping O/R vient de paraître. C’est un outil très puissant de persistance automatisée surtout destiné à une architecture plus légère utilisant des POJOs à la place des EJBs.

Si vous avez compris ce que je viens de dire, ce n’est pas la peine de lire la suite :-). Je vais essayer de définir rapidement les quelques termes utilisés ci-dessus. C’est le genre de choses que j’ai longtemps cherché lorsque j’ai commencé à suivre les fils rss de TSS, d’a19s ou de DotNetGuru

Un peu d’aide

Je ne prétends pas faire de définition exhaustive et pouvant vous servir à comprendre totalement. Je vais simplement expliquer les choses telles que je les ai comprises. Je suis convaincu que c’est le fait de lire des dizaines d’explications de la même chose à des endroits et avec des façons différentes qui permet de comprendre correctement un concept ou une technique.

La persistance

En fait, ce terme est utilisé pour indiquer le fait qu’un objet peut être sauvegardé de façon plus ou moins automatisée. Vos objets pourraient par exemple être sauvegardés automatiquement dans une base de données ou dans un fichier au moment de l’arrêt du conteneur et être restaurés tout aussi automatiquement lors du redémarrage de celui-ci.

Ce qui est impressionnant pour le néophyte avec un outil comme hibernate, c’est qu’on peut sauvegarder ses objets dans une base de données sans écrire une ligne de JDBC ni de SQL !

Pourquoi “mapping O/R”

Et bien, parce qu’on indique à l’outil la correspondance entre le modèle objet de la partie programmatique et le modèle relationnel couramment rencontré dans les bases de données. Les bases de données relationnelles sont effet beaucoup plus répandues que les bases de données objet. Elles sont aussi plus anciennes, donc mieux maîtrisées, elles font moins peur aux entreprises.

Concrètement, on utilise par exemple dans hibernate un fichier xml dans lequel on indique la correspondance table/objet et champs/attribut.

POJO, Késako ?

Je ne sais plus où j’ai lu cette histoire, mais ce nom aurait été inventé pour contrer l’effet mode qui allait avec le terme EJB. On a donc cherché un mot fashion pour les objets Java classiques : de bons vieux objets classiques en opposition avec la complexité de déploiement qui va avec les EJB.

Pourquoi ? Tout simplement parce que les entreprises sont revenues de la mode tout J2EE. C’est complexe à développer, déployer et à maintenir un conteneur d’EJB ! Le plus souvent, utiliser une architecture mettant en oeuvre des EJB est surdimensionné, inadapté. Je me souviens qu’un formateur disait que 80% des projets qui en utilisaient auraient été mieux inspirés d’utiliser plutôt une architecture simple servlets/jsp, avec éventuellement du Struts/Spring/Hibernate et les autres outils courants du domaine…

Hibernate

Si vous avez suivi, vous avez compris qu’Hibernate est donc un outil de mapping O/R. Il permet de sauver ses objets très simplement en base. Après quelques lignes de code, une instruction du genre session.save(monObjet) sauvera l’objet monObjet si sa classe a été mappée correctement. Ça donne envie d’essayer, non ? :-)

Bon, je crois que ça suffira pour ce soir. J’ai fait largement assez long pour ne finalement vouloir parler que de la première phrase o_O.

Page 24 of 33 Older