De l'intérêt de Docker pour tout développeur !

Dans l’article qui suit, je vais vous montrer comment j’ai récemment eu l’occasion d’utiliser Docker pour un cas concret.

La particularité ici est que cela était un cas utile à un travail de développement : cela n’avait pas pour but de faire tourner une application, simplement d’accéder à un environnement (via Docker, donc), de récupérer des informations, puis de jeter.

Pour ce cas, j’estime avoir gagné au bas mot plusieurs dizaines de minutes.

Le contexte

Alors que je travaillais sur une pull request pour le projet maven-scm, j’ai eu besoin pour les tests d’intégration d’une vieille version de Subversion (oui, j’utilise Git sinon :-)).

Plus précisément, j’avais besoin de pouvoir faire un checkout d’un dépôt SVN avec les métadonnées au format SVN 1.6.

Or, ma machine est à jour, et la version que j’ai en local est une récente 1.8.8…

Que faire ?

  • Rétrograder la version de ma machine ? Bof, pas trop envie de risquer de péter mon existant.
  • Une VM ? Où ? En local ? Pfiou, ça va être long… En IaaS ? Bof.

Mais dis-donc !

Docker à la rescousse

Au final, cette manipulation m’a pris maximum 5 minutes. Le plus long a été de trouver sur Google la version du paquet debian correspond à SVN 1.6 la bonne version de Debian (pour aller au plus simple, puisqu’on pourrait aussi prendre une version plus récente et tenter d’installer une version spécifique de SVN).

Sur https://packages.debian.org/search?keywords=subversion, donc :

Paquet subversion
squeeze (oldstable) (vcs): Système de contrôle de version avancé 
1.6.12dfsg-7: amd64 armel i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 sparc
wheezy (stable) (vcs): Système de contrôle de version avancé 
1.6.17dfsg-4+deb7u6: amd64 armel armhf i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 s390x sparc
wheezy-backports (vcs): système de gestion de version évolué 
1.8.10-1~bpo70+1: amd64 armel armhf i386 ia64 kfreebsd-amd64 kfreebsd-i386 mipsel powerpc s390 s390x
jessie (testing) (vcs): système de gestion de version évolué 
1.8.10-2: amd64 arm64 armel armhf i386 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc ppc64el s390x
sid (unstable) (vcs): système de gestion de version évolué 
1.8.10-2: alpha amd64 arm64 armel armhf hppa hurd-i386 i386 kfreebsd-amd64 kfreebsd-i386 m68k mips mipsel powerpc ppc64 ppc64el s390x x32 
1.8.8-2: sparc 
1.7.13-3 [debports]: sparc64 
1.6.17dfsg-3 [debports]: sh4

OK, on va donc partir sur une version stable.

$ sudo docker run --rm -it debian:stable /bin/bash
root@d2645d786f6e:/# apt-get update
[snip]
root@d2645d786f6e:/# apt-get install subversion zip
[snip]
root@d2645d786f6e:/# svn --version
svn, version 1.6.17 (r1128011)
   compiled Mar 12 2014, 02:44:28
[snip]
root@d2645d786f6e:/# svn co -N http://svn.apache.org/repos/asf/maven/pom/trunk/asf/
A    asf/pom.xml
A    asf/site-pom.xml
 U   asf
Checked out revision 1629441]
root@d2645d786f6e:/# zip -rq asf.zip asf

Ensuite, depuis le host, dans un autre onglet de votre émulateur de terminal favori :

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
dbd6d39cbdb1        debian:stable       "/bin/bash"         25 minutes ago      Up 25 minutes                           sick_archimedes
$ sudo docker cp sick_archimedes:/asf.zip .
$ unzip -t asf.zip 
Archive:  asf.zip
    testing: asf/                     OK
    testing: asf/.svn/                OK
    testing: asf/.svn/dir-prop-base   OK
    testing: asf/.svn/props/          OK
    testing: asf/.svn/entries         OK
    testing: asf/.svn/all-wcprops     OK
    testing: asf/.svn/tmp/            OK
    testing: asf/.svn/tmp/props/      OK
    testing: asf/.svn/tmp/prop-base/   OK
    testing: asf/.svn/tmp/text-base/   OK
    testing: asf/.svn/prop-base/      OK
    testing: asf/.svn/prop-base/pom.xml.svn-base   OK
    testing: asf/.svn/prop-base/site-pom.xml.svn-base   OK
    testing: asf/.svn/text-base/      OK
    testing: asf/.svn/text-base/pom.xml.svn-base   OK
    testing: asf/.svn/text-base/site-pom.xml.svn-base   OK
    testing: asf/pom.xml              OK
    testing: asf/site-pom.xml         OK
No errors detected in compressed data of asf.zip.

Et voilà, en à peine quelques minutes, j’ai mon checkout, je jette mon conteneur, et je continue.

Je sais pas vous, mais moi c’est ce genre de petit exemple tout simple qui me place du côté de ceux qui disent que Docker n’est pas une simple nouveauté, mais effectivement une véritable révolution !

Atelier forge à l'AgileTour : préparez vos machines !

Michäel Pailloncy et moi allons animer un atelier lors de l’AgileTour Toulouse 2013, jeudi 10 octobre (cf. les détails de la session). Oui, c’est dans 3 jours :-).

Quelques informations complémentaires si vous prévoyez de venir à cet atelier :

  • sachez qu’il nécessite absolument un ordinateur. Si vous n’en avez pas, libre à vous de venir avec un ami qui en a un, mais ce sera probablement moins intéressant pour vous.
  • vous devrez aussi disposer d’un client Git fonctionnel (nous clonerons un dépôt local fourni sur la clé USB car nous n’aurons pas accès à Internet).
  • la machine devra posséder un JDK en version 7 installé. Nous en fournirons les binaires sur une clé USB, mais vous gagnerez beaucoup de temps si vous n’avez pas à le faire en début de TP.

Cf. aussi le dépôt GitHub suivant et son README

Si vous avez besoin de précisions, n’hésitez pas à me contacter via Twitter ou dans les commentaires de ce billet.

Merci de votre attention, faites passer le message :-).

Investir dans l'humain ?

Qu’est-ce qu’on va faire si on investit dans nos collaborateurs, et qu’ils s’en vont ?

Qu’est-ce qu’on va faire si on n’investit pas, et qu’ils restent ?…

Envie de participer à un projet opensource ? Jenkins a besoin de vous

Woui Nide You
! Jenkins est certainement le serveur d’Intégration Continue le plus utilisé dans le monde. Si vous vous intéressez de près ou de loin à l’open-source et que vous aimeriez contribuer à un projet de ce type, lisez la suite.

L’année dernière, en août, nous avons attaqué la traduction en français du Jenkins Definitive Guide, écrit en bonne partie par John Ferguson Smart. Le travail a avancé doucement, mais a avancé tout de même. A ce jour, sur la quinzaine de chapitres, trois sont traduits et relus, et presque tout le reste est en cours.

Mais je ne parle pas bien anglais…

Ce n’est pas grave. Il y a plusieurs chapitres où il faut simplement relire, et donc parler français est suffisant. Si éventuellement, vous ne comprenez pas certaines parties traduites, et qu’il faut relire l’original, vous pouvez toujours soulever la question sur la liste de diffusion du projet où on parle français.

Je ne suis pas développeur, ou je ne connais pas Git, ou les deux

si vous voulez vous former à Git, c’est l’occasion. On se fera un plaisir de répondre à vos questions sur la liste de diffusion, même si elles sont exclusivement liées à Git, et pas (encore) à la traduction :-).

Mais si vous ne le sentez pas ou n’avez pas le temps, ce n’est pas grave. Vous devez simplement savoir éditer un fichier XML. Il y en a un pour chaque chapitre.

Super ! Par où je commence alors ?

Si vous êtes intéressé, mais que vous avez des questions, surtout n’hésitez pas à les poser.

On vous attend ! :-)

Want to push your git changes, but no connection on Holiday? No worries, git bundle is here !

I’m currently writing this article offline, since I’m in a place where even phones don’t work fine. Imagine the following situation:

  • Granted, it’s the summer, but outside the weather is more suited to the frogs than to the human beings…;
  • Your laptop is sitting next to you, waiting for you to tackle this long overdue task on a dev project ;
  • You use git, but your Internet connection is between lacky and inexistent. Your only way to receive updates is to regularly take your computer to some place where the network is a bit better (so you can sync your emails, for example).

So, what you would like to do is quite simple: work offline with git (it’s one of its best forces, right?), then push a mail somewhere with your commits. To do that, you have many possibilities:

  • Zip -9 your repository and send it as attachment!
    • Ahem, mine is 400MB. Forget about it.
  • Git request-pull/am/format-patch to send mails and integrate them automatically on the other side
    • Requires too many configurations for what I want.

So what’s left? git bundle. Let’s have a look at the documentation:

git-bundle - Move objects and refs by archive

Ahem, well, not very explicit if you ask me. Let’s look at the description:

Some workflows require that one or more branches of development on one machine be replicated on another machine, but the two machines cannot be directly connected. This command provides support for git fetch and git pull to operate by packaging objects and references in an archive at the originating machine, then importing those into another repository using git fetch and git pull after moving the archive by some means (e.g., by sneakernet).

More interesting.

I’ll rephrase it: we’re going to create a special archive, containing only the commits I want, and finally send it as an attachment. People receiving this mail will be able to just pull from this archive, as from a normal repository! Sounds great, doesn’t it?

So, how to use it? Here’s my use case: I have to do some kind of code review. So I’m gonna create a new branch from the main one “develop”, I’ll call that new one reviewFeatX. Then, that‘s at least the content of this branch I’d like to be able to send.

The principle

For bundling to be efficient and interesting, it’s assumed that both repositories have a common basis. That’s quite obvious anyway: if the repository you’re working on is totally new, then you are likely to have to send it in its entirety. Sending “some commits” only makes sense when there’s in fact commits already present in both places. A Git
Tree

Thanks to git’s “everything-is-a-sha” policy + every commit has a parent, it’s quite easy for it to find the link between your work tree and another one.

Creating the archive

Looking at the picture above, what we would like to do is quite obvious: send the blue part as an archive, and not a lot more if possible. Now, how do we do that?

$ git bundle create ../reviewFeatX.gitbundle develop..reviewFeatX

Notice the “develop..reviewFeatX”: this part will be passed through the git rev-list command, which will in fact return all the hashes (sha) corresponding to the blue part above in the diagram. Now you have a reviewFeatX.gitbundle file that you can send by email, dropbox or whatever you want.

Using the archive

On the other end of the pipe, someone is hopefully going to want to retrieve commits from the file. Here’s how to do that:

  • First, you can just check if the bundle contains enough information to apply to your repository (that is: your local repository contains at least the commit basis onto which the bundle was created)
$ git bundle verify ../reviewFeatX.gitbundle
The bundle contains 1 ref
8c7feeb8d13233a466459cffc487ca08334af838 refs/heads/reviewFeatX
The bundle requires these 1 ref
6807f3ac794d72a410ac23fa8e2dc5c0bbd6c422 some log
../reviewFeatX.gitbundle is okay
  • So now, we can just apply it! To do that, just use the bundle as a remote repository.
$ git ls-remote ../reviewFeatX.gitbundle
1fd7         refs/heads/reviewFeatX

$ git fetch ../reviewFeatX.gitbundle reviewFeatX:reviewFeatX
From ../reviewFeatX.gitbundle
 * [new branch]      reviewFeatX -> reviewFeatX

$ git branch
* develop
  master
  reviewFeatX

$ git checkout reviewFeatX
Switched to branch 'reviewFeatX'

$ git log --oneline develop..reviewFeatX
1fd7 log3
df56 log2
abc1 log1

That’s it! You’ve now imported the commits from the bundle you received by mail.

As said in the introduction, you see there’s many ways to exchange commits. I hope you’ll have found this one interesting and that it will be useful to you.

Configure Hudson CI Server to automatically disable itself when main SVN repositories become unreachable

Note: I wrote this post some months ago, and just made it public since the problem making it impossible to use was fixed some weeks ago. In the meantime, you should also be aware that Hudson has recently been renamed to Jenkins, and its new house is now http://jenkins-ci.org/

Sometimes, we encounter erratic issues accessing our subversion repositories. Even apart from the server upgrade information that just dont reach the interested people, but only managers who didn’t forward (since there’re obviously not the ones that use the dev server…), we also have random problems like everyone.

The problem

When SVN becomes unreachable, every one starts receiving mails about it from Hudson… For example, last week-end I received 6000+ emails about that. So, I wrote this small script to update all our jobs to not run during both the night and the week-end.

But sure, this won’t solve everything. For example, if the server goes down during a working-day, and you’re not in front of your computer for some reason. When coming back to your box, you might discover the big amount of mails from Hudson, or even from the devs if you’re in charge of operating the CI server.

So I’ve been looking for a way to just automatically disable Hudson builds when a problem is detected.

The solution

For some days now, I’ve been playing with the Hudson script console since I discovered how greatly powerful it can be.

My starting point was the hudson command used to prepare a shutdown. How to do it through the groovy console? I gave it here in one tweet: hudson.model.Hudson.instance.doQuietDown(). Once I found this, I just had to find a way to interact with the SVN inside the groovy/hudson console system and build around it a small groovy script.

After some struggle about how to programmatically use SVNKit (Subversion pure Java API), and then how to use an anonymous class with Groovy, I was done.

Here’s the resulting script:

import hudson.model.*
import org.tmatesoft.svn.core.*
import org.tmatesoft.svn.core.wc.*

String[] repoToCheck = ['svn://svn/scle', 'svn://svn:3691/pgih']

class MyHandler implements ISVNDirEntryHandler
{
  def void handleDirEntry(SVNDirEntry dirEntry)
  {
    // nothing
  } 
}

org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl.setup();
Map<String, Throwable> problematicRepos = new LinkedHashMap<String, Throwable>();
for(String repo:repoToCheck)
{
  SVNURL url = SVNURL.parseURIDecoded(repo);

  SVNClientManager clientManager = SVNClientManager.newInstance();

  SVNLogClient c = clientManager.getLogClient();
  try
  {
    // Special groovy anonymous class construct
    def handler = new MyHandler()
    c.doList(url, SVNRevision.UNDEFINED, SVNRevision.HEAD, false, false, handler);
  }
  catch (Exception e)
  {
    problematicRepos.put(repo, e);
  }
}

if(!problematicRepos.isEmpty())
{
  for(Map.Entry<String, Throwable> entry:problematicRepos.entrySet())
  {
    println("Problem accessing \""+entry.getKey()+"\"");
    String s = entry.getValue();
    println(s)
  }
  println("Disabling hudson build")
  hudson.model.Hudson.instance.doQuietDown()
  return 1
}
else
{
  println("No problems with repos");
}

How to install and configure it

Install the Groovy Plugin for Hudson. This way, you’ll be able to add job directly written in Groovy. Then create a job that will run every minute! (”* * * * *”) and put the script above inside an “Execute system Groovy script”.

Then, configure the notification you like. It’s probably a good idea to target admin email when this jobs fails. That’s what I did.

Important note: there used to be a difference of behaviour with classloading between “groovy script console” and “groovy system script” in a job. This made the script above unable to work. The good news if that it was fixed with Hudson 1.352 and HUDSON-6068. So the bad news is that you can’t use this technique if you’re using an older version (time to upgrade? ;-)).

Possible improvements

Sure the script isn’t perfect, here’s a few thought of what’s currently missing:

  • At the moment, watched repositories are explicitly declared in the script. Maybe it would be more interesting to iterate through the whole list of jobs to find the actual used repositories. But I feel this approach might be a problem: if only one job is failing, maybe the team HAS to be notified. You’re not going to disable the whole hudson instance (or even cluster) for only one job failing, right?
  • About svn :
    • this is the only supported scm in the script above
    • Only the “svn” protocol is supposed to be supported. If you want to access http exposed repos, then you might have to also initialize the webdav subsystem by calling DAVRepository.setup() first.
  • Groovify the script a bit. I first wrote it in Java, and then adapted it a bit to be more groovy-like, but my experience in Groovy is only about two weeks, so please be indulgent.

Hope this helps!

Mon avis sur le livre "Apache Maven" de Nicolas De Loof et Arnaud Héritier

J’ai lu le livre Apache Maven, édité chez Pearson. Pour un premier livre en français sur Maven, on peut dire que l’expérience est globalement très réussie.

Mon expérience de maven

Disons-le tout de suite, je ne suis pas néophyte sur Maven. J’ai été utilisateur de maven 1 un tout petit peu (preuve ici :-)), avant de me plonger dans maven 2 depuis maintenant plusieurs années. Bon, ça c’est fait. J’espère que vous comprendrez que là, je veux pas me la péter hein. Je veux juste dire que nombre de concepts du livre m’étaient déjà connus. Et que, donc, mon analyse ne sera forcément pas celle d’un nouvel arrivant sur Maven.

Le style du livre

J’avoue que j’ai trouvé la lecture très agréable. C’est volontaire de la part des auteurs, et c’est réussi. Ils ont réussi à apporter beaucoup de concepts dans un style facile à lire. Ils ne sont pas tombés dans le piège de la documentation de référence, parfois un peu dure à lire, voire carrément chiante, qu’on n’ouvrirait que pour y faire un grep sur ce qu’on cherche (et ce n’est à mon sens pas le but pour un livre papier).

Le livre se lit un peu comme un roman : un petit projet débute, et rencontre les problèmes classiques du packaging qui devient une usine à gaz, et que seul celui qui l’a développé (et encore) peut lancer. Au fil de l’eau, on explique donc comment fonctionne maven (et pourquoi il a été créé), comment packager simplement, etc. Ensuite, on se rend compte que l’écriture et le lancement de tests est fastidieuse, alors on explique comment ajouter des tests, et ainsi de suite en décrivant la mise en œuvre de choses de plus en plus complexes.

La structure et le contenu du livre

“Premiers pas avec Maven”

La première partie introduit maven, d’où il arrive, qui l’a créé et pourquoi. Exemple : un projet, quel qu’il soit (et dans quelque langage que ce soit), rencontre presque toujours les trois besoins suivants lors de sa construction : préparer la construction (initialisation), compilation, puis assemblage.

Tout y est, “convention-over-configuration”, la notion de dépendance, la transitivité, les scopes, les classifiers, etc… Et tout passe comme une lettre à la poste. Vraiment, je le redis : l’exploit de Nicolas et Arnaud réside dans la capacité à nous permettre de lire le livre sans avoir l’impression de lire une documentation technique.

Comme je le disais sur twitter, je pense que ce livre est un outil formidable sur lequel s’appuyer pour préparer des sensibilisations à Maven dans vos boîtes. Mais surtout, CITEZ VOS SOURCES !!! :-)

Dans la première partie, on la jouait petit. En tant qu’utilisateur expérimenté de maven, ça m’a surtout donné envie de voir comment on pourrait déployer Selenium et FitNesse en IC chez nous.

“Maven en entreprise”

Là, on commence à ouvrir les vannes. Le projet est devenu complexe : comment gérer les dépendances proprement avec un repo manager, centraliser les informations dans un pom parent, utiliser Maven dans l’IDE.., et on arrive enfin à “mais diantre, comment on release un projet avec Maven ? On pourrait pas gérer automatiquement ces actions répétitives, rébarbatives qu’on se tape à chaque livraison, et sur lesquelles on se trompe une fois sur deux ?“.

“Encore plus loin avec Maven”

On lâche les chevaux : écriture de plugin maison, comment le tester, intégrer de l’assurance qualité (analyse de code, couverture de code), la génération des rapports et enfin on parle de Sonar, la rolls de l’analyse qualité d’un projet.

Une fois la partie “technique” terminée, Arnaud et Nicolas se livrent même à l’exercice périlleux de prédiction : Maven 3 et consorts (Encore bon pour le moment : Maven 3 à attendre plutôt pour fin 2010, d’après le livre imprimé en novembre 2009. On en est à l’alpha-7 à ce jour.).

Les reproches

Il en faut, sinon, vous allez penser que je ne suis pas objectif :-).

  • Tests d’intégration : les mettre dans le projet, ou dans un projet externe ? Le livre dit que les deux approches sont valides, mais sans creuser. J’aurais aimé davantage de retours sur le sujet. Au moins essayer de donner des pistes ou des exemples sur quelle stratégie plutôt adopter qu’une autre dans une situation en particulier. Ou même simplement l’avis d’Arnaud et de Nicolas (je suis sûr que vous en avez un :)) si aucun consensus n’existe effectivement.
  • *Problèmes d’impression en N&B* : je suppose que quelques captures ou diagrammes (exemple : p.206, un des écrans de sonar) ont dû être envoyés à l’éditeur en couleur. Le passage au noir&blanc les rend peu lisibles (essayez de différencier du bleu et du vert une fois dans des nuances de gris…). Je pense qu’il aurait fallu soit vérifier la conversion au noir&blanc, soit voir avec l’éditeur pour imprimer en couleur au moins ceux-là (je suppose que ça permet de baisser le prix de revient du livre).
  • Évolution de Maven 3 : pouvoir référencer un pom parent sans version. Le problème de la poule et de l’œuf de Maven. Cette évolution me paraît à la fois intéressante, et en même temps pose question. En effet, l’une des forces de Maven est qu’il est actuellement possible de checkouter un seul module (et non tous) et de travailler dessus. Un peu comme SVN, on peut checkouter n’importe quel niveau, et Maven s’y retrouve très bien. Je suppose que si la version parent n’est plus spécifiée, il devient impossible de checkouter de cette façon. Je pense que ce sera comme ça, mais j’aurais aimé quelques détails sur le sujet.

Mon impression générale

Dans la description de ce petit projet devenu gros, j’ai retrouvé une très grande partie des choses que nous avons faites chez nous. Je pense que certains choix n’ont pas toujours été faits immédiatement, et la lecture d’un tel livre nous aurait économisé pas mal de temps et de recherches (le release-plugin marche très bien, une fois qu’il marche. Mais il peut être difficile d’initialiser les premières releases, où il y a toujours un truc qui plante au milieu).

Petit bonus en prime : le style adopté, et la partie à la fin du livre vous donnent l’impression de connaître tout le monde, de faire un peu partie de la famille :). Maintenant on connait l’âge de tous les développeurs francophones de Maven, même celui de Vincent qui a tenté un chiffrement en héxa :-).

Globalement, donc, je recommande chaudement ce livre à toute personne qui utilise maven et qui souhaite maîtriser l’outil. Le livre offre un accès facile à toutes les facettes du projet, des plus simples au plus avancées, sans omettre le côté humain qui est si important dans les projets opensource.

Comment connaître la provenance d'une classe programmatiquement en Java

Il est possible par programmation de savoir d’où vient une classe : un jar ? un répertoire ? autre ?

Use case classique : vous pensez (et devez) ne plus avoir les commons-logging nulle part dans votre classpath, parce que vous êtes (intelligemment :-)) passés à SLF4J. Malgré cela, il semble que cette fichue classe soit toujours trouvée, mais vous n’arrivez pas à savoir dans quel jar (ou quel répertoire si vous travaillez directement avec les .class). Résultat, ça vous fout un bazar monstre dans la configuration de vos logs. Certains continuent à apparaitre alors que vous avez demandé à ce qu’ils ne soient pas affichés…

Le code est un peu sioux, alors je le mets ici au cas où ça vous servirait :

System.out.println(MaClasse.class.getProtectionDomain().getCodeSource().getLocation());

MAJ du 15/03/2010

Suite à l’incompréhension ci-dessous, voici quelques exemples pour illustrer ce que fait ce code :

Le code :

System.out.println(org.springframework.mail.MailSender.class.getProtectionDomain().getCodeSource().getLocation());
System.out.println(MyJunitTest.class.getProtectionDomain().getCodeSource().getLocation());

Affiche sous Windows :

file:/C:/m2repository/org/springframework/spring-context-support/2.5.6/spring-context-support-2.5.6.jar
file:/C:/tests/myproject-core/target/test-classes/

J’espère que l’utilité est un peu plus claire à présent.

Bonne année 2010 à tous

Souhaitons que cette nouvelle année soit le début d’un retour aux manettes de ceux qui font à la place de ceux qui comptent. Mais j’avoue que j’y crois très peu :-).

Vu aucune différence de performances entre firefox 3.5 et les versions précédentes : vous utiliseriez pas Firebug ?

Par le plus grand hasard, pendant la lecture d’un billet de Pascal sur les performances de firefox au fil des âges, je viens de m’apercevoir que je ne profitais en fait pas de TraceMonkey, le compilateur JIT intégré à Firefox depuis la 3.5 !

C’est vrai que je n’avais pas fait très attention, mais que je n’avais pas non plus remarqué d’amélioration notable sur mon navigateur favori. En fait, c’était à cause du fait que j’avais, comme tout bon développeur qui se respecte :-), installé firebug depuis déjà un bon moment.

Sur le blog de Pascal, la phrase suivante m’a donc fait tilter :

Un petit rappel si vous utilisez Firebug, votre moteur de compilation JIT de javascript est désactivé et vous aurez donc des perfs équivalentes à celles de Firefox 3.0, même si vous êtes en 3.5. La version 1.5beta7 de Firebug sortie hier devrait résoudre ce bug.

Aussitôt dit, aussitôt fait. J’ai installé la version 1.5X.0b8 de firebug et j’ai tout de suite vu effectivement une différence. Gmail, Google Reader, Hudson, tout s’affiche plus vite.

Comme j’avais fait le test SunSpider avant la mise à jour, en gros, je peux vous dire que je suis passé de 3500 à 1500 !

Bref, installez-vite cette mise à jour !

Si vous maigrissez trop vite, prenez vos patch un jour sur deux

Je viens d’éclater de rire en voyant une publicité passer dans Gmail :

Maigrir trop vite...

Le plus extraordinaire, c’est que le site en question semble pourtant se vouloir très sérieux :-).

Encoding par défaut avec XML : UTF-8

Nous gérons en ce moment un petit problème d’intégration avec des WebServices d’une entreprise qui ne s’attend qu’à du iso-8859-1. XML a pourtant été conçu pour gérer plus simplement les problèmes de jeux de caractères et d’encodage utilisé, mais ce qui a été fait ne respecte tout simplement pas la spécification.

En effet, notre code envoie une requête SOAP dans un tube HTTP annonçant de l’UTF-8. Comme ça ne marchait pas, nous avons carrément ajouté l’attribut encoding au prologue XML et retesté avec Soapui, mais ça n’a rien donné.

Alors, comme il faut que quelqu’un corrige son code, j’ai vérifié la spécification^[1]^, voici ce qui est indiqué :

Bref, attendre de l’iso-8859-1 lorsque rien n’est indiqué est au minimum une bizarrerie, et au pire une erreur par rapport à ce que dit la spécification.

Notes

[1] Non-Normative

Apache Subversion

Tiens, j’avais raté cette news (300 billets en attente dans mon google reader :-/, que je n’arrive à dépiler que 10 par 10. Ça ne suffit pas :-)) : Subversion a intégré l’incubateur d’Apache.

En français, ça veut dire que bientôt, Subversion sera un projet faisant partie entièrement de la fondation Apache. Subversion n’arrête pas son ascension, et c’est logique vu la qualité de l’outil.

[Hudson] How to set a private maven repository by job and easily be able to delete them

When building maven projects with hudson, there’s some common best practices about maven repositories handling :

  1. isolate maven repositories between jobs
  2. regularly purge repositories

The problem

The basic way to do it is to activate the hudson per-job option : “Use private Maven repository”. But the thing is you have to do it for EVERY new job you add. There is no way inside hudson to activate it globally.

Documented solution

If you look at hudson help for this option, you’ll see a link to a simple solution that specify the repository directly in the maven settings.xml file. The tip is to redefine the localRepository tag inside settings with this special value :

<localRepository>${env.WORKSPACE}/m2_repo</localRepository>

This way, you’re done with the first best practice : isolate maven repositories. But not yet with the regularly purge repositories one. Actually, using this option will put the m2_repo inside each hudson job workspace. So, finding and deleting them could become a bit cumbersome. You’d have to cron something like find . -name m2_repo -exec rm -rf "{}" \;.

Even better

As you might have understood, I was not thoroughly satisfied with this solution. I wanted to be able to really easily delete the repositories. So I just changed the option above to have them all inside the same root directory under ~/.m2/repositories, one per job.

Quite simple in fact, instead, just use :

<localRepository>/some/path/.m2/repositories/${env.JOB_NAME}/repository</localRepository>

This way, the only thing you have to put in the cron job is rm -rf /some/path/.m2/repositories/. A bit more straightforward, isn’t it? :-)

Hope this helps.

Encodages/jeux de caractères : Vincent et Hadrien, un grand merci !

Non, ce billet n’est pas une nouvelle tentative d’explication de ce que sont encodages et jeux de caractères. Je garde toujours dans un coin de ma tête de chercher un jour à écrire moi aussi un billet sur le sujet. Qu’est-ce j’aimerais pouvoir faire comprendre ce sujet à la fois simple et complexe à tous en quelques mots…

Non, ce billet est là pour remercier Vincent et Hadrien pour leurs pages récapitulant les jeux de caractères les plus courants en France. Je viens de m’en servir à l’instant pour expliquer une nouvelle fois le sujet.

Un autre site bien pratique, qui permet notamment d’avoir la valeur hexadécimale du stockage d’un point de code Unicode en UTF-8 : FileFormat.Info. Par exemple, le î (“LATIN SMALL LETTER I WITH CIRCUMFLEX”).

Et encore un rappel d’articles en français que je vous conseille sur le sujet :

JSR 330 : Dependency Injection for Java

Récemment, SpringSource (Rod Johnson, créateur de Spring) et Google (Bob Lee, coauteur de Guice) lançaient une proposition de JSR visant à standardiser un jeu d’annotations pour gérer l’injection de dépendances.

Cette proposition, « Dependency Injection for Java », est devenue une véritable JSR depuis 3 jours.

Personnellement, j’ai hâte de voir ce qui va ressortir de ce travail. Notamment, je regarderai attentivement en quoi cela complètera ou s’intégrera avec les annotations de common annotations (JSR 250, dont sont notamment issues @PostConstruct, @PreDestroy, @Resource) et éventuellement les annotations de la spécification des EJB3 (@TransactionAttribute, notamment).

Comme la spécification sera développée avec un scm et une liste de diffusion accessibles publiquement, j’essaierai de vous en dire plus à ce sujet dès que possible.

À suivre.

Citation du jour : Clémenceau

En lisant un bouquin, j’ai découvert l’histoire de la mort de Félix Faure, et le commentaire fait par Clémenceau après son décès. Félix Faure, président français de la fin du 19e siècle, est en effet mort en pleins ébats avec sa maîtresse.

Et Clémenceau, publiquement de dire :

Il a voulu vivre César et il est mort Pompée.

Superbe, Georges ! :-)

Java User Group Toulouse : première conférence

Pour ceux qui n’auraient pas encore vu passer l’information, demain soir a lieu la première session du JUG toulousain. Vous êtes évidemment les bienvenus !

Au programme, GWT et Java ME.

À demain !

L'église catholique à côté de la plaque

Après la récente intervention controversée du pape^[1]^, on a par contre maintenant affaire à un véritable débile en la personne d’André Fort.

Je viens en effet de l’entendre nous expliquer à la radio que (de mémoire) : “les scientifiques savent très bien que le virus du SIDA est trop petit et traverse la paroi du préservatif” (!).

Inutile de préciser que toute la communité scientifique est dite indignée par de tels propos… Et rappelons que si ! N’en déplaise à ce ramolli du bulbe d’André Fort, l’usage du préservatif est très sûr.

Il est inadmissible de chercher à appuyer ses propos de la sorte en se référant à des soi-disants “scientifiques”. Ça me rappelle les créationnistes !

Cela risque d’avoir simplement un impact sur la frange peut-être la plus fragile de la population qui pourrait croire ce discours, et à exaspérer encore davantage les catholiques… Je suis personnellement d’éducation catholique et non pratiquant (je n’ose pas dire simplement “catholique non pratiquant”) et les propos de ce genre de décérébré me rendent dingue.

Heureusement que je connais d’autres prêtres plus intelligents, plus pragmatiques, plus ancrés dans la vie de tous les jours, pour ne pas me mettre simplement à penser comme certains doivent certainement le faire (et on peut les comprendre…) : “décidément, ces catholiques, qu’est-ce qu’ils peuvent être cons !“.

À bon entendeur.

Notes

[1] attention à bien toutefois se renseigner quant aux propos exacts du pape avant de critiquer, cf. la note de Maître Eolas par exemple. On a toujours l’air très con à critiquer des propos qui ne sont pas ceux que l’on pense précisément.

Abattre des cloisons non porteuses en briques

Dans les travaux de notre maison actuellement, je me suis enfin décidé à expliquer comment nous avons procédé pour l’abattage de cloisons. Plusieurs personnes ont semble-t-il été étonnées que je n’en parlasse point avant :-).

Abattre des cloisons en brique

Nous avions environ 30 à 40 mètres linéaires à abattre, sur des hauteurs de 2m50 ou 2m80. L’objectif était d’abattre absolument toutes les cloisons, parce que nous n’avions pas de mur porteur (seuls les murs extérieurs sont porteurs sur cette maison). Ces cloisons étaient en brique de 7cm d’épaisseur.

Première étape : se faire une idée de la difficulté des opérations

J’ai commencé par créer un passage entre les pièces pour faciliter la circulation. Ce premier perçage avait aussi pour objectif d’avoir une idée de la vitesse à laquelle nous pourrions abattre le reste.

J’y suis allé franco : à grands coups de masse. (J’avais acheté cette “masse trancheuse“ chez Casto. Le côté “tranchant” est effectivement bien pratique.).

Note à ce propos : faites très attention à ce qu’il n’y ait rien qui craigne les projections de gravats de l’autre côté de la cloison sur laquelle vous vous acharnez. En effet, taper à coup de masses dedans a dans mon cas projeté des gravats largement jusqu’au mur suivant (situé à environ 4 mètres). Réfléchissez donc aux fenêtres qui peuvent se trouver derrière, ou simplement aux personnes qui travaillent avec vous. Dans ce dernier cas, hurlez simplement tiiimbeeeer avant de taper, ça fonctionne généralement plutôt bien :-).

Deuxième étape : industrialiser le processus

La technique du “c’est moi que vlà avec ma masse”, c’est bien. Mais si vous cassez progressivement et simplement autour du point initial, ça va vous faire des tonnes de gravats à transporter par petits morceaux. Je vous la déconseille donc.

Je vous recommande en effet plutôt une technique que j’ai adoptée ensuite : casser le mur en faisant des grosses saignées pour réaliser des carrés de briques transportables. C’est plus simple à transporter dans la voiture que tout casser en petits bouts…

Pour vous, j’ai testé plusieurs techniques :

  1. Ma tête après le
meulage À la meuleuse d’angle et disque diamant (on l’appelle aussi souvent “disqueuse”) : bof. Je vous la déconseille plutôt, sauf si vous avez besoin d’une découpe au millimètre. Mais ATTENTION : si vous partez sur cette technique, préparez vous à faire de la poussière. Mais quand je dis poussière, je ne plaisante pas. La pièce sera remplie de poussière après 5 minutes de meulage…
  2. à la masse petit bout par petit bout : vous faites un trou, puis vous l’élargissez progressivement. Cette technique a le gros inconvénient de vous imposer un long et fastidieux ramassage de gravats après coup. Je vous la déconseille aussi. Vous devrez aussi investir à mon avis dans un nombre très important de “sacs de gravats” (j’y reviens plus bas) ;
  3. à la masse, avec des saignées pour essayer d’obtenir des plaques de par exemple environ 1m² plus facilement transportables ;
  4. à la masse et au marteau, par pan de cloison entier… On part toujours sur le principe des saignées, sauf qu’on part du sol, on va jusqu’au plafond. On fait la saignée au ras du plafond avec escabeau et marteau, puis on redescend jusqu’au sol au bout de quelques mètres. Vous l’aurez compris. Cette technique est de loin la plus rapide. Un conseil toutefois : soyez plusieurs et au moment où vous faites descendre la cloison, retenez la le plus longtemps possible. Par exemple, à trois, nous retenions sans aucun souci une cloison de 2m50 par environ 3m. Pensez aussi à mettre au sol des tapis ou toute chose de ce genre pour amortir le choc de la chute lorsque vous ne pouvez pas retenir jusqu’au bout. Nous avons utilisé cette technique pour les derniers 90% des cloisons sans soucis. Son gros avantage est qu’on peut ensuite simplement récupérer des morceaux de taille assez importante au sol sans trop de petits morceaux.

Chute de cloison
accompagnée... Saignée
dans les cloisons à
abattre À propos des petits morceaux, les nombreux “bouts” de gravats que ce genre de travaux va vous produire, un conseil important : achetez des “sacs à gravats” (comme ceux-là). Ce sont des sacs en plastique extrêmement épais qui sont très utiles lorsqu’il faut balayer puis convoyer jusqu’à la déchetterie les bouts de briques cassées sur le sol. Attention, ne les jetez pas avec les gravats… Videz les simplement et réutilisez les jusqu’à ce qu’ils rendent l’âme (jusqu’ici, je dirais que nous avons utilisé chaque sac environ 5 à 10 fois, nous en avions acheté 24…)

Si vous avez des questions, n’hésitez pas.

Dans le prochain épisode, si vous êtes sage : abattre un plafond en plafonnette ou en lattis (oui, j’ai les deux).

Eclipse Killer Feature (un de plus) : formatage automatique du code modifié

Voilà pourquoi j’utilise Eclipse, pour ce genre d’apports qui peut paraître mineur au premier abord, mais qui en fait nous change la vie.

Lorsqu’on développe dans une équipe, on souhaite généralement appliquer entre autre des normes communes de formatage. Dans Eclipse, le Ctrl-Shift-F permet d’exécuter le formatage sur le fichier (ou sur toute une arborescence) selon le modèle qu’on aura défini et chargé au préalable.

Le Ctrl-Shift-F a cependant un défaut : sans sélection préalable, il va formater le fichier complet. La fois suivante que vous envoyez vos modifications aux gestionnaires de version (commit avec svn, par exemple), les développeurs qui récupèrent votre modification peuvent se demander pourquoi vous êtes allé modifier tout le fichier pour une simple faute de frappe…

Autre cas encore plus problématique : vous faites du développement MDA. Une partie plus ou moins importante de votre code est donc générée. Vous ne devez donc a priori surtout pas toucher au code en dehors de ce qu’on appelle généralement le code utilisateur (on retrouve ce principe avec acceleo il me semble). Du genre

// Ici, le code modifié manuellement sera écrasé par le générateur.
  // [DEBUT:METHODES]
// Là, le code ne sera pas écrasé à la régénération suivante.
  // [FIN:METHODES]

Depuis la 3.3 d’Eclipse, dans la partie Java/Editor/Save Actions de Window/Preferences, on peut demander à ce que le code qu’on vient de modifier soit automatiquement formaté… C’est pas formidable, ça ? À chaque Ctrl-S, le code modifié et uniquement celui-ci va subir le formatage adéquat… Via cette fonctionnalité, vous pouvez automatiser tout plein d’autres choses au moment de la sauvegarde, je vous laisse jouer avec :-).

java-editor-saveactions.png

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 :-).

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.

À quelle vitesse vous tapez ?

41 mots

Speed test

L'image du jour

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

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 ?

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 :-).

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.

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 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…

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>

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…

40 000 ans de prison

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

\ Question idiote, réponse idiote - Vidéo

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.

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.

How to load a XML Spring context lazily by default

Say you want to change the default-lazy-init attribute programmatically. The most common use case for this seems to appear with unit-testing. In fact, you probably want to load everything when starting a production server, even if it costs you more time. But when testing, and particularly on your machine, you might want to inverse this behaviour. In fact, you might be interested in not loading every 1000 beans of your context when you just need less than 10 for example…

A (beginning of) solution

If you crawl Google, you might find this entry that links to this other one that explains how to programatically modify the lazy-init attribute of each bean of your context. In fact, before the loading occurs, you can iterate through the bean list and call setLazyInit using the method AbstractBeanDefinition.setLazyInit(true). This will be roughly equivalent to manually put lazy-init=“true” on every single bean of your context files.

The problem

The problem with this is that you override everything that was declared in the XML context file. You might want a particular bean be instantiated lazily or eagerly for some reason. But iterating through the whole list like this won’t let you keep what was explicitly defined and only redefine the default value. Another problem is that you may have to exclude some bean from this loop, ending up with a condition that really looks like an ugly hack :

for (String beanDefinitionName : context.getBeanDefinitionNames()) {
    AbstractBeanDefinition beanDefinition = (AbstractBeanDefinition)context
            .getBeanDefinition(beanDefinitionName);
    System.err.println(beanDefinitionName);
    // FIXME : ugly hack
    if (!"org.springframework.aop.config.internalAutoProxyCreator".equals(beanDefinitionName)) {
        beanDefinition.setLazyInit(true);
    }
}

Having to exclude the one bean that’s (according to its name) responsible for proxying beans that have to be lazy-loaded seems quite reasonable. But the thing is you obviously don’t have to do it when you put the default-lazy-init manually…

So I looked for a way to simply replace the default value of this attribute instead. After some time digging into Spring code, I finally found it.

When parsing context definition written in XML (since writing it in XML is no requirement), Spring will use an instance of BeanDefinitionReader that will then call DefaultBeanDefinitionDocumentReader to parse the Document instance. Searching a bit more lets us find where the default values are initialized : BeanDefinitionParserDelegate.initDefaults().

LazyInitByDefaultBeanDefinitionDocumentReader

public class LazyInitByDefaultBeanDefinitionDocumentReader extends DefaultBeanDefinitionDocumentReader
{
    @Override
    protected BeanDefinitionParserDelegate createHelper(XmlReaderContext readerContext, Element root)
    {
        root.setAttribute(BeanDefinitionParserDelegate.DEFAULT_LAZY_INIT_ATTRIBUTE, "true");
        return super.createHelper(readerContext, root);
    }
}

I would have preferred to use the seemingly more dedicated method preprocessXml(Node root)], but this method is called after createHelper(), so the default values are already initialized when calling preprocessXml()… So overriding preprocessXml() is “too late”.

I think I’m going to submit a patch into the Spring bug tracker about this problem.

Unit-testing

When you do unit-testing with Spring, you generally inherit the AbstractDependencyInjectionSpringContextTests class. Add this method redefinition to enable the “lazy by default” behaviour :

@Override
protected BeanDefinitionReader createBeanDefinitionReader(GenericApplicationContext context)
{
    XmlBeanDefinitionReader r = new XmlBeanDefinitionReader(context);
    r.setDocumentReaderClass(LazyInitByDefaultBeanDefinitionDocumentReader.class);
    return r;
}

Plain old Java (Spring) code

When you want to create an XML context, you generally use a ClassPathXmlApplicationContext instance. If you want to modify the default behaviour like here, you have to use a GenericApplicationContext. Note that this is what is adviced in the javadoc of ClassPathXmlApplicationContext :

This is a simple, one-stop shop convenience ApplicationContext. Consider using the GenericApplicationContext class in combination with an org.springframework.beans.factory.xml.XmlBeanDefinitionReader for more flexible context setup.

Here is the code using this GenericApplicationContext that enables the lazy-loading :

GenericApplicationContext context = new GenericApplicationContext();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(context);
reader.setDocumentReaderClass(LazyInitByDefaultBeanDefinitionDocumentReader.class);
reader.loadBeanDefinitions("/yourApplicationContext.xml");
context.refresh();

When is it needed ?

At the moment, I see two reasons for enabling the lazy-loading by default :

  1. When unit-testing, this lets you test a part of the code a bit more quickly, since not every single beans needs to be instantiated.
  2. When using code-coverage tools to evaluate a part of the code, this prevents totally unrelated code to appear with non-null percentage.

Hope this small article will help some other people :-).

The Mythical 5%

Via InfoQ, voici un article de Bruce Eckel sur l’informatique aujourd’hui.

Il commence par parler du “fascinant” “5% des programmeurs sont 20 fois plus productifs que les autres 95%.”, et élargit ensuite au monde de l’informatique : jeune, immature, …

Note : Le titre de l’article de Bruce fait très certainement référence au célèbre livre “The Mythical Man-Month” de Frederick P. Brooks. C’est de ce livre qu’est issu la plus célèbre encore “loi de Brooks” :

Ajouter des ressources à un projet en retard le rend encore plus en retard

Je vous conseille aussi la lecture de cet ouvrage, ça se lit très bien et c’est très instructif.

Paranoïa

Extraits de Wikipedia :

Dès lors, la paranoïa est définie comme un délire chronique, organisé, structuré, logique dans son développement, comportant le plus souvent un sentiment de persécution, entraînant une forte adhésion du patient, mais n’entravant pas les autres fonctions psychiques. Ce type de délire, dit délire paranoïaque apparaît préférentiellement chez des sujets marqués par un trouble de la personnalité paranoïaque pré-existant.

Et aussi

Ce trouble affecte 0,3 à 2,5 % de la population générale. D’un point de vue sémiologique les personnalités paranoïaques se caractérisent par quatre traits fondamentaux qui entraînent à terme une inadaptabilité sociale :

​1. la surestimation pathologique de soi-même ;\ 2. la méfiance extrême à l’égard des autres ;\ 3. la susceptibilité démesurée ;\ 4. la fausseté du jugement.

Et pour finir :

La dangerosité psychiatrique des patients affectés par des psychoses paranoïaques n’est pas à négliger. Elle est d’autant plus à craindre :

* qu’il existe un persécuteur désigné, c’est-à-dire un individu précis, jugé comme étant responsable des persécutions que le sujet pense endurer\ * que le délire évolue de longue date et s’est enrichi au cours du temps\ * qu’il existe un trouble de l’humeur concomittant\ * qu’il existe un alcoolisme et/ou une consommation excessive de cannabis

Do Interfaces have semantics ?

When I saw the title of this entry in my feed reader, my first thought was “who the f*** could be wondering if interfaces have semantics ?”. Happily, that’s not Gavin who thinks this.

The assertion is the following :

Interfaces in Java don’t have any semantics attached. Only a concrete class can define the semantics of a method.

In my opinion, that’s even what interfaces are designed for, defining semantics…

I totally agree with Gavin when he says semantics is defined in the Javadoc and the “name of the things”. I always find myself taking a long time to carefully choose the naming of my objects, since I want those names to be the most meaningful possible (same for method parameters, method names, and so on. Naming meaninfully local variable is also important, but it goes beyond the scope of the current subject).

Using polymorphism let you see different implementations as the same thing, thanks to the defined contract. Maybe I’m only viewing interfaces throught the Liskov principle. But for me contract is a synonymous for semantics when it comes to programming, although I’d be glad to hear explanations of where it differs in your opinion.

Even more, I think that today, as everybody gets more and more used to using the dependency injection pattern, some concrete classes are not even known to the code they’re used by. It’s becoming common to use classes only through their interfaces only (services, for example). In those case, semantics resides in the interface only, and implementations obviously have to respect it very carefully.

J'ai un différentiel de 500 ou 300mA et je vais mourir si je touche le jus

Attention, ce qui suit est issu de ma compréhension du domaine de l’électricité et plus particulièrement de la sécurité électrique. Ne prenez donc pas mes dires pour argent comptant. Si j’ai dit une bêtise, n’hésitez pas à me corriger dans les commentaires. Tout le monde en profitera :-).

J’ai trouvé ce petit sondage via google sur le forum Santé de hardware.fr. passons sur la question : “mais que vient f***re un forum santé sur Hardware.fr”. Faut que j’arrête d’être mauvaise langue, cette page contient quelques informations intéressantes.

En plus, en recoupant avec les informations de connaissances plus au jus (haha) que moi et ma récente formation de Sauveteur Secouriste du Travail, on comprend mieux cette phrase. En effet, sachez qu’en gros, la mort se trouvera presque toujours si vous prenez 50mA en touchant un fil dans lequel circule le courant. Et même à partir de 25mA, vous serez pas en grande forme.

La question qui se pose donc est la suivante : est-ce que je peux faire quelque chose au niveau de mon installation pour que si je touche d’une façon ou d’une autre quelque chose qui serait en contact avec le courant électrique de ma maison ? (l’un des deux fils, la phase, plus précisément).

Allez voir à l’entrée de votre maison. Vous devez avoir un truc qui permet de faire une coupure générale de l’électricité de votre maison. C’est ça qu’on appelle le disjoncteur. Regardez ce qu’il y a écrit dessus. S’il ressemble à ça : Disjoncteur différentiel
antédiluvien Si vous touchez le courant, vous êtes mort…

Que faire ?

Derrière le disjoncteur, que vous ne pouvez pas changer sans faire appel à EDF, vous pouvez installer un dispositif différentiel plus sensible que les 500mA comme celui que j’ai, par exemple. La norme est aujourd’hui à 30mA. Mais il est quand même flippant de voir des statistiques annoncées qu’au vu du parc électrique français, 50% des foyers sont encore équipés de différentiels comme le mien, inutiles pour protéger les humains…

Par contre, je n’ai pas encore bien compris s’il fallait mettre un interrupteur ou un disjoncteur différentiel. D’après cette réponse sur leurs différences sur Yahoo Questions/Réponses, je comprends que le disjoncteur est juste un peu mieux parce qu’il va aussi protéger les installations des surintensités, alors qu’un interrupteur grillera tout simplement.

Ce que j’en comprends aussi, c’est que disjoncteur ou interrupteur, l’important est qu’il soit différentiel pour protéger les humains. Au choix du propriétaire de choisir ou non de mieux protéger aussi son installation.

En vrac

Quelques trucs marrants reçus ou trouvés ces temps-ci :

Le karaté à la Star Ac’ :

Via Géraud, le Rap de l’Aveyron :

Via BienBienBien, le nouveau teckto-tube pour les moins de 15 ans, flippant :

Et pour finir, cours de strip-tease :

Continuum : envoyer le mail après le build dans tous les cas

Nous avons récemment installé et configuré Continuum. Comme nous démarrons avec, nous avons configuré nos projets pour recevoir systématiquement un mail lorsque le build est terminé, qu’il ait réussi ou non. Nous voulons en effet nous assurer que le build est bien effectué par ce biais. Une fois que nous aurons rôdé le processus, dans quelques mois par exemple, je pense que nous modifierons effectivement la configuration pour rendre le serveur d’intégration moins bavard…

Voici le bloc qui permet de dire au serveur d’intégration d’envoyer les mails dans tous les cas. À mettre dans le pom.xml de votre projet :

<ciManagement>
    <system>continuum</system>
    <url>http://mvnrepo.mipih.fr:8080/continuum</url>
    <notifiers>
        <notifier>
            <type>mail</type>
            <sendOnError>true</sendOnError>
            <sendOnFailure>true</sendOnFailure>
            <sendOnSuccess>true</sendOnSuccess>
            <sendOnWarning>true</sendOnWarning>
            <configuration>
                <address>notre-adresse@mipih.fr</address>
            </configuration>
        </notifier>
    </notifiers>
</ciManagement>

Dans tous les cas, j’ai dit !

Mais en fait, même comme ça, continuum ne vous enverra pas toujours la notification. En fait, il ne l’enverra que si l’état de la construction de votre projet a changé depuis la dernière fois. De base, donc, continuum n’enverra pas de mail si dexu builds successifs ont réussi.

J’ai donc cherché à savoir comment configurer continuum pour envoyer le mail inconditionnellement à la fin de chaque build. Comme je n’ai pas trouvé cette information dans la documentation de continuum, j’ai posé la question sur la liste de diffusion. J’ai eu la réponse d’Emmanuel Venisse, le projet lead de continuum :

You can configure “alwaysSend to true in WEB-INF/classes/META-INF/plexus/application.xml in the mail notifier component descriptor.

By default, we don’t send notifications if the state doesn’t change to not spam users.

Emmanuel

Dans continuum 1.0.3, c’est là : $CONTINUUM_HOME/apps/continuum/conf/application.xml. Et effectivement, après modification du bloc <alwaysSend/> à true du composant mail notifier comme suit, ça marche !

<!--
    The mail notifier
-->
<component>
    <role>org.codehaus.plexus.notification.notifier.Notifier</role>
    <role-hint>mail</role-hint>
    <implementation>
        org.apache.maven.continuum.notification.mail.MailContinuumNotifier
    </implementation>
    <requirements>
        <requirement>
            <role>org.codehaus.plexus.velocity.VelocityComponent</role>
        </requirement>
        <requirement>
            <role>org.apache.maven.continuum.store.ContinuumStore</role>
        </requirement>
        <requirement>
            <role>org.codehaus.plexus.mailsender.MailSender</role>
        </requirement>
        <requirement>
            <role>org.apache.maven.continuum.configuration.ConfigurationService</role>
        </requirement>
    </requirements>
    <configuration>
        <from-mailbox></from-mailbox>
        <from-name></from-name>
        <timestamp-format>EEE, d MMM yyyy HH:mm:ss Z</timestamp-format>
        <includeBuildResult>true</includeBuildResult>
        <alwaysSend>true</alwaysSend>
    </configuration>
</component>

En espérant que ça en aide certains…

Quelles méthodes je peux mettre dans mes « objets du domaine » ?

Gavin King, le créateur du projet Hibernate, dont le hobby est maintenant devenu Seam, a récemment publié un billet intéressant sur ce sujet.

Souvent, la question se pose : quelles méthodes doit-on modéliser dans un objet métier ? Concrètement, où dois-je mettre mon code métier ? Par exemple, est-ce que la méthode de sauvegarde d’une facture doit se trouver dans l’objet Facture lui-même ? Si je veux récupérer le nombre de clients d’une facture, dois-je mettre la méthode dans la Facture, etc. ?

Gavin a formulé d’une façon très concise une règle à laquelle je souscris totalement :

the domain model (entity classes) are the most reusable classes in my codebase

[…]

In particular, I would never write code that calls out to external services, or accesses the database, or calls an EJB/Seam/Spring component in my entity class. I want my domain model to be completely self-contained!

So anytime you find yourself wishing that entities supported injection, or find yourself writing a JNDI lookup in a method of an entity, please consider that your domain model is no longer self-contained, and will be less reusable in different execution environments.

Rien de plus à ajouter.

Problème Gmail avec Adblock plus

Depuis quelques jours, j’avais des problèmes à l’utilisation de gmail. Je n’ai pas fait le rapprochement tout de suite. La page principale de la boite de réception s’affichait, mais cliquer sur un message n’affichait jamais ce dernier. Certaines fois, même, Firefox m’affichait le message indiquant qu’un “script (javascript) ne répond pas”…

Après réflexion, je me suis demandé si adblock plus, l’extension anti-pub pour firefox que j’ai installée ne pouvait pas être en cause ? Bingo avec Google. Je n’ai par contre pas compris pourquoi les billets comme celui-ci dataient déjà de 2005, alors que je suis persuadé que ça fait une ou deux semaines au moins que j’utilisais déjà conjointement adblock plus et gmail sans soucis. Peut-être une mise à jour d’adblock plus récente que j’aurais faite sans y faire attention ?

Bref, la solution est simple. Il suffit d’ajouter mail.google.com à la liste blanche. Pour faire ceci, on peut se référer au billet en lien ci-dessus ou à la documentation d’adblock plus. En fait, pour ajouter un filtre à la liste blanche, il faut simplement préfixer le filtre par @@ (enfin, simplement, faut le savoir, quand même…).

Une fois ceci fait, tout roule normalement à nouveau.

44 balises en 5 minutes...

Via Prendre un café, un petit test rigolo sur vos connaissances HTML4 :

44

Pas trop mal. J’ai honte d’avoir oublié de citer acronym, abbr que j’ai déjà pas mal utilisé, et toutes les balises des formulaires ;-).

Grève à Toulouse : toujours aucun problème

N’hésitez pas à prendre le métro, il fonctionne parfaitement. Les bus étaient, paraît-il, moins nombreux le premier jour, mais pratiquement à 100% aujourd’hui…

Allez, encore un peu de patience, la réforme va finir par passer :-).

Limitation Oracle antédiluvienne

Je découvre avec une relative stupeur que la taille maximale des noms de tables, de colonnes, de contraintes est limitée sur Oracle à 30 caractères seulement !

Imaginez que vous ayez une contrainte d’intégrité référentielle entre deux tables :

  • PRODUIT
  • CATEGORIE_PRODUIT

Par convention, on préfixe souvent ces contraintes de clés étrangères par FK (voire C_FK par exemple, pour Constraint et Foreign Key). Ça me donne quelque chose comme ça :

  • FK_PRODUIT_CATEGORIE_PRODUIT

Là, j’ai 28 caractères, je passe limite. Si je rajoute “C_”, je suis à fond…

Imaginons maintenant que votre fonctionnel vous indique qu’il y a une relation de réflexivité sur CategorieProduit. Les catégories de produit forment en effet un arbre avec des catégories, des sous-catégories, etc. Ben là, vous oubliez le nommage ci-dessus :

  • FK_CATEGORIE_PRODUIT_PRODUIT_CATEGORIE_PRODUIT, ça passe pas…

Autre cas, si vous avez deux relations entre deux mêmes tables. Par exemple, Adresse et Client : un client peut avoir une adresse de facturation et une adresse de livraison. En base, on doit donc retrouver deux contraintes d’intégrité. La première idée qui vient est de concaténer par exemple le rôle au nommage ci-dessus. Euuu, ça commence à exclure pas mal de cas.

Franchement, à l’occasion du passage de la mise à jour de Oracle v10, Oracle aurait pu supprimer ou au moins augmenter cette limitation antédiluvienne !!! Pour la petite histoire, cette limitation n’existe pas sur les autres SGBD que nous pouvons utiliser : HSQLDB, MySQL, PostgreSQL… Je comprends mieux pourquoi les schémas d’entreprise sont truffés de noms absolument incompréhensibles. L’auto-documentation du nommage est impossible avec une limitation aussi importante.

À l’heure de l’auto-complétion omniprésente, il est courant d’avoir des variables qui atteignent 30 caractères. Je ne dis pas qu’il faut forcément des noms de variable à rallonge, mais si la longueur apporte en clarté, en maintenabilité, en compréhension, ne vous en privez surtout pas !

Très très déçu par Oracle sur ce coup là.

Grève : pas de problème demain ?

Sur le site de Tisséo, la RATP toulousaine, dirons-nous pour nos amis parisiens :

Le 18 octobre

[…]

Le trafic du métro ne devrait pas être affecté.

J’essaierai donc de prendre le métro demain, sinon ce sera vélo ou moto. Bon, en même temps, je n’ai que 6,5km de chez moi au boulot… Aaaah Paris, je suis content de ne plus y être :-).

Citation du jour

De A.B., Software IT Architect chez IBM, reçu chez nous aujourd’hui : “Les multiples acronymes à deux ou trois lettres, c’est vachement bien pour les commerciaux. Personne ne comprend rien et tout le monde est d’accord ! Mais en dév, c’est chiant !”.

La blague du jour

Seb, à un collègue :

Toi, t’es un HighGlandeur !

Une citation immortelle. Très bon ! :-) .

UPDATE : En train d’écrire ce billet, un collègue nouvellement arrivé regarde mon écran et me demande : “Tiens !? batmat.net, tu connais ?”. Moi : “Ben, euuu, comment ça ? Tu rigoles ? (comprenant et rougissant) oui, euu, c’est mon blog…” Et là, comme dit Seb, érection molle :-D .

Excuses reçues

Je les publierai bientôt en supprimant le nom de l’entreprise, mais j’ai reçu un courrier d’excuses à propos de l’affaire que j’ai expliquée l’année dernière en février (le billet du 8 février 2007).

Comme je suis en vacances et je paye cher mes accès au net, je verrai plus tard pour trouver une solution plus propre (notamment pour les permaliens vers le billet en question). J’ai en effet pour le moment simplement mis le billet offline.

Sur ce, je retourne à la plage (bon, en fait, je déconne, il pleut là :-)).

Aux abonnés absents

Je pars aujourd’hui en vacances jusqu’à après mi-août. Je serai donc un rien moins présent :-). Je laisse les commentaires ouverts, je suis un fou. J’y jetterai peut-être un œil de temps en temps depuis un cyber-café.

À bientôt.

Conférence sur l'économie en webcast

Après mon billet au sujet de l’immobilier en France qui m’a fait découvrir L’ACDE de Marc Touati, je me suis abonné au fil RSS de ce site. Améliorer mes connaissances générales concernant l’économie, la finance sans non plus vouloir (pour le moment) aller jusqu’à passer un MBA m’intéresse. Être par exemple en mesure de mieux comprendre les notions de croissance, d’inflation, d’impacts sur l’emploi me paraît très utile pour gérer ses choix, sa vie, ses investissements etc.

Ce soir, j’ai vu qu’une conférence sur l’économie donnée récemment à Paris par Marc Touati était en ligne. Ça me rappelle un tout petit peu mes cours d’éco en seconde, auxquels à l’époque je n’accordais évidemment que peu d’intérêt…

Très instructif. Le slide V.4 reparle notamment de la bulle immobilière.

La bulle immobilière : urgent d'attendre ?

UPDATE : Comme le dit Géraud dans les commentaires, les vidéos en caméra cachée dans les agences de Toulouse viennent d’être postées.

Géraud m’a fourni des liens très intéressants au sujet de l’état de l’immobilier en France.

Pour commencer, une interview de l’économiste Marc Touati :

\ Marc Touati évoque la bulle immobilière, part 1\ envoyé par jmpoure

En résumé, il prévoit notamment une baisse de l’immobilier de 10 à 15% dans les 2 ans à venir. Optimiste, il ne croit pas au scénario catastrophe d’un Krach.

Moins formel, mais tout aussi édifiant : Jean-Michel Pouré fait depuis quelques temps le tour des agences immobilières de France pour voir la réalité de terrain. En gros, il débarque dans des agences et demande à vendre son bien aux prix actuels. Il se voit expliquer qu’aux prix actuels, ça ne partira pas forcément aussi vite qu’il l’espère…

Exemple à Carpentras :

\ Carpentras, part 3 : baisse d’activité de 50%\ envoyé par jmpoure

Si j’ai bien compris, des caméras cachées auraient été récemment faites à Toulouse. On devrait bientôt pouvoir les visionner…

Utiliser les objets du domaine directement dans la couche présentation

Nous utilisons encore Struts 1 actuellement. Ce n’est normalement qu’une question de temps avant de passer à autre chose. Nous sommes sûrs de ne plus l’utiliser à terme. Nous connaissons donc notre source, mais pas encore la cible. Voici les nombreuses solutions qui s’offrent à nous :

  • Struts 2
  • GWT
  • .Net
  • Flex

Toutefois, je ne suis pas très chaud pour .Net ou Flex ou toute technologie qui nous contraigne forcément à passer par les WS pour accéder à nos services (développés en Java). Je suis réticent à devoir obligatoirement passer par une couche WS alors que nous pourrions garder du java de bout en bout, et ainsi économiser le marshalling/unmarshalling incessant qui va avec les WS, sans parler du problème de l’identification du graphe d’objets à sérialiser pour le renvoyer. Quoi qu’on en dise, utiliser systématiquement des WS n’est pas neutre et amène de nombreuses questions qu’on ne se pose jamais sinon (hein Séb…).

Donc, pour revenir au sujet, nous ne sommes pas encore fixés sur notre future couche présentation (ou plutôt nos futures couches de présentation). Pour le moment, nous avons donc décidé de continuer à fonctionner tant bien que mal Struts 1.x avec la version 2 du socle technique que nous sortons.

Or, la différence fondamentale entre notre version 1 et notre version 2 est que nous avons supprimé une “transformation” systématique entre deux couches. Auparavant, en effet, nos entités persistantes de couche DAO étaient systématiquement transformés en objet de couche service. Entre les deux couches, nous avions systématisé un bidouillage destiné à régler le problème que nous avons dans la couche Web dans la gestion des multiplicités 0..1.

La gestion du null de Struts 1.x

Avec Struts 1, si vous demandez par exemple le prénom d’un client null, vous n’aurez pas quelque chose de null, mais une exception. La question a été discutée il y a déjà un moment sur la liste de Struts et posée sur le tracker de Struts en février 2001 (quand je vous disais que ça faisait un moment), et Craig Mc Clanahan d’expliquer que le principe était que si vous vouliez afficher le prénom d’un client, eh bien il fallait protéger le code pour n’afficher le prénom que si le client est non null :

[XML]
<logic:present name="beanname" property="client">
  <bean:write property="client.prenom"/>
</logic:present>

Si dans l’exemple ci-dessus, on met un champ de saisie à la place du <bean:write />, on est dans une impasse : certes, il n’y aura pas de plantage, mais il devient alors impossible de saisir le prénom du client puisque le textfield n’apparaîtra même pas…

Si votre objectif est de créer le client seulement si l’utilisateur a saisi des données (exemple : le formbean en cours gère un objet Facture qui a une multiplicité 0..1 vers un objet client), vous êtes obligé de créer dans votre FormBean un objet destiné à recevoir ces données. Le problème qui survient alors, c’est que si vous voulez conserver des objets “propres”^[1]^, vous devez ensuite vérifier l’instance de Client pour la remettre à null ou l’associer manuellement (si pas encore fait) à la Facture avant de transmettre la Facture à la couche service pour mettre à jour. Ouf…

La longueur de l’explication ci-dessus par rapport à la complexité de ce qu’il faut gérer me paraît parler d’elle-même. Et le code qu’il faut écrire pour gérer ce cas est toujours le même… :

  1. avant affichage de la JSP : instancier les propriétés null pour pouvoir les afficher. Eh oui, rappel comme je l’ai dit plus haut : la demande de la propriété “a.b” déclenche une exception si a est null, il faut donc s’assurer que a est non null et l’instancier le cas échéant.
  2. après soumission du formulaire de la JSP et avant de passer les données à la couche application : supprimer les objets 0..1 non modifiés dans la JSP.

Struts 2

Dans Struts 2, le premier point est géré différemment : la demande de “a.b” si a est null renvoie simplement null. Par contre, le deuxième point est toujours à gérer manuellement et plantera si on cherche à valoriser a.b.

Une étape a déjà été franchie, pourquoi ne pas aller plus loin ?

Une solution

Pourquoi ne pas instancier automatiquement a s’il est null lorsqu’on cherche à valoriser *a.b* ? La question se pose d’autant que nous ne sommes pas les seuls à nous être posés la question : ce patch apportait déjà les modifications nécessaires aux commons-beanutils (utilisé par Struts, c’est cette bibliothèque qui impose le comportement de lever une exception si une propriété imbriquée est demandée à l’intérieur d’un objet null)…

Une autre solution (sans patch, cette fois) intermédiaire a été proposée pour la partie “get” : mettre en place un handler externe pour gérer le cas des propriétés imbriquées (nested properties) dans un conteneur null. Cette solution est un intermédiaire intéressant parce qu’elle est très courte à implémenter et permet de faciler renvoyer null ou de lancer une autre exception dans le cas en question.

Cette deuxième solution ne gère toutefois que le cas get. Peut-être le même principe serait-il utilisable pour le “set”. Cela permettrait de même de positionner une sorte de NestedSetterHandler qui pourrait s’occuper d’instancier les propriétés intermédiaires si besoin. Avec un fonctionnement de ce type, on pourrait même envisager de définir un handler qui serait observable afin de gérer à la fois l’instanciation “dynamique” et de pouvoir suivre les instanciations effectuées. C’est à creuser.

Ce mode de fonctionnement aurait toutefois quelques inconvénients : lorsqu’on instancie manuellement a, on sait qu’on risque de devoir l’enlever s’il n’est pas vraiment saisi avant de l’envoyer à la couche service. Et que faire si on décide de faire gérer ça en standard par le service ? Imaginons par exemple qu’une adresse ait été automatiquement instanciée pour un Client. À quel composant, à quelle couche, incombe le rôle de supprimer l’adresse créée dynamiquement si le fonctionnel indique qu’elle n’est pas correcte ?

Conclusion

Dommage que l’équipe de commons-beanutils soit peu réactive sur cette question à mon avis primordiale de gestion des propriétés. C’est aussi très dommage que l’idée d’avoir derrière la classe statique BeanUtils une instance de BeanUtilsBean ne soit pas poussée à son terme : en l’état, il est en effet impossible d’utiliser de façon transparente une sous-classe BeanUtilsBean qu’on aurait adaptée à ses besoins.

Je nous vois bien maintenir en interne une version patchée de commons-beanutils afin de résoudre le problème tant que nous utiliserons Struts 1, en espérant bien sûr que le patch en question soit finalement appliqué.

En même temps, il reste la question de la gestion de la suppression des propriétés instanciées dynamiquement. Mais je ne suis pas sûr que ce soit un véritable problème, c’est un code qu’il faut de toute façon écrire. Au final, il y a actuellement les deux points suivants à gérer :

  1. instanciation manuelle pour gérer l’affichage ;
  2. vérification des données et suppression des créations incorrectes si les données n’ont par exemple pas été saisies.

C’est à mon sens un point qu’il serait intéressant de creuser. Avec Struts 2 par exemple, écrire un Interceptor chargé de l’instanciation dynamique ferait l’affaire pour enlever le point 1 ci-dessus.

Le tout serait ensuite de définir un emplacement de choix pour faire la validation, puis la suppression des propriétés fonctionnellement “inacceptables”. À part ce point, je ne vois aucun frein à cette évolution. Cette question se posant pour n’importe quel formulaire de saisie, le monde de l’informatique aurait à mon sens beaucoup à gagner à trouver un véritable pattern pour gérer ce cas…

Notes

[1] c’est à dire que facture.getClient() renvoie bien null si la facture en question n’a pas de client, et non une instance bâtarde de Client qu’il vous faut ensuite analyser pour savoir si c’est un vrai client ou bien simplement une instance positionnée pour gérer des contraintes de présentation.

Martin Fowler à propos de Microsoft

Martin Fowler a pondu ce soir un long billet sur la politique de Microsoft envers Ruby. Il parle ensuite de sa sensation selon laquelle une certaine désaffection pour la plate-forme .Net serait en cours, et que les AlphaGeeks (tiens, il faudrait un questionnaire, “êtes-vous un AlphaGeek ?” :-)) seraient en train de quitter l’environnement de développement MS.

Quelques morceaux choisis :

A few years ago my (limited) contacts in Redmond told me that they were seeing a real drift of technical leaders away from the Windows platform. More recently these signs seem to be increasing.

The tools, with their rigid role-separations, actively discourage the blurry boundaries that agilists prefer.

Pour ceux qui ont récemment joué avec WPF, Blend et consorts, on voit très bien ce qu’il entend par là.

The attitude to open-source is a large part of this problem. When Java appeared there were yawning gaps in its portfolio […] Those gaps and bad ideas were fixed by the open-source community. […] .NET has also got its gaps, and again the open source community has stepped up to fill them. Yet Microsoft refuses to collaborate with these efforts, […] Microsoft ended not just bringing out a competitive library, but deliberately making it incompatible. That’s not the kind of reaction that encourages people to invest their time in the platform.

Je connais peu .Net, mais est-ce que MS travaille à l’intégration ou en tout cas encourage un projet comme NHibernate ?

Quelques liens (déjà donnés ci-dessus)

MAJ : ajout de liens :

  • L’avis de Sam Gentile, un expert MS consulté par Martin Fowler pour l’écriture de son article. Martin Fowler a ajouté en fin de son billet des liens vers des réactions, dont celle de Sam.

Toplink better than Hibernate?

Today, we received Oracle. They were coming to speak about their business Intelligence offer, Oracle Application Server and so on.

When speaking about Toplink, the guy said something like: “We could say Toplink is kind of a father to Hibernate. Obviously, it’s already almost 15 years of existence.” Well, why not. Though I didn’t see any article interviewing Gavin King confirming that, but apart from reusing their ideas or not, Toplink was here before, OK.

The assertion that surprised me was another one, something like: “As Toplink is older than Hibernate, it’s obviously more robust and has more functions.”

Well, I’m not sure I would agree with this one. In fact, as Toplink Essentials was only released in the OpenSource world very recently (may 2006 in Glassfish, so the JPA implementation even more, if I’m right), and experts seems to agree that about 90% of the projects today use Hibernate for the persistance layer (Didier Girard says it in the TV4IT Webcast. I think this is more of a feeling for him, so if anybody has some statistics about, I’m very interested. I should also ask Sami Jaber for his feeling about it.).

Webcast (in french, see about 9/10 of the video for the “Hibernate is 90% of the current projects”) :

So, what is the right indicator about software robustness?

Is this the software that’s been released fifteen years ago, used by 10 people around the word since this time, or is this this other one, that’s been released 6 years ago, used by 90 people since then? Who was the most testable? The one that only few people could download to give it a try, or the one that’s been downloaded and tested tons of time by a lot different people?

In my opinion, but I also agree I only know Hibernate, I’m pretty sure Hibernate has already been thoroughly tested. At least, as much as Toplink has. My point is that the maturing of Hibernate was a lot quicker than Toplink’s one. Once more, it would be very interesting to put numbers in the debate. Hibernate has been opensourced since its start, so it always benefited from code reviews, patches and so on, and evolved very quickly.

To sum up, because of the fundamental differences between both development styles, I’m not sure that today Hibernate is still behind Toplink speaking about robustness, functions scope and so on. Though I’d be delighted to learn about interesting differences, if you know about it.

Le débat Royal/Sarkozy en ligne et en direct

Pour ceux qui comme moi n’ont pas accès à une télévision, mais à leur ordinateur, vous pouvez vous rendre sur le site d’Arte et cliquer sur Retransmission en direct sur Internet du débat Royal/Sarkozy pour le visionner en ligne.

Débat en direct : les handicapés

C’est un peu dommage. Mme Royal a cassé les pattes arrières de Nicolas Sarkozy sur le sujet des handicapés, mais a fait durer un peu trop le sujet. Elle a laissé M. Sarkozy reprendre du poil de la bête et faire le choqué, le blessé après la longue attaque, semble-t-il justifiée. Elle ressort de ce moment du débat avec moins de points que ce qu’elle aurait pu.

Pour résumer, Sarkozy propose de fournir un droit opposable pour tout (crèches, enfants handicapés scolarisés dans des écoles classiques…). Ségolène Royal lui répond, à juste titre il me semble, qu’on ne peut pas tout résoudre avec des lois et des passages en justice. Elle répond avec énergie à la partie sur les enfants handicapés, où elle explique qu’elle avait déjà mis en place des auxilliaires (7000 postes, je crois) spécialisés pour aider les enfants handicapés dans les écoles lorsqu’elle était ministre de l’éducation. C’est justement le gouvernement dans lequel travaillait Sarkozy qui aurait fait sauter ces postes. Le problème, c’est que ça a duré trop longtemps à mon goût. Elle aurait dû s’interrompre après la réponse qu’elle lui a faite, histoire de voir sa réaction. Il a eu le temps de préparer une réponse pendant qu’il faisait le pauvre petit gars qu’on attaque sans raison. Toutefois, sur le fond, je trouve qu’elle a très bien réagi.

Je voterai pour la gauche

De sensibilité plutôt encline à vouloir aider les plus démunis qu’à protéger l’ISF, j’ai une forte inclination à gauche. Toutefois, je m’intéresse aux arguments des candidats pour ne pas partir dans le mur aveuglément.

L’UMP me donne des raisons supplémentaires de ne pas voter pour elle. Je dirais même plus, le PS me donne des raisons de voter pour lui. Chose importante, vu le nombre de fois que l’on on a entendu notamment la gauche de la gauche “voter pour faire perdre la droite” et non simplement voter pour la gauche.

Merci à Thomas d’avoir rédigé un billet récapitulatif de l’initiative Candidats.fr, qui a consisté à poser des questions à chacun des candidats concernant différents sujets afférant à Internet, à la protection des droits d’auteurs, aux Mesures Techniques de Protection, ces fameuses DRM, les brevets logiciels.

À mon sens, la gauche est loin devant quant au traitement de la problématique des droits des citoyens sur Internet, la protection des consommateurs (vente liée, interopérabilité des lecteurs de musique numérique, …).

La synthèse de Thomas.

Citation

Une citation que j’aime beaucoup. Je ne sais pas si elle est de lui à l’origine, mais je l’ai trouvée chez Rags, CTO chez Sun :

It’s better to have an unanswered question than an unquestioned answer

Ou en français

Mieux vaut une question sans réponse qu’une réponse qu’on ne remette pas en question

J’ai l’impression que nous appliquons sans vraiment y faire attention ce principe. J’aime à penser que c’est le bon chemin. Ne jamais considérer que ce qu’on a est parfait, et surtout être toujours prêt à en écouter les critiques pour améliorer ses points faibles.

L’informatique n’est un long fleuve tranquille, il y a des milliers de ruisseaux pour arriver au même endroit Certains sont plus courts, d’autres plus longs, d’autres simplement plus rapides et toute la complexité est de choisir celui qui convient le mieux pour faire ce qu’on veut. Notre rôle est de sans cesse revérifier les routes et les cartes pour les utiliser afin que les suivants gagnent du temps… Et depuis ma petite expérience, ce n’est ni simple ni de tout repos, mais heureusement terriblement passionnant et enrichissant !

La photo du jour

Aujourd’hui, prise par nous dans la banlieue toulousaine… Tout est flouté, à part moi, pour éviter les éventuels problèmes (le sujet de la photo, âgé d’une dizaine d’années, ne s’est aperçu de rien, tout concentré dans sa lecture qu’il était). Je déflouterai peut-être les gens qui sont à gauche s’ils sont d’accord :-).

Le-Pen.jpg

Du régis bien glauque

Des fois, je vais sur YouTube et je me fais une série de Régis. Aujourd’hui, je suis tombé sur un qui m’a peu fait rire tellement il est orienté sur des vautres qui ont dû faire mal. Je me demande même si certains morceaux de cette séquence n’ont pas provoqué la mort d’un ou plusieurs des intervenants… J’ai plus souvent fait “ouch !” que je me suis marré. À votre tour de juger :

Régis… Ouch !

Dépilement en cours

  • Viens de revenir de congés - stop.
  • Plus de 30 fils de conversation en attente sur mon adresse perso - stop. Notamment concernant AvenIR - stop.
  • Idem sur l’adresse du boulot - stop.
  • Une dizaine de spams dans les commentaires du présent blog (seulement) + un message de propagande à supprimer - stop (soit dit en passant, si un des commentaires que vous avez postés récemment n’est pas affiché, il y a des chances qu’il soit parti à la poubelle avec les 3500 autres commentaires marqués spam…).

Sun Tech Days, mercredi 21

Avec un peu de retard, je prends enfin le temps de faire un billet sur mon deuxième jour aux Tech Days. Cette journée a été très chargée, mais j’ai appris pleins de nouvelles choses. Évidemment, ce sont des choses à approfondir, mais je vais essayer de vous donner aussi envie de le faire. En cherchant un logiciel pour faire des vidéos de démo comme on en voit partout fleurir sur le net, je suis tombé sur Wink. C’est simplissime d’utilisation : avec ça, plus aucune excuse pour ne pas faire de vidéo explicative de l’installation ou d’une démo d’un logiciel (et on peut générer du flash ou un .exe pur windows).

Sun Technical Keynote

Cette introduction a été l’occasion de nous montrer le langage F3 : Form follows function, censé simplifier le développement d’interfaces graphiques. C’est vrai que la partie de la démo montrant comment mettre un fond en dégradé de rouge vers bleu vers jaune (ou d’autres couleurs) a montré que c’était effectivement très simple.

Speach VMWare

En tant que sponsor Platinium, VMWare a eu droit à un speach devant tout le monde. On nous a présenté ce qu’était VMWare, pour ceux qui l’ignoraient encore. Ça a été l’occasion de parler de Lab Manager, une sorte de dépôt central dans lequel on peut stocker des machines virtuelles et les lancer depuis des postes clients. Ça a l’air intéressant dans le cas des recettes par des équipes de tests. En effet, le syndrôme du “Chez moi ça marche” est effectivement connu de tout informaticien. Avec ce système qui simplifie le partage d’une configuration complète (du logiciel jusqu’à l’OS et sa configuration précise), il devient possible de débugguer un problème dans les conditions qui garantissent la reproductibilité, ce qui est la première difficulté pour un développeur : trouver les conditions permettant de reproduire le problème (essayez de corriger un problème que vous n’avez pas, pour voir !).

Java Jacket Give away

20 minutes pour un mini-show de 4 d’entre nous. Je n’ai pas osé y aller. J’ai eu une idée un peu tard, mais j’aurais dû la préparer la veille. Peut-être pour l’année prochaine :-).

Le gagnant a chanté une petite chanson sur Java et a donc gagné la veste en cuir avec le logo Java :-).

Java scripting: One VM, Many Languages

Cette session a été très intéressante. La démo de Guillaume Laforge m’a notamment donné envie de me mettre au Groovy, pour les apports en rapidité d’écriture par rapport au Java, l’ajout des fermetures, mais aussi pour sa proximité syntaxique et son intégration avec le Java. Ça peut en effet fonctionner directement avec la JVM, être mis dans un jar…, puisqu’on peut générer du pur bytecode Java. L’idée n’est pas de remplacer le Java, mais d’apporter une alternative plus puissante aux scripts shell et une syntaxe plus habituelle pour le développeur Java qui veut déployer un script de batch sur le serveur, par exemple.

Cette présentation a été l’occasion de découvrir la JSR223, la spécification qui permet d’intégrer n’importe quel langage de script à la plate-forme Java. Javascript l’est déjà (cf. la présentation flash plus bas), JRuby, Groovy, etc. En gros, l’architecture mise en place permet à n’importe qui d’intégrer n’importe quel langage de script en implémentant simplement les interfaces de la spéc (pensez à JDBC si vous ne voyez pas ce que je veux dire).

Code Quality issues: Prevention and Detection

C’est certainement l’une des sessions dans lesquelles je me suis senti le plus à l’aise, parce que j’avais déjà mis en place un grand nombre des outils cités. Ça a toutefois été l’occasion de découvrir de nouveaux outils (Selenium, notamment).

La présentation a commencé en citant Dijkstra : “Testing can only show you bug presence, not their absence”. Et c’est vrai que c’est bien de rappelant l’intérêt essentiel des outils de qualité de code… Ce n’est pas magique.

Pour résumer :

  • Test unitaire : Junit, TestNg
  • Couverture de code : Emma (+ pleins d’autres), ce type d’outil permet de savoir quelles parties de votre code ont été testées par les tests unitaires. En gros, vous lancez tous les tests de votre projet et l’outil monitore par où ça passe. Ensuite, vous pouvez généralement savoir quelles parties ont été testées, voire même lesquelles l’ont été plusieurs fois et d’autres une seule. La plupart de ces outils possèdent des plugins pour les principaux IDE qui permettent de voir graphiquement la couverture. Bien sûr, il existe aussi des plugins pour des outils comme Maven, permettant de sortir des statistiques.
  • Montée en charge : JMeter, LoadRunner (j’ajouterais OpenSTA)
  • Mock objects : EasyMock, JMock
  • Qualité du code : PMD, Checstyle
  • Test fonctionnel d’une webapp : Selenium
  • P6Spy pour voir la valeur des “?” dans les requêtes SQL paramétrées.

TP : Les nouveautés de Java 6

Comme j’en ai parlé plus haut, il est possible d’interfacer la JVM avec d’autres langages. Avec Java 6, vous disposez de jrunscript, un interpréteur Ecmascript (javascript normalisé).

En voici une petite démo :(cliquez sur l’image pour voir la démo flash) : jrunscript-presentation.jpg

JMX, Performance et concurrence

JMX

J’ai appris au cours de cette session que l’équipe de développement de JMX était située à Grenoble.

L’objet de cette session a été principalement de développer un MBean et de l’exposer via le MBeanServer. Ceux qui, comme moi, ont déjà développé un MBean et joué avec JConsole juste pour voir n’auront pas été surpris.

Par contre, j’en ai appris sur les différentes espaces mémoires de la JVM :

  • Eden : c’est l’espace mémoire où les objets à courte durée durée de vie sont stockés (la plupart en général) ;
  • Survivor : pour les objets qui ont une durée de vie un peu plus grande ;
  • Tenured : ben euu, encore plus :-).

Autre chose que les conférenciers ont dit, je n’ai pas vérifié, mais à propos des options -client et -server :

  • -client est toujours utilisé sous Windows, quelle que soit la machine
  • -server est utilisé automatiquement sous Linux ou sous Solaris si la machine possède plus de 2Go de mémoire vive.

Truc génial : la possibilité de repérer des deadlocks avec un simple bouton ! (je crois que c’est un ajout dans le JConsole embarqué dans Mustang, parce que je ne me souviens pas de l’avoir dans Tiger).

JSR 262

La façon dont on accède à JMX, JMX Remote, n’est pas liée fortement à JMX. En effet, l’implémentation par défaut dans Java 5 est effectivement en RMI, mais il reste très faisable de permettre l’accès aux fonctionnalités d’un serveur JMX par n’importe quelle autre implémentation.

C’est justement l’objet de la JSR 262 : implémenter une couche WebServices d’accès à JMX. Comme il existe une norme appelée WS-Man qui n’est pas liée au Java. Cette implémentation permettra donc l’accès au management de la JVM d’une façon normalisée. WiseMan est ainsi l’implémentation Java de WS-Man.

Lors de la séance de Q/R, j’ai posé la seule question de ces deux jours à Paris : “pourquoi n’y a-t-il pas pour les MBeans, de la même façon qu’il y a l’annotation @WebService pour les Webservices, une annotation @MBean qui indiquerait automatiquement aux MBeanServer quels sont les MBeans à exposer ?” Éamonn McMannus a répondu que c’était une question qu’on leur posait souvent, et que c’était justement prévu.

Performance

Bon, ils ont parlé du classique StringBuffer à la place de concaténer des String. Attention : depuis la version 5 de Java, la classe StringBuilder est à privilégier : de la même manière qu’il est recommandé d’utiliser HashMap à la place de Hashtable, il faut utiliser StringBuilder dans un contexte qui ne nécessite pas de synchronisation. En effet, la synchro n’est pas gratuite, donc l’utiliser de façon systématique est une grave erreur.

Concurrence

Ils ont présenté la nouvelle API de gestion de la concurrence ajoutée au JDK5, encore peu connue.

Java Puzzle

Pour finir, on a eu droit à un Java Puzzle (en anglais, puzzled correspond à surpris, étonné), c’est un bout de code qui surprend ou pour lequel on n’a généralement pas une réponse évidente pour tout le monde :

public class PingPong {
    public static synchronized void main(String[] a) {
        Thread t = new Thread() {
            public void run() { pong(); }
        };
        t.run();
        System.out.print("Ping");
    }

    static synchronized void pong() {
        System.out.print("Pong");
    }
}

Qu’affiche ce bout de code ?

  1. PingPong
  2. PongPing
  3. Ça varie

J’avoue sans honte que j’ai répondu correctement à cette question :-). Je mettrai la réponse dans les commentaires un peu plus tard (si personne d’autre ne le fait avant, d’ailleurs).

Sun Tech Days de l'intérieur, mardi 20

J’étais donc aux Tech Days aujourd’hui. Encouragé par des “moins scrupuleux” que moi, je me suis aussi levé pour dire bonjour à Alexis Moussine-Pouchkine, que je n’osais pas déranger parce qu’il avait l’air à bloc pour préparer/peaufiner sûrement sa session de cet après-midi :-) (ce qu’il m’a confirmé ensuite, la session avec Stéphane Goudeau sur WSIT, plus précisément :p).

De façon très inégale, j’ai pris quelques notes au cours de chacune des sessions. Je vais essayer de vous faire un rapide topo de ce à quoi j’ai assisté et ce que ça m’évoque. Après, je vais dormir pour réussir à me réveiller tout à l’heure :-).

Keynote session : James Gosling

Ça faisait longtemps que je ne n’avais pas entendu quelqu’un parler anglais, j’ai donc mis quelques minutes à m’habituer à son accent, que je qualifierais d’américain malgré le fait qu’il soit Canadien il me semble :-). Une fois lancé, j’ai ensuite pu comprendre facilement Rags ou Rima Patel (soit dit en passant, j’ai été amusé de remarquer qu’ils avaient tous les deux un portable Ferrari, vous savez celui tout en rouge).

Pour rester dans l’anecdotique, ça ne va pas intéresser grand monde, mais comme j’avais déjà joué avec, j’ai pu remarquer que James Gosling utilisait toujours Huckster pour faire sa présentation. J’ai trouvé ça propre et joli. J’avoue que ça m’a donné envie de l’utiliser à nouveau :-).

Sinon, au niveau du contenu, James a survolé un peu tout ce qui fait Java aujourd’hui. Du client léger au mobile, en passant par les tests de l’A380 et le temps réel. Une phrase qui m’a amusé, mais finalement pas tant surpris que ça. Il a dit : “For me, the java language is almost uninteresting.”. Sorti du contexte, ça pourrait faire une bonne news à troll sur TSS. En fait, ce qu’il a évidemment précisé, c’est que c’est surtout la JVM et sa portabilité sur des plates-formes potentiellement très hétérogènes qui l’intéresse :-).

Sun Technical Demo(s)

En l’espace de quelques dizaines de minutes, nous avons eu droits à 6 démos. Je le dis, les deux les plus impressionnantes ont été pour moi celle de Romain Guy montrant Aerith en fonctionnement et celle d’un certain Peter (pas entendu/noté le nom, désolé) qui m’a bluffé sur du dév sur téléphone portable. De mémoire :

Développement client léger

Pas trop bien compris. Ça ressemblait plus à du flash qu’à du Java sur une page Web (ou alors, c’était sûrement une Applet). L’objectif était de montrer qu’on pouvait faire une jolie page web avec Java EE. Pourquoi pas.

Aerith : Romain Guy

[Aerith]() montre qu’on peut faire en Swing des applis avec un design de fou furieux. Si vous voulez tester, vous pouvez lancer assez facilement aerith directement depuis le lien Java Web Start (jnlp).

Aerith est un Mashup. Il utilise les WS de Flickr, de Google Maps et la localisation Yahoo si j’ai bien compris… Époustouflant.

Développement JSF avec Netbeans : Doris Chen

NetBeans semble effectivement bluffant de simplicité pour du dév Web. Quand je vois comment on rame pour nos JSP avec Eclipse, je m’interroge…

Par contre, JSF, JSF, JSF, JSF, ou alors JSF si j’ai bien compris

Java DB

Dans un client Web (Firefox :)), Francois Orsini nous montre qu’il peut saisir des données et tuer Firefox. Lorsqu’il rouvre l’application, il retrouve ses données telle qu’il les avaient saisies sans avoir pourtant cliqué sur un bouton de soumission. En fait, par Ajax, à chaque modification de champs, le client envoie les données au serveur qui les stocke.

Certes, la fonctionnalité est intéressante pour éviter le syndrôme de la perte des données dans un formulaire en cours de saisie. Mais, je ne vois pas bien le rapport direct avec Derby : la partie la plus grosse du code me semble résider dans l’Ajax qui stocke les données au fur et à mesure, non ? N’importe quelle base côté serveur ferait ensuite l’affaire il me semble.

jMaki : Ludovic Champenois

Sorte de wrapper à framework Javascript, jMaki a été mis à contribution pour développer rapidement quelques pages Web et montrer l’intégration simple et rapide de code Java directement dans le code Javascript. Ceci a notamment permis par exemple d’utiliser java.util.Date en plein milieu d’un code js. À creuser, à mon avis, mais très intéressant.

Développement Mobile

Si j’ai bien suivi, Peter a ensuite fait en live du remote debugging, posant en effet un point d’arrêt sur le code en cours d’exécution sur la JVM du téléphone ! Après avoir pris Doris Chen en photo avec l’appareil, il a imprimé sa photo sur l’imprimante, mais je n’ai pas bien compris ce qu’il voulait montrer. En tout cas, c’était sympa.

Glassfish : Alexis Moussine-Pouchkine et Ludovic Champenois

L’une des principales choses que j’ai retenue, ça tombe bien parce que j’ai le sentiment que c’est l’une des choses sur lesquelles Alexis a voulu insister : Glassfish n’est pas seulement une implémentation de référence dans le sens où on pouvait l’entendre habituellement^[1]^. Glassfish est parfaitement utilisable en production.

L’interface d’administration est agréable et l’outil asadmin permet de gérer des choses comme l’ajout de Datasources, etc.. (euu, là, chui pas sûr du tout). Glassfish intégre JAX-WS, beaucoup plus rapide qu’Axis 2, qu’y disaient.

Quelques notes en vrac :

  • Intégration de Comet : permet de créer des connexions persistantes HTTP, et donc de permettre au serveur de faire du callback.
  • Shoal : implémentation de clustering dynamique avec JXTA.
  • L’admin se fait avec JMX
  • Des extensions à JMX, des Application Servers Management eXtensions donc ? :-), des AMX sont aussi présentes.

Extreme Gui Makeover : Romain Guy

Là, j’ai un peu merdé. Comme je n’avais pas re-regardé le planning. Je me suis retrouvé à assister aux quelques premières minutes de la session VMWare. J’ai donc changé de salle pour aller suivre une “Track” a priori plus développement, plus code. J’ai pu voir quelques trucs bien agréables pour améliorer la tronche des composants Swing ou en simplifier le développement :

  • un peu de code maison, pas forcément difficile mais qu’il faut tout de même trouver :-),
  • SwingX
  • Timing Framework

WSIT : Tangoing with .Net

Cette session a permis de rappeler les normes existantes ou en cours de développement liées à WS. C’est Rags qui s’est occupé de la partie “magistrale” :-). Alexis et Stéphane Goudeau (de MS), nous ont quant à eux fait une jolie démo de l’interopérabilité Java/.Net, projet sur lequel ils ont travaillé pour la DGME. Il a notamment été question d’optimisation du transport des pièces jointes avec les WS en utilisant deux protocoles/principes (?) :

  • W3C SOAP Message Transfert Optimization Mechanism : MTOM
  • W3C XML-binary Optimized Packaging : XOP

La session s’est ainsi terminée par l’envoi depuis le code .Net d’une image affichée ensuite sur le portable d’Alexis.

SOA, WS, BPEL : Rima Patel

Après la session WSIT, j’ai quitté la grande salle pour rejoindre Rima Patel afin de découvrir un peu ce qu’était BPEL, dont j’entends tant parler mais dont je ne savais toujours pas ce qu’elle permettait de faire concrètement.

Cette session a été intéressante pour rappeler une fois de plus ce que doit être une Architecture Orientée Services. Un peu en vrac :

  • Un WS est une boite noire avec une interface bien définie (elle n’a pas utilisé le mot contrat, je trouve pourtant qu’il convient parfaitement bien).
  • SOA apporte de la valeur ajoutée sur le métier, pas sur la technique. Elle a même dit : c’est pour ça que ce sera votre CEO qui vous parlera peut-être de SOA, en raison de la valeur ajoutée métier qu’elle apporte (Nota de moi : et qui donc est remontée dans les articles de 01 Informatique :-)).

On a eu droit en fin de session à une démo de BPEL dans NetBeans. Comme je voulais en savoir plus sur BPEL, je suis ensuite allé au TP pour faire les exercices moi-même. J’avoue que le plugin BPEL, notamment le debugger, de netbeans est impressionnant de simplicité. Le problème, c’est que je n’ai pas eu le temps de faire le troisième exercice où on rentrait un peu plus dans le code. Les deux premiers n’étant presque que du clic-clic-bouton sur l’interface de netbeans sans forcément prendre le temps de comprendre un peu plus BPEL. Comme j’ai le support, j’essaierai de finir l’exercice pour voir s’il y a des choses intéressantes à dire.

J’aurais aimé terminer la journée en allant au “FOSSDAY” sur “Langages Libres, machines virtuelles et Web 2.0”, mais j’ai préféré ne pas arriver chez moi à 21h. J’ai pu voir un peu plus la famille pour une fois que je passe dans la région parisienne (en coup de vent, en plus :p).

Voilà pour aujourd’hui, bonne nuit :-).

Notes

[1] Lorsqu’une spécification est publiée, Sun développe toujours une implémentation de référence pour montrer la faisabilité du principe. Ces implémentations sont donc souvent basiques et impropres à un usage en production. Ce n’est donc pas le cas de Glassfish.

Aidez à populariser Linux

Je reprends le titre du billet de NiKo de PuC.

Au cas où vous auriez raté ça dans l’actualité, Dell envisage de livrer des configurations avec des Linux préinstallés. Allez donc remplir leur sondage afin de leur montrer que les utilisateurs de Linux existent bel et bien.

En distribution, j’ai mis Ubuntu, puisque c’est à mon sens la seule réponse sérieuse aujourd’hui.

Plus sérieusement et sans pousser gratuitement au troll comme dans ma phrase précédente, pour la petite histoire : j’ai commencé à utiliser Linux au début de mon DUT, Informatique c’était en 2000. Je ne connaissais comme OS que Windows. J’avais pas mal bidouillé Windows 95 et 98, mais pas trop les précédentes versions puisque je n’ai vraiment commencé à m’intéresser à l’informatique que lorsque j’étais en seconde.

Slackware, un Linux pour les unixiens…

La première distribution que j’ai installée fut donc une Slackware (à prononcer avec l’accent Ukrainien, Kostia, si tu m’entends ;o)). Je peux vous garantir que j’ai lutté. Il m’a déjà fallu plusieurs jours avant d’abandonner et de rapporter enfin le CD que Kostia m’avait passé pour m’entendre dire : “Aaaaah, mais ce sont les sources !”… Pour vous dire à quel point j’étais une tanche. Je ne me souviens pas s’il est excusé de s’être trompé de CD. Toujours est-il que je suis donc reparti avec un CD et un espoir flambant neufs. Au bout d’une bonne dizaine de tentatives (je suis arrivé plusieurs fois à la fin de l’install, mais comme j’avais peur de merder quelque part, lorsqu’il manquait quelque chose d’important je recommencais tout à zéro. Une habitude issue de windows, sûrement :-D).

En résumé, la slackware, pas simple. Faut aimer ./configure&&make&&make install en tout cas…

Bref, c’était pas le top. Il fallait passer à autre chose.

Mandrake, the solution pour les newbies… Mouai…

C’est un peu comme ça qu’on me l’a vendue en fait. Je crois qu’à cette époque, j’étais aide-administrateur à temps partiel, en plus du DUT, des machines du département informatique, avec Peter. J’ai découvert ce à quoi pouvait ressembler de l’administration système. Je vous avoue que j’en ai un souvenir mitigé : à la fois intéressant, parce que j’ai indéniablement appris des trucs, surtout sur Linux grâce à Peter, mais aussi incroyablement chiant ces tâches répétitives d’install de x postes à l’identiques, même en passant par des images…

Tout ça pour dire, donc, que l’école utilisait des Mandrake 8. Je crois plus précisément que la Mandrake 8.0 était sortie récemment et que nous l’avions installée sur tous les postes. Si je ne me trompe toujours pas, je me souviens que c’est à la même époque qu’est sortie la RedHat 7, qu’André arborait fièrement. De mémoire, toujours, je crois qu’André a installé la RH7 et nous a sorti : “cette fois, je passe à Linux, c’est pour de bon”. Je pense qu’André a prononcé ensuite plusieurs fois cette phrase dans les 2 années qui ont suivi, Dédé si tu m’entends :-).

J’ai donc installé sur ma machine une Mdk8… “Énorme”, qu’on m’avait dit. “L’outil rpm déchire, tu verras”, et tout et tout… Mon cul, oui ! À l’époque, pour installer un rpm alors que tu n’étais qu’un newbie, fallait bien s’accrocher au lecteur de cd pour pas vomir. Aucune gestion des dépendances, donc yavait intérêt à avoir tout sur place. Je me souviens encore de la commande, tiens : “rpm -Uivh’ leRpm.rpm’ (j’ai un doute sur la casse des options). Bref, toujours pas génial tout ça.

Debian, et la lumière fut

En fait, je me rends que je vous raconte ça dans un léger désordre et une certaine inexactitude, mais c’est pas très grave. J’ai dû récupérer la Mdk8 avant d’être admin sys, puisqu’il me semble justement que c’est le fait d’avoir été admin sys qui m’a permis de mieux connaître Peter. Comme c’est Peter qui m’a convaincu d’installer Debian, doit y avoir un truc comme ça. C’est pas grave, je suis pas loin de la réalité, l’essentiel c’est que j’en arrive à vous parler de Debian, ou plutôt de Debian et moi :-).

Peter m’a donc poussé à installer la Debian. Heureusement, parce que c’est vrai qu’à l’époque, vu mon niveau, je ne sais pas si j’aurais franchi le pas si tôt. La Debian était en effet réputée pour être complexe à installer, limite imbitable. Les légendes urbaines, tout ça.

Bon, je me disais qu’après la Slackware, ça pourrait pas être pire. Donc, je me suis lancé. Effectivement, pour un windowsien habitué au suivant-suivant, c’était un peu surprenant cette interface mode texte. Mais finalement, une fois l’étape du partitionnement franchie, le reste n’était en gros qu’une suite d’appui sur la touche entrée. Le plus long consistait à choisir les packages qu’on souhaitait installer. Si on décidait de dire oui ou non à chaque paquet, fallait vraiment être à bloc, parce qu’on en voyait pas le bout. Bon, après tout, pas long pour rien le bazar.

Une fois l’installation de base franchie, on commencait à saisir toute l’ampleur de la magnificence de la Debian : apt-get. The killer-app comme on dit en bon françois. Gestion des dépendances : tu demandes gnome, il t’installe gnome et tout ce dont gnome a besoin. En gros, tu tapes apt-get install gnome, tu attends que tout soit téléchargé, installé et configuré, ça te rend la main et tu peux lancer gnome !

Depuis cette époque, je suis resté sur Debian. En fait, sur des dérivées. J’ai essayé Knoppix, suis passé par Kanotix, deux fois, distrib sur laquelle je tourne encore aujourd’hui sur pumte, ma dernière machine, un Dell Inspiron 8600 justement, que j’ai depuis environ 2 ans.

Donc, Debian, c’est clair, ya pas mieux. Apt-get est tout simplement géniale. rpm à côté, à l’époque où je l’ai laissé, c’était de la merde en boîte. Alors, pourquoi j’irais réessayer des distrib qui ne se sont pas rendues à l’évidence qu’un système comme apt qui existait depuis si longtemps et fonctionnait si bien était forcément la direction à suivre. Franchement, je ne comprends pas pourquoi Mandrake, Opensuse et les autres continuent à jouer avec leurs petits outils à côté d’apt-get, the Legend :-).

Allez, bonne nuit et faites passer le message :-).

Sun Tech Days à Paris, les 19, 20 et 21 mars 2007

J’y serai le mardi 20 et le mercredi 21. Et vous ? :-)

Le programme des candidats aux présidentielles concernant les logiciels libres

Vous utilisez les logiciels libres dans votre métier ou à titre personnel et vous aimeriez connaître le programme des différents candidats à ce sujet ? C’est de cette question qu’est née l’initiative Candidats.fr.

Vous pouvez aller signer la pétition pour pousser les politiques à donner leur avis sur ce sujet.

Vous êtes aussi encouragés à relayer cette initiative pour inciter plus de monde à signer la pétition. Il est aussi possible d’utiliser les bannières mises à disposition.

Déclaration d'utilisation de logiciels
libres Déclaration d'utilisation de logiciels
libres

Attention, Windows se prépare à supprimer...

Je suis dans ma période… Franchement, ça me fait pitié. J’ai demandé une suppression sans passer par la corbeille, et voilà la fenêtre qu’il m’affiche : Windows se prépare à
supprimer...

C’est l’un des sujets les plus fréquents de moqueries de cet OS entre collègues, étant donné qu’il nous arrive assez fréquemment de vouloir supprimer des fichiers… Pour info, là, après avoir réfléchi une ou deux minutes, l’OS en question m’a affiché qu’il allait supprimer cette arborescence en 17 minutes ! Et dire que ça ne représente qu’environ 1Go, certes un nombre important de fichier (installation Eclipse). Ça me semble tout de même un peu excessif, pour ne pas être vulgaire…

Gestionnaire des tâches Windows - une gestion exemplaire de la mémoire ?

Gestionnaire des tâches windows -
Performances...

Je ne comprends pas pourquoi Windows me dit qu’il swappe tout de même 800Mo alors que j’ai encore 200Mo de libre ! Sous Linux, de base, le système n’utilise la swap que s’il n’a plus de RAM (Cf. cet exemple). C’est un comportement d’une logique évidente, puisqu’un disque dur a une rapidité 1000 fois plus faible que la mémoire vive…

A mon avis, j’ai une mauvaise lecture de cet écran. Je ne peux pas imaginer qu’encore aujourd’hui, Windows (XP, en l’occurrence) fasse si mal son travail de gestion de la mémoire virtuelle.

C'est quoi un architecte ? Ça code ou pas ?

Je me pose la question depuis que je suis censé exercer ce métier. Je dis “censé” parce que c’est ma fonction officielle, mais que je ne saurais pas encore précisément la décrire en quelques phrases simples. De plus, j’ai conscience de ma relative faible expérience dans le domaine. Idéalement, je me qualifierais donc plutôt architecte junior^[1]^, pour montrer un peu d’humilité, chose dont j’ai souvent besoin, mais je me soigne.

Ce qui me rassure, c’est qu’il semble que je ne sois pas le seul à me poser la question, quant à la définition de mon métier…

Pour moi, pour faire court, un architecte, c’est un gars qui sait programmer. Quelqu’un qui adore ça. Curieux et ouvert, ce quelqu’un se doit de concevoir un système non pas pour se faire plaisir, mais pour qu’il soit à la fois propre, évolutif sans être non plus sur-conçu ^[2]^ et le plus simple possible à utiliser.

Je pense donc qu’un architecte (informatique) doit savoir programmer. En fait, je pense même plus précisément qu’un architecte n’est finalement qu’un bon programmeur. Et il doit continuer à coder, toujours, sinon il ne peut plus prétendre être architecte, c’est aussi simple que ça : comment une personne peut-elle oser (pro)poser des règles si ce ne sont pas celles qu’il utilise tous les jours et dont il est convaincu du bien fondé ?

Plusieurs articles vont dans ce sens. D’abord, le célèbre anti-pattern ArchitectsDontCode, demandant notamment :

How can someone who never writes a line of code be responsible for how that code will be written?

ou en français :

Comment quelqu’un qui n’écrit jamais une ligne de code peut-il être responsable de comment ce code sera écrit ?

En fait, il y a une différence importante entre un architecte du bâtiment et celui de l’informatique. C’est d’ailleurs le sujet d’un article de Martin Fowler :

A software architect is seen as a chief designer, someone who pulls together everything on the project. But this is not what a building architect does. A building architect concentrates on the interaction with client who wants the building. […] Given the focus on client interaction I think the closest equivalent in software development is a user-interface designer.

Le travail d’un architecte logiciel

  • Via a19s, les erreurs les plus courantes des “architectes”. Everybody Hates Architects. Écrit sur un ton humoristique qui le rend très agréable à lire, ce billet donne néanmoins des points très intéressants. Un qui me touche particulièrement :-)

Do You Talk A Lot? Then Just Shut Up - Have a nominated day where you don’t try to take over a conversation with either Technology, Patterns or some hair-brained new idea you’ve had that involves something you read in the new MSDN magazine regarding vector graphics on a device implanted inside the human skull using web services. Find the person on your team that you talk to the least, and spend some time listening to what they do and how they do it. Really try to just shut up and listen. If you don’t want to be the software world’s equivalent of a corridor bogey man, then practice some humility as often as you can. An occupational hazard of all that zippy confidence and rapid mouth action is that you’ll be blind-sided when the day comes that you didn’t listen enough.

This kind of architect must be very aware of what’s going on in the project, looking out for important issues and tackling them before they become a serious problem.

Ce billet n’est évidemment en rien exhaustif, mais il a le mérite de m’avoir permis de vous donner les quelques liens que je trouvais intéressants ci-dessus :).

Notes

[1] Même si je n’aime pas trop ce suffixe. En informatique, ce suffixe junior se rencontre parfois sur les CV, le plus souvent pour le pompeux “Chef de projet junior”. Toutefois, je me demande si l’informatique serait le seul métier où on n’est généralement pas X, mais X junior, lorsqu’on est jeune. Est-ce que les architectes du bâtiment sont au début de leur carrière affublés de ce type de suffixe ? À mon avis, ce suffixe est superflu. C’est au recruteur de regarder le CV pour calculer l’expérience du candidat. Selon le projet en question, il pourra ainsi juger de l’importance de la longueur de cette expérience.

[2] j’aurais bien écrit overdesigné, mais ça fait un peu pédant. J’entends pas là quelque chose d‘usineàgazesque :-)

Samsung YP-Z5

Samsung YP-Z5 Je me suis acheté il y a maintenant quelques semaines ce lecteur MP3.

J’y ai adjoint des écouteurs Koss pour un son de grande qualité. Ces écouteurs intra-auriculaires sont tellement “isolants” que je suis obligé de mettre le son au minimum lorsque je marche dans la rue, afin d’entendre un peu l’environnement (voitures, vélos…).

Je suis globalement très satisfait du lecteur et des écouteurs. La radio marche très bien, elle possède un mode recherche automatique bien pratique. Le seul point noir que j’ai trouvé au lecteur est une traduction française absolument catastrophique. Celle-ci m’énervait tellement que j’ai repassé le lecteur en anglais. Deux petits exemple rapides : Shuffle All, qui permet une lecture aléatoire de tous les morceaux, a été traduit Brouillez Tous, ou Language laissé Language… N’importe quoi ! Y a aucun français qui bosse chez Samsung qui pourrait se sortir les doigts du cul pour nettoyer cet immondice de traduction ? Ou alors au moins un responsable des ventes en France qui pourrait au moins s’intéresser à ce qu’il vend ?

Grâce à Seb, j’ai trouvé le site Z5 Lounge grâce auquel, à peine déballé, j’ai upgradé mon lecteur au dernier firmware 2.47. Soit dit en passant, c’est bluffant de simplicité à faire. Un autre avantage est son autonomie, effectivement impressionnante. Je n’ai pas compté pour vérifier, mais la trentaine d’heures annoncée ne me semble pas être démentie à l’utilisation. Toujours à propos de ses points forts, il est l’un des rares lecteurs du moment à supporter autant de format, et notamment le ogg, format ouvert alternatif au mp3 (mieux, donc).

Si j’étais sûr de pouvoir réparer mes éventuelles conneries, j’essaierais bien d’éditer le binaire de ce firmware pour corriger cette traduction ni faite ni à faire, mais je ne vais pas risquer de devoir renvoyer mon lecteur chez le fabriquant, voire de devoir le jeter, pour ça…

Note : Si quelqu’un de chez Samsung lit ce billet, je suis même prêt à aider pour la traduction si besoin. Franchement, vu les qualités techniques du matériel, c’est affligeant une qualité pareille sur la version française ! batmat chez batmat point net :-).

Ressources intéressantes sur le YP-Z5 :

JSR 310 : Date and Time API

Génial.

L’API standard de Java manque encore aujourd’hui cruellement d’une API de traitement des dates, de calcul des durées entre deux dates et tout ce qui peut avoir un rapport avec le traitement du temps dans un programme. L’une des bibliothèques les plus connues qui comble cette lacune est Joda-Time.

Une JSR est donc en marche pour répondre à ce besoin de façon standard. Ceux qui ont déjà utilisé les classes Calendar et Date savent à quel point elles sont incomplètes et parfois même bugguées. Vivement que ce groupe de travail produise la base de ce javax.time.*, base sur laquelle nous pourrons jeter un oeil afin de commenter. Ça va sûrement être très intéressant. Nous découvrirons alors notamment s’il est entrevu un chemin de migration entre la classe Date actuelle et celle qui sera conçue. A priori, les deux classes devraient en effet être rendues obsolètes :

It is intended that this JSR will produce classes that effectively replace the need for the existing Date and Calendar APIs. Over time we look forward to other specifications being updated to us the new date and time API.

Mais le groupe de travail tentera évidemment si possible de réintégrer ces classes dans le nouveau modèle :

In terms of design, it is intended that immutable classes will form the core. It is also intended to use interfaces, if possible, to bring the old Date and Calendar classes into the new model. The expert group will also examine if Calendar can be reimplemented internally using the new date and time classes.

Vu la base de code dans la nature qui dépend de Date/Calendar, j’espère qu’on trouvera un moyen de fusionner l’ancien et le nouveau modèle…

Thème du site en cours de mise à jour

Ceux qui consultent le site directement de temps en temps sans passer par le fil RSS remarqueront certainement des changements sur son rendu.

Pour ceux que ça intéresse, j’ai utilisé comme base le thème Aorakit 3F de Kozlika. Maintenant que la structure qui me convient est posée, je récupère bout par bout les parties de la CSS que ce blog avait lorsqu’il tournait avec dotclear 1. J’essaie à cette occasion de supprimer les trucs un peu tordus qui s’étaient accumulés avec le temps dans la CSS :-).

J’ai gagné un temps précieux grâce au travail de Kozlika pour poser la structure que je voulais. Merci beaucoup.

Comment fusionner plusieurs listes en une seule avec Spring [Test de coloration syntaxique :-)]

Attention, fonctionnalité en test :-). Merci GeShi

C’est pas mal du tout, mais il faut encore améliorer le rendu. Notamment les espaces inter-lignes. Il faut aussi que je passe en mode “class” et que j’écrive le code CSS associé au rendu que je veux donner à mon code.

package fr.mipih.foundation.spring;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.config.AbstractFactoryBean;

/**
 * Classe Spring permettant de fusionner plusieurs tableaux ou listes en une seule.
 * 
 * @author Baptiste Mathus
 */
public class ListMergerFactoryBean extends AbstractFactoryBean
{
    List<String> mergedSourceList;

    public Class getObjectType()
    {
        return List.class;
    }

    public void setSourceLists(List[] sourceLists)
    {
        mergedSourceList = new ArrayList<String>();
        for(List<String> l : sourceLists)
        {
            mergedSourceList.addAll(l);
        }
    }

    @Override
    protected Object createInstance() throws Exception
    {
        logger.debug(mergedSourceList);
        return mergedSourceList;
    }
}

Remise de diplôme, septembre 2005. Que de souvenirs...

J’ai eu enfin l’idée que j’aurais dû avoir il y a longtemps tout à l’heure. J’ai eu un mal fou à essayer de faire tourner la vidéo de la soirée de remise de diplôme d’ingénieurs de mon école : Ingénieurs 2000.

Je me suis donc créé mon compte YouTube tout à l’heure et j’ai uploadé la vidéo. La qualité est assez basse, à cause du fait que la caméra numérique utilisée n’était qu’une très bas de gamme. Mais c’est toujours beaucoup mieux que rien, et ça m’a quand même presque mis la larme à l’œil de revoir cet évènement et toutes ces têtes d’un coup…

Aspect particulièrement énorme de la remise : Dominique Revuz nous a tous appelé chacun notre tour par nos prénoms, noms ET surnoms. La vidéo se termine par quelques plans pris lors du restaurant après la remise, où DR était d’ailleurs aussi présent. Ça donne ça :

[](http://www.youtube.com/watch?v=9o960aO-mJ)

9o960aO-mJQ

Ça a été trois années géniales. On en a bavé, ça c’est clair, mais je le referais dix fois s’il le fallait.

Citation d'une vieille truffe

L’autre jour, dans le bus, une dame dans les 60 ans, pas BCBG mais presque, parlant à une dame de 70 ans passés :

Et vous avez entendu parler de la maison à 100000 euros ? Non mais dites donc ! Vraiment, les gens (petit rire narquois). Non, mais c’est encore un coup médiatique, rien de plus ma bonne dame.

l’autre

Oh oui, hein !

la première

Non, mais si les gens se renseignaient un peu au lieu d’écouter ce genre d’information, ils se rendraient compte de la réalité. Une maison, ça se trouve à partir de 70000€ sans problème. Non, mais vraiment, hihi. C’est affligeant.

l’autre

Oooh ben oui, hein !

Et moi, entendant ces anneries, je me disais : “tais toi, Baptiste, tais toi, ne t’énerve pas !”.

Truffasses !

Le marché immobilier est en telle explosion que les prix augmentent sans arrêt. Vous voulez un exemple de prix réel d’aujourd’hui, en 2007, et pas celui d’une vieille neuneute qui se réfère certainement aux prix de 1980 ? Eh bien, ça me désole, mais en gros, pour une petite maison d’environ 90m² de surface habitable et 3 ou 400m² de jardin, ce à une dizaine de km de Toulouse au minimum (et je suis gentil) vous pouvez compter 200000€… Oui, deux cents mille euros, vous avez bien lu.

Autre exemple : T3 de 60m² dans Toulouse, pas dans le centre, dans un quartier agréable comme St Michel, comptez 130000€ au bas mot (et plutôt 140 à 150000 minimum en étant plus réaliste).

Le plus triste dans tout ça, c’est que je ne comprends pas comment il est encore envisageable pour les bas salaires d’acheter une maison à moins de 50km d’une ville comme Toulouse. Au taux d’emprunt actuel, il faut en gros en effet s’endetter aujourd’hui 25 ans, en payant 1200€ par mois, pour rembourser 200000€ “seulement”…

Pascal Nègre à propos des DRM : champion de la métaphore

Via 404BNF, notre star des neurones gravés sur CD a proféré :

Je ne sais pas si vous avez une voiture, mais si vous avez une voiture, elle roule soit à l’essence, soit au gazole, eh bien votre moteur n’est pas interopérable. Vous pouvez pas mettre du gazole dans un moteur à essence.

ou

Le mec qui achète une PlayStation ne va pas acheter des jeux Nintendo. C’est la même chose pour la musique.

Donc, si vous voulez payer vos musiques une fois pour votre chaîne HiFi, une fois pour l’autoradio, une fois pour votre lecteur mp3 et une fois pour votre grille pain, votez pour Pascal Nègre et les DRM…

Migration Dotclear 2 #2 - RewriteRule et appel à contribution

Bon, c’est mieux. Maintenant, normalement les flux RSS sont correctement redirigés. Il me reste à supporter les anciennes URL, ce que je m’escrime à faire depuis plusieurs heures sans succès.

Je suis principalement reparti du billet de kozlika sur dcTips.

Pour les flux des billets et des commentaires d’ici, ça marche sans problème et ça donne ça :

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^dotclear/rss.php /blog/feed/rss2 [R=301]
RewriteCond %{QUERY_STRING} ^type=co$
RewriteRule ^dotclear/rss.php /blog/feed/rss2/comments? [R=301]
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^dotclear/atom.php /blog/feed/atom [R=301]
RewriteCond %{QUERY_STRING} ^type=co$
RewriteRule ^dotclear/atom.php /blog/feed/atom/comments? [R=301]

Par contre, pour la redirection des anciens billets, je patauge. Exemple http://batmat.net/blog/2005/05/02/1… ne fonctionne pas de base. La nouvelle inclut en fait simplement “post” entre “blog/” et la date, ce qui donne http://batmat.net/blog/post/2005/05…. J’ai donc fait comme ça :

RewriteRule ^blog/(\d{4})/(\d{2})/(\d{2})/(\d+.+)$ /blog/post/$1/$2/$3/$4 [R=301]

Mais visiblement, cela ne fonctionne pas (cliquez sur le premier lien pour en être convaincu :-)). Je ne comprends pas trop pourquoi. Ceci est très certainement dû au fait que je ne connaissais de mod_rewrite que le nom il y a encore quelques heures. J’ai l’impression que le fait que le fichier blog.php existe prend le pas et n’exécute pas la règle de réécriture.

Si quelqu’un a une idée de comment résoudre le problème, et par la même occasion pourquoi je mange une Internal Server Error dès que j’essaie d’activer l’option RewriteLog pour comprendre ce qui se passe, je suis ouvert à toute proposition…

D’avance merci

Amélioration de myPIXmania : utiliser les informations exif

Récemment, nous avons commandé une centaine de photos chez myPIXmania. Je viens de finir de noter au dos de chacune :

  • la date
  • les personnes présentes
  • le lieu

Vous imaginez le temps que j’ai passé à faire ça. Ça se compte clairement en heures. Et encore, j’utilise fort heureusement KPhotoAlbum (anciennement KimDaBa) qui me permet de retrouver une photo en tapant quelques noms et trois clics. Ça me désespère d’autant plus que la date, au moins, aurait pu être automatiquement inscrite au dos de la photo.

Si vous ne saviez pas que votre appareil photo numérique stockait des informations très intéressantes en plus de la photo elle-même, c’est le moment de le découvrir. On appelle ces informations des méta-données, c’est à dire des données sur les données (ici, la photo). Le standard informatique permettant de décrire une photo s’appelle EXIF.

Exemple de ce que je peux voir dans ma fenêtre propriété :

Propriétés EXIF d'une photo

Comme cette information est présente, il est à mon avis très dommage que des entreprises comme PIXmania sur le marché de la photo numérique ne l’exploite pas. J’ai cherché à leur faire la remarque sur le site, mais les critères pour poster une question sont tellement restrictifs que c’est impossible sans choisir un problème au hasard et sans indiquer de numéro de commande…

Si quelqu’un connaît d’ailleurs un autre site d’impression de photos numériques capable d’imprimer au moins la date de la photo au dos, je suis très intéressé.

Migration à Dotclear 2 en cours

Bon, ben voilà. Comme j’en avais marre des spams et qu’il paraît que Dotclear2 est très fort pour ça, j’ai migré. Pour l’instant, je n’ai migré que le contenu et bidouillé un petit coup dotclear pour que l’adresse http://batmat.net soit toujours l’adresse directe du blog…

Veuillez donc m’excuser pour les quelques dysfonctionnements que ce blog devrait subir dans les jours à venir.

Pour ceux qui se posent la question :

  1. Le procédé est très bien documenté
  2. C’est très rapide (lié au point 1, merci l’équipe dotclear pour cette doc très claire de migration).

Merci aussi à OVH pour son bon travail d’aide sur le sujet.

Il a fallu que je crée une nouvelle base utilisant mysql5 et configurer mon 60GP pour tourner en php5. Merci au petit script de test de configuration de dotclear :-).

Tout ça pour dire qu’il devrait y avoir quelques désagréments sur ce blog dans les quelques jours à venir, mais que je vais tout faire pour que ça rentre dans l’ordre dans pas trop longtemps :-). Je compte par exemple regarder comment on peut faire pour récupérer les url dc1.2. J’ai en effet entendu dire que le format n’était plus le même, mais qu’il était possible de bidouiller un truc pour que les liens ne soient pas cassés…

Il me restera ensuite peut-être à essayer de personnaliser un peu la charte, histoire de pourrir un peu le magnifique thème de base. Et récupérer aussi l’affichage automatique des blogs que je suis, tiens, grâce au fichier opml d’export (pour une fois que je fais du XSLT). Je devrai aussi tagger les billets que j’ai posté jusqu’à présent, ça par contre, ça me plait ! Rappelez vous,la classification par répertoires est morte !

Bon, après ya aussi mes plugins à découvrir et/ou réinstaller, mais ça, c’est de la tambouille interne :-).

Différence entre Session.save() et Session.persist()

Dans la version 3 d’Hibernate, d’un point de vue strictement utilitaire, il y a deux méthodes qui ont le même objectif : sauvegarder un objet en base (ou le rendre persistant, comme on dit).

Le problème est donc de savoir laquelle il faudrait plutôt utiliser. Et bien la réponse est simple, euuuu…

Traduction de ce qu’on peut lire dans la FAQ :

Je ne sais pas si je dois utiliser save() ou persist().

Ces deux méthodes rendent persistante une instance éphémère (NdT : transient). Toutefois, la méthode persist() ne garantit pas que la valeur de l’identifiant sera assignée immédiatement, l’assignement pourrait arriver au moment du flush.

La méthode persist() garantit aussi qu’aucun INSERT ne sera exécuté si elle est appelée en dehors d’un contexte transactionnel. Ceci est utile pour les conversations longues avec un contexte de persistance/session étendu.

La méthode save() ne garantit pas la même chose. Elle retourne un identifiant, et si un INSERT doit être exécuté pour obtenir l’identifiant it returns an identifier (e.g. générateur “identity”, pas “sequence”), cet INSERT arrive immédiatement, peu importe que vous soyez à l’intérieur ou à l’extérieur d’une transaction. Ce n’est pas bon pour les conversations longues avec un contexte de persistance/session étendu

En résumé, si vous faites des conversations longues, utilisez plutôt persist(). Sinon il y a peu de différence, mis à part toutefois le cascading. Celui-ci n’est propagé dans le cas de save() que si la relation est mappée cascade=“save-update”, alors que c’est cascade=“persist” pour persist().

Notez que si vous mappez cascade=“all”, cela inclue à la fois save-update et persist. Donc pour les relations mappées “all”, la sémantique de persist() et de save() sont à mon avis extrêmement proches.

Cost Analysis of Windows Vista Content Protection

À lire ici.

Un petit extrait de l’introduction :

one important point that must be kept in mind when reading this document is that in order to work, Vista’s content protection must be able to violate the laws of physics, something that’s unlikely to happen no matter how much the content industry wishes it were possible

Ou en français

Un point important qui doit être gardé à l’esprit à la lecture de ce document est que pour fonctionner, la protection de contenu de Vista doit être capable de violer les lois de la physique, soit quelque chose qui a peu de chances d’arriver, peu importe à quel point l’industrie du contenu souhaite que ce soit possible

J’ai envie de rapprocher cette phrase d’un autre de mes billets :

Eh oui, les CD soit disant protégés contre la copie le sont aussi souvent contre la lecture par un effet de bord inévitable : il est strictement impossible de permettre la lecture de quelque chose et d’en empêcher la copie. C’est logique : une chose que vous pouvez lire est forcément copiable. Tout procédé technique affirmant pouvoir l’empêcher est une blague.

Les “têtes pensantes” de l’industrie de la musique ont sans doute refusé de le croire pendant longtemps, et je pense que c’est cela qui a fait naître un grand nombre de procédés techniques “infaillibles”, cassés en quelques minutes par n’importe quelle personne disposant d’un lecteur CD, désireux de le lire, son CD, le salop (encore)…

Je rappelle par ailleurs qu’il n’y aucun doute sur le sujet à mon avis : les MTP, alias DRM dans la langue de Shakespeare, ne feront toujours chier que les honnêtes gens. Ceux qui ont payé tout ce qui doit l’être et qui n’ont pas les compétences techniques pour comprendre pourquoi ce pµ#@|n de cd qu’ils viennent d’acheter n’est pas lu par la chaîne hi-fi sur laquelle tous les cd passent habituellement très bien… Les pirates, les vrais, ceux qui veulent vraiment déplomber une protection, ne seront pas arrêtés par des procédés aussi techniquement inutiles et sans aucun espoir d’efficacité.

Pour ceux qui croieraient par ailleurs encore à la grande complexité de briser de telles mesures : [](http://www.youtube.com/watch?v=_oZGYb92isE)

_oZGYb92isE

Pour la route… (Personnellement, ce qui m’a amusé dans la vidéo, c’est non seulement de voir que le code utilisé faisait effectivement quelques lignes seulement, mais surtout que c’était du Java :-)).

Regarder un DVD sous Linux devient pénalement répréhensible

Attention, billet d’humeur.

J’ai pitié de mon pays… Deux solutions, donc :

  1. se préoccuper de la loi et arrêter tout simplement de regarder des DVD sous mon OS favori,
  2. on fait comme avant lorsque c’était légal, et on se moque des crétins à la solde des majors…

À votre avis, je vais choisir quoi ? Indice : j’avais déjà dit ce que je ferais sans hésiter une seconde si je n’arrivais pas à lire un CD que j’ai payé avec mon argent à moi que j’ai. C’est pas ça qu’on appelle de la résistance citoyenne, tiens ?

Note sur le titre : Pour les gens qui se poseraient la question, seuls les DVDs cryptés, qu’on doit donc lire avec des outils comme DeCSS, vous poussent à entrer dans l’illégalité.

Mapping Hibernate pour routeur...

Extraordinaire :-).

Java Persistence with Hibernate

Il y a quelques semaines, j’ai vu passer ce billet sur le blog de l’équipe de développement d’Hibernate. Étant donné que j’avais “suffisamment”, sans prétention aucune, contribué au forum d’Hibernate pour participer, j’ai immédiatement envoyé un mail à l’adresse indiquée. J’ai mis un descriptif très très court de mon expérience sur l’outil, tellement j’étais stressé d’avoir une chance de faire partie des heureux bénéficiaires et donc pressé d’avoir envoyé le mail :-).

Je n’ai eu aucune nouvelle pendant environ une semaine, je ne savais absolument pas s’il y avait eu 25 personnes avant moi ou pas, puis j’ai reçu le 5 décembre ce mail de la part de Christian Bauer :

A copy of ‘Java Persistence with Hibernate’ is on its way to you. Inside the US Manning expects to get the book to you this week, to Europe and other countries it might take more than a week.

If there is any problem with the delivery please contact me directly.

Thank you again for contributing to Hibernate.

Et la page récapitulative a été mise à jour :-).

Bon, je me suis dit : “Je n’en parle pas tant que ce n’est pas définitif”. Pis finalement, je suis allé récupérer ça à la poste ce matin :

800 pages, il va me falloir un peu de temps avant d’éventuellement pouvoir reparler du contenu :-).

Ajax pour les nuls, Scriptaculous

Franchement génial ce qu’on peut faire en trois coups de cuillère à pot grâce à Scriptaculous. J’avais fait, il y a un moment déjà, un petit test pour voir comment fonctionnait Ajax au marteau et au burin, sans aller bien loin. Ça avait donné ça.

Après en avoir entendu parlé un peu, ce soir, j’ai testé la bibliothèque Scriptaculous. Et voilà ce que ça donne. Franchement, en partant du wiki de scriptaculous, il m’aura fallu moins d’une heure, le temps de refaire un bout de php et trouver la fonction stristr à utiliser ! J’ai par ailleurs testé les effets (bibliothèque Effects) et c’est aussi très impressionnant : rien à faire ou presque et on peut tout de suite obtenir de superbes effets de fondus sur n’importe quel élément HTML.

Ajax en mode marteau/burin, j’y crois mais alors pas du tout. Faut être chtarbé pour envisager de faire coder à des dizaines de développeurs un truc aussi difficile à maintenir et à débugguer. Par contre, avec des bibliothèques comme celles-ci, ça devient tout de suite plus crédible. Toutefois, attention, comme c’est souvent rappelé, il ne faut pas s’emballer à en faire à bloc partout tout le temps : ça tape quand même beaucoup sur le serveur à coup de requêtes HTTP (exemple avec l’autocomplétion : à chaque lettre un échange avec le serveur est effectué, ben oui, c’est pas magique non plus), donc ça peut vite devenir gênant en terme de performance. Ne pas en abuser et à surveiller, donc.

Bravo pour cet outil si bien documenté et simple à utiliser, c’est pas toujours comme ça :-).

Une tranche de Rumsfeld, à point

[](http://www.youtube.com/watch?v=c5P6MLiKEJI)

c5P6MLiKEJI

Un peu d'humour

Quelques bons éclats de rire ces derniers temps :

  • Têtes à claques, via Prendre un café
  • Découvert Les petits détournements de mozinor, j’ai particulièrement ri avec le détournement de 007 : “Eh t’as craqué Papi, je suis James Bond quand même !”. Aimé aussi Lambert qui cherche un producteur, ou Delon : “Rin à fout’” :-D.
  • Et pour finir, reçu au boulot, ÉNORME ! Les chvalié du diakzo. Riront particulièrement ceux qui ont connu les “Chevaliers du Zodiaque” et connaissent le langage utilisé par les ados actuels (Pauline, si tu m’entends :-p). Je me suis roulé par terre plusieurs fois avec les phrases du genre “lol mdr, mé ta msn sinon???” : \

No comment

Aujourd’hui, un courrier est arrivé chez mes parents, m’enjoignant de payer 400€ de taxe d’habitation 2005 pour la ville de Lognes, dans laquelle j’ai résidé de septembre 2004 à mars 2005, lors de ma dernière année d’études.

Ces 400€ sont composés d’environ 350€ de taxe + 50€ de frais de pénalité. Sauf que je n’ai jamais reçu de courrier appelant au paiement de cette taxe. Mes parents m’ont joint à l’instant pour te transmettre la bonne nouvelle.

Je décide donc d’appeler le Trésor public immédiatement pour en discuter, il est 15h15 et là, je suis partagé entre rire et colère… Je tombe à trois reprises sur le répondeur :

“Bonjour et bienvenue à la trésorerie de Marne-la-Vallée, nos bureaux sont ouverts du lundi au vendredi de 9h à 16h. Merci de votre appel. Au revoir” et ça raccroche…

Ouai, c’est ça… Vous mettez pas en retard, les gars !…

Il suffisait d'y penser... - Journal d'un avocat

Je ne suis aucunement juriste. Lorsque j’ai entendu à la radio ces derniers jours le projet de faire passer du statut de déli à celui de crime les agressions en bandes organisées de policiers ou pompiers, c’est à dire de faire passer la peine maximale de 10 à 15 ans de réclusion, cela ne m’a pas semblé a priori une mauvaise idée.

Si vous êtes encore du même avis, allez lire le billet sur le sujet du célèbre maître Eolas, qui ne vole décidément pas son statut de blog hyper-connu :-) :

Il suffisait d’y penser… - Journal d’un avocat

Canon Powershot S3 IS

Même si je suis déjà convaincu que le classement par répertoire est un concept mort, le fait de ne pouvoir placer ce billet que dans la catégorie Linux me le rappelle de façon un peu insolente… J’y reviendrai.

Depuis quelques temps déjà, je voulais changer d’appareil. Les photos de mon Powershot A80 commençait à être trop souvent floues à mon goût. Cela faisait donc quelques mois que l’idée d’investir dans un nouvel appareil photo numérique trottait dans nos têtes… L’achat s’est finalement porté sur le Powershot S3 IS.

Ce qui m’a attiré dans cet appareil :

  • réputé pour être un très bon intermédiaire compact/reflex
  • mode vidéo impressionnant (640x480 à 30 images par secondes)
  • une évolution, avancée certes, de mon ancien appareil, donc plus rapide à appréhender
  • des dimensions correctes : identiques pour hauteur et largeur, 2 fois plus large en profondeur
  • zoom 12x optique, 4x en numérique, avec stabilisateur de bonne qualité (dixit les spécialistes)
  • La vignette orientable, fonction qui m’avait d’ailleurs déjà fait choisir mon a80

Ce qui m’embête un petit peu :

  • le protocole de connexion de Canon : certes, Canon a fait un très bon choix d’utiliser un protocole normé (PTP), mais je ne comprends pas pourquoi les constructeurs ne choisissent pas plutôt systématiquement que l’appareil soit vu comme une clé USB par l’ordinateur. Serait-ce parce que ce protocole est bidirectionnel et qu’il faut que l’appareil puisse envoyer un ordre, d’impression par exemple, pour pouvoir imprimer directement sur une imprimante compatible PictBridge ? Ça doit être ça…
  • le switch entre les modes de visualisation des photos prises et la prise de vue aurait pu être un rien plus ergonomique. Ça marche bien, mais je ne sais pas, je trouve que le bouton est un rien trop petit, peut-être. Mais ce n’est pas rédhibitoire, évidemment.
  • le flash qui ne sort pas seul. Alors, c’est certain, c’est bien pour les cas où on ne veut surtout pas de flash, mais je ne suis pas habitué à devoir penser à le sortir… Heureusement, l’appareil prévient toutefois lors de la prise de vue : si vous ne l’avez pas sorti et qu’il estime qu’il serait nécessaire, il l’indique sur l’écran. L’avenir me dira si ça me dérange vraiment ou pas :-).
Utilisation sous Linux

Pour récupérer les photos, quel que soit le système d’exploitation, il y a deux solutions :

  • sortir la carte et la lire via un lecteur de carte ;
  • utiliser le câble USB fourni pour récupérer directement les photos en le branchant à l’appareil.

Je me suis dit que j’allais lire directement l’appareil. J’ai donc lancé gtkam, le logiciel de gestion d’appareil photo numérique pour gnome et essayer de récupérer mes photos. Impossible.

Après quelques recherches sur le net, j’ai compris que gtkam n’était en fait qu’un frontend pour gphoto2. Si celui-ci n’était pas capable de voir mon appareil, ce n’était même pas la peine d’ouvrir gtkam. Gphoto2 possède un mode où il est capable d’autodétecter l’appareil photo branché à l’ordinateur, le problème, c’est que chez moi, ça donnait ça :

baptiste@pumte:~$ gphoto2 --auto-detect
Model                          Port
----------------------------------------------------------

En farfouillant un peu au hasard, je suis tombé sur un bug report pour digikam qui n’avait a priori aucun rapport avec mon problème. C’est cette phrase qui a attiré mon attention :

don’t worry about the mount path (it’s an internal thing). if you have commandline gphoto2 installed, try this commands:

gphoto2 –auto-detect gphoto2 -l

try both as user and as root

Tiens ? Aaaah, mais ouiii, c’est peut-être un problème de droit. J’essaie :

baptiste@pumte:~$ sudo gphoto2 --auto-detect
Model                          Port
----------------------------------------------------------
Canon PowerShot S3 IS (PTP mode) usb:

Bingo ! Je prends même le temps d’essayer aussi avec l’A80.

baptiste@pumte:~$ sudo gphoto2 --auto-detect
Model                          Port
----------------------------------------------------------
Canon PowerShot A80 (normal mode) usb:

Parfait. Tout fonctionne très bien en fait. Il ne me reste donc plus qu’à gérer la sécurité pour autoriser baptiste à utiliser les appareils photo numériques. Pour info, sachez que ce genre de chose est souvent gérée par l’intermédiaire d’un groupe sous Linux. Ces groupes sont déclarés dans le fichier /etc/group. Chaque ligne définit un groupe, pour que baptiste fasse partie du groupe pouet, il suffit d’ajouter baptiste à la liste des utilisateurs déclarés sur la ligne du groupe, après le “:“, simple.

Il est même possible de lancer le logiciel qu’on désire au branchement de l’appareil, j’ai trouvé une documentation complète qui explique comment faire. C’est là que j’ai trouvé que le groupe duquel il faut faire partie pour accéder aux APN est camera.

Soit vous faites adduser votreuser camera en mode texte dans une console. Soit vous pouvez toujours passer par l’interface graphique. Sous gnome, ça donne ça : dans le menu Administration/Utilisateurs et groupes :

Une fois ces manipulations effectuées, gtkam est totalement fonctionnel. L’auto-détection est opérationnelle, je peux récupérer mes photos et tout va pour le mieux dans le meilleur des mondes. Je ne sais trop que penser de la mini-mésaventure que j’ai vécue dans la détection de mon appareil. Est-ce un bug ? Ou plutôt devrait-on le considérer comme tel ? Je ne pense pas. Toutefois, il est vrai que des utilisateurs moins expérimentés auraient pu y passer un temps bien plus important sans trouver de réponse claire (l’un des buts de ce billet, d’ailleurs). Sous Linux lorsqu’on vient de windows, il faut assimiler une chose très importante issue du monde unix : les droits. Soit vous avez droit d’accéder un fichier, soit vous ne l’avez pas. Si ce n’est pas le cas que ça ne devrait pas être ainsi, il faudra demander à l’administrateur de changer cet état de fait. Ce n’est pas un bug, ce n’est que de la configuration. Ce n’est évidemment pas fait que pour faire chier l’utilisateur, mais pour le protéger, lui et surtout les autres dans le cas où l’utilisateur en question serait malveillant. En procédant ainsi, vous limitez les risques qu’un utilisateur inexpérimenté n’accède à des choses qu’il ne devrait pas. Le même principe est présent sous Linux pour l’accès au graveur de CD, l’accès au clés USB, etc. Au final, c’est simplement l’habitude d’accéder à tout sans jamais poser de questions qui doit changer.

Après, que les logiciels qui gèrent cela vous préviennent lorsque vous possédez des droits limités (cf. ce que fait par exemple k3b, le logiciel de gravure de KDE) me paraît évidemment une très bonne chose, lorsque c’est possible, mais c’est un autre débat. Le système sous-jacent de gestion des droits n’est alors plus en cause.

Pour finir, voici un tout petit extrait sans prétention aucune de ce que fait le S3 IS. Il possède une fonctionnalité amusante (faisable aussi après coup sur ordinateur, je le reconnais) qui permet de passer sur une image tout en noir et blanc, sauf pour une couleur indiquée :

Toulouse, dimanche 1er octobre, 18h

Opticiens, lequel se moque le plus du monde ?

J’ai la vue qui se dégrade évolue (je me suis fait reprendre par mon ophtalmo pour ça :-)). Jusqu’à mes 22 ans environ, je n’avais jamais eu de problèmes. J’imagine que je devais “compenser”, comme on dit.

Je suis un petit peu myope-astigmate. Je n’avais jusqu’alors même pas une dioptrie complète en moins, c’est chose faite, rassurez vous. Je me mange pas encore les murs sans lunettes, mais ça va ptête venir, rassurez vous aussi =).

Je portais donc déjà des lunettes depuis un peu moins de 3 ans. Et je je commençais à sentir que je ne voyais plus vraiment bien, donc rdv pris chez l’ophtalmo, paf ! rendez-vous.

Verdict : -0.75 pour l’oeil droit, -1.25 pour le gauche… Soit environ une demi-dioptrie de moins qu’il y a 2 ans… Bon, ben OK. Je vais certainement me mettre aux lentilles de contact, mais en attendant, je vais me refaire faire des verres à la bonne “puissance” (c’est comme ça qu’on dit ?). J’avais fait faire mes premières lunettes à l’époque par G.O., à côté de la place Esquirol.

Samedi matin, guilleret, je me lève donc à 9h et pars tranquillement à pieds faire mes emplettes oculaires. Comme j’avais le temps, j’avais l’intention de m’arrêter chez deux ou trois opticiens. Je me dirige donc vers le centre ville de Toulouse à pieds. Place Lafourcade, je trouve un O2k, parfait.

Précisons pour ceux qui se poseraient la question que mes défauts oculaires sont somme toute très faibles et courants. On peut donc s’attendre à des prix qui ne soient pas délirants. On calcule : 72€ par verre chez O2k (je ne veux que les verres, gardant les montures actuelles), soit 144€ le devis.

Très bien. Pourquoi pas. Je continue vers le centre ville et décide de retourner chez G.O. qui avaient fait mes premières lunettes. À l’époque, je ne m’étais pas posé trop de questions, j’avais je crois payé 325€ pour les verres avec des montures de marque. Un peu cher certainement… Grâce à cet achat, je possède une carte G.A. qui me permet d’obtenir 10% sur l’achat suivant.

Je rentre dans le magasin, au style très spatieux, pas luxueux, mais presque. Plein centre ville. On refait un devis avec mes 10% de remise. Je demande une seule chose : des verres anti-reflets, chose très habituelle à l’heure actuelle il me semble. Bilan : 108€ par verre, soit 216€ pour les deux, parce que je suis un bon client. Sinon, c’était 240… Bon, j’évacue direct, je dis à la fille qui me reçoit : “Non, c’est trop cher. Je sors à l’instant de chez un de vos concurrent, O2K, et il y a une différence beaucoup trop importante par verre. Au revoir.”

En sortant, je m’interroge. 50€ de différence par verre (sans carte de fidélité, j’entends), comment est-ce possible ?

Avant de rentrer, je me dis que j’ai bien envie d’aller faire un devis chez Krys. Krys est l’opticien de ma mère et de mon frère, nous ne sommes pas des cousins des Rothschild, donc je pense que ça doit être des prix corrects. Bien m’en a pris…

Après quelques pérégrinations, je finis par trouver Krys à quelques enjambées d’Esquirol en direction de la Garonne. Je rentre et demande le devis habituel… 45€ par verre, oui, vous avez bien lu. Soit 90€ les deux. Là, je souris et je dis d’une façon un peu confuse à la vendeuse : “Je vous avoue que je suis un peu surpris. Vous avez votre carte à jouer. Je sors de chez deux de vos concurrents, et les prix vont du simple au triple ! Je ne sais pas lequel, mais il y en a un qui se moque du monde, à mon avis…”. Un peu amusée de ce que je lui dis et certainement aussi parce qu’en quelque sorte d’après mon ton, elle sent que je dis aussi que Krys est peut-être le plus honnête des trois, elle tente de m’expliquer pourquoi la différence peut être importante et d’excuser les gens de son métier. Elle m’explique que comme pour les voitures, il y a le luxe, et tous les prix, etc. Soit, mais le truc c’est qu’elle finit en répondant à ma question de savoir quelles sont les différences de qualité qui peuvent exister : “Non, pour votre type de verre, il n’y a pas trop de différences possibles. C’est plutôt sur les verres progressifs que vous pourrez trouver le jour et la nuit selon marques et prix…”. Bon, alors je conclus en mon for intérieur que les autres se foutent bel et bien de ma gueule, ou alors qu’il ne maîtrisent toujours pas bien les techniques de fabrication des verres et que ça leur revient à des prix follement différents chez l’un ou l’autre :o).

En résumé, sans tenir compte de ma carte de fidélité, ça donne :

  • Krys : 90€ ;
  • O2K : 144€;
  • G.O. : 240€.

Alors, qui se moque du monde ?

Will all software go open source?

Via Application Servers : Will all software go open source?

Non, je ne suis pas mort, je reviens simplement doucement dans la vie active après un peu plus d’un mois de congés :-).

Géoportail, l'histoire d'une défaite ?

J’avoue, j’ai un peu honte pour mon pays en regardant un peu partout ce qui se dit sur le Géoportail (si le lien ne se charge pas ou met 5 minute à atteindre la page d’accueil, c’est normal…), le Google Earth, mais en mieux (sic), à la française.

Vous savez ce qui a déjà fait le tour de la planète ? Non, pas que le Géoportail est effectivement mieux, mais surtout que son lancement a tout simplement été une véritable catastrophe pitoyable. Tout le monde se fout de la poire de l’IGN. Je viens encore d’essayer à l’instant, soit 3 jours après le lancement, et le site semble toujours avoir un mal fou. Il me faut au moins 1 à 2 minutes pour afficher complètement la page d’accueil (et encore, quand on y parvient). Ri-di-cule.

Une réflexion intéressante, lue sur un site anglophone, explique qu’au moins lorsque Google lance ses services, il l’annonce en Beta. Comme ça, on ne s’attend pas à un truc fini, et les erreurs sont excusables. Mais non, prétentieux français, comme nous sommes si bien réputés à l’étranger, nous annonçons une résolution plus grande que Google Earth…

Eh bien, je suis désolé messieurs, mais quand bien même vous avez une super application, si elle n’est utilisable que par une personne à la fois, il ne faut pas vouloir jouer dans la cour de Google et ses milliers de serveurs. Tout le monde se moque éperdumment de savoir que la résolution est plus importante que celle de Google Earth si on ne peut même pas y accéder pour le constater.

Je suis informaticien. J’ai beau ne pas du tout travailler dans le domaine des réseaux, je peux vous garantir que n’importe quel personne qui s’intéresse un peu à Internet aurait pu prévoir ce désastre. Depuis vendredi :

  • sur France-Info : blablabla le Géoportail ouvre aujourd’hui
  • France-Info un peu plus tard : “le président a testé aujourd’hui le nouveau service de l’IGN, le Géoportail, Google Earth à la française”
  • Internet sur à peu près tous les sites de news possibles…
  • Toutes les émissions télévisées en parlent, radio et tout et tout :-/

Bref, n’importe qui aurait pu prévoir qu’avec tout ce battage médiatique, le site allait tomber par terre dans la première heure de mise en service ! Moi même, arrivant au boulot vendredi matin, je me souviens que je ne me faisais pas d’illusions : j’ai essayé d’accéder au site en me doutant fortement que ce serait peine perdue.

Donc, à qui la faute ? Parce qu’il va bien falloir trouver des responsabilités à ce superbe coup d’anti-pub mondial… Qui avait en charge le lancement de ce service au public ? En trois jours, l’IGN vient de profondément se ridiculiser à l’international…

Non, mais franchement, pourquoi ne pas avoir annoncé une Beta, pour au moins bénéficier de l’indulgence associée à un service encore en phase de tests ? Pourquoi ne pas avoir étalé la présentation et la publicité du service pour étaler de la même façon les arrivées sur le site et le bouche à oreille ? Pffff. Google a sorti ces temps-ci Google Calendar, Picasa, vous en avez beaucoup entendu parler ? Non ? C’est normal. Ils ne communiquent pas beaucoup dessus. Eh bien allez voir à quoi ça ressemble. C’est pourtant déjà très abouti…

Il n’y a donc personne à l’IGN qui sache ce qu’est un serveur web, une bande passante ? Que le site soit inutilisable dans la première heure passe encore, mais qu’il soit toujours au même point 3 jours après est franchement désolant.

J’ai honte… Et ce site qui se charge toujours à la vitesse d’une tortue poussive traînant un 38 tonnes…

Stabilisation OK

Et ce matin : 78,7 :-)

Attaqué moi aussi ?

J’utilise la forme interrogative parce que je n’ai toujours reçu aucun papier officiel.

Ce billet fait suite à celui expliquant factuellement mes déboires avec l’entreprise Gaz Entretien Réparation.

J’ai été contacté le 31 mai dernier aux alentours de 10h du matin. La personne au téléphone m’a calmement dit quelque chose du genre : “Bonjour. Nous avons remarqué que des liens vers votre site au sujet de notre entreprise étaient visibles depuis plusieurs moteurs de recherche. Je vous appelle donc juste pour vous indiquer que nous avons porté plainte ce jour auprès du commissariat. Ne vous étonnez donc pas de recevoir d’ici quelques temps un papier à ce sujet.”

La personne que j’ai eue n’avait en rien un ton belliqueux. J’avais le sentiment qu’on me prévenait effectivement juste pour que je ne sois pas surpris. Et c’est vrai qu’on trouve tout avec les moteurs de recherche

Après réflexion et au vu du fait que je n’ai encore aujourd’hui toujours rien reçu, je me demande si :

  • c’était bien quelqu’un de l’entreprise… En effet, puisque mes coordonnées sont facilement trouvables (mon portable, en l’occurrence), ça pourrait très bien être un plaisantin qui a voulu m’inquiéter ;
  • ce serait bien quelqu’un en lien avec la boîte, mais qu’on cherchait juste à m’intimider pour que je mette le billet incriminé hors-ligne (ce que je n’ai pas du tout, mais alors pas du tout, l’intention de faire, surtout étant donné ce que je vais expliquer au sujet des risques que j’encourre a priori).

Sur le coup, j’ai un peu stressé, je l’avoue. Mais pas non plus outre mesure. Je savais que je ne risquais normalement pas d’être accusé avec succès de diffamation : j’ai écrit ce billet en pensant aux nombreuses assignations en justice à la mode du moment. J’ai donc utilisé un ton familier tout en restant dans le descriptif pur et simple des faits qui se sont déroulés (et je précise, pour ceux qui se poseraient la question, que je ne me souviens pas avoir jamais retouché ce billet après publication).

Ce que j’ai fait

  • J’ai envoyé un mail à Bix qui connaissait la même mésaventure avec Hugues Rondeau. Celui-ci m’a répondu en me signalant que la prescription intervenait au bout de 3 mois, soit le 7 mai… Il m’a conseillé de faire un billet du présent sujet, ce que je fais aujourd’hui avec un peu de retard.
  • J’ai écrit à Maître Eolas qui m’a répondu qu’il ne consultait pas par mail, ce que je peux comprendre. J’imagine qu’il doit être harcelé par des mickeys dans mon genre plusieurs fois par jour…
  • J’ai appelé un ami avocat, à qui j’ai expliqué le problème. Il a commencé par me rassurer en disant qu’à son avis, ça n’allait pas aller bien loin. Je lui ai ensuite envoyé par mail le lien vers le billet en question, il a été encore plus catégorique après la lecture du billet : je reste factuel. Il m’a même conseillé de noter le numéro, la date et l’heure à laquelle j’avais été joint, au cas où ça recommencerait. En effet, si aucune plainte n’a réellement été déposée et que je recevais encore un coup de fil, on pourrait commencer à appeler cela du harcèlement, ou quelque chose du genre tentative d’intimidation (ça, c’est moi qui interprète ce que m’a dit mon ami, il ne l’a pas dit exactement comme ça :o)).

Aujourd’hui mardi 13 juin 2006

Bref, je n’étais déjà pas paniqué lorsque j’ai reçu le coup de fil. Aujourd’hui, encore moins.

En résumé : non seulement le contenu de ce que j’ai écrit ne semble pas pouvoir faire l’objet d’une plainte pour diffamation, mais en plus il y a prescription depuis maintenant plus de 4 mois, 3 mois et demi au moment du coup de fil et du potentiel dépôt de plainte…

J’ai fait ce compte-rendu pour vous tenir au courant, et pour que j’ai des informations un tant soit peu précises si l’affaire venait à resurgir d’outre tombe pour je ne sais quelle raison dans quelques temps.

Mail encoder

J’ai écrit une page qui vous permet d’encoder vos adresses email. Je l’ai fait parce que celle qui était auparavant disponible chez Olivier semble ne plus l’être.

Cette technique permet de réduire le nombre de spams reçus. Toutefois, bien évidemment, il ne s’agit en aucun cas d’une technique infaillible. Je parle bien d‘encodage et non de cryptage. Un robot un peu élaboré n’aura donc pas plus de mal à récupérer pouet@free.fr que %70%6f%66%40%66%72%65%65%2e%66%72.

Il s’agit en l’occurrence simplement d’une sorte de petite bidouille qui met seulement hors-jeu les robots collecteurs les moins élaborés. Et l’expérience semble montrer que la plupart des robots ne s’embêtent pas à tenter de récupérer les adresses encodées, il doit y en avoir déjà largement suffisamment qui ne le sont pas… Il existe un nombre important de façon de rendre plus difficile aux robots la récupération des adresses email. La technique en question d’encodage présente surtout l’intérêt d’être directement utilisable dans un lien mailto.

Ça me fait penser à autre chose : personnellement, lorsque j’écris une adresse au format texte, du style moi chez free point fr, je le fais en essayant d’utilisant des modèles pas trop standards, mélangeant les langues, at avec point, chez et dot, écrivant POWAIN au lieu de POINT lorsque le sérieux de l’endroit me le permet (e.g. pas sur un CV). Je vous conseille de faire de même si vous êtes paranoïaques. En effet, il semble envisageable d’écrire un programme qui récupère simplement tout ce qui ressemble à l’expression suivante : “(.*POINT)+CHEZ(.*POINT).*” ou quelque chose de ce genre afin de récupérer sur la toile un grand nombre d’adresses écrites dans ce format à la mode… Il serait peut-être intéressant d’écrire un pareil robot pour voir la faisabilité de la chose, mais ça me semble hautement faisable ^[1]^…

Notes

[1] Notez que je parle ici uniquement de prouesse technique, et en aucun cas je ne pense à cela dans le but de devenir un spammer professionnel. Je vous encourage grandement à ne pas le faire non plus dans ce but si vous ne souhaitez pas recevoir ma plus grande inimitié et celle de la plupart des internautes de la planète (cf. mon rêve de désouder un spammer)

Bashfr

J’avais vu plusieurs références à ce site^[1]^ lorsque des blogs “citaient des citations” qu’ils avaient particulièrement aimées, mais je n’étais jamais allé lire sur place. Depuis quelques jours, quand j’ai envie de rire un peu, je me rends sur ce site via un bookmark pointant directement vers une liste aléatoire de citations et je lis…

Je vous encourage à le faire, on ne s’en lasse pas !

Quelques morceaux choisis :

#2299

<mercobenz> je crois que le gaz fuit chez moi mais je sens rien\ <kirjap> allume un briquet\ <mercobenz> ouais bonne idée, si y a une grosse flamme c’est que oui\ <mercobenz> atoute\ <kirjap> MAIS NON REVIENS ABRUTI

#3003

Flo> Attention Pickpockets au Carrefour.\ Flo> J’ignore si beaucoup parmi vous font leurs courses chez Carrefour mais ceci pourrait vous être utile.\ Flo> Je vous envoie ceci pour vous prévenir d’une mésaventure qui m’est arrivée, étant donné que j’ai été la victime d’une arnaque alors que je faisais mes courses.\ Flo> Ceci s’est produit au Carrefour et peut vous arriver !\ Flo> Voici comment cela fonctionne : deux superbes jeunes filles vous abordent alors que vous rangez vos courses dans le coffre de votre voiture. Elles commencent par frotter votre pare-brise avec une éponge et du produit nettoyant, leur poitrine sortant littéralement de leur petit T-shirt.\ Flo> Il est presque impossible de ne pas y prêter attention.\ Flo> Alors que vous les remerciez et leur offrez un pourboire, elles le refusent et vous demandent à la place de les conduire dans un autre centre Carrefour.\ Flo> Vous acceptez et elles montent à l’arrière de votre voiture.\ Flo> En chemin, elles commencent à faire l’amour ensemble.\ Flo> L’une d’elles grimpe ensuite sur le siège passager et s’adonne à une fellation avec vous, pendant que l’autre vole votre portefeuille!\ Flo> Soyez donc vigilants ! Ceci peut vous arriver aussi …\ Flo> On m’a ainsi volé le mien vendredi dernier, samedi, deux fois dimanche, encore une fois mardi et à nouveau hier soir et j’y retourne demain.

#3254

<Akya> P’tin j’galère sur une synthèse de 3 pages à rendre pour vendredi… J’ai fait qu’un paragraphe.\ <Kamo> J’t’informe que vendredi c’est demain.\ <Akya> A rendre vendredi dernier…\ <Kamo> A tiens.. Et t’es en quel classe ?\ <Akya> 1ère ES\ <Kamo> A David d’Angers ?\ <Akya> Ouai pourquoi ? T’y es aussi ? Tu l’as rendu ? Tu peux m’aider ?\ <Kamo> Liz ?\ <Akya> Ouai oO T’es qui ?\ <Kamo> Karine Morreau, prof de sciences économiques et socials à David D’angers notemment pour les 1ere ES B, j’ai l’honneur de t’annoncer que tu as 0 à ton devoir Liz.\ [Quit Akya] : ( C’pas tout ça mais j’ai du taf moi..)

#3027

Macha : Bonsoir\ Chtiti : Bsr\ Macha : Comment ca va ?\ Chtiti : Komen va?\ Macha : ….\ Macha : Eh les gars, je crois que j’ai trouve un convertisseur SMS en ligne!!

Notes

[1] BashFr est un site qui stocke les meilleurs extraits de discussions ayant pris place sur l’IRC

Mise à jour en cours ou à mort les spammeurs...

Les quelques lecteurs qui suivent encore ce blog l’auront peut-être remarqué, je suis victime en ce moment, comme la plupart des utilisateurs de dotclear, d’un spamming affolant. J’ai eu le malheur de partir une semaine en vacances sans fermer les commentaires et les trackbacks et je suis revenu avec environ 1000 spams…

Bref, je suis en train de mettre à jour Dotclear vers sa dernière version afin de tenter de m’assurer la protection des derniers plugins anti-spam à la mode… Le problème c’est que je ne vois pas bien où tout ça va nous mener. Nous passons de plus en plus notre temps à lutter contre ce fléau.

Moi même, ces derniers temps, les seules opérations ou presque que j’ai eu à effectuer ont consisté à supprimer les spams (commentaires ou trackback). Très sérieusement, j’ai parfois des envies de meurtre, si je pouvais simplement désouder un spammeur de moyenne ou grande envergure là tout de suite, je crois que ça me soulagerait, un peu :-/. Enfin, j’y collerais bien une bonne grosse mendale à ces empafés, dirais-je dans un françois un tantinet plus châtié…

Pis là, à l’écriture de ce billet, d’un coup j’ai moyen envie de faire cette MAJ… La flemme. Bon, allez on y croit. Je vous tiens au courant.

UPDATE : OK, c’est fait. Et même je suis un fou, j’ai réactivé les commentaires et les trackbacks après avoir réinstallé la dernière version de spamplemousse. Peut-être que j’essaierai bientôt SpamClear afin de voir ce qu’il donne.

OS de merde...

Incapable de supporter des noms de fichiers ou de répertoires un peu long, obligé de faire des bidouilles infâmes pour contourner le problème (passer en DOS, zipper puis décompresser le répertoire gênant), pfff. Quel temps je peux perdre… Pittoyable.

CSS Naked Day

.

Promouvoir les standards du web… À quoi ressemble votre site sans CSS ?

De l'importance du nommage, état atteignable ou état invariant ?

Il y a quelques temps, j’ai eu l’occasion de rencontrer un cas qui m’a donné à réfléchir sur la signification des suffixes anglais able et ed. En l’occurrence, le cas portait sur une classe qui dérivait en Java de ArrayList qui s’appelait SortedArrayList.

Cette classe ajoutait la possibilité de tri à sa super-classe ArrayList. Elle possédait pour ce faire la méthode sort(), et c’est justement ça que je le lui reprochais.

Le suffixe able signifie qu’un objet peut atteindre un état, sans y être nécessairement constamment, par l’appel par exemple d’une méthode qui lui fera atteindre cet état à un instant t. Pour une propriété X, le sufixe ed signifie quant à lui qu’un objet est constamment Xed.

C’est peut-être un peu abstrait comme ça, je vais donc illustrer avec la classe SortedArrayList dont j’ai parlé ci-dessus.

Sort*able*ArrayList et non Sort*ed*ArrayList

Une classe en ed, comme sorted, est triée. Cela signifie qu’elle l’est constamment, en considérant un point de vue extérieur à l’objet : en interne, l’objet peut ne plus respecter l’état, mais au retour de la méthode, il doit y être revenu. Exemple : dans le corps d’une méthode add d’un conteneur trié, il peut se faire que l’objet soit non trié à un instant t, mais jamais au retour de la méthode add en question.

Toute action occasionnant une modification de son contenu doit laisser l’objet …Sorted trié à l’issue de l’opération. Par exemple, un add sur un SortedSet en Java n’a pas besoin d’être suivi par un tri pour qu’une itération ultérieure sur l’instance se fasse toujours dans l’ordre de tri.

À l’inverse, un objet suffixé par able est par exemple Triable et non Trié, ce qui n’est pas du tout la même chose. Ainsi, une classe nommée SortableArrayList possédera une méthode sort() et l’ajout d’un objet à cette liste pourra ne pas forcément garantir que l’objet soit constamment dans un état trié. Il sera alors possible d’appeler la méthode sort() pour rétablir l’état trié au moment voulu.

Quand utiliser able ou ed ?

C’est assez simple. Je dirais que ça peut d’ailleurs souvent être lié à des questions de performances. Il sera en effet certainement plus coûteux de chercher à maintenir un état particulier constamment si ce n’est pas absolument nécessaire. Auquel cas, il semblera alors plus approprié d’utiliser le suffixe able et la méthode permettant de revenir à cet état.

Si par contre, vous avez souvent, voire toujours besoin d’accéder à l’objet alors que celui-ci est dans l’état voulu, utilisez le suffixe ed pour que toute opération touchant à la structure de l’objet conserve l’état à son retour.

Introduction à l'objet

Je suis en train de jeter un oeil à un cours de Java pour ma culture. Dans la deuxième partie de ce cours, on part en vrille :-) :

Je vous laisse en exercice de trouver d’où vient ce cours. J’ai vérifié, c’est très facile avec Joujeule… Mais ne vous moquez pas trop vite, celui qui a créé ce cours sait très bien ce qu’il dit (enfin, le plus souvent, quoi :p).

Note pour Vincent : Oui oui, c’est bien notre foufou à nous… Tu auras de plus reconnu “Le Mal®”.

Mediawiki, utilisation d'un wiki en entreprise, coloration syntaxique avec GeSHI et pages secrètes

Depuis maintenant un peu moins d’un an, Mediawiki a été installé dans mon entreprise.

C’est un peu amusant, parce que je pense en être le principal instigateur, mais je ne peux pas le dire avec certitude. En effet, à l’époque, j’en parlais en effet souvent à celui qui allait devenir mon responsable aujourd’hui. Je discutais avec lui de toutes ces technologies, de tous ces outils modernes, connus ou moins connus, à la mode pour des raisons justifiées ou non.

Je lui parlai donc de ce qu’était un wiki, lui expliquai le principe. “Une bonne démo valant mieux que de longs discours”, ainsi pourrait-on détourner la formule consacrée, je lui montrai successivement ChuWiki, puis Mediawiki. Je me souviens que c’est à ce moment que, sentant que de l’intérêt était présent face à moi, j’ai beaucoup cherché des arguments me permettant de mieux défendre l’idée d’utiliser un wiki dans l’entreprise. Je cherchais surtout ces arguments pour convaincre si besoin les responsables de l’entreprise.

Pour moi, l’intérêt majeur d’un wiki d’entreprise réside dans la centralisation de la documentation. Toutefois, il ne fallait pas que le wiki impacte le processus de certification qualité en cours de mise en place, utilisant déjà largement word et ses modèles… Je défendai donc la pertinence du wiki pour ce que j’estime être sa plus grande utilité : la rédaction de toutes ces petites documentations, ces FAQ, qui devraient être utilisables et modifiables par tous, tout le temps. Mais aussi SURTOUT qu’on puisse être certain de disposer toujours de la dernière version d’une doc, ce qui est loin d’être trivial lorsque vous travaillez avec des gens qui ont pris l’habitude depuis longtemps de passer leur temps à s’échanger des fichiers word par mail. Personnellement, ma plus grande hantise lorsque je dois écrire une documentation avec un traitement de texte est de savoir où je vais bien pouvoir la mettre… Avec un wiki, je ne m’occupe que de choisir un nom de page qui exprime le plus clairement possible son contenu (sémantique, mon enfant, sémantique, ya qu’ça de vrai !), le stockage n’est plus mon problème.

Un jour, Lionel est revenu me voir en me disant : “Bon, la direction veut qu’on installe un wiki, rapidement.”. Je pense que ceci est arrivé parce qu’à l’époque, 01 Informatique commencait à en parler. Alors, comme ça faisait un peu plus “DSI-hype” qu’avant, on a eu carte blanche pour le monter. Dès la semaine suivante, la moitié du centre de développement était invitée à une présentation/formation sur le sujet, faite par Lionel, à laquelle j’ai assisté pour l’assister :-).

Formation Wiki

La formation devait partir de très loin. Une partie non négligeable des développeurs de l’entreprise utilisent encore leur navigateur de façon très épisodique, et ne connaissent que les outils qu’ils utilisent depuis longtemps. Il fallait donc parfois non seulement expliquer ce qu’est le code wiki, mais aussi montrer qu’on pouvait changer le nom par la barre d’adresse du navigateur, etc.

Cette formation avait évidemment pour objectif de présenter la philosophie générale d’un wiki, en plus de son utilisation. Ceci nous paraissait indispensable de présenter notre wiki de la sorte afin d’éviter que l’auditoire ne prenne par exemple le wiki pour un simple marque-page vers les documents word actuels ou futurs qui continueraient à être disséminés sur les serveurs de l’entreprise…

Coloration syntaxique avec GeSHI

Le wiki a continué à grossir et à prendre sa place. Il a été modifié très majoritairement par Lionel ou moi jusqu’à récemment. Les projets actuels ont fait que nous l’avons beaucoup utilisé pour documenter notre processus de développement J2EE. Nous mettons ainsi beaucoup de code Java et (X)HTML.

Plus cela allait, plus il nous apparaissait indispensable de chercher à ajouter la coloration syntaxique au wiki, afin d’améliorer la lisibilité des différents morceaux de code présents. J’ai donc cherché une solution et trouvé l’extension GeSHI pour mediawiki. En suivant précisément la documentation fournie, l’installation de l’extension prend 5 minutes maximum. Appliquez bien les bugfix spécifiés sur le lien ci-dessus.

La première question qui vient à l’esprit pour tout utilisateur de CSS est de se demander quelle est la forme du code généré par GeSHI. Et bien, c’est très propre. Par défaut, le code généré utilise les styles inline pour colorer le texte. Il est toutefois simplissime de modifier ce comportement. En lisant la documentation de GeSHI, on trouve l’appel à la méthode enable_classes(true).

Ajoutez simplement $geshi->enable_classes(true); avant le return de la fonction formatCode de l’extension et ça marche ! Après, il vous reste bien sûr à écrire le code CSS pour mettre la forme et les couleurs qui vous conviennent.

Note : J’ai essayé l’extension sur la dernière version actuelle (Mediawiki 1.5.5). Pour faire ça, j’ai dû migrer de la version 1.4.3 vers la dernière. Suivez la documentation de mise à jour à la lettre (notamment la mise à jour de latin1 vers utf8 si besoin, primordiale) si vous êtes dans le même cas que moi.

Ajouter un bouton pour encadrer votre code Java

J’ai voulu ajouter un bouton pour ajouter rapidement les balises <code type=“java”></code> autour du code sélectionné, à la manière de ce que permettent les autres boutons pour mettre en valeur, faire un lien, etc.

C’est très simple à faire :

  • Ouvrez le fichier EditPage.php et cherchez la fonction getEditToolbar().
  • Copiez-collez un bloc qui définit un outil, à la fin par exemple :
array( 'image' =>'button_hr.png',
                    'open'  =>   "\
\
",
                    'close' =>   '',
                    'sample'=>   '',
                    'tip'   =>   wfMsg('hr_tip'),
                    'key'   =>   'R'
                )

Et remplacez ce qui doit l’être pour faire ce que vous voulez :

array( 'image' =>'button_java.png',
                    'open'  =>   "<code type="java">\
",
                    'close' =>   '</code>',
                    'sample'=>   '',
                    'tip'   =>   wfMsg('codeJava_tip'),
                    'key'   =>   'J'
                )

Ceci fait, il vous reste deux choses à faire :

  • Ajoutez l’image que vous voulez pour faire votre bouton pour le code Java
  • Ouvrez le fichier de localisation correspondant à la configuration de votre wiki et ajoutez, derrière celle du hr_tip par exemple, la ligne :
'codeJava_tip'        => 'Code Java',

Ça y est, ça marche. Vous avez la coloration syntaxique et un joli bouton pour gagner du temps :-). Je vous laisse en exercice la manipulation précédente pour insérer un bouton pour du code XML :-).

Cacher des pages

Revenons à mon entreprise. Il a été question récemment de savoir où nous allions bien pouvoir stocker les mots de passe utilisables par notre équipe… Ça commence à faire du monde… Les utilisateurs/mots de passes de :

  • connexion ssh au serveur web du wiki ;
  • connexion phpmyadmin à la base mysql du wiki ;
  • connexion ssh au serveur cvs (oui, je sais, bientôt passer à svn, c’est dans le tube :p)
  • etc.

Étant donné que le wiki est devenu l’emplacement le plus logique pour nos documentations communes, j’ai naturellement pensé à utiliser des pages invisibles à d’autres que nous. Étant donné que nos comptes sont tous sysop, cela doit bien être possible sans trop d’efforts.

Après quelques investigations, il s’est avéré que c’était un peu moins simple que prévu, étant donné que ce n’est pas un comportement standard et intégré à mediawiki. En effet, il existe la possibilité de définir des pages en lecture seule, mais pas d’empêcher carrément la lecture. La raison énoncée est que ce n’est pas la volonté d’un wiki de permettre le masquage d’une partie de l’information. Toutefois, cette fonction est maintenue sous forme de patch pour certains contextes, tels qu’une entreprise, où ce type de page peut s’avérer très utile.

J’ai donc testé le patch en question sur mediawiki 1.5.5. J’ai utilisé le principe de namespace secret. Celui-ci fonctionne parfaitement. Si vous souhaitez mettre en place cette fonctionnalité sur votre mediawiki, voici une version raccourcie et simplifiée de la configuration à ajouter en fin de votre LocalSettings.php :

$wgExtraNamespaces = array(100 => "Secret", 101 => "Discussion_secrète");
$wgRestrictedNamespaces = array(100 => "namespacePriv", 101 => "namespacePriv");
$wgGroupPermissions['sysop']['namespacePriv']      = true;

Ces trois lignes définissent un namespace Secret (exemple : la page bonjour du namespace Secret s’appelle Secret:Bonjour) et sa page de discussion associée “Discussion secrète” (attention à enregistrer votre fichier en utf8 si vous voulez voir l’accent de secrète s’afficher correctement). Tous les utilisateurs appartenant au groupe standard sysop pourront voir et éditer ces pages.

Notons que le patch est bien fait : si vous n’êtes pas de ce groupe, vous ne verrez pas apparaître les modifications sur ces pages dans vos “Modifications récentes”. Ça peut paraître évident, mais heureusement toutefois que c’est fait afin d’éviter que des utilisateurs puissent avoir envie de hacker la lecture de ces pages en les voyant sans cesse dans les pages modifiées. Bien sûr, si un utilisateur qui n’est pas du bon groupe tape directement le nom d’une page cachée, il ne pourra tout de même pas la voir, donc tout va bien :).


Voilà, ce sera tout pour aujourd’hui. Je vous laisse passer une agréable fin de week-end et à bientôt.

Nouvelle sortie au Cap d'Agde

Aujourd’hui, dix kitesurfers toulousains motivés au Cap. Arrivés sur place, 5.5°C au thermomètre d’une des voitures :-).

Avant de m’arrêter, lorsque je revenais à pieds après avoir pas mal dérivé, à cause du fait que je ne sais pas encore remonter au vent, j’ai compté rapidement le nombre de planches-à-voiles et d’ailes de kite dans l’eau : une trentaine de planches et entre 10 et 15 kitesurfs.

Comme me l’a dit un habitué, quand on voit le monde qu’il y avait aujourd’hui par 6 ou 7°C, imaginez un peu le monde qu’il y a au printemps lorsque le temps est plus propice !

Le Cap d'Agde le 15 janvier
2006

Comme une boule de flipper

Entendu sur R&R. Pour ceux qui connaissent cette chanson de Corynne Charby, ça devrait au moins vous tirer un sourire :

Chui comme une couille de dauphinnn

Et bonne année, sinon :-).

Citation du jour

Mon chef, déconneur devant l’éternel, en train de lutter contre une erreur dans le développement d’une application Web J2EE :

Mais p****, pourquoi il trouve pas l’haricot dans le faisceau

faisceau => scope, haricot => je vous laisse trouver :-)

Puis, quelques minutes plus tard :

Nom d’un Form Bean !

Bon, je replonge… Ça va pas fort, moi :)

@ bientôt…

La fin du Logiciel Libre ?

Je reprends le titre utilisé par Bix dans ce billet sur la loi DADVSI.

Vraiment n’importe quoi. Pour ceux qui ne seraient pas convaincus des problèmes que peut occasionner cette loi, je vais essayer d’en illustrer avec deux exemples simples : un mondialement connu sur le code développé pour pouvoir lire des DVD sous Linux et un exemple beaucoup plus proche.

Problème

“toute personne contournant, de manière directe ou indirecte, un dispositif sera présumée coupable du délit de contrefaçon (3 ans de prison et 300.000 euros d’amende)“.

Voilà une partie de la loi sur le droit d’auteur et les droits Voisins dans la société de l’information qui concerne très clairement les exemples suivants :

Exemples

Jon Lech Johansen

Un cas très connu qui aurait été directement concerné par cette loi, c’est DVD Jon, un garçon qui voulait lire le DVD qu’il avait acheté avec ses sous, le salop… (Le Cinquième Élément je crois, pour la petite histoire).

Problème : ce jeune homme utilisait alors (et utilise encore) Linux et ne pouvait à l’époque pas lire le DVD puisqu’aucun lecteur ne disposait des codes de décryptage DVD (ce code s’appelle CSS comme Content Scrambling System)…

Passionné d’informatique, il a décidé de chercher à le lire quand même, a fini par réussir et a expliqué publiquement comment faire (je simplifie l’histoire). Pour faire cela, la seule solution existante est la rétro-ingéniérie (je vous laisse suivre le lien si vous voulez en savoir plus sur ce procédé).

Il a été attaqué en justice et cela a occasionné l’un des plus importants procès sur le sujet. Il a été relaxé entièrement le 7 janvier 2003. Il a gagné ce procès contre deux mastodontes, dont la MPAA… Mais l’utilisation de son outil permettant de lire les DVD sous Linux (appelé DeCSS) est pourtant toujours illégale dans certains pays…

Qu’aurait-il dû faire ? Est-ce que le législateur aurait osé lui répondre : “Hep, tu restes tranquille ! Tu achètes Windows, un logiciel de lecture de DVD et tout ce qui va avec hein !“. J’espère bien que non…

Enfin bref, tout ça peut paraître lointain. Si ça vous parait trop lointain, j’ai un exemple beaucoup plus proche

Moi

J’ai acheté à ma copine un double CD de Norah Jones. Après l’avoir acheté, j’ai aperçu un logo au dos du paquet indiquant (de mémoire, je ne l’ai pas sous les yeux) “Protégé contre la copie”.

J’ai payé ce CD. Je ne suis donc pas un voleur. Mais je le promet ici solennellement : si jamais il m’est impossible de le lire sur tous les appareils dont je dispose chez moi (un petit poste cd/radio/mp3, ordinateurs), je n’hésiterai pas une seconde à faire tout mon possible pour faire sauter cette protection afin de pouvoir lire ce CD QUE J’AI PAYÉ !!!.

Robin Nitot

Étant donné que j’ai laissé ce billet en attente depuis déjà un bon bout de temps. Deux ou trois semaines je dirais (cf. billet de bix en référence ci-dessus). J’en avais écrit une bonne partie, mais n’avais pas trouvé pris le temps de le finir.

Entre temps, Noël est arrivé et le fils de Tristan Nitot a eu droit pour Naouëlle à une toute moderne chaîne Hi-Fi, capable de lire des CD, des CD mp3 et tout et tout. Avec cette chaîne lui a été offert un double-CD… Je vous laisse lire la suite de l’histoire chez Tristan

Lecture non garantie sur tous les lecteurs

Une chose absolument incroyable est en train de se produire. Mais bien sûr, elle arrive tellement progressivement que nous ne nous en plaignons que faiblement. D’un standard ouvert grâce auquel il était pourtant initialement possible de faire qu’un CD^[1]^ soit lisible partout, nous sommes en train de parvenir à une aberration qui fait qu’il devient aujourd’hui de plus en plus courant de voir écrit sur les emballlages une mention “Lecture non garantie sur tous les lecteurs”.

Mon analyse du sujet

Eh oui, les CD soit disant protégés contre la copie le sont aussi souvent contre la lecture par un effet de bord inévitable : il est strictement impossible de permettre la lecture de quelque chose et d’en empêcher la copie. C’est logique : une chose que vous pouvez lire est forcément copiable. Tout procédé technique affirmant pouvoir l’empêcher est une blague.

Les “têtes pensantes” de l’industrie de la musique ont sans doute refusé de le croire pendant longtemps, et je pense que c’est cela qui a fait naître un grand nombre de procédés techniques “infaillibles”, cassés en quelques minutes par n’importe quelle personne disposant d’un lecteur CD, désireux de le lire, son CD, le salop (encore)…

Finalement, à force d’échecs sur le plan technique, il ne restait plus qu’une ultime solution : le plan légal.

Vous ne comprenez pas ? Vous allez voir, ce n’est pas compliqué : on vous colle encore un des nombreux procédés techniques de protection contre la copie, cassable techniquement en trois minutes, mais ce coup ci, c’est devenu clairement illégal de la contourner (3 ans de prison et 300.000 euros d’amende, cf. plus haut). Tout simplement génial, non ? Il fallait y penser, bravo à eux !

Mise à jour :

  • J’aime beaucoup cet article. Et pour ceux qui se poseraient la question, oui, il y a bien un lien de parenté.
  • Cet article chez Maître Eolas résume de façon hautement instructive et intéressante les débats de l’assemblée sur le sujet. Je suis d’ailleurs de ceux qui sont à 100% pour l’idée de la “licence globale”.

Notes

[1] Notez d’ailleurs que le nom Compact Disc est déposé et que son dépositaire (Philips, semble-t-il) refuse justement qu’il soit utilisé pour des disques mettant en œuvre un système de protection anti-copie. Il est donc théoriquement illégal d’utiliser le terme CD pour parler d’un disque protégé…

Kite surf ... Et Noël qui approche ...

Message personnel… :-)

Après cette sortie de samedi dernier qui s’est révélée être idéale (air ~ 15°C, eau pareil) bien couvert (intégrale 5/3 + gants + chaussettes néoprène), j’ai vraiment hâte d’y retourner pour progresser.

Justement, lorsque j’y retournerai… Eh ben pour ça, en ce moment, je pense à deux choses qui me seraient bien utiles pour le kitesurf, lorsque je m’y remettrai vraiment vers mars/avril prochain :

  • Un anémomètre (exemple), histoire de pas risquer une mauvaise session par une mauvaise appréciation de la vitesse du vent ;
  • Un DVD de cours sur le kite. En l’occurrence, le site a beau être en anglais, le DVD possède aussi la langue française ainsi que plusieurs autres.

Bref… À bon entendeur :)

Trompe moi l'œil

Avant de partir pour la journée faire du kite en Méditerranée, je voulais vous donner ce petit lien impressionnant sur des dessins en trompe-l’œil. Ce site est en Russe, donc je ne peux absolument pas vous dire ce qui s’y raconte :-).

Regardez notamment l’avant dernière photo puis la dernière pour voir à quel point l’artiste est fort pour donner l’impression de réalisme depuis le point de vue de l’appareil photo.

Se cultiver avec MSN

Salut à tous,

Un p’tit truc bien sympa avec MSN: Ajoutez encarta@conversagent.com dans vos contacts, c’est un robot qui répond à vos questions. Attention faut parler anglais!

Exemple:

Sylvain dit :\ how old is Jacques Chirac ?\ Encarta® Instant Answers dit :\ Jacques Chirac is 72 years, 11 months and 28 days old (born on November 29th, 1932).\ Sylvain dit :\ When JFK is dead ?\ Encarta® Instant Answers dit :\ John Fitzgerald Kennedy: death date: John F. Kennedy was shot and killed on November 22, 1963, in Dallas, Texas.

Surcharge ou redéfinition ?

Comme si un billet en appelait un autre :-).

Je suis en train d’effectuer la relecture de la traduction d’une documentation d’un framework Java très connu et je tombe sur une phrase qui me choque :

La classe identifiante doit surcharger equals() et hashCode() et implémenter Serializable

Je me dis que l’erreur vient peut-être de la version anglaise. Je vérifie immédiatement que non :

The identifier class must override equals() and hashCode() and implement Serializable.

Les équivalents anglais de surcharge et redéfinition sont overloading et overriding. C’est pourtant simple à se souvenir : overload contient le mot load, dont tout le monde sait, même les plus anglophobes, qu’il veut dire charge (ou charger, selon le contexte, bref).

Donc :

  • Overload => Surcharge
  • Override => redéfinition

Rappel

Surcharge (overload)

Il y a surcharge lorsqu’on utilise le même nom qu’une autre méthode, mais en changeant la signature des paramètres.

Exemple :

class MaClasse
{
   public void maMethode(int i) { ... }
   public void maMethode(float f) { ... }
}

Ici, la méthode maMethode est surchargée.

Redéfinition

On touche ici à ce qu’on appelle le polymorphisme. Un des apports de la POO qui permet d’appeler une méthode spécialisée dans une hiérarchie de classes. La redéfinition d’une méthode est étroitement liée à la notion de dérivation (ou d’héritage) et consiste à définir dans une sous-classe une méthode déjà définie dans une classe parente. La méthode en question doit posséder exactement la même signature, sinon ce n’est justement plus de la redéfinition, mais de la surcharge !

Exemple :

public class A
{
   public void direDesBetises()
   {
      System.out.println("Hey, ça foire fouille ?");
   }
}

public class B extends A
{
   public void direDesBetises()
   {
      System.out.println("Hey, vNr ?");
   }

   public void direDesBetises(String msg)
   {
      System.out.println("Alors, comme ça tu veux dire "+msg+" ?");
   }
}

Avec le code ci-dessus, le code main suivant affiche quoi d’après vous ?

public class Test
{
    public static void main(String args[])
    {
        A a = new A();
        B b = new B();      
        A ab = new B();

        a.direDesBetises();
        b.direDesBetises();
        ab.direDesBetises();
    }
}

Ici B.direDesBetises() est une redéfinition (override) de A.direDesBetises(). En plus, j’ai surchargé (overloaded) dans la classe B la méthode en question avec la méthode B.direDesBetises(String).

Résultat
baptiste@pumte:~/Temst$ java Test
Hey, ça foire fouille ?
Hey, vNr ?
Hey, vNr ?

Mon propos ici étant simplement de récapituler brièvement ce que sont surcharge et redéfinition en plus de rappeler la correspondance des termes français et anglais, je n’entrerai pas plus dans les détails. Si vous souhaitez en savoir plus, Vincent a par contre déjà écrit un article très complet sur le polymorphisme.

Citation

Vu à l’instant sur un forum de kite :

Comme on dit en pologne boire ou conduire : on a pas d’voiture.

:-)

Le Kitesurf... Ça déchire...

Bon, ben ça y est. J’ai acheté mon matériel de kite surf. Il me reste à acheter une ou deux ailes pour compléter mon quiver comme on dit dans le milieu :). J’avais décidé d’attendre l’année prochaine, après la superbe découverte lors du stage que je me suis offert cet été, pour m’acheter mon propre matos. Une bonne occasion a fait que les choses se sont un peu précipitées.

Je me suis donc acheté une aile Best Nemesis 14. Je cherche à m’acheter une seconde aile, certainement une yarga 9…

J’ai trouvé une sk8 d’occasion à 350€, en très bon état :

En cherchant, j’ai trouvé un regroupement de kitesurfers toulousains, les kt31. Ça devrait me permettre d’éviter d’avoir à naviguer seul. J’espère parvenir à aller essayer mon matos une fois d’ici peu et ensuite, ce sera certainement rangement pour hibernation en attendant le retour de la chaleur ou peut-être, qui sais ?, que je pourrai en faire dans les îles avant avril prochain ? :)

Je pars ce week-end dans le centre de la France. Je vais emmener tout ça et irai peut-être jeter un œil au lac de Sidiailles, dans le Cher, à côté de chez mes grands-parents ;).

En attendant, un lien vers un site plein de vidéos de kite. Celle qui me fait le plus vibrer en ce moment : Mark Shinn - Boosting. J’aime particulièrement la deuxième moitié jusqu’à la fin de la vidéo où le plan s’élargit et où on voit à quel point il s’envole et comme l’aile se déplace à toute vitesse par son contrôle !

Internet Explorer 8

Voter contre les brevets logiciels

Via le StandBlog, on trouve un lien vers un site qui nous permet de voter enfin pour donner de l’importance aux personnalités qui luttent contre les brevets logiciels en Europe.

Pour mieux comprendre : il s’agit en l’occurrence d’un vote qui n’a pas de rapport direct avec les brevets logiciels. C’est une sorte d’élection des personnalités qui ont marqué l’Europe en 2005 dans différents domaines. C’est un QCM pour lequel certaines des questions sont difficiles à répondre. Il y a une dizaine de questions. En gros, il y en surtout quatre qui sont importantes (où il faut indiquer Michel Rocard, José Luis Rodriguez Zapatero et Florian Mueller), dont une particulièrement.

Il s’agit ainsi de faire gagner Florian Mueller, de NoSoftwarePatents.com, pour la raison suivante :

Imaginez ce que cela signifierait si notre candidat recevait un prix hautement prestigieux dont Microsoft est l’un des sponsors, qui plus est à un gala présidé par un lobbyiste pro-brevets (Pat Cox), et s’il pouvait faire son discours de remerciement devant de nombreux commissaires européens et des chefs de gouvernement de plusieurs pays membres de l’Union européenne. Les dirigeants politiques européens n’auraient d’autre choix que de nous écouter comme jamais ils ne l’ont fait et la nouvelle se propagerait de par le monde. Florian a promis qu’il donnerait l’argent de la récompense à la FFII s’il gagnait.

Je pense que nous n’aurions pas forcément beaucoup de chances de gagner cette élection si elle n’était pas organisée sur Internet… Mais sur le net, nous pouvons gagner ! Donc, blogueurs, blogueuses, faites circuler l’information ! Trackbackez, commentez et faites que toutes vos connaissances votent pour Florian Mueller !

Merci de votre attention.

Makes me want to slap faces !

Completely stupid.

Watch out your buttocks, you dishonest morons…

Via Blog-and-blues/Standblog

EDIT : Pour la route, navigateur obsolète, va !

Harry Potter 6

Note : Don’t be afraid of reading this entry, I won’t say what’s going on in this episode, so as not to waste a part of your pleasure in reading…

Don’t try and find out now if you’re still not aware of it… As I am :-(. Even if this sixth is, as ever, a very enjoyable book to read apart from it. It’s thoroughly, woefully difficult to read it knowing this so very important thing those stupid guys pointed out (beginning at /., I think).

In fact, I’m reaching the 2 third (I’m not being precise on purpose) of the book and I know that something terrible is gonna happend, and it wastes a lot of my reading knowing it… What a pity… I will be infinitely more careful when the seventh comes out, so as to preserve my pleasure to discover this new, ‘cause I’m sure it will be too, wonderful story.

Renommer une série de fichiers avec des majuscules en minuscules

Un peu pour pour toi lecteur chéri, mon amour, mais surtout pour moi parce que j’ai souvent besoin de ça et que ça me fera un bon endroit pour retrouver l’info. Voici une petite commande très rapide pour renommer facilement un ensemble de fichiers possédant des majuscules de façon plus ou moins “désordonnées”.

Mon problème, en l’occurrence, est que IMG_3.jpg est différent sous Linux de img_3.jpg ou encore de ImG_3.jpg. Ce n’est pas très grave en soi, je préfère cette différenciation majuscules/minuscules. Mais lorsque tout n’est pas en minuscules, ou en majuscules, ça peut parfois être chiant : ma copine a un répertoire de photos, listées sous windows. Je suis censé avoir les mêmes, mais il semble m’en manquer une parce qu’elle en a 76 et moi 75… Alors, je trie par ordre alphabétique les photos… Le problème c’est que A vient après le z et non après le a sur mon système, contrairement à windows qui trie sans regarder la casse.

Un peu chiant pour comparer une liste de photos à l’oeil nu, vous en conviendrez. Donc, je me décide à renommer d’un coup toutes les photos de mon disque (au nombre de 1700 actuellement). De toute façon, ça fait longtemps que je le prévoyais, je préfère : ce sera plus homogène.

La commande qui permet de faire ça d’un coup d’un seul :

$ rename 'y/A-Z/a-z/' *

Comment savoir quel processus utilise telle socket ou tel périphérique

Plusieurs commandes permettent de répondre à cette question.

Netstat

J’utilise en général la commande netstat -ntap pour voir quels sont les ports ouverts. La dernière colonne indique quels sont les noms des programmes qui utilisent les ports. Vous devez lancer cette commande en tant qu’utilisateur root, sinon vous n’aurez pas les droits pour savoir quels sont tous les processus en jeu.

Exemple :

$ netstat -ntap
(No info could be read for "-p": geteuid()=1000 but you should be root.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:1476            0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN     -
tcp        0      0 10.31.99.3:3306         0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:1099            0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:81              0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:8083            0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     -
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:8090            0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:33370           0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:8091            0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:33371           0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:33372           0.0.0.0:*               LISTEN     -
tcp        0      0 0.0.0.0:4444            0.0.0.0:*               LISTEN     -
tcp        0    248 10.31.99.3:22           10.31.0.162:2301        ESTABLISHED-
tcp        0      0 10.31.99.3:22           10.31.0.162:4268        ESTABLISHED-

En lancant la commande en étant *root* :

$ sudo netstat -ntap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:1476            0.0.0.0:*               LISTEN     11485/java
tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN     11485/java
tcp        0      0 10.31.99.3:3306         0.0.0.0:*               LISTEN     11969/mysqld
tcp        0      0 0.0.0.0:1099            0.0.0.0:*               LISTEN     11485/java
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN     11485/java
tcp        0      0 0.0.0.0:81              0.0.0.0:*               LISTEN     5614/apache2
tcp        0      0 0.0.0.0:8083            0.0.0.0:*               LISTEN     11485/java
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN     2034/xinetd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     968/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     838/exim4
tcp        0      0 0.0.0.0:8090            0.0.0.0:*               LISTEN     11485/java
tcp        0      0 0.0.0.0:33370           0.0.0.0:*               LISTEN     11485/java
tcp        0      0 0.0.0.0:8091            0.0.0.0:*               LISTEN     11485/java
tcp        0      0 0.0.0.0:33371           0.0.0.0:*               LISTEN     11485/java
tcp        0      0 0.0.0.0:33372           0.0.0.0:*               LISTEN     11485/java
tcp        0      0 0.0.0.0:4444            0.0.0.0:*               LISTEN     11485/java
tcp        0    148 10.31.99.3:22           10.31.0.162:2301        ESTABLISHED6839/1
tcp        0      0 10.31.99.3:22           10.31.0.162:4268        ESTABLISHED11874/0

lsof

L’avantage de cette commande est qu’elle n’est pas limitée aux sockets. Elle s’occupe de tout descripteur de fichier. De la même façon que pour netstat, vous devrez lancer cette commande en root pour pouvoir connaître les utilisateurs de tout descripteur.

Je fais tourner un apache2 sur le port 81 de la machine sur laquelle je travaille. Pour utiliser lsof avec les sockets, voici la commande à utiliser :

$ sudo lsof -i :81
COMMAND  PID     USER   FD   TYPE DEVICE SIZE NODE NAME
apache2 5614     root    3u  IPv4  13850       TCP *:81 (LISTEN)
apache2 5628 www-data    3u  IPv4  13850       TCP *:81 (LISTEN)
apache2 5631 www-data    3u  IPv4  13850       TCP *:81 (LISTEN)
apache2 5632 www-data    3u  IPv4  13850       TCP *:81 (LISTEN)
apache2 5633 www-data    3u  IPv4  13850       TCP *:81 (LISTEN)
apache2 5639 www-data    3u  IPv4  13850       TCP *:81 (LISTEN)
apache2 7572 www-data    3u  IPv4  13850       TCP *:81 (LISTEN)
apache2 7586 www-data    3u  IPv4  13850       TCP *:81 (LISTEN)

Je pense que ce sont tous les processus/threads qui peuvent accéder à la socket qui sont montrés. Cette commande reste donc toutefois très utile pour avoir une réponse exhaustive à la question “qui utilise ce port ?” lorsque vous voulez le savoir.

Là, j’ai choisi un port pour lequel peu de lignes sont affichées. Pour information, je fais aussi tourner un serveur J2EE JBOSS sur le port 8080, et lorsque je lance la commande sudo lsof -i :8080, le résultat fait 59 lignes…

Je préfère donc netstat qui offre une réponse plus synthétique, ce dont j’ai le plus souvent besoin.

Liens externes

Article sur AJAX dans 01 Informatique

En général, j’abhorre ce magazine et son contenu. Je le trouve souvent creux et uniquement destiné à permettre aux DSI de se faire mousser aux réunions en faisant un Buzzword Bingo.

J’ai trouvé que cet article sur AJAX était plutôt mesuré, à l’inverse de l’énorme buzz à propos du “Web 2.0” que dénonce actuellement dans la blogosphère un grand nombre de personnes : Laurent, François, TC, LaurentJ, ….

Preuve en est l’analyse du journaliste en conclusion de l’article :

Du coup, certains s’emballent. Ils voient dans la nouvelle technique Ajax le modèle de développement de tous les types d’applications client dans une architecture orientée services (SOA). La technique semble pourtant loin d’être mature. Alors, simple battage médiatique ou début de révolution ?

Le fils de Villepin

Allez Daniel, rions un peu… Même si ça me désole aussi, cette image m’a bien fait marrer.

Publications

Ça faisait longtemps que j’avais préparé ces documents, mais je n’avais pris eu le temps de les mettre en ligne. Voici donc erreur réparée.

Je mets donc en ligne trois documents techniques traitant de sujets différents :

  • Des études techniques Java/J2EE (150 pages, 4Mo). Ce document a été produit cette année par notre équipe pour le projet de GL. Il étudie un panel assez large d’outils potentiellement utiles pour les besoins de notre projet. Vous constaterez que les niveau d’études de chaque technologie n’est pas homogène. Je pense toutefois que ces études pourront servir à du monde.

  • Le rapport (400Ko) et le code pour le projet du cours de Modélisation Des Réseaux sur DiffServ, un protocole de gestion de QoS. J’ai travaillé avec Vincent sur ce projet, dont le code Tcl nous a pas mal fait chauffer les neurones :-). Le code en question est fait pour fonctionner avec l’outil de simulation Network Simulator, aussi connu sous le nom de ns. (repository subversion du projet)

  • Un compte-rendu de TP d’initiation à la sécurité des réseaux (25 pages, 400Ko, exercices pratiques sous GNU/Linux). Je parle d’initiation parce qu’on ne peut pas se prétendre compétent en ayant lu et vu que cela, mais quelques informations contenues dans ce document sont toutefois très intéressantes.

Tous ces travaux ont été réalisés pendant ma troisième année d’école d’ingénieurs chez Ingénieurs 2000 dans la filière Informatique Réseaux.

Les extensions de Firefox

Comme Batmat ne poste plus beaucoup en ce moment, je vais reprendre la main et j’vais vous parler de mes extensions Firefox préférées :

  • Google Pagerank Status dont Batmat a parlé, il y a quelques mois. Même si c’est limite légal. C’est quand même bien pratique.
  • Color Zilla qui permet de récupérer les indices RGB d’une couleur affichée sur une page. Mais surtout, une fonctionnalité que je trouve bien pratique : un zoom qui zoom tout même les images.
  • Live HTTP Headers pour afficher les entêtes HTTP échangées avec les serveurs web.
  • Copy Plain Text pour copier du texte brut sans formatage. Très utile pour copier des textes dans Open Office ou autres.
  • IE View pour afficher une page dans Internet Explorer. Houhououhou!!! Oui je sais mais bon quand un site passe pas sous Firefox ça évite d’avoir a faire un copier-coller de l’adresse dans IE. Un simple clic et hop le méchant IE s’affiche avec la page désirée.
  • Mouse Gestures pour lancer des commandes à la souris en dessinant dans la fenêtre (comme dans Opéra). C’est bien marrant et puis ça peut parfois aller plus vite que les raccourcis clavier.

Pour ceux qui sont intéressés, toutes ces extensions sont dispo sur le site geckozone. Bon je sais ça fait un peu pub comme ça, mais non, je ne suis pas rémunéré par la fondation Mozilla.

PS: pour ceux qui sont pas au courant la version 1.0.7 de Firefox est dispo… non, non puisque j’vous dis que je touche rien !

L'école est finie

Ce billet chez mauriz me fait songer au fait que j’entame aujourd’hui une nouvelle étape de ma vie… Je me lève certes pour aller encore travailler au même endroit que ces trois dernières années, à la différence que j’y vais à partir d’aujourd’hui non plus comme apprenti mais comme ingénieur en CDI.

Malgré le fait que je vais pourtant “simplement” continuer dans les premiers temps le travail en cours, je me sens un peu bizarre ce matin :-).

Debian, combien ça coûte ?

Dans la même verve que ce billet dans lequel je vous parlais du noyau Linux estimé à 650 millions de dollars s’il fallait le redévelopper à partir de rien, on apprend cette semaine, dans la DWN, le coût estimé de la distribution Debian :

La valeur de Debian GNU/Linux. Le document Measuring Libre Software étudiant la taille des paquets source dans Debian 3.1 calcule la taille de Sarge (presque 230 millions de lignes de code source), l’utilisation des divers langages de programmation dans lesquels sont écrits les logiciels et la taille des paquets inclus dans la distribution. Il estime également le coût d’une création telle que Debian en partant de rien avec une méthode de coût reconnue (COCOMO) à plus de 8 milliards de dollars américains.

OOo que c'est beau

Pour faire patienter les millions de lecteurs de ce blog, un petit plaisir parce que je n’ai pas le temps d’écrire de plus longs billets :-).

Je passe demain à 14h ma soutenance de mémoire d’ingénieur. Après ça, fini les études. J’ai en effet réfléchi et je ne continuerai finalement pas en DEA master 2 de recherche.

Bon, TC n’en a pas voulu alors je le mets ici. Vous allez voir, c’est fin, ça se mange sans faim :) :

All we are is kite in the wind...

Aile de traction (kite
surf) ”)

Citation

Mon frère vient de me citer une phrase de Tomer Sisley sur la calvitie :

Au début, on se rend pas compte tout de suite qu’on devient chauve, on se dit juste qu’on passe beaucoup plus de temps à se laver le visage.

Bibi, la réponse à tous vos soucis

Tsunami : Pas de trace d'animaux morts au Sri Lanka

Les responsables sri-lankais de l’environnement n’en reviennent toujours pas: le pire raz-de-marée qu’ils aient jamais connu a fait des dizaines de milliers de morts, mais nulle trace de cadavres d’animaux.\ […]\ “Aucun éléphant n’est mort, on n’a même pas retrouvé un cadavre de lièvre ou de lapin. Je pense que les animaux peuvent anticiper ce genre de catastrophe. Ils ont un sixième sens. Ils le savent à l’avance.”

Source

Il serait intéressant de savoir si le même phénomène, à savoir que les animaux auraient pressenti la catastophe, s’est produit dans la catastrophe provoquée par Katrina.

Roulette bashienne

Trouvé sur le net comme signature, j’aime beaucoup :

$ (("RANDOM%6")) || rm -rf ~

UTMB, Allez Cyril !

Bon courage à mon “tuteur ingénieur” Cyril KLEIN (il l’est encore pour un peu plus de deux semaines :-)). Il prend dans un peu moins de 2 heures le départ de l’Ultra-trail du Mont-Blanc

faire le tour du Mont-Blanc en individuel en une seule étape !

26 - 28 août 2005 \ 3 pays - 155 km - 8 500 m de dénivelé positif \ 2000 coureurs au départ vendredi 26 août à 19h00

L’année dernière, il l’a déjà fait et a tenu jusqu’à Courmayeur, à 71km du départ. Il a couru 17h et a arrêté.

Quelques témoignages de coureurs qui se sont arrêtés avant la fin l’année passée.

Ça donne vraiment envie, mais en même temps il faudrait peut-être déjà que je commence par un marathon avant de songer une seconde à ce genre de trucs :-). Sinon, pour rester dans l’ultrafond, allez donc jeter un œil à ce qu’est la Badwater : une course de 250km dans la vallée de la mort aux États-Unis…

EDIT : pour suivre les pointages, c’est . Il a été pointé au refuge Elisabetta qui se situe à 57,5km du départ à 8h42. Il faut savoir qu’il y a un temps limite de 45h pour faire la boucle de 155km. Je ne sais pas combien de temps il va mettre jusqu’à Courmayeur, mais je suppose qu’il va être plus à l’aise maintenant qu’il ne va plus devoir courir dans le noir (enfin, jusqu’à ce soir…).

EDIT2 : 10h33, arête Mont-Favre. Il vient de faire 500m de denivelé positif

EDIT3 : 12h11, Courmayeur, 72km. Ça y est, le voilà revenu au même point que l’année dernière avec le même temps : 17h10 ! Il s’est arrêté là l’année passée, je pense donc que s’il ne termine pas la boucle complète, il va au moins aller plus loin que Courmayeur. Attendons le prochain pointage :-).

EDIT4 : 15h05, il vient de passer au refuge Bertone, 76,9km. Il lui reste donc un peu moins de 4h pour manger encore 12km avec près de 500m de dénivelé positif pour atteindre Arnuva s’il veut pouvoir continuer (temps limite 19h)… 4h pour faire 12km en temps normal, c’est de la rigolade. Mais après 20h de course ? :-) Allez, continue !

EDIT5 : Il est passé à Arnuva à 18h35, soit avec 25 minutes d’avance sur l’heure limite. (Je me demande s’il n’y a pas un problème de décalage horaire d’une heure parce qu’il est 19h35 et que je viens de lire que l’heure limite d’Arnuva était 20h et non 19). Bref, il a déjà fait 88km et il attaque un tronçon de 5km avec un denivelé de presque 800m après 23h de course… Après ça, une longue descente s’annonce.

Pour mieux comprendre ce dont je parle, j’ai récupéré l’image sur le site. J’espère qu’ils ne m’en voudront pas, mais je la mets sur batmat.net pour éviter d’aller leur générer du trafic à cause de moi :

profil topographique, oui je crois que c'est comme ça qu'on
dit :-p

EDIT6 : Ça y est, pointé à 21h47, il s’est arrêté à La Peulaz après 26h de course et 96km parcourus autour du Mont-Blanc. Il semble qu’il ne finira pas cette année, sûrement l’année prochaine ? :-)

EDIT7 : Cyril m’a expliqué qu’après avoir couru 6h sous la pluie, lui et son camarade sont arrivés très limite sur le temps à La Peulaz. Avec la pluie et la nuit tombée, il leur a été fortement conseillé d’arrêter parce qu’ils ne pourraient de toute façon pas arriver avant l’heure limite à La Fouly…. Ils se sont donc inclinés devant la raison, avec toutefois beaucoup de tristesse car ils étaient encore ok physiquement pour continuer… Comme m’a dit Cyril de là bas depuis son blackberry “Faudra revenir…” ;-)

Rouler moins vite consomme vraiment moins ?

Je me pose cette question depuis que je suis enfant. Aujourd’hui, j’ai grandi et je ne suis toujours pas convaincu.

Certes, il est d’une évidence implacable que rouler 10 minutes à 130km/h fera plus consommer que de rouler à 100.

Mais la question pour moi n’est pas là et elle n’est de toute façon jamais là : on ne roule pas 10 minutes pour se faire plaisir (sauf quand on est complètement con et que la ballade du dimanche correspond à aller se promener pendant quelques heures en voiture…).

On roule pour se rendre quelque part. On y arrivera donc plus vite si on roule plus vite, et on aura roulé moins longtemps… Vous voyez où je veux en venir ? Je suis conscient que la courbe de la consommation d’un véhicule en fonction de sa vitesse n’est certainement pas linéaire, prenons donc en exemple des vitesses standards pour un véhicule d’aujourd’hui :

Allez, un peu de maths (je vais essayer de ne pas faire d’erreur de calculs). Pour faire simple, disons que je dois aller à un endroit distant de 100km.

  • À 100km/h, je mettrai 1h.
  • À 130km/h, je mettrai 0.76h, soit 46 minutes.

Au total, j’aurai donc roulé 14 minutes de moins. Le fait que j’ai roulé près de ¼ du temps en moins ne peut-il pas compenser le fait que j’ai effectivement consommé plus à la minute ?

J’ai essayé de trouver sur Internet un tableau indiquant par exemple combien de litres consomme ma clio en fonction de la vitesse, mais je n’ai pas trouvé et je n’ai donc pas pu répondre moi-même à la question ci-dessus. Quelqu’un peut-il m’aider ?

La direction prend les devants

J’aime :-)

Hier :

Aujourd’hui :

Blogologismes

Via pointblog.com.

Rien ne va plus, comme le dit le premier commentaire du sujet, c’est incroyable à quelle vitesse l’adoption de nouveaux termes peut aller dans la blogosphère…

Moi ça m’amuse, alors les revlà ici. Nouvelle leçon à apprendre :-) :

Pfiouuuu, mais jusqu’où nous arrêterons nous ?

Footage de gueule ?

Énorme !!!

EDIT du 08/09/2005 : Bon, j’ai bien fait d’aller vérifier la cible du lien. Heureusement que j’avais fait une capture d’écran pour conserver ça à la postérité :-D :

Votre interlocuteur est absent, veuillez rappeler ultérieurement...

Bon, comme je n’ai pas le temps de rédiger un véritable billet vous racontant mes lonnnnngues vacances, je vous dis un peu où j’en suis pour le temps à venir.

J’hésitais à poursuivre mes études en Master 2 Recherche SLCP, anciennement DEA auquel je suis admis. Après une lonnnnngue réflexion, je pense que je ne vais pas le faire et plutôt travailler. En même temps, je dis ça, mais je n’exclue pas à 100% de vous dire le contraire la semaine prochaine si de nouveaux arguments valables se présentent à moi :-).

Côté recherche d’emploi donc et pour faire suite à ce billet, voici un peu l’état des lieux :

  • Contact d’une vingtaine d’entreprise depuis que j’ai mis mon CV sur *Monstre&Cie* :-p (mail, téléphone, pigeon voyageur, chouette) ;
  • Au vu de ma disponibilité “seulement” au 19 septembre, quelques-unes m’ont dit qu’elle me rappelerait plus tard ;
  • Quatre entretiens effectués (dont un téléphonique depuis Oléron, lieu de mes 3 premières semaines de vacances sur 4) et deux autres prévus la semaine prochaine ;
  • Quelques propositions en passe d’être officialisées de la part de SSII et peut-être de ma boîte actuelle (sachant que j’ai décidé de mettre systématiquement les CDD de côté, puisque des CDI sont possibles à plusieurs endroits) ;
  • Un salaire aux alentours de 30-34k€ pour commencer (brut/an, évidemment), soit un peu moins qu’à Paris, puisque je suis à Toulouse… ;
  • 90% de chances que ça soit pour bosser dans du Java/J2EE, toutes boîtes confondues :-).

Sinon, côté extra-pro :

  • Je compte me mettre sérieusement au kite-surf, sport que j’ai découvert cet été grâce à un stage que je me suis offert, je vous en reparlerai ;
  • J’ai commencé un teasing il y a de ça maintenant presque 2 mois, ça fait maintenant un peu pétard mouillé :-). Je reviendrai dessus, mais il s’agit en fait de mon espace rédacteur chez developpez.com pour lequel j’ai adapté un article du présent blog.

Pour finir, l’école :

  • Ben je dois finir de rédiger mon mémoire d’ingénieur d’ici le 29 août et c’est loin d’être fini, voilà pourquoi je me force à ne pas passer mon temps à rédiger des billets :-) ;
  • Soutenance dudit mémoire le 12 septembre à 14h à l’école (Bâtiment Copernic de l’UMLV, pour ceux qui connaissent) ;
  • Paf fini, l’école d’ingénieurs. Il ne restera ensuite plus qu’à recevoir le diplôme Informatique Réseaux pour lequel nous avons tant souffert durant ces 3 années. À propos de la souffrance des études, je pense que c’est aussi un point sur lequel je reviendrai.

Voilà, je pense que ce sera tout d’ici le 29 août.

Supprimer le suffixe de votre adresse de weblog

Si vous souhaitez que l’adresse de la racine de votre blog soit bien http://www.monblog.com et non http://www.monblog.com/blog (ou blog.php ou même dotclear/), il y a plusieurs techniques. Nous avions eu une discussion à ce sujet avec Vincent il y a quelques temps de cela. Notre discussion nous a conduit à utiliser tous les deux la même solution, trouvée de manière collaborative :-).

Les méthodes

Il y a donc deux méthodes :

  1. Faire dans un fichier index.php un include('blog.php');. Ça marche très bien, mais ça a tout de même un inconvénient : cette méthode est coûteuse en ressources parce qu’elle demande au moteur php d’ouvrir un fichier supplémentaire pour en lire le contenu afin de l’envoyer au client. L’avantage de cette solution réside toutefois dans le fait que cette solution est extrêmement simple à mettre en œuvre et qu’elle devrait fonctionner partout où php fonctionne.
  2. Comme vous vous en doutez : utiliser un .htaccess. Pour ceux qui l’ignoreraient encore, ce fichier permet de passer des directives au serveur Web Apache. On peut ainsi changer la majorité des comportements configurés dans le httpd.conf. On peut notamment modifier la primordiale DirectoryIndex, c’est cette directive qui indique au serveur Web dans quel ordre il doit rechercher les noms de fichiers dans le cas où celui-ci n’est pas précisé (typiquement, lorsque vous tapez http://batmat.net au lieu de http://batmat.net/blog).

Souvent DirectoryIndex est configurée avec quelque chose comme ça :

DirectoryIndex index.php index.html index.shtml
Le but

Rappelons le au fait, parce qu’on finirait par l’oublier : je voudrais bien que lorsqu’un utilisateur tape http://batmat.net il voit bien mon blog. Évidemment, il n’est plus question d’utiliser ici une simple redirection transformant automatiquement l’adresse en http://batmat.net/blog/. Non, je veux que l’adresse tapée ne change pas et que http://batmat.net et http://batmat.net/blog présentent le même contenu.

Solution

Si vous avez suivi le rôle de DirectoryIndex expliqué ci-dessus, vous avez sûrement déjà trouvé la solution : on va ajouter un .htaccess à la racine qui va contenir la ligne suivante pour demander à ce que blog.php soit affiché par défaut lorsque l’adresse racine est demandée :

DirectoryIndex blog.php
Bug et vraie solution

Comme vous le verrez, cette solution fonctionne très bien pour la racine. Mais si vous commencez à cliquer sur les liens vers des sous-répertoires, vous risquez d’avoir des surprises : vous ne verrez parfois plus les fichiers que vous pensez pointer, mais seulement un listing du répertoire qui le contient.

Pourquoi ?

Très simple : via la directive DirectoryIndex, vous avez changé le comportement global du serveur Web. Une chose très importante à savoir est que les .htaccess s’appliquent de façon récursive, c’est à dire que si vous fixez une règle dans un répertoire, tous les sous-répertoires verront cette règle leur être appliquée.

Donc, vous venez de changer le fichier de base, du classique index.php ou index.html au _blog.php_ : si un répertoire ne possède pas de fichier blog.php, la règle habituelle de listing du répertoire sera appliquée.

Mais alors nous sommes fichus ?

Bon sang de chybronhuitre à la muuu^[1]^ ! Mais qu’allons-nous deviendre ?

Ne vous en faites pas, les plus rapides auront déjà trouvé une solution très simple : on ne doit pas seulement mettre blog.php, ce qui correspond à remplacer tous les noms de fichiers indiqués dans la directive DirectoryIndex du fichier httpd.conf, mais plutôt préfixer la liste classique avec blog.php. Ce qui donnera :

DirectoryIndex blog.php index.php index.html

Voilà, ce sera tout pour aujourd’hui.

Je pars en congés mercredi jusqu’au 15 août. Je vais pouvoir enfin reprendre ma dose de volley. Vous n’aurez donc peut-être plus de nouvelles de ma part d’ici là :-). Je reviendrai en pleine forme pour traiter tous les billets que j’ai à l’esprit et que j’ai mis en attente par manque de temps, notamment en raison de la rédaction de mon mémoire d’ingénieur que je devrai rendre peu après mon retour de congés :-\.

Bref, bonnes vacances à tous :-).

Notes

[1] private joke

Un article honteux sur les attentats de Londres

Via Bix qui relaie Loïc, on apprend à l’instant qu’un brillant reporter de Fox News a publié mercredi un article inadmissible qui dit en substance : “C’est con que les attentats aient eu lieu à Londres. Ça aurait été beaucoup mieux à Paris, ça les aurait calmé ces gros cons prétentieux de français”…

Paris was exactly the right place to pick and the Olympic committee screwed up.

Why? Simple. It would have been a three-week period where we wouldn’t have had to worry about terrorism.

First, the French think they are so good at dealing with the Arab world that they would have gone out and paid every terrorist off. And things would have been calm.

[…]

It would have been a delight to have Parisians worried about security instead of New Yorkers. It would have been exquisite to watch.

But, alas, they picked London. I like the Brits. I like London. I hate to see them going through all this garbage when it would have been just fine in Paris.

Je pense qu’il n’est pas indispensable de traduire, d’autant que Loïc l’a déjà fait si vous avez vraiment du mal avec l’anglais…

Un peu énervé, j’ai écrit à l’adresse email en bas de l’article ce mail amical au journaliste :

http://www.foxnews.com/story/0,2933,161750,00.html

You’re insulting all the dead londonian people, you stupid thing. You’re doing a thing that really proves you’re racist and completely brainless. You’re saying that it would have been fine to kill somebody else ! Do you realize it ? Nobody should die from terrorism, no french people thinks there’s people who would be best at dying than others.

It’s tempting, but I won’t play your game saying you’re like all americans, ‘cause you’re not. You’re only one particularly big git, which I am sure a lot of americans will be ashamed of.

Sucker.

Mais dans quel monde vit-on ?

[Mise à jour 17h20]

Comme le dit Bix, nous nous serions peut-être un peu vite emportés, parce que justement, bête que je suis, il a écrit ça mercredi alors que les attentats n’avaient pas encore eu lieu. Nous lui aurions donc prêté des idées ou intentions qu’il n’avait pas ?

Que nenni ! Ce fier crétin bunniesque nous donne raison avec l’édition d’hier, après les attentats donc, où il en remet une couche :

The bombings in London: This is why I thought the Brits should let the French have the Olympics (search) — let somebody else be worried about guys with backpack bombs for a while.

En français :

Les bombes à Londres : Voilà pourquoi j’ai pensé que les anglais devraient laisser les français avoir les JO. Laissons quelqu’un d’autre s’occuper des mecs avec des bombes dans leurs sac à dos pour un petit moment.

Très bonne nouvelle : les brevets logiciels sont enterrés en Europe !

Je viens de l’apprendre via le standblog, via Tristan, Le Monde nous annonce la meilleure nouvelle de l’année : “Le Parlement européen a enterré la directive sur le brevet des logiciels”}.

En attendant, c’est le blackout complet sur le serveur de la ffii :

Webserver overloaded - back online soon

For FFII wiki editors: you can still view/edit pages by using the admin interface (e.g by using http://wiki.ffii.org/admin.cgi?PageName). I can make static versions of important pages.

Après une mauvaise nouvelle au sujet des JO, une très bonne nouvelle pour rattraper le coup aujourd’hui.

Ça me met de bonne humeur tout ça :-)

[Mise à jour : 8 juillet]

Mon eurodéputé préféré nous raconte le vote depuis l’intérieur. Alain Lipietz a depuis longtemps milité contre les brevets logiciels et j’avoue que c’est le genre de personnes dont l’opinion, le combat et le style de communication (weblog) a tendance à faire pencher mon bulletin de vote vers elles…

Merdâââââsse

Dans le même esprit que la Veuve Tarquine… Bon sang de nhuitre, déception tion tion ! Chier même :-(

Pour plus d’infos.

Ma vision du Libre

Ce billet est en gestation depuis très longtemps. Il vient d’être finalement déclenché par un acte que je juge totalement inadmissible. Thomas vient de mettre au jour un splendide plagiat réalisé par le Club des Utilisateurs de Logiciels Libres Tunisiens du livret du libre

Les membres de ce GUL ont ici violemment enfreint une règle primordiale du LL. Comment peut-on se prétendre ami du Libre et oser écrire “Le Livret du Libre est un document rédigé par le ..::CULLT::.. dans le cadre de son projet pour le Libre” sans aucune indication du véritable auteur original. De sombres voleurs sans vergogne, c’est tout ce que vous êtes !

J’ose espérer qu’ils corrigeront très vite leur erreur en s’excusant et en indiquant par exemple dans les références l’adresse du document original, avant de s’attirer l’inimitié de toute la communauté.

Comme dit Éric Raymond :

People who do what the GPL tries to prevent […] wind up injuring only themselves.

en français :

Les gens qui font ce que la GPL essaie d’éviter […] se tirent eux-mêmes dans le pieds (traduction personnalisée).

Les licences Libres

Les licences Libres autorisent la copie, la modification et la publication sans limitation de la version modifiée. Quand bien même les licences ne contraindraient pas à donner de référence vers le travail original, faut-il le faire ? Peut-on se permettre de systématiquement forker un logiciel parce qu’on en a le droit ? C’est par exemple l’une des raisons qui ont fait hésiter un certain temps Vincent à publier ChuWiki sous licence GPL.

La réponse évidente est non si vous avez reçu un tant soit peu d’éducation : on ne se glorifie pas du travail d’autrui sans le rétribuer ! Les cas de forks justifiés existent, mais cette solution ne doit être utilisée qu’en dernier recours après avoir essayé de contribuer directement au logiciel.

Sinon, on finit par se rapprocher du modèle de développement des logiciels propriétaires où refaire encore et toujours le même travail est un gaspillage pur et simple de ressources, et non une rationalisation d’énergie.

Le Libre

La philosophie du Libre ne consiste pas à donner sans rien attendre en retour. Le principe le plus important à mon sens est une courte phrase que j’ai écrite il y a quelques temps et que j’utilise comme signature dans mes courriels :

Si chacun de nous a une idée et que nous les partageons, nous repartirons tous les deux avec deux idées… C’est ça le Libre.

Ce que défend Stallman, c’est un principe tendant à stopper ou au moins diminuer cet immense gâchis constant : trop d’entreprises passent leur temps à réinventer la roue (et encore, quand elle n’est pas carrée) au lieu de tenter de se mettre d’accord pour ne faire le travail qu’une fois et gagner ainsi du temps et de l’argent.

Bill Gates a souvent parlé de RMS en le décrivant comme un évangéliste un peu loufoque anti-commerce et communiste, par dessus le marché (pour ceux qui l’ignorent, aux États-Unis le terme communiste est une insulte).

RMS serait contre toute forme de profit financier ? Détrompez vous. Lors de son speach le plus classique, RMS cite toujours en exemple un logiciel qui serait libre et auquel manquerait une fonctionnalité que 10000 personnes souhaiteraient voir ajoutée. Que faire pour que tout le monde en profite ? Et bien ces 10000 personnes pourraient donner chacunes un peu pour que la fonctionnalité puisse être développée par une SSLL, comme aliacom par exemple.

Travailler pour la gloire

Oui, cette expression si galvaudée que tout le monde utilise, souvent sans y prêter attention, dans la phrase “on ne travaille pas pour la gloire”. Or, pour le logiciel Libre, c’est la base, l’un des moteurs les plus importants. Évidemment, il y a généralement le challenge technique du hacking mais la gloire y est pour beaucoup. Et c’est compréhensible : ne seriez-vous pas content, fier même d’avoir créé quelque chose qui sert à d’autres, qui vous montrent qu’ils apprécient votre travail ?

De façon plus pragmatique : imaginez vous pouvoir mettre sur votre CV que vous êtes développeur de la fondation Apache, de la fondation Mozilla ou encore du noyau Linux, vous ne pensez pas que ça peut être un facteur motivant ?

Contribuer

Bien sûr, comme je l’ai dit plus haut, quelqu’un de normalement constitué ne peut pas utiliser un outil sans ressentir le devoir d’apporter quelque chose en retour. Bien entendu, et la nuance est bien là par rapport aux logiciels propriétaires où aucune alternative n’est laissée, cet apport n’est pas forcément uniquement financier.

C’est une des règles tacites du logiciel Libre : lorsqu’on utilise le Libre, soit on offre de son temps, soit on verse une somme d’argent qu’on détermine en fonction de ses moyens et de l’utilité qu’on accorde à un logiciel.

Pensez-y, c’est indispensable pour que le modèle même puisse continuer à exister…

Logiciel de suivi de candidatures

Bon, ça a démarré… J’ai eu 7 ou 8 contacts la semaine passée suite à la publication de mon CV sur monster&Co. J’ai deux entretiens de prévus.

Je suis confronté à un problème : je me rends compte que ça devient compliqué de gérer tous les contacts de tête. Si la semaine prochaine se passe comme celle passée, cela deviendra complètement impossible. Parce qu’encore si ce n’était que les contacts, ça pourrait aller, mais il faut que je gère :

  • ceux qui m’ont juste laissé un message sur mon portable, parce que j’étais indisponible, et qu’il faut que je rappelle ;
  • ceux qui m’ont écrit un mail en me demandant des précisions, à qui il faut que je réponde ;
  • ceux avec qui j’ai un entretien prévu (2 actuellement) ;
  • les boites dans lesquelles je voudrais faire une candidature spontanée (valtech par exemple, Sami si tu m’entends, on peut toujours rêver :-p) ;
  • etc…

Bref, je suis à la recherche d’un logiciel capable de gérer tout cela et même plus, anpsedic semble intéressant mais il n’est pas libre et ne fonctionne que sous windows ce qui ne me convient donc pas du tout.

J’ai donc commencé à écrire un petit peu de code Java, mais je me rends compte que je risque de faire n’importe quoi si je ne réfléchis pas un peu plus à tout ce que je voudrais gérer. Pour l’instant, j’ai écrit principalement 3 objets centraux :

  1. Company (contient une liste de recruteurs)
  2. Recruiter (contient une liste de messages)
  3. Message

Mon objectif initial était en effet de simplement gérer les contacts initiés par des recruteurs d’une entreprise. J’ai donc imaginé une liste de recruteurs pour une entreprise parce qu’on est au final toujours contacté par une boite, mais pas forcément toujours le même recruteur de cette boite, non ?

Et justement, c’est là que vous intervenez ! Quelles fonctionnalités souhaiteriez-vous dans un tel logiciel ? Utilisez les commentaires pour le dire, je reprendrai les idées pour les lister au fur et à mesure dans le corps du billet. En vrac, donc :

  • Les recruteurs/entreprises qui vous ont contactés ;
  • Les relances à effectuer pour telle ou telle entreprise ;
  • Les entretiens prévus (i.e. mini gestion de planning et alarme) ;

Pub honteuse ou l'homme qui parlait à l'oreille de google (de son cv)

Ça y est, je suis enfin arrivé à une version que j’estime acceptable (i.e. prête pour diffusion) de mon CV, version que je consens donc à publier.

Merci à Paï, Vincent, Antoine et Nico pour leurs relectures et avis sur le fond et sur la forme qui m’ont permis de parvenir à cette version. Mon objectif était de n’avoir à maintenir qu’une seule version du contenu de mon CV, je crois que je suis parvenu à trouver une solution : en utilisant une CSS d’impression pour générer un pdf, j’ai ainsi une version html et une version pdf de mon cv à partir du même fichier XHTML :-) (note pour plus tard : la version imprimée depuis FF linux en postscript et convertie en pdf est un peu crado, des espaces incongrus se sont insérés entre certaines lettres, je verrai demain pour remplacer ce fichier par une version moins bizarre).

Update : OK pour la version pdf, elle est beaucoup plus propre comme ça. J’ai fait aussi une version word pour les sites de recrutement… Franchement, utiliser le format Word pour publier un CV me parait totalement déraisonnable ! Et j’aurais dit la même chose d’OpenOffice.org. L’un des seuls formats à garantir un rendu et une impression propre sur toutes les plates-formes est le format pdf ! Et puis, l’objectif n’est pas de pouvoir recopier le contenu du CV, mais bien de pouvoir simplement le consulter, alors pdf est encore plus approprié.

Je t’invite donc chaleureusement, cher lecteur, à lire le Curriculum Vitae de Baptiste MATHUS (oui, vous avez bien vu que j’essaie d’attirer google, mais vous pourrez pas dire que je vous avais pas prévenu, ce billet est une pub, ma pub :p) et à donner ton avis. Je suis preneur de tout conseil pour l’améliorer.

En fait, j’ai décidé de refaire complètement mon CV et de me créer bientôt un compte chez Monster et consorts, parce que moi aussi je veux voir si je reçois bien les 3 propositions par jour comme mes potes de promo le disent. Soyons honnête, c’est un peu une histoire de curiosité et d’amour propre à la fois :).

De façon plus pragmatique, si je reçois effectivement des propositions, cela me donnera évidemment des arguments supplémentaires pour négocier mon embauche. Que ce soit ou non dans mon entreprise actuelle, si je reste après la fin du contrat d’apprentissage en septembre. Actuellement, l’idée de rester s’installe de plus en plus dans mon esprit, mais nous verrons ce qu’il en adviendra réellement. De toute façon, ne vous inquiétez pas, vous serez les premiers au courant :).

Ah oui, j’oubliais. Bientôt une nouvelle intéressante : je dispose maintenant d’un hébergement sur un site très connu où je vais pouvoir publier quelques articles techniques reformatés pour l’occasion, issus du présent blog, avant d’en écrire de nouveaux quand j’en aurai le temps.

Baptiste, qui s’essaie au teasing :-)

Enfin

Florence et Hussein ont été libérés !

Ça faisait plusieurs semaines qu’à chaque fois que j’entendais leurs noms à la radio, je me demandais ce qu’il pouvait rester de ces deux personnes, psychologiquement. Je me souvenais en effet des études dont nous parlions en cours de communication montrant qu’une personne normale, privée de ses libertés fondamentales (variables selon les personnes), tenait en gros quelques jours avant de commencer à ressembler à un zombie :-\…

Ah ces stagiaires...

J’ai récupéré des “rapports de stage” de quelques uns des stagiaires qui sont passés dans mon entreprise au cours des 2 ou 3 années passées… Et bien, quand je vois ça, ça m’inquiète franchement.

La première partie est souvent une partie consacrée aux remerciements, chose que je me refuse à faire pour mon mémoire d’ingénieur en apprentissage de la façon que je vois. Les stagiaires se posent en pauvres victimes sauvées par les entreprises qui les ont “accueillis”, ou remercient leurs maîtres de stage pour le “temps qu’ils ont consacré”.

Quelques extraits :

Je remercie Untel, […], de m’avoir permit d’effectuer mon stage au sein de son entreprise. Je remercie UnAutreTel qui a été mon maître de stage pour son accueil et le temps qu’il m’a accordé bien qu’il était très occupé.

J’adresse des remerciements chaleureux à toutes les personnes qui de part leur investissement à mon égard m’ont permis d’effectuer ce stage dans de bonnes conditions.

Je souhaite remercier chaleureusement toutes les personnes qui m’ont permise d’effectuer ce stage dans de bonnes conditions.

Hormis le fait désolant que les trois extraits ci-dessus issus de dossiers différents, constituant les premières lignes de chacun des dossiers, contiennent d’énormes fautes d’orthographe, je ne supporte pas ce style d’expression !

J’ai l’impression de lire : “merci à l’entreprise qui est vraiment trop cool d’avoir bien voulu daigner perdre du temps à s’occuper de moi” :-\.

Soyez un peu plus sûrs de vous, bon sang ! Sans dire que les remerciements sont toujours inutiles, il faut qu’ils soient plus professionnels. Arrangez vous pour effectivement remercier si vous estimez que certains le méritent, mais pensez aussi que vous avez apporté quelque chose à l’entreprise (sinon, il y a un grave problème dans l’élaboration de votre stage). Vous n’êtes pas une victime, mais simplement une personne qui n’a pas le statut d’un salarié et qui a apporté sa part de valeur à l’entreprise.

Gardez toujours ça à l’esprit lorsque vous rédigez le rapport, le travail que vous avez effectué est un échange : vous avez réalisé des travaux pour l’entreprise, et celle-ci vous a fourni en retour une expérience professionnelle. En aucun cas, vous ne devez considérer que votre stage était un service à sens unique que l’entreprise vous a rendu dans son infinie bonté !!!

Désespoir

… Toulouse, c’est super ! Cadre de vie génial. Il fait beau, les gens ne sont pas stressés comme à Paris, mais…

Pourquoi ya si peu de tournois de volley, bon sang de nhuitre ! Ou alors les toulousains ne connaissent-ils pas le site Tournoi-volley.com ? Ya quand même plusieurs centaines de milliers de personnes dans la région proche de Toulouse, de quoi trouver des joueurs bon sang ! ;-)

“36 tournois dans les 7 prochains jours.”…

Oui vous avez bien lu :-). Il y aura en France 36 tournois de volley organisés dans le courant des 7 jours à venir. Enfin, justement, le problème c’est que c’est pas vraiment “En France”, je devrais plutôt dire “en région parisienne” :-/

77, 78, 91, 92, 93, 94, 95… Ça fait un peu loin de Toulouse tout ça…

Bon, yen a bien un peu dans le 42, 45, ça fait un peu plus près, mais toujours pas top :-(. (Tiens, ça me fait penser qu’un fil RSS serait le bienvenu sur ce site pour annoncer les tournois. Si le webmaster du site lit ce billet, je suis prêt à lui proposer mon aide).

Si quelqu’un entend parler de tournois de volley dans la région, même à 100 bornes de Toulouse, ça m’intéresse… Faites suivre, je suis en train de dépérir sans ma dose régulière :-(

Vivement la rentrée en septembre que je puisse trouver un club.

<pub>

Je viens de région parisienne. J’ai joué cette année à Lognes (77) où nous sommes l’année dernière montés en R3, je suis parti début mars pour Toulouse à cause de mes études en alternance : mon entreprise se trouve à Basso-Cambo.

Nous avons terminé cette année 5ème de notre poule de R3 en ayant fourni une saison très irrégulière (nous avons battu tous ceux qui sont devant nous au classement final au moins une fois, à l’exception du premier).

Je cherche donc pour septembre un club de R1 ou R2 dans la région Toulousaine, où je vais rester, pour la rentrée de septembre. (Je joue en attaq/récep.)

</pub>

Mac passe à Intel : tour d'horizon

Parce que c’est à la mode en ce moment et parce que ça m’intéresse, je vais regrouper ici tous les billets parlant de l’info “Mac passe à Intel”.

  • Chez Darken, celui par qui je l’ai appris, une analyse des avantages architecturaux des PPC par rapport aux Intel.
  • Ça se confirme et il en est très décu
  • LinuxFR nous donne quelques infos sur la procédure de migration des logiciels externes à Apple
  • Vincent n’aime pas non plus cette info
  • Improbable pour Olivier
  • Tristan se fait à l’idée que son Mac PPC est aujourd’hui un collector…
  • Laurent en parle aussi
  • Alexis n’y a pas cru jusqu’à ce qu’Apple le dise lui-même
  • Cédric nous livre son analyse de ce que Jobs ne dit pas
  • Eric Meyer en parle aussi
  • Tristan nous annonce que Firefox a été utilisé comme exemple de portage par Apple. Les patches sont déjà prêts :).

Mojtaba Saminejad

Faites passer le message, décidément l’extrêmisme est le pire des maux.

RSF : Le weblogger Mojtaba Saminejad condamné à deux ans de prison

UPDATE : Signez la pétition

Mojtaba Saminejad, un weblogger de 25 ans arrêté le 12 février 2005, a été condamné à deux ans de prison par le tribunal révolutionnaire de Téhéran pour “insulte envers le Guide suprême”. Il sera également jugé prochainement pour un autre chef d’accusation, “insulte envers les prophètes”, passible de la peine capitale. Reporters sans frontières est profondément inquiète du sort du jeune internaute et demande une nouvelle fois à la communauté des bloggers de se mobiliser.

“Tous les messages de solidarité dans la blogosphère sont les bienvenus. Nous savons que ces messages parviennent aux prisonniers et permettent de faire pression sur les autorités iraniennes, en particulier en cette période d’élection présidentielle. Il faut absolument faire parler de Mojtaba”, a déclaré l’organisation.

L’avocat du weblogger, Mohammad Saifzadeh, a confirmé la sentence. Il a précisé que, lors de l’audience devant le tribunal, le 23 mai, son client n’avait jamais pu s’exprimer librement. Pour l’intimider, les autorités l’avaient en effet placé à côté des policiers qui l’avaient interrogé en prison.

Le weblogger va repasser devant les tribunaux, le 22 juin, pour répondre cette fois d’“insulte envers les prophètes et les saints imams”. Cette charge extrêmement grave - car elle peut signifier l’apostasie de l’inculpé - fait encourir la peine capitale à Mojtaba, selon l’article 512 du code pénal islamique.

Via Embruns

Message de l'administrateur

Reçu aujourd’hui au boulot (2ème fois que ce message est envoyé en 3 jours, avec le petit ajout en rouge, cette fois-ci :p) :

Bonjour,

Nous avons transféré le DNS auxiliaire sur un nouveau serveur.

Afin d’éviter des problèmes de connexion, une modification des propriétés réseau de votre poste est à faire.

Pour cela :

  • Panneau de configuration, à connexions réseau afficher les propriétés de la connexion au réseau local (via le bouton droit)
  • Faire Propriétés de Protocole Internet (TCP/IP)
  • Modifier (si ce n’est déjà fait pour certain) l’adresse du serveur DNS auxiliaire par 10.37.2.221.

    Là, dans le mail HTML reçu, il y a une capture d’écran de l’écran de configuration, avec les adresses de la machine de l’administrateur (pour exemple), le masque et les adresses de DNS

  • Puis valider par Ok

J’ai bien spécifié ci dessus l’adresse du serveur DNS auxiliaire et pas le reste !

Alors celui ou celle qui a pris mon adresse IP est prié de contacter les administrateurs pour que l’on puisse réparer tout cela.\ Je signale que cette personne doit avoir un message lui indiquant un conflit d’adresse IP

:-) Énorme…

Happy Birthday

Un p’tit message pour souhaiter un joyeux anniversaire a Batmat. Oui oui, c’est aujourd’hui!\ Allez tous ensemble!!!\ “Happy birthday to you… Happy birthday to you… Happy birthday to you Batmat!!!!”

Attac, c'est quoi déjà ?

Originellement, il semble que ça ait été une association. Fondée parait-il à l’origine pour promouvoir la taxe Tobin.

Je ne fais pas de politique, je suis informaticien. Je suis donc cela de l’extérieur. Et bien, il y a une question que je me pose depuis quelques temps au sujet de ce groupuscule extrêmiste. J’utilise volontairement le mot groupuscule parce que le travail effectué par Attac durant la campagne du référendum n’a été que propagande révulsante et nauséeuse. Même les partisans raisonnés du non s’accordent à dire qu’Attac était la source d’une partie non négligeable, et donc décrédibilisante, des arguments stupides du non.

Qu’est-ce qui différencie Attac d’un parti politique ? Pourtant il semblerait qu’Attac se refuse à présenter des candidats pour faire mieux. Je me demande d’ailleurs si c’est normal d’autoriser ça… Est-ce qu’il est normal de laisser une personne juridique, une association chier sans cesse sur l’existant sans pour autant proposer mieux. C’est facile de critiquer, très facile même. Mais c’est lorsqu’on essaie de proposer mieux qu’on se rend compte que satisfaire le plus grand nombre n’est pas si simple.

Pour moi, Attac & LCR, c’est kif-kif bourricot. Je ne vois d’ailleurs pas pourquoi ils ne travailleraient pas plus officiellement ensemble puisque toutes leurs idées semblent se rejoindre : “Tout est à chier, bah ! caca ! Ouuuu, c’est nul ce que vous faisez vous hein !”.

Mais attac n’est pas un parti politique !

Alors de quel droit se permettent-ils de solliciter l’état pour subventionner leur université d’été ? J’espère bien que l’année passée était la dernière à permettre cet abominable fait.

Le plus fort, c’est qu’il semble qu’Attac ait dans ses dirigeants plusieurs personnes du PS et se servent allègrement de leur subventions pour leur tirer dans le dos…

Enfin…

Où on parle d’Attac

Je fais ici une liste des billets qui traitent du sujet Attac. Je mettrai cette liste à jour au fur et à mesure :

Nettoyage chez Mappy

Mappy se met à l’AJAX.

Faut vraiment que je teste XmlHttpRequest !

Office 12 : Microsoft standardisera ses formats en XML ?

Via Antoine, un article de chez Clubic

Microsoft a officiellement reconnu que sa prochaine suite bureautique prévue pour 2006 et connue sous le nom de code d’Office 12, intégrera un support complet/standard et amélioré du langage XML (eXtensible Markup Language) […]\ Les fameux formats de fichiers “.doc”, “.xls”, et “.ppt” des applications Word, Excel et Powerpoint devraient ainsi être remplacé par des extensions “Microsoft Office Open XML Format” de type “.docx”, “.xlsx” et “.pptx”. Le format d’engistrement XML sera proposé en standard à l’utilisateur pour sauvegarder ses docuements. Il est également question d’intégrer une compression de type ZIP par défaut dans l’enregistrement de ces fichiers pour réduire au maximum l’espace occupé par les fichiers générés. Microsoft promet que ces formats XML seront entièrement gratuits et pourront être exploités sans verser de royalties.

Qu’en penser ? Je ne ferai pas la réflexion habituelle de dénigrement.

Bravo à Microsoft si c’est une véritable news ! Espérons que ceci soit enfin un honnête pas vers l’interopérabilité demandée par tous depuis si longtemps.

Horrifié... dépité... honteux...

Via Embruns.

La question portait en effet sur un traité constitutionnel. On finirait par l’oublier. Elle a intéressé un tiers des électeurs favorables au non, ce n’était de toute évidence pas la motivation principale.

Libération : Illusions en perdition

Alors, ça fait du bien de gâcher tout le travail accompli, tous les compromis trouvés et repartir pour 10 ans de négociations rien que pour virer Raffarin ? Franchement ?

Le traité n’était certes pas parfait. Mais parfait n’existe pas sur cette terre. Et ce n’est pas une valeur absolue. Vous avez voulu une Europe française ? Vous avez gagné, vous n’aurez rien du tout.

Je ne comprends pas cette France qui a préféré jeter un verre à moitié vide sans aucune garantie, aucune d’en obtenir plus la prochaine fois. Et cette prochaine fois, elle aura lieu quand ? Dans 10 ans ? Jamais ?

Allez, ça fait chier, tiens !

Ah, et au fait. Vous savez ce qu’ils votent les libéraux, les vrais ? Ils votent non… Trop peu libérale, trop sociale, cette constitution…

La Chine supprime ses taxes à l'export

Entendu il y a 1 minute sur France-Info : “La Chine a supprimé depuis aujourd’hui ses taxes à l’export mises en place tout récemment.”

Au lendemain du non de la France, coïncidence ? Et maintenant, quel sera notre poids pour demander à Bruxelles d’imposer à la Chine ces taxes ? Pfff.

Le couloir du noniste

Au boulot, rapporté du couloir tout à l’heure :

“Haha ! On leur a mis une bonne claque au gouvernement !” :‘( Rien, mais alors rien compris du tout à l’enjeu passé.

Franchement, à tout ceux qui ont voté contre Raffarin ou contre Chirac et non contre des choses qui vous déplaisaient dans le TCE, vous êtes stupides ! Achetez vous un cerveau pour la prochaine fois, ou alors votez blanc !

Non...

LCP annonçait 54,5% de non à 22h00.

Bon, j’ai posté juste un petit commentaire chez publius, mais là je vais aller me coucher. Le déchaînement médiatique des prochaines heures qui vont suivre ne m’intéresse pas et je préfère attendre demain matin que la tempête se calme.

Bonne nuit.

Netscape 8 vs IE

Énorme, Netscape 8 fait planter le rendu XML d’IE.

Heureusement, Microsoft a trouvé un workaround (le gras est de moi), contournement quoi… :

  1. Uninstall Netscape 8
  2. START->RUN\
    1. Type: regedit
    2. Hit ENTER
    3. Navigate to the following:
    4. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Plugins\Extension
    5. Highlight and right-click the node titled “xml” and select delete.
    6. Restart Internet Explorer

Nouvelle technique Microsoft : un produit pose des problème au nôtre. Pas de problème, désinstallez le :-D

Svn 1.2 : arrivée du reserved checkout (file locking)

J’avais déjà parlé de subversion dans un billet précédent.

Via a19s, on apprend à l’instant que la version 1.2 de Subversion vient de sortir.

Cette version apporte une fonctionnalité extrêmement importante : le reserved checkout. Cette fonctionnalité permet de poser un verrou sur un fichier donné (file locking) afin d’éviter les conflits par exemple.

Autant je trouve que c’est une fonction qui se doit d’être utilisée avec parcimonie, autant je comprends que beaucoup de boîtes aient besoin de cette “sécurité”. Pouvoir éviter qu’un fichier soit modifié alors qu’il ne devrait pas l’être me semble effectivement une bonne idée.

Nous allons enfin pouvoir adopter la notion de “package fermé” (bonjour à DR :-)) et véritablement fermer les packages qui ne doivent pas être touché sans autorisation préalable. J’ai hâte de pouvoir tester ça.

Trop de blog tue le blog

Ça fait plusieurs jours que j’ai cette réflexion à l’esprit lorsque je lance ma machine et mon agrégateur RSS par la même occasion, à domicile ou au bureau.

J’aime à pouvoir lire correctement les blogs que je suis. C’est la raison pour laquelle j’ai par exemple arrêté de suivre il y a maintenant quelques mois slashdot, TheRegister et autres sites à dix news par heure.

De la même façon, malgré le fait que les infos parfois découvertes sur Planet Gnome soient intéressantes, j’ai préféré arrêter simplement que de ne plus lire tranquillement ce qui en sortait. J’espère donc que Peter pourra bientôt blogguer pour le filtrer et pointer le plus intéressant. :-)

Actuellement, un blog qui commence à me les briser menu, c’est celui de Robert Scoble qui se prend pour /.. Ce n’est d’ailleurs plus vraiment un blog à mon goût, mais presque un BlogMark avec ses 10 billets quotidiens de deux lignes…

Récemment, j’ai failli arrêter de suivre le blog de LLM pour la même raison, d’ailleurs je m’interroge de plus en plus quant à la pertinence de le suivre directement vu la grande “mercantilité” de ses billets (notamment lorsqu’il ne poste justement que deux lignes pour donner, comme dirait Denis, un petit plaisir sucré à ceux qui se décident à blogguer sous TypePad)… À l’inverse, lorsqu’il parle de François Pinault qui n’installera finalement pas en France son musée destiné à exposer son millier d’œuvres d’arts, c’est le genre de billet qui possède du contenu par lequel je trouve un intérêt à garder ce blog dans mon agrégateur.

EDIT : Loïc vient de péter un cable. Là, ça m’énerve grave. On bloggue sur des sujets intéressants, pas pour satisfaire tous les pecquenots incompétents du coin qui demandent : “Hé, Hé, Hé, dis, dis, dis, tu voudrais pas parler de moaaa ? steupléééé ? Si tu le fais pas, ben je quitte Typepad, naa !”. Pfff, pitoyable, obligé de s’abaisser à ça.

Ce que je recherche dans les blogs, ce sont des infos intéressantes, certes. Mais surtout, j’aime lire de bonne plumes. En ceci, le blog de la Veuve Tarquine me rassasie tout particulièrement.

Trop de blog tue le blog, qu’on se le dise.

Ah ces français...

En ces temps où on nous critique pour notre égoïsme, je trouve que le titre de la chanson française présentée à l’Eurovision nous sauve : Chacun pense à soi.

Ouf, l’honneur est sauf :-/ …

Vive Benoit 16

Franchement, si ceci est vrai, la religion me sort tous les jours un peu plus par les yeux.

Pour les prêtres accusés d’avoir commis des crimes sexuels, Ratzinger aurait rédigé en mai 2001 un document indiquant que l’église pouvait et devait garder secrètes les éventuelles preuves de viol par l’un de ses prêtres. L’église au dessus de la police et de la loi, quoi… Une “raison” supérieure à mon entendement, certainement…

Extrait en anglais :

It asserted the church’s right to hold its inquiries behind closed doors and keep the evidence confidential for up to 10 years after the victims reached adulthood. The letter was signed by Cardinal Joseph Ratzinger, who was elected as John Paul II’s successor last week.

En français :

Le document affirmait le droit de l’église à tenir ses enquêtes secrètes et à garder confidentielles les preuves jusqu’à 10 ans après que les victimes aient atteint leurs majorités. La lettre était signée par le cardinal Joseph Ratzinger, qui a été élu comme successeur de Jean-Paul II la semaine dernière.

Via 404, Brain Not Found.

Supprimer les bips bips de la console

Ou comment éviter d’entendre les réflexions de votre entourage : “’tain, mais c’est chiant ce bip ! Tu peux pas l’enlever ?”. Et là, ou vous baissez les yeux en disant que vous savez pas faire, ou vous savez le faire. Ne vous inquiétez plus, maintenant vous saurez. :-)

Il y a deux cas : soit vous êtes sous X, soit vous êtes en mode console.

Sous X

$ xset -b 0

En mode console

$ setterm -blength 0

Merci à pouet de ccm qui m’a appris ce truc il y a deux ou trois ans.

ASM 2.0 est sorti

Via ce billet du blog d’Eugene Kuleshov, on apprend qu’ASM 2.0 vient de sortir.

Cette nouvelle est très fraîche, je peux vous le dire : aucune news n’est encore passée sur la ml d’asm. C’est amusant, j’ai commencé à suivre le blog d’Eugene avant de m’apercevoir qu’il était l’un des contributeurs principaux du projet ASM, développé par Éric Bruneton, pour lequel j’avais déjà écrit un billet ici.

Je suis sûr qu’une news sur ce sujet ne va pas tarder à arriver sur a19s :-)

Baptiste, avec un p, bordel de merde !

J’ai encore reçu hier un dossier à mon nom fait récemment. Ma nouvelle carte PASS, avec mon prénom joliment orthographié. :-/

Faut vraiment que les services financiers apprennent à lire, ou alors faut pas nous demander nos cartes d’identité pour remplir le dossier. Je l’épellerai alors en insistant sur cette lettre, comme je le fais toujours devant ceux qui semblent avoir du mal avec le stylo ou le clavier.

De plus, je crois qu’on trouve quand même plus souvent l’orthographe “classique” avec un p, que l’autre amputée de ladite lettre, alors par défaut, écrivez au moins Baptiste avec le p qui lui est dû !

J’ai bien voulu supporter l’ignominie à Lognes, lorsque le technicien de chez FT avait orthographié mon nom de la sorte, parce que je ne restais que 6 mois. Mais je me refuse à supporter intemporellement la vue de cette foutue carte.

Pffff, quelle perte de temps.

EDIT (16/05) : J’y suis allé pour la faire refaire. Machine en panne, “Repassez dans la semaine”, “Au fait, c’est bien Baptiste votre prénom, ce n’est pas Mathus ? :-/”. (soupir)…

Trackback, cékoidon ?

Sur les conseils de Géraud, j’ajoute un texte devant le mot Trackback présent dans le template des billets. Ainsi, le titre Trackback devient Les réactions à ce billet sur d’autres sites [Trackbacks] : et le Aucun trackback devient Aucune réaction ailleurs.

J’encourage tous les blogueurs à faire de même. J’ai discuté de ça hier avec quelqu’un qui ne savait pas ce qu’était un trackback et il m’expliquait qu’il avait cliqué dessus en se demandant ce que c’était et en croyant que c’était écrit par l’auteur du billet lui-même. Les blogs devenant de moins en moins destiné aux seuls geeks et info-passionnés, ça me semble nécessaire pour ceux qui n’iront pas chercher ce que signifie ce nouveau buzzword, à plus fortes raisons si vous publiez du contenu à cible généraliste.

Olivier, Loïc, si vous m’entendez…

Si quelqu’un pense avoir une meilleure proposition de texte court pour l’intitulé des trackbacks que celui que j’ai utilisé, je reste preneur :-).

Je voterai oui

Au vu des arguments énoncés et des très nombreuses lectures que j’ai effectuées, je peux à présent voter en conscience pour le oui à la constitution européenne.

Un grand merci à Géraud et Jevoterainon pour leurs nombreux commentaires argumentés pour ce billet. Géraud a répondu à mes craintes et m’a permis de pouvoir faire mon choix sans inquiétudes. Il devait me convaincre, mais Jevoterainon a lui aussi bien argumenté. Mais je l’avais indiqué, j’avais une propension naturelle à trouver une solution qui aille avec ma volonté d’être Européen, je pense donc qu’il a été plus facile de me convaincre pour le oui que pour le non. Comme le pourquoi vous intéresse sûrement si vous m’avez lu jusque là, je vais essayer de reprendre les choses qui m’avaient marqué lors de mes lectures.

Si vous êtes souverainiste, n’allez pas plus loin. Vous ne sauriez être convaincu par quiconque. Si par contre, comme moi, vous aimeriez pouvoir dire oui à une constitution mais qu’on vous a dit “qu’elle était pas sociale, qu’elle était comme ci ou qu’elle était comme ça” et que ça vous inquiète alors de voter oui, la suite vous est destinée. J’ai récemment eu les mêmes peurs, aujourd’hui totalement dissipées grâce à mon étude du sujet. Je donne ici mon opinion personnelle, libre à vous d’y souscrire ou pas, mais je souhaite tout de même tenter de convaincre ceux qui demandent à l’être. J’utiliserai pour ce faire des citations de part et d’autres, mes avis qui en ont parfois découlé, bref ce qui a fait ma réflexion.

La longueur du texte

Le texte est long.. Trop long ?

Certes la constitution française est 30 fois plus courte, mais elle a été écrite par un nombre de personnes beaucoup plus réduit (30 fois plus peut-être :-)?) et de sensibilités politiques proches. Elle a été écrite par des français uniquement et non, comme pour la constitution européenne, par 102 personnes de 25 nationalités différentes.

Pour le TCE, il a fallu intégrer des cultures différentes, des habitudes et des lois en place dans chaque pays, bref tout ce qui fait nos différences. Il a fallu débattre lorsque une habitude d’un pays allait à l’encontre de celle d’un autre pour trouver une position commune afin de rédiger le traité. Malgré cela, un texte a été produit qui constitue tout de même des avancées majeures, notamment la partie II, la charte des droits fondamentaux qui inscrit pour principes, entre autres :

  • la garantie de la dignité de la personne humaine
  • l’abolition de la peine de mort
  • Le droit à la vie

Je reviendrai sur le troisième point parce qu’il a fallu que des féministes trouvent moyen de dire que c’était un début pour supprimer le droit à l’avortement…

Certes, pour un français, la plupart de ces droits sont déjà présents, mais j’aime à croire que les français savent aussi regarder autre chose que leur propre nombril. Et que proposer que l’abolition de la peine de mort soit une des bases de notre union et oblige ainsi 25 pays et tous ceux qui voudront se joindre à nous à faire de même est une idée qui me séduit grandement.

La constitution n’est révisable qu’à l’unanimité.

C’est l’un des problèmes qui m’avaient semblé le plus important et choqué dans le texte d’Étienne CHOUARD. Ce point semble marquer tout le monde et être très important pour les indécis.

En réponse à cela, je vous conseillerais de lire tout le document dont j’ai déjà parlé plusieurs fois : Réponse à Étienne Chouard par Bastien François, un prof de droit constitutionnel à la Sorbonne.

Je me contenterai de le citer :

​3. « Révision nécessitant l’unanimité » : VRAI, MAIS c’est la situation de tous les traités européens existants. Même s’ils ne s’appellent pas « Constitution », ils partagent avec le projet en cours le fait de n’être révisables que par ratification unanime et le fait d’être juridiquement supérieurs à la loi nationale. Cependant, le TCE sera plus facile à réviser que les traités de Nice et Maastricht, et en particulier pour la partie III grâce à une procédure de révision simplifiée et des clauses passerelles (art. IV-444 et IV-445). Surtout, le Parlement européen aura le droit d’initiative pour demander une révision.

“Les pays de l’Est n’ont pas d’argent, ils vont venir chez nous et on sera fichus”

Ou dit plus sobrement : “Est-ce qu’elles n’avantageront pas plus les 10 nouveaux pays plutôt que la France?”

Là, je me cite :-) :

Je dirais oui, mais c’est normal. La France, l’Angleterre, l’Allemagne, etc. seront les pays les plus riches et les plus avancés en terme de droits sociaux. De la même façon qu’en France, on aide plus les pauvres que les riches (on est par exemple plus imposable si on gagne plus d’argent). Il s’agit bien de faire monter les autres à notre niveau, en aucun cas de descendre celui de la France aux autres.

L’objectif est d’atteindre un niveau de vie à peu près égal dans l’union. Cette union est destinée à faire progresser tous les pays qui n’ont pas le même niveau que les autres.

Certains prétendent donc que les pays de l’Est vont faire descendre notre niveau de vie. Je dis non ! À la lumière de ce qui s’est passé pour l’Espagne et le Portugal, on ne devrait pas oser dire ce genre de choses. Je veux insister là dessus parce que ça me choque. Certaines personnes ressortent sans cesse les mêmes arguments malgré le fait que l’histoire leur ait prouvé qu’ils avaient tort :

16 mars 2001 - Fonds structurels : “33 140 milliards d’euros” pour les régions les plus pauvres d’Espagne pour la période 2000-2006 !!! Et après ça, qu’on ose plus prétendre que ce n’est pas grâce à l’Europe qu’ils se sont développés. Et est-ce que l’Espagne ou le Portugal nous ont fait baissé le niveau de vie ? Non, c’est le leur qui est monté, point.

“On remet en cause le droit à l’avortement”

Comme tout groupement extrêmiste, il fallait que les féministes se manifestent en affirmant leur non.

C’est cette partie de la charte qui est à l’origine de ce reproche :

Article 2\ Droit à la vie\ 1. Toute personne a droit à la vie.\ 2. Nul ne peut être condamné à la peine de mort, ni exécuté.

La première phrase, en supposant que quelqu’un arrive à faire reconnaître à un embryon le statut de personne, permettrait alors d’interdire l’avortement. Les féministes demandent donc à ce que cette ligne soit supprimée ! Ben voyons.

Là, je vais citer Alain Lipietz qui fournit une brillante réponse à cet argument et cette requête :

Remarquons :\ - qu’aucune féministe n’avait protesté en 1948 et en 1983,\ - que supprimer « Toute personne a droit à la vie », et donc répudier la Déclaration universelle des droits de l’Homme, serait un immense scandale (qui justifierait pour le coup de voter Non),

“L’abolition de la peine de mort n’est qu’un leurre”

“Puisqu’en guerre, on peut rétablir cette peine de mort”

Voici l’argumentaire en question :

10 - On trouve, à l’article 2 du Protocole n°6, déjà annexé à la Convention Européenne des Droits de l’Homme, en correction de l’article II-62 , « Droit à la vie », ce correctif négatif affreux : « Un État peut prévoir, dans sa législation, la peine de mort pour des actes commis en temps de guerre ou de danger imminent de guerre ; une telle peine ne sera appliquée que dans les cas prévus par cette législation et conformément à ses dispositions… » En cas de conflit grave entraînant l’usage de la force, -qui peut l’exclure ?-, tous les « traîtres » pourront donc être passés par les armes. C’est pire qu’une régression ; c’est la barbarie rendue, de nouveau, possible. Ce texte à lui seul fonde le rejet.

Et la réponse, encore issue du blog d’Alain Lipietz :

En effet , cela fait belle lurette que l’abolition de la peine de mort par la Convention Européenne de Droits de l’Homme, le 28 avril 1983, autorise à la rétablir en temps de guerre !! À l’époque, ni les écologistes ni les communistes n’avaient protesté. C’est exactement la même chose dans les droits nationaux de tous les pays de l’Union. En France par exemple, si une loi interdit la peine de mort en temps de paix depuis 1982, rien n’empêche, une fois la loi martiale établie lors d’une guerre, d’avoir recours à la peine de mort. Les Verts se battent contre la guerre, mais, dans l’état actuel des choses (où la guerre elle-même n’est pas interdite), cet article n’est pas une régression : faire la guerre c’est d’abord tuer l’ennemi, saviez-vous ? et sans jugement. C’est la guerre, qui est la régression, pire, une barbarie. Dire que cet article, dont on reconnaît qu’il n’est que la transcription dans la Constitution de la Convention Européenne de Sauvegarde des Drois de l’Homme (dont les avocats des droits humains estiment que c’est l’instrument international le plus avancé, plus même que la Charte), « qu’à lui seul il fonde le rejet du texte » signifie que la France doit se retirer de la Convention de Sauvegarde et de la Cour de Strasbourg. C’est bien ça que tu as voulu dire ?

Conclusion

Voilà, j’en ai terminé sur les points que je voulais traiter. Place aux commentaires.

Mon marque-ta-page

Parfois, un blog, ça peut aussi servir de marque-ta-page.

  • Via le standblog : Ubuntu a embauché un ergonome
  • Via Peter (l’a presque son blog, mais je garde l’adresse du proto pour moi, na. Vivement qu’il arrive !), allez baver devant les vidéos de démo de Luminocity. Là, ya de quoi attirer du monde.
  • Toujours via Peter, Planet Gnome, un agrégateur de blogs de développeurs gnome.

Heureusement qu'on peut changer d'avis !

Je voudrais réagir à une question posée par Daniel Schneidermann lors de l’émission sur France 5, Arrêt sur Images, où étaient invités d’éminents tenants respectivement (dans l’ordre) du non ou du oui sur le net :

Vous pouvez visionner l’émission en RealVideo sur le site d’Arrêt sur Images.

La question donc. Devant les doutes apparents et constants de M. Chouard qui indique pouvoir changer d’avis jusqu’à la dernière minute, Daniel lui demande : “Alors, si je comprends bien, si on vous démonte les 5 arguments qui vous restent encore, vous voterez oui ?”, et Chouard d’acquiescer.

Sur le moment, j’ai trouvé ça beau. Que quelqu’un dise pouvoir changer d’avis, beau c’est tout…

Puis j’y ai repensé ensuite, et je me suis dit : “mais p***** ! Y a rien d’extraordinaire ! C’est normal, encore heureux qu’il réponde ça !”. J’espère bien qu’aucun homme (politique ou non) n’oserait continuer à défendre une position pour laquelle toutes les fondations ont été détruites. Ça tombe sous le sens en fait… Hein ? oui hein ? Pourtant, la question, au moment où elle a été posée n’a pas fait immédiatement résonner cette évidence en moi. Hasard ? Peut-être pas… Est-ce qu’il ne devient pas habituel aujourd’hui de défendre une position sans posséder forcément de réels arguments qui tiennent la route ?

Extension Firefox pour obtenir le PageRank google

Un des paramètres principaux de google pour son algorithme de tri, c’est le pagerank.

En gros, si une recherche ramène deux sites pour une requête donnée, l’ordre de tri se fera selon le pagerank. En d’autres termes, si un site et le vôtre parlez de la même chose mais que le PR du site en question est supérieur au vôtre, il y a de bonnes chances pour que ses pages arrivent avant dans la liste des résultats.

Vous allez me dire, “mais est-il possible d’obtenir ce nombre (de 0 à 10 avec 10 le meilleur score) ?”. Et bien oui, Simone ! Pour IE, google avait développé la googlebar qui permettait, entre autre, de l’obtenir en direct.

Il était évidemment impensable que cette fonctionnalité ne soit pas présente dans l’une des nombreuses extensions existantes pour firefox et je ne suis pas viendu ici pour vous dire que vous devriez utiliser IE pour ça, vous vous en doutez. En fait, j’ai trouvé et testé deux extensions différentes pour obtenir le précieux PR.

  • PRGoogleBar : Une extension qui contient en fait simplement l’ajout de l’affichage du PR par rapport à l’extension originale Celui-ci n’est en effet pas présent dans la GoogleBar firefox pour des raisons expliquées en note. Pour information, la googlebar fait toute la largeur de la fenêtre du navigateur et apporte pour fonctionnalités un champs de texte de recherche (comme celui déjà présent en haut à droite). Je trouvais que c’était donc un peu du gâchis pour n’utiliser finalement que les 2 cm² affichés au milieu de la barre contenant le PR du site en cours de visite.
  • Google PageRank status : Capture du
rendu de l'extension c’est cette extension que je vous conseille. Au lieu de vous imposer la grosse barre google, le pagerank s’affiche simplement en bas à droite de la barre d’état. Discret, utile, parfait quoi.

C’est ainsi qu’un coup d’oeil rapide aux valeurs fournies par cette extension me permet de donner les PR actuels de ces quelques sites pour exemple :

Debian : 9 FSF : 8 Standblog : 7 (et oui, pas étonnant ^^) Vincent : 6 (récemment passé de 5 à 6) Batmat.net : 5 (récemment passé de 4 à 5) Mon directeur de filière : 4, petit clin d’œil ^-

Un peu plus d'espace disque pour mon compte IMAP siouplé

Crévindiou ! Je me bats depuis plusieurs jours avec mon compte mail free. Je n’arrive que très difficilement à garder 2 ou 3 semaines de mails d’affilée sur le serveur qui est déjà arrivé deux fois en over-quota en deux semaines :-/.

25 Mo seulement… Franchement, à côté des 2Go de GMail. Certes, ce con de gmail ne propose pas d’accès IMAP, mais il y a un juste milieu. Je me contenterais bien de quelques centaines de méga :-). (À la limite, déjà plus que 25, ça serait pas mal :/).

Free ? Vous faites quoi ?

Reconnaître ses erreurs, petits conseils au professeur

Je me suis fait encore récemment cette réflexion en regardant le débat télévisé de Chirac face aux 83 jeunes. Professeurs, retenez bien cette phrase : il est infiniment plus bénéfique d’admettre qu’on ne sait pas quelque chose, mais qu’on cherchera, que de tenter de faire croire à l’auditoire qu’on sait. Parce que si jamais on s’aperçoit par nous mêmes que vous ne savez en fait pas, l’effet sera dévastateur.

Chirac, indépendamment de ce que je pense du débat, a en effet admis qu’il ne connaissait pas avec exactitude les équivalences des diplômes de droit dans tout l’union européenne. Personnellement, c’est pour moi un bon point.

Confiance

En tant qu’étudiant (quoi que ce soit bientôt fini), je suis devenu de plus en plus exigeant vis à vis de mes professeurs, de moins en moins tolérants au sujet de leurs fautes. Et ce que j’appelle une faute, ce n’est pas dire “Ah, ça je suis désolé, mais je ne connais pas bien, si vous voulez j’approfondirai pour le prochain cours”, non, ça c’est un très bon point (lorsque ça n’arrive pas 10 fois par cours évidemment :-)), c’est s’engoncer dans une espèce de “je suis le meilleur et je ne répondrai pas à vos questions. Par contre, je peux répondre aux questions que vous n’avez pas posées (et pour lesquelles je sais répondre)”.

Croyez-moi, vous gagnerez infiniment plus de respect de vos élèves en restant humble et en montrant votre compétence quand il le faut qu’en vous la jouant en laissant penser que vous savez tout. Parce que si on s’aperçoit une fois, vous êtes mal, plusieurs vous êtes grillé pour l’année et ptête même pour les années suivantes si les promos communiquent (LC si tu nous entends, c’est pour toi, entre autre).

Réciprocité

Travaillez, autant que vos élèves travaillent. Montrez leur que le boulot qu’ils font, ils ne le font pas pour rien. Si vous leur avez demandé de faire un rapport de 400 pages, soit vous le lisez, soit il ne fallait pas le demander. Mais c’est alors votre problème et votre part du travail que de lire ce fichu document qui a pris tant de temps à être écrit ! Pensez-y vraiment, si vous ne le faites pas, vous risquez là aussi une grande grogne de vos étudiants. Une fois, ça pourra aller si vous savez admettre vos fautes, plusieurs fois, vous serez méprisé, celui qui se fout de la gueule du monde…

Conclusion

Professeur, si tu me lis et que tu te reconnais dans la description faite ci-dessus, change vite ! (LC, si tu m’entends).

Je donne peut-être l’impression d’être aigri au regard de ces quelques lignes, mais il n’en est rien. Il est tout de même plusieurs professeurs que je n’oublierai pas de si tôt et qui n’ont rien en commun avec la description du vilain petit canard que j’ai donnée.

Je suis un peu frustré parce que j’ai l’impression d’avoir oublié des choses. J’aurais dû commencer ce billet qui me trotte dans la tête depuis si longtemps lorsque j’étais encore en période académique… (à l’école quoi, je suis en alternance et là je suis retourné en entreprise pour mes derniers 6 mois).

Ehehe

Deux choses :

  1. Vive le mode patate :

    Le mode patate Free : 776ko/s :-)

  2. Tiens… Vincent, j’ai retrouvé ton CV et ton blog :-D

AJouter un fil RSS à phpbb

J’ai un mal de plus en plus grand à suivre les sites qui ne fournissent pas de fil RSS. J’aurais même tendance à dire qu’à moins que celui-ci ne m’intéresse infiniment et que j’y pense régulièrement, un site ne fournissant aucun canal RSS n’a qu’une toute petite chance que je revienne (régulièrement, du moins).

EDIT : La crainte qui peut venir à l’esprit est que les gens suivent le fil rss mais ne viennent plus sur le site. Il semble bien que ce ne soit pas le cas, via pointblog, on apprend que les statistiques globales d’un site proposant un canal RSS ont plutôt tendance à augmenter…

De la même façon, les forums actuels se devraient de fournir un fil RSS de leurs posts afin de faciliter leurs suivis. Le forum de DotClear, utilisant punbb, permet par exemple de suivre tous les posts de chaque thème.

Récemment, j’en ai eu assez de devoir me connecter tout le temps sur le forum installé pour l’association de promotion de ma filière (Informatique Réseaux : AvenIR, bientôt refondu en XhtmlCss j’espère) au sein de mon école (ingénieurs 2000). J’ai donc décidé de jeter un œil rapide aux tables du forum phpbb pour être en mesure d’écrire une petite requête destinée à me simplifier la vie pour suivre le forum de l’asso : écrire le fil RSS de ce fichu forum.

Voici le code qui en a résulté :

<?
header('Content-type: text/xml;charset=iso-8859-15');

echo "<?xml version='1.0' encoding='iso-8859-15'?>
"; ?>

<?php
$hostname = "adresse du serveur de BD"; 
$user = "le user de la bd"; 
$password = "le password qui va avec"; 
$bdd = "nom de la bd"; 

$link = mysql_connect($hostname, $user, $password)
or die("Connexion au SGBD impossible. <BR /> Vérifiez votre login et votre mot de passe.");
mysql_select_db("$bdd") or die("La base de données $bdd n'existe pas ou n'a pas été trouvée");
?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<link>http://adresseduforum/</link>

<title>Forum AvenIR</title>
<description>Posts du forum PhpBB de l'association AvenIR. 
  Ce fil permet de suivre le forum sans s'y connecter pour rien. 
  Bref, le but d'un fil RSS :-)</description>
<dc:language>fr</dc:language>
<dc:creator>Batmat</dc:creator>

<?php
function transformHtml($myText)
{
    $myText2 = preg_replace('/\&/','&amp;', $myText);
    return preg_replace('/\x9c/','oe',$myText2);
}

// Définition d'une requete SQL
$query="select post_subject,post_time,username,post_text,p.post_id from phpbb_posts as p,phpbb_posts_text as t,phpbb_users as u where p.post_id=t.post_id and p.poster_id=u.user_id ORDER BY post_time DESC  LIMIT 0 , 30";

// Exécution par Php de la requete SQL
$result=mysql_query($query);

while($row = mysql_fetch_array($result))
{
    echo "<item>
";
    //La date doit avoir le format suivant : 2005-04-01T00:00:00+01:00
    echo "  <dc:date>".date("Y-m-d\TH:i:s+01:00",$row[1])."</dc:date>
";
    echo "  <dc:creator>".$row[2]."</dc:creator>
";
    echo "  <title>".transformHtml($row[0])."</title>
";
    echo "  <description>".transformHtml($row[3])."</description>
";
    echo "  <link>http://adresseduforum/viewtopic.php?p=".$row[4]."#".$row[4]."</link>
";
    echo "</item>

";
}
?>
</channel>
</rss>

<?php
mysql_close($link);
?>

Mes compétences en php étant limitées et ayant voulu faire vite et fonctionnel, j’ai conscience que le code php n’est certainement pas des plus propres. Je suis toutefois tout à fait preneur de techniques d’améliorations simples et substancielles du code présenté ci-dessus.

Deux choses pour finir :

  • Au cas où vous vous poseriez la question, ce fil passe bien la validation.
  • Je crois avoir vaguement lu en diagonale que cette fonctionnalité est à présent disponible pour phpbb, mais elle n’est toujours pas disponible sur le forum en tout cas :-(

Dire non à la constitution, c'est dire non à l'Europe ?

Oui, c’est ça. J’ai envie à mon tour de donner mon avis sur le sujet. Faites en ce que vous voulez, utilisez les commentaires si vous n’êtes pas d’accord ou si vous l’êtes, c’est fait pour ça.

Via Bix, un billet de plus qui me pousse à parler d’un sujet qui me tarabuste depuis quelques temps.

Par principe, j’ai toujours été pour le oui, parce que je suis profondément pour les échanges, parce que l’idée de vivre européen dans quelque chose de grand me passionne. Il y a encore quelques temps, j’aurais donc certainement voté oui sans hésiter, par principe toujours.

Mais l’échéance approchant, je m’y intéresse plus précisément, et je m’inquiète. Le nombre d’arguments du contre semble (commencer à) surpasser celui du pour.

Je n’ai jamais envisagé voter sans prendre le temps de lire ce pour quoi j’allais voter, j’ai donc récemment pris le parti d’acheter un exemplaire de ladite constitution pour m’en faire un avis personnel, j’en avais assez d’entendre tour à tour dire que nous allions tous la recevoir, puis non, puis si, puis non…

Je n’aime pas l’idée de voter en me basant seulement sur les différents avis autour de moi. Plus récemment, j’ai beaucoup lu sur le sujet. J’essaie de me faire un début d’avis avant de lire. Je vais donner plus bas les arguments ou choses que j’ai entendues qui m’ont marqué.

Commençons avec les “ouï-dires” (ce ne sont donc pas les points les plus importants, gardez à l’esprit qu’ils sont peut-être faux. Je m’empresserai bien sûr de mettre à jour si on me montre que c’est faux) :

EDIT : Ce qui suit a été réfuté ou a au moins obtenu des arguments contraires qui valent la peine d’être lus dans les commentaires. Comme je l’ai dit une ligne au dessus, certains de ces points pouvaient être carrément erronnés, l’un des objectifs de ce billet était justement de mettre à plat tous ces “on dit” pour en montrer leurs véracités ou leurs faiblesses. Si vous souhaitez donc vous aussi mettre votre cerveau au clair, je vous en prie, ne vous arrêtez pas à mon billet mais lisez aussi les commentaires.

  • L’équipe qui a rédigé la constitution européenne serait extrêmement réduite (moins de 10, voire moins de 5). J’ai du mal à imaginer une seule seconde qu’un texte aussi important puisse avoir mis en cause moins d’une cinquantaine de personnes avec un véritable rôle, ne serait-ce que pour garantir un reflet à peu prêt correct de la diversité sociale européenne. Même si je suis conscient qu’il est difficile voire impossible de se mettre d’accord avec autant de personnes, il me semble toutefois indispensable de s’organiser pour le faire quand même vu l’importance !
  • Ce serait des gens de l’âge de Valéry Giscard d’Estaing (80 ans l’année prochaine) qui ont conçu ce traité. Dans le même esprit que ce dont je parlais dans le point précédent : comment est-ce possible de ne pas représenter tous les âges pour un sujet aussi primordial ? Est-ce cohérent de laisser uniquement des personnes dont la plus grande partie de leur vie est derrière eux concevoir ce texte ?
  • J’ai la sensation que les les instigateurs de ce traité sont aussi ceux qui forcent le passage dans des points comme les brevets logiciels.

Les arguments qui ont, à mon sens, beaucoup plus de poids :

  • Vous avez certainement comme moi, à moins que vous ne travailliez dans le droit, entendu maintes fois parler du traité constitutionnel et n’avez pas prêté une attention particulière au mot traité. Dans le texte d’une vingtaine de pages d’Étienne Chouard, un professeur de droit, j’ai appris ce qu’était un traitéPour réviser la constitution européenne une fois votée, il faudra l’unanimité, ce qui est normal pour un traité, mais pas pour un texte de cette importance. Étienne nous explique qu’en terme d’immobilisme, on ne fait pas mieux. Et je suis complètement d’accord : comment voulez-vous qu’une requête satisfasse les 25 ou 30 états que nous serons demain sans exception ? C’est impossible et c’est bien là le problème.

EDIT : via le blog de DSK, un lien vers un document très intéressant, écrit par un professeur de droit constitutionnel à la Sorbonne, ayant pour objectif de répondre point par point au texte d’Étienne Chouard.

  • Le texte est trop long et par ce fait, impossible à lire pour la plupart. Un peu plus de 400 pages pour le traité lui-même, puis encore un peu plus de 400 pages pour les annexes, soit 850 pages !!! Pourtant, comme rappelé ici, les constitutions française, italienne et américaine font toutes moins de 30 pages. Celles-ci sont donc lisibles par tous, ce qui n’est pas le cas pour le traité actuel, c’est du foutage de gueule ou de la branlette intellectuelle, mais je trouve totalement incroyable et surtout inadmissible qu’on soit parvenu à concevoir un texte qui fait près de 30 fois la longueur d’une constitution classique… Ce paramètre est rédhibitoire quant à la possibilité de tout un chacun de voter en son âme et conscience pour un texte qu’il a lu et auquel il adhère ou pas. Il est clair que ce n’est pas tout le monde qui pourra lire 800 pages de ce verbiage sans gros efforts…

Maintenant, que faire ? Je suis inquiet des conséquences d’un non. Je me demande combien de temps le nouveau texte, parce qu’il en faudra un : je veux l’Europe, c’est juste que je ne veux pas de mauvaises bases pour elle, et si j’estime qu’elles le sont, ce dont je déciderai bientôt parce que je viens de recevoir le texte, je n’hésiterai pas à voter non. Mais suis-je compétent pour le juger, ce texte pour avocat ? Et bien, c’est simple, je suis tout à fait d’accord avec notre professeur de droit, si je n’y comprends rien, je voterai non par principe ! Si je le comprends au moins dans les grandes lignes, je voterai alors oui.

Note : Je mettrai à jour régulièrement ce billet au fur et à mesure des arguments que je trouverai.

Vive la France

Ça fait plaisir de voir qu’un site aussi important fasse des efforts : via formats-ouverts, on apprend que la nouvelle version du site de l’Élysée respecte les standards du web préconisés par le W3C.

Merci.

Affligeant

Je me disais qu’en France nous avions encore la chance de ne pas connaitre le Jerry Springer Show… Peine perdue…

Par le biais de ma Freebox, je peux regarder la chaine RTL9 et j’ai eu le malheur en zappant de tomber sur une émission du même genre en français Ça Va Se Savoir (vu l’accents des intervenants, c’est soit en Belgique soit très près de la frontière belge (Belge ?).

L’histoire du jour : Carl, 27 ans, en veut à son frère Norbert (ou un truc comme ça) parce que celui-ci ne l’a pas remercié pour la maison qu’il lui a construite (bricoleur ou du métier, je ne sais pas, j’ai raté le début). Norbert a voulu le payer mais Carl a refusé. Mais Carl dit que ce n’est pas grave pour l’argent, parce qu’il a été payé… Vous voyez venir le tableau… Oui, il s’est fait la femme de Norbert, la dénommée Pauline, pendant les travaux. Accusé de mensonge, pur prouver qu’il a bien couché avec et éviter que son frère ne le prenne pour un menteur, Carl finit par parler du piercing clitoridien de Pauline devant tout le monde (houuuuu caractéristique du public).

Là, les “Salope”, “sale con” et autres civilités bien habituelles s’en suivent pour ravir le veau spectateur et là, je sors mon portable pour commencer ce billet parce que ce spectacle me sidère…

Rappelons tout de même que Norbert venait simplement pour s’excuser de ne pas avoir suffisamment remercié Carl pour la maison… Le présentateur était bien content de déclencher ce conflit en live pour son audimat.

La dernière parole que j’ai entendu n’est pas mal non plus : Pauline est fâchée avec Carl (l’amant bricoleur) ET son mari (qui a déjà hurlé qu’il demanderait le divorce) et elle annonce fièrement (elle s’est outrée d’être traitée de salope, mais vous allez voir que la définition lui va pourtant bien) qu’elle va de toute façon le quitter pour aller vivre avec… le troisième frère. Oui, jamais 2 sans 3, évidemment.

Mais où va-t-on ? Bientôt, est-ce que nous aussi nous aurons un président con comme la lune, pas capable de faire deux phrases sans créer un incident diplomatique avec ses bushisms ? Les lobbies dirigeront le pays et on mettra J6M au gouvernement pour le bien de tous ?

Toutes mes excuses publiques

En réponse à Olivier, à mon tour de raconter une mésaventure liée à une mauvaise manipulation de commande GNU/Linux… Histoire de ne pas laisser la honte reposer que sur lui et pour m’excuser une fois de plus, parce qu’en plus, j’ai même pas fait l’erreur sur mon compte mais sur celui de quelqu’un d’autre…

Bref, cette histoire a eu lieu il y a un peu plus de deux ans. Alors que j’étais en train de programmer en salle info à l’école pour rendre un projet de plus, j’ai entendu une question provenant de la part d’Anne-Claire et de Brice : elle cherchait à supprimer les fichiers .class générés dans l’arborescence de son projet pour en faire un package (oui, pas de versionning avec CVS ou Subversion, vous allez d’ailleurs voir que ça aurait bien été utile :/).

Alors, paf ! Je sors ma cape de super-gecko (c’est le héro geek, bien connu des utilisateurs du renard de feu, ou autre panda argenté, mais je m’égare. Bon, j’avoue qu’il est agréable de réussir à aider les autres. Ça me fait toujours terriblement plaisir de sortir quelqu’un de la merde. C’est même un peu certainement égoïste, mais je crois que j’en retire souvent une certaine fierté. Là, j’aurais mieux fait de me casser la gueule sur le chemin…), et je fonce.

Moi : “Ouiiii, bonnnnjour à votre service” (mettez la bouche en cul de poule geek) “si vous voulez supprimer un certain type de fichier dans une arborescence, rien de plus simple, je m’en vais vous le montrer”…

Et là, le drame commence.

Je reste debout et je me met à taper frénétiquement la commande magique. Après coup, je suis persuadé que ça a beaucoup joué dans le fait que je tape [Entrée] si vite sans relire une commande potentiellement aussi dangereuse qu’un rm -rf

find . -type f (je dis la commande en même temps que je la tape) -exec (là, on commence la partie qui impressionne toujours les novices, mais bon, c’est pas ça qui permet de draguer, rappelons le) rm {} \; … et PAF ! [Entrée]

Et là, je réfléchis (oui, je sais, normalement, c’est avant qu’on le fait). En une demie-seconde, je viens de comprendre ce que j’ai fait. Des sueurs froides me montent de partout. J’en ai encore honte aujourd’hui. “put*** de crétin, tu as oublié le paramètre -name "*.class" me dis-je en mon for intérieur. “La bonne commande c’est ça : find . -type f -name "*.class" -exec rm {} \; !!!”. Encore à demi courbé, ma tête tombe et je dis : “pardon”.

Brice et Anne-Claire commencent à comprendre ce que je viens de faire, Anne-Claire se met à pleurer (elle avait passé la journée à bosser dessus), à bout de nerf.

Voila… Chui open lapidation, maintenant.

Jokes back

Ça faisait un petit moment que je n’avais pas rempli cette catégorie. Deux choses qui m’ont récemment bien fait rire et dont j’avais envie de vous parler :

  • La première s’est déroulée pendant un vol Paris-Toulouse (ou Toulouse-Paris, je ne sais plus) il y a quelques mois. Le commandant de bord, alors que nous allions décoller, annoncait comme d’accoutumée la température qu’il faisait sur le lieu de destination (voyez avec quelle aisance je parviens à ne pas être obligé de dire Paris ou Toulouse parce que je ne sais plus dans quel sens l’avion volait. C’est fou ce qu’on peut parvenir à faire avec la langue française. On peut facilement éviter de parler pour ne rien dire, non ?). Bref, nous allions décoller, disais-je, avant de m’interrompre impoliment. Et le commandant dit : « À …, il fait une température de 11 dégrés celsius [………..] Et c’est la même chose en anglais » :-)

  • La deuxième est plus courte et est issue des deux minutes du peuple de François Pérusse : vous connaissez la peur de l’impuissance ? C’est la phobite molle.

Encore une page où Flash était indispensable

Bon, on doit pas être nombreux à aller sur cette page, c’est sûr… La formulation m’a bien fait rire : “Une nouvelle version du site utilise le plugin Flash, nouveau standard de l’Internet, qui permet (entre autres) des menus plus interactifs.” (le gras est de moi).

Et alors, là attention CASCAAAADE ! Une page qui effectivement nécessitait forcément du flash pour obtenir “(entre autres) des menus plus interactifs”. Il faut rendre à César ce qui est à Garfield…

Je vais pas très bien, moi.

Brevets logiciels : Un bon résumé du feuilleton

On entend souvent parler de façon décousue des différents évènements du feuilleton des brevets logiciels. Je trouve que cette page reprend bien le tout pour en faire un résumé clair.

Il met bien en valeur les différentes étapes de cette affaire, en montrant clairement les vices de procédure (attention, je ne me prétends pas spécialiste du sujet, loin de là).

En gros, voici un résumé très court de l’histoire, suivi par moi. Je m’efforce d’être objectif et comme c’est un résumé de moi, il y a peut-être quelques légères imprécisions, lisez donc la page donnée en lien ci-dessus pour plus de précisions et de détails si cela vous intéresse.

  • La directive sur les brevets logiciels est rédigée et couvre un large champ d’applications ;
  • Elle est donc amendée pour restreindre le champ de la brevettabilité et éviter les risques d’abus bien connus ;
  • Ces amendements sont supprimés et on tente de passer en force, mais heureusement, la Pologne sauve la mise ;
  • Récemment, deuxième essai ;
  • Et là, ils réussissent.

Comment je juge de la sécurité d'un site

J’ai un nombre très important de comptes sur différents sites, mailing listes, mails, etc. Je pense que ça dépasse les 20 ou 30.

Il m’arrive donc assez régulièrement d’oublier quel login/mot de passe j’ai bien pu utiliser lorsque j’ai besoin d’accéder à mon profil sur certains outils que j’utilise plus rarement que d’autres.

J’utilise alors la fonctionnalité courante Lost you password et là, paf !, je panique parfois… Je dispose d’environ 4 ou 5 mots de passe dignes de ce nom plus ou moins vieux que j’utilise selon la sécurité qu’exige le compte (depuis mon compte d’achat sur le net jusqu’à la mailing liste de SOS).

Je me dis qu’aucune entreprise digne de ce nom ne doit plus stocker un mot de passe récupérable en l’état, il me semble entendu qu’il est aujourd’hui totalement obsolète et dangereux de stocker un mot de passe sans utiliser un hashage type md5 (ou toute autre algorithme de cryptage à sens unique).

Lorsque j’oublie mon mot de passe, je m’attends donc à en recevoir un nouveau, le site en question étant normalement contraint d’en générer un nouveau, me l’envoyer et d’en stocker la version hashée…

Et bien, non.

Un nombre impressionnant de sites ne le fait toujours pas. Je me demande bien quel justification ils peuvent avancer. Encore à l’instant, sur mon compte d’Oracle (!), j’ai rencontré le problème.

Inquiétant.

Si des justifications existent, n’hésitez pas à les donner ici afin que je comprenne mieux. Parce que pour l’instant, la seule chose que cela me prouve, c’est qu’il existe encore des webmasters qui ne soient pas au fait de la plus simple des sécurités, même dans les plus grosses entreprises :/.

Un peu d'orthographe

Parce que je vois trop souvent les mêmes fautes revenir un peu partout sur le net, y compris dans des documents officiels et publics de spécifications que je suis en train de lire, j’en profite pour rappeler la page du présent site dédiée à l’orthographe.

Dans le top parade, voici les quelques fautes les plus courantes que je veux repréciser :

  • Parce que s’écrit en deux mots ;
  • Quel que soit et non quelque soit. Et ça s’accorde : “Quelles que soient les fleurs”…
  • Connexion s’écrit avec un x en français ;
  • y a-t-il prend des tirets uniquement, surtout pas des apostrophes et à des endroits bien précis.

Ces fautes sont déjà citées sur la page donnée en lien en début de billet.

Note : La page des fautes d’orthographe de Batmat.net possède un fil rss.

T'en veuuuuux ?

J’aime beaucoup. Je suis en train de lire une transcription de questions posées à James Gosling lors d’une rencontre avec des développeurs en Australie.

J’ai ri à l’instant en lisant la réponse à la question “What’s your opinion of SCO’s claims to what’s inside Linux?” (en gros, “que pensez des allégations de SCO au sujet du code de Linux ?” :

Et la réponse de Gosling :

Uh…I want some of what they’re smoking […]. SCO were so strange about it, actually refusing to publicly disclose what they think is violating their stuff..

Je vous laisse traduire et lire la suite si vous le voulez :-).

Note : Pour ceux qui l’ignorent. SCO, un des propriétaires principaux des droits originaux d’UNIX, affirme qu’une « grande partie » du code de Linux proviendrait des sources d’UNIX et serait donc volée. Le point que rappelle Gosling ici et que tout le monde a à l’esprit, c’est justement que SCO est ridicule au point d’affirmer ça depuis un bon bout de temps, sans jamais avoir réellement montré du code volé qui soit présent à la fois dans les sources de l’UNIX de SCO et de Linux … L’histoire commence à dire quelque chose du style (je ne sais plus où j’ai lu cette phrase) : “La différence entre le Titanic et SCO, c’est que pour le TITANIC, le capitaine n’avait pas fait exprès d’envoyer son bateau au “casse-pipe”…” :/

Monde de merde

Comme le dit Tristan et comme je l’avais exprimé moi-même récemment, je suis horrifié. Pas tant par le contenu de cette directive que par la manière dont elle a été adoptée…

Quoi que le contenu… Quand on y regarde d’un peu plus près, on se rassure :

Conformément à la Convention européenne des brevets, un programme d’ordinateur en tant que tel ne peut constituer une invention brevetable. Ne sont pas brevetables les inventions consistant en des programmes d’ordinateur, qu’ils soient exprimés en code source, en code objet ou sous toute autre forme, qui mettent en œuvre des méthodes pour l’exercice d’activités économiques, des méthodes mathématiques ou d’autres méthodes et ne produisent pas d’effets techniques au-delà des interactions physiques normales entre un programme et l’ordinateur, le réseau ou un autre appareil programmable sur lequel celui-ci est exécuté.

On se dit qu’ils ont quand même fait attention à la pire des choses. Que la boucle for a peut-être encore quelques chances de rester utilisable par tous sans royalties. Et puis, on lit le paragraphe suivant :

Le Conseil a introduit une nouvelle disposition afin de préciser que, dans certaines circonstances et à des conditions très strictes, un brevet peut correspondre à une revendication pour un programme d’ordinateur, seul ou sur support.

Si on lit ça, on peut penser qu’il n’y a pas à s’inquiéter, mais si on regarde ce que certaines (grosses) boites ont réussi à brevetter de l’autre côté de l’atlantique, on peut commencer à trembler.

Maintenant, il n’y a plus qu’à attendre les bombardements des géants pétés de thunes sur toutes les petites PME qui n’auront pas les épaules pour se rebeller et qui paieront sans broncher les droits d’utilisation de brevets plus absurdes les uns que les autres.

Connerie.

14000 €

Je continue de pousser des cris… Hier soir, devant la télévision j’ai encore vu une chose (en même temps que beaucoup d’autres personnes, j’en suis sûr) qui m’a révolté. Que dis-je dégoûté !

Pour ceux qui l’ignorent encore, sachez que le ministre de l’Economie, jusqu’à ce que cette histoire soit rendue publique par le canard enchaîné vivait tranquillement avec sa famille dans un appartement de 600m² à Paris, payé par le contribuable, pour la modique somme de 14000€/mois

Et Pierre Méhaignerie de tenter de l’excuser : “Comprenez bien qu’un ministre doit parfois recevoir des chefs d’état, et il ne pourrait le faire dans un 70m².” (sic).

Décidément, je crois que ces gens là ignorent ce que signifie l’expression “juste milieu”. Et après, Hervé Gaymard ose dire qu’il faut que la France “se désintoxique de la dépense publique”.

Et voilà

Je laisse le Web un moment parce que je ne suis plus dans mon environnement habituel (on m’a volé mon ordinateur portable :-() et paf ! Vlà que batmat.net n’est plus premier sur la requête batmat ! Même la requête sur baptiste mathus qui renvoyait auparavant le présent site ne renvoie même plus batmat.net ne serait-ce que sur la première page…

Décidément, je ne comprends pas bien le fonctionnement de google. Il est rancunier ce petit coquin. Serait-ce parce que je n’ai pas mis à jour ce blog depuis un peu plus de deux semaines ? Peut-être… J’ai beaucoup de travail en ce moment, c’est donc difficile, mais j’ai quelques sujets potentiels qui devraient permettre de combler ce vide d’ici très bientôt je l’espère. En attendant et pour meubler donc, je vous offre ce petit billet nombriliste :).

À la prochaine.

EDIT : heyy, attendez, je viens de m’apercevoir que l’image des poissons en haut de page rendait la page invalide :/. C’est corrigé, on va voir très vite si ça joue pour remonter dans l’estime de google.

fireFooXXX

Il faut croire que les billets s’attirent entre eux :-).

Au détour d’une recherche sur Java, voilà-t-y po que je tombe sur une référence à mon navigateur préféré.

PS pour ceux qui ne suivent pas : / protected avec firefox. :D

Rajouter une interface à une classe pendant l'exécution

Je viens à l’instant de découvrir enfin les joies de l’ASM (j’ai bien dit ASM ! :-p). Je me suis basé pour ce faire sur un exemple d’un de mes profs cette année, Rémi Forax pour l’ASM et sur ce billet pour mieux comprendre le principe de l’agent java (cf. plus loin). Comme c’est encore frais, j’en profite pour en faire un petit article qui sera profitable, je pense, à d’autres et à moi pour plus tard ^^.

Cet outil permet en Java de rajouter du code à une classe pendant l’exécution. C’est très impressionnant. Imaginons qu’on veuille faire quelque chose que le compilateur ne permet pas. Je veux par exemple renvoyer une classe d’un type différent, mais la même cependant, selon des paramètres donnés, je n’ai pas d’autres choix que d’écrire les deux classes différentes.

Pas avec ASM, justement.

Je vais ici expliquer avec un exemple le plus simple possible comment rajouter une interface à une classe pendant l’exécution. Pour faire cela, nous aurons besoin de trois choses (en plus de javac et java, évidemment) :

Pensez aussi à vos petits doigts, ça peut servir.

Nous allons écrire une classe AddInterfaceClassTransformer qui hérite de ClassFileTransformer. C’est cette classe qui va s’occuper de modifier le bytecode de la classe qu’on veut changer au moment de son chargement.

Comment ça marche ?

  1. On utilise un pattern Visitor pour en quelque sorte tager les classes qu’on veut modifier ;
  2. On parcourt la classe pour réécrire le code qu’on souhaite en fonction des tags par exemple.

En fait, on va indiquer à la VM qu’elle doit utiliser un “java agent” avant de charger les classes. C’est ce principe qui va nous permettre de modifier le code si on le souhaite.

La classe de test

On écrit cette toute petite classe qui “implémente” par exemple EventListener, on lui fait implémenter quelque chose pour bien mettre ensuite en évidence qu’il y en a bien une de plus :

public class MyClassOfMe implements EventListener
{
}

Le code de test

La classe suivante va nous permettre d’afficher par reflection java les interfaces de MyClassOfMe :

public class MonTest
{
   public static void main(String[] args)
   {
       System.out.println("Liste des interfaces de "+MyClassOfMe.class+" : ");
       for (Class interfaze : MyClassOfMe.class.getInterfaces())
       {
           System.out.println(interfaze);
       }
       System.out.println("Fin");
   }
}

Si on lance cette classe après compilation, on obtient le résultat suivant :

$ java fr/umlv/bmathus/MonTest
Liste des interfaces de class fr.umlv.bmathus.MyClassOfMe :
interface java.util.EventListener
Fin

Rien d’extraordinaire, on a affiché là ce qui est actuellement compilé et qu’on a sous les yeux. Mais encore fallait-il vérifier que ça fonctionne :-).

Maintenant, nous voudrions donc comme je l’ai dit que cette classe affiche en fait une ligne de plus indiquant qu’elle implémente une interface supplémentaire. J’ai choisi d’ajouter Serializable.

Le transformer

Écrivons donc le ClassFileTransformer qui va nous permettre de faire ça :

public class AddInterfaceClassTransformer implements ClassFileTransformer
{
   public byte[] transform(ClassLoader loader, String name, Class clazz,
           ProtectionDomain domain, byte[] code)
           throws IllegalClassFormatException
   {
       // if it's not the first load or a bootstrap class
       if (loader == null || clazz != null)
           return null;

       System.out.println("[Loading " + name + "]");

       ClassReader reader = new ClassReader(code);

       // On "tag" le code à modifier
       final MyVisitor myVisitor = new MyVisitor();

       // On fournit le visitor au reader, on ne s'occupe pas des méthodes de
       // debug (skipDebug=true)
       reader.accept(myVisitor, true);

       ClassWriter writer = new ClassWriter(false);

       MyRewriteClassAdapter rewriteClassAdapter = new MyRewriteClassAdapter(
               writer, myVisitor.mustAddInterface);
       reader.accept(rewriteClassAdapter, true);

       byte[] remoteCode = writer.toByteArray();
       return remoteCode;
   }

Ici, on définit en tant que classe interne le visitor qui va s’occuper de marquer les classes qu’on souhaite modifier.

   private class MyVisitor implements ClassVisitor
   {
       public MyVisitor()
       {
       }

       public void visit(int version, int access, String name,
               String superName, String[] interfaces, String sourceFile)
       {
           System.out.println("Nom de la classe analysée = " + name);

Je n’arrive pas utiliser getInternalName(MyClassOfMe.class) et que ça fonctionne encore ici, donc je mets la chaîne en dur. Si quelqu’un a une explication, je suis preneur.

           if ("fr/umlv/bmathus/MyClassOfMe".equals(name))
           {
               mustAddInterface = true;
           }
       }

       public void visitInnerClass(String _arg0, String _arg1, String _arg2,
               int _arg3)
       {
       }

       public void visitField(int _arg0, String _arg1, String _arg2,
               Object _arg3, Attribute _arg4)
       {
       }

       public CodeVisitor visitMethod(int _arg0, String _arg1, String _arg2,
               String[] _arg3, Attribute _arg4)
       { 
           return null;
       }

       public void visitAttribute(Attribute _arg0)
       {
       }

       public void visitEnd()
       {
       }

       boolean mustAddInterface;
   }

   private static class MyRewriteClassAdapter extends ClassAdapter
   {

       private boolean mustAddInterface;

       public MyRewriteClassAdapter(ClassWriter writer,
               boolean mustAddInterface)
       {
           super(writer);
           this.mustAddInterface = mustAddInterface;
       }

Ici, assez simplement, on récupère la liste des interfaces déjà présentes. Et on y ajoute Serializable, l’utilisation d’un Set nous permet de ne pas nous occuper de savoir si l’implémentation est déjà présente. En effet, pour ceux qui l’ignorent, un Set est un ensemble. Or, au sens mathématique, ça veut dire qu’on ne peut pas avoir deux fois le même objet. Donc, ici, l’ajout ne se fera que si l’interface n’est pas encore présente.

       public void visit(int version, int access, String name,
               String superName, String[] interfaces, String sourceFile)
       {
           HashSet<String> set;
           if (interfaces == null)
               set = new HashSet<String>();
           else
               set = new HashSet<String>(Arrays.asList(interfaces));

           if (mustAddInterface)
           {
               set.add(I_SERIALIZABLE);
           }
           super.visit(version, access, name, superName, set
                   .toArray(new String[set.size()]), sourceFile);
       }

       private static String I_SERIALIZABLE = getInternalName(Serializable.class);
   }

Là, nous donnons le point d’entrée du java agent. De la même façon que la fonction main est le point d’entrée d’une classe normale, la méthode premain est celui recherché par la vm lorsqu’on lui indique qu’une classe est un agent java.

On lui passe ici une instance de notre transformer.

   public static void premain(String agentArgs, Instrumentation inst)
   {
       inst.addTransformer(new AddInterfaceClassTransformer());
   }

   private static String getInternalName(Class< ? > clazz)
   {
       return clazz.getName().replace('.', '/');
   }

   private static Method defineClass;
   static
   {
       try
       {
           defineClass = ClassLoader.class.getDeclaredMethod("defineClass",
                   String.class, byte[].class, int.class, int.class,
                   ProtectionDomain.class);
       }
       catch (NoSuchMethodException e)
       {
           throw new AssertionError(e);
       }
       defineClass.setAccessible(true);
   }

   private static HashSet<String> objectMethods = new HashSet<String>();
   static
   {
       objectMethods.add("equals" + "(Ljava/lang/Object;)Z");
       objectMethods.add("toString" + "()Ljava/lang/String;");
       objectMethods.add("hashCode" + "()I");
   }
}

Création du java agent

Comme je l’ai indiqué au début, cette classe doit être utilisée par la vm avant de charger normalement les classes. Nous allons donc packager notre classe dans un jar pour l’utiliser ensuite en tant qu’agent java.

Le manifest

Le manifest doit contenir une ligne indiquant la Premain-Class à utiliser, il aura donc la forme suivante :

Premain-Class: fr.umlv.bmathus.AddInterfaceClassTransformer

À présent, nous pouvons créer notre jar :

$ jar cvfm transformer.jar META-INF/MANIFEST.MF fr

C’est presque fini, il ne reste plus qu’à lancer la même classe qu’au début en précisant à la vm qu’elle doit utiliser notre java agent transformer.jar. Bien entendu, il faut rajouter au classpath le jar d’asm :

java -javaagent:transformer.jar -cp asm-1.5.3.jar:. fr/umlv/bmathus/MonTest

Et ça affiche :

[Loading fr/umlv/bmathus/MonTest]
Nom de la classe analysée = fr/umlv/bmathus/MonTest
[Loading fr/umlv/bmathus/MyClassOfMe]
Nom de la classe analysée = fr/umlv/bmathus/MyClassOfMe
Liste des interfaces de class fr.umlv.bmathus.MyClassOfMe :
interface java.io.Serializable
interface java.util.EventListener
Fin

Gagné ! Nous avons réussi à ajouter l’interface qu’on voulait à notre classe.

Conclusion

ASM est très puissant, je n’ai fait là qu’en découvrir un petit morceau. Ce type de traitement est applicable à n’importe quel attributs de votre classe, vous pouvez ainsi modifier méthodes, champs, etc. Je reviendrai certainement sur le sujet d’ici quelques temps si je trouve des compléments intéressants à ce billet.

Mon poing sur la gueule

Vous vous souvenez du billet où je parlais du fait qu’on essayait de faire passer les brevets logiciels lors d’un conseil de l’agriculture ?

Et bien, ils remettent ça ces connards ! Putain, mais dans quel monde je, nous vivons ? C’est ça qu’on appelle un processus démocratique ? Essayer de faire passer en force (et plusieurs fois!!!) des trucs aussi importants en les faisant valider par des gens qui ne connaissent pas les dossiers et qui n’en ont donc pas les compétences ?

Ahurissant, désarmant. Je ne comprends pas. Je suis dégoûté. Partagé entre l’envie de coller une grosse baffe aux instigateurs de cette manipulation malhonnête et celle de leur vomir dessus par dégoût.

Quelle honte.

Visual très basic

En direct de la partie cartoons de theserverside : The usual suspect.

Mon besoin du moment

Des journées plus longues… Une soixantaine d’heures par jour m’irait assez bien… Pas le temps de dormir… Pas le temps de sortir… Pas le temps de vous parler…

Quelle horreur…

Mapper une relation many-to-many avec Hibernate

Un peu de technique, soyons fou. Après cette nuit de coding party pour le projet de génie logiciel de mon école, je me dis que c’est sûrement un bon moment pour vous parler d’hibernate.

J’avais déjà un peu parlé d’hibernate ici pour ceux qui se demandent ce que c’est. En gros, c’est un outil qui permet de ne pas s’occuper de la sauvegarde de ses objets dans une base de données. On spécifie pour ce faire un mapping en XML indiquant les correspondances entre le modèle relationnel (les tables de la BD) et le modèle objet (les classes).

Je vais ici décrire comment effectuer un mapping many-to-many. Cet exemple est ciblé pour ce besoin, si vous ne connaissez pas ce dont je parle et que vous voulez en savoir plus, allez plutôt lire la documentation de référence. Je me suis initialement basé sur cet article pour me documenter et réaliser mes tests.

Mon objectif est de donner un exemple simplifié au maximum, mais complet. Par complet, j’entends donner le diagramme de classes et leurs relations, le mapping de toutes les classes et tester quelques trucs qui m’ont fait me poser des questions lorsque je cherchais.

J’ai prévu de faire ça sur différents sujets, je dirais que le prochain que je ferai sera conditionné à la fois par les demandes en ce sens et un peu par mon temps :-).

Les relations ?

On a une classe RCourse et une classe RStudent :

  • un cours peut contenir plusieurs étudiants ;
  • un étudiant peut assister à plusieurs cours.

Rappelons ici, qu’une relation de type n/n génère sur un schéma relationnel une table intermédiaire qui contient justement les associations RCourse/RStudent existantes. Nous décidons d’appeler cette table rstudent_rcourse.

Le code

Voilà les deux classes Java correspondantes :

public class RCourse
{
   int id;
   String name;
   Set<RStudent> students;
   //Écrivez ici tous les setters et getters 
    [...]
}
public class RStudent
{
    private int id;
    private String firstName;
    private String lastName;
   //Écrivez ici tous les setters et getters 
    [...]
}

Un conseil pour les getters et setters. Si vous utilisez un IDE comme eclipse, demandez lui de générer toutes les méthodes en protected. En effet, cette visibilité suffit à Hibernate pour accéder à l’objet persistant et vous permet de ne pas exposer forcément tous les setters publics sur votre objet. Un peu à la manière de la configuration d’un firewall : fermez tout, ne passez ensuite en public que les méthodes au fur et à mesure des besoins.

Le mapping

La partie un peu moins facile que le reste est la description du set , mais le fichier reste quand même assez simple :

Pour RCourse :

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
                "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
  <class name="de.berlios.chronos.technique.hibernate.relations.RCourse" 
    table="rcourse">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="name" type="java.lang.String" />

    <set name="students" table="rstudent_rcourse" lazy="false">
      <key column="course_id"/>
      <many-to-many class="de.berlios.chronos.technique.hibernate.relations.RStudent" 
        column="student_id" outer-join="true"/>
    </set>
  </class>
</hibernate-mapping>

Pour RStudent :

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
               "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
  <class name="de.berlios.chronos.technique.hibernate.relations.RStudent" 
    table="rstudent">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="firstName"/>
     <property name="lastName"/>

    <set name="courses" table="rstudent_rcourse" lazy="false">
      <key column="student_id"/>
      <many-to-many class="de.berlios.chronos.technique.hibernate.relations.RCourse" 
        column="course_id"/>
    </set>
  </class>
</hibernate-mapping>

Faisons remarquer l’attribut lazy (i.e. paresseux, oui, oui) de la balise set. Il conditionne le fait qu’Hibernate cherchera ou non à peupler directement les collections dépendantes à la récupération de l’objet (exemple : si on récupère un cours, si il doit aller chercher tous les étudiants de ce cours tout de suite), ou si il doit attendre l’utilisation de la collection en question pour le remplir.

Génération du SQL

Grâce à SchemaExport, il est possible de générer directement tout le SQL correctement au mapping ci-dessus. Vous pouvez vous inspirer de l’exemple de script donné ici si vous avez des soucis avec ça. Si vous insistez, je pourrais éventuellement envisager d’écrire quelques explications sur le sujet.

alter table rstudent_rcourse drop constraint FKDB6FCE57C276819F;
alter table rstudent_rcourse drop constraint FKDB6FCE57575ED7BF;
drop table rstudent_rcourse;
drop table rstudent;
drop table rcourse;
drop sequence hibernate_sequence;
create table rstudent_rcourse (
   course_id int4 not null,
   student_id int4 not null,
   primary key (student_id, course_id)
);
create table rstudent (
   id int4 not null,
   firstName varchar(255),
    lastName varchar(255),
   primary key (id)
);
create table rcourse (
   id int4 not null,
   name varchar(255),
   primary key (id)
);
alter table rstudent_rcourse add constraint FKDB6FCE57C276819F foreign key (student_id) references rstudent;
alter table rstudent_rcourse add constraint FKDB6FCE57575ED7BF foreign key (course_id) references rcourse;
create sequence hibernate_sequence;
Tester

Après avoir écrit le code, le mapping, généré le sql et créé les tables, on peut tester. Il est notamment intéressant de tester l’influence du paramètre lazy.

Conseil : sauvegardez des étudiants et un cours auquel ils assistent. Essayez ensuite de récupérer l’objet RCourse en mettant tour à tour le paramètre lazy à false ou true.

Positionnez l’affichage du code SQL (hibernate.show_sql=true) et faites quelques affichages entre la récupération de l’objet et le premier accès que vous faites à la collection de students. Selon le mode (fainéant ou non), vous remarquerez que le moment où la requête de jointure est effectuée diffère : au moment du Session.find() pour lazy=“false”, au premier accès à la collection pour lazy=“true”.

Conclusion

Bon, j’ai été un plus court que je n’aurais voulu, mais je suis très fatigué et je pense que des docs plus complètes existent déjà sur Internet. De toute façon, mon objectif résidait plus dans le fait de founir tout le code nécessaire aux tests au néophyte afin qu’il puisse constater simplement et rapidement le fonctionnement d’Hibernate.

Train pour Lille ou comment bien contrôler

Aujourd’hui, j’ai pris le train pour aller à Lille voir un copain à qui je l’ai promis depuis la terminale. 6 ans déjà :-/. Il était temps…

Bref, en arrivant gare du Nord, avant de monter dans le train, il y avait déjà une horde de contrôleur (une petite horde il est vrai, environ 6 ou 7, c’est à partir de combien une horde ? (o= ) qui attendait pour contrôler, donc, tous les voyageurs à l’entrée du quai.

Très bien, je montre mon billet, il le vérifie, me dit même que j’ai oublié de le composter (ah, la fatigue…), je corrige ceci et je passe.

Je m’installe donc dans le convoyeur raillique de viande humaine et je commence à travailler sur mon portable. Je découvre un réseau Wifi, je m’y connecte, ehehe un DHCP me donne une adresse et … trop tard, le train a démarré et je n’ai pas le temps de regarder si je pourrais avoir accès au net =).

Après quelques minutes, qui vois-je arriver ? LE CONTRÔLEUR…

Je réfrenne une envie sauvage de lui demander pourquoi on est contrôlé deux fois pour le même prix et s’il est payé au nombre de contrôles dans la journée, il REvérifie donc mon billet et passe son chemin.

Alors question à un éventuel connaisseur des mécaniques occultes internes à la SNCF : Est-ce que vous pouvez m’expliquer l’utilité de payer des gens à contrôler les voyageurs dans le train alors que ceux-ci n’ont déjà pu y rentrer que s’ils avaient été contrôlés ?

….. Et c’est nous qui payons …..

Ça ne fera jamais qu'une de plus

Et hop, encore une faille de sécurité “extrêmement critique”… Via slashdot, on apprend en effet qu’une nouvelle faille IE6 sur un SP2 pourrait permettre à un programme, je cite :

  • d’écrire des fichiers sur votre disque ;
  • d’en supprimer.

Étonnant, non ?

Bon, j’ai failli arrêter là ce billet, mais je me dis que certains (il en reste encore ?) n’utilisent ou ne savent pas quelle autre solution existe. Pour surfer sur Internet, utilisez firefox.

Le navigateur obsolète

Bon, nous avons quelques jours pour que ce célèbre navigateur obsolète devienne premier sur google pour la requête “navigateur obsolète”.

Vincent et Denis ont commencé, je continue. Allez, faites passer le message pour que notre navigateur obsolète possède enfin la place qu’il mérite tant.

C’est vrai qu’un navigateur obsolète comme celui-ci, on n’en fait plus…

Mise à jour du 9 janvier : Ayè, c’est déjà gagné

Ah ben ça va mieux maintenant

C’est mieux.

# free
            total       used       free     shared    buffers     cached
Mem:        775264     607272     167992          0      29268     303304
-/+ buffers/cache:     274700     500564
Swap:       491360          0     491360

Avec Gnome 2.8, Eclipse, OpenOffice.org, Firefox, Thunderbird, Apache, PostgreSQL et tous mes services habituels (serveur ssh, xinetd, etc.) lancés en même temps.

C’est un peu comme une bouffée d’air pur :-)

Mise à jour du 9 janvier : pour les gens comme Vincent qui ne comprennent pas ce qu’il y a au dessus. En gros, ma machine avait trop peu de RAM (cf. billet précédent), ce qui fait qu’elle devait beaucoup swapper (en gros aussi, utiliser le disque dur comme ram virtuelle, le problème c’est qu’un dd est beaucoup plus lent que de la vraie RAM). La commande free donne l’utilisation de la mémoire, ici on voit que j’ai maintenant 775Mo de RAM au lieu de 256 avant. On voit donc aussi en conséquence que la machine ne swappe plus (au lieu de 300Mo avant…), ce qui se ressent énormément au niveau de la réactivité du système lorsqu’il est chargé.

D’autres part, je vais rajouter ces quelques mots pour que google les référence au cas où des gens qui possèdent le même portable que moi chercheraient à savoir quelle RAM fonctionnerait avec leur ordinateur. Mon portable est un Presario X1000, plus précisément un X1005EA. C’est un centrino et le type de RAM qu’il utilise est de la DDR-SDRAM SoDimm PC2100. J’ai acheté une barette de 512Mo Corsair garantie à vie sur le site de LDLC, livré en quelques jours seulement, tout a fonctionné parfaitement.

Linux, MacOS ou Windows

Récemment, au cours des réunions familiales qui se produisent communément en ces moments noëliens, un membre de ma famille m’a demandé ce qui lui serait nécessaire pour être en mesure de faire du traitement vidéo.

Ni lui ni sa femme ne sont passionnés d’informatique comme vous (hein ?) et moi (bon, ça ok). Ils ont encore moins l’esprit hacker, comme beaucoup de gens par ailleurs. Je ne les vois pas s’extasier devant un “Rhoo, c’est quand même génial les systèmes de fichiers journalisés, je viens de crasher mon kernel et paf ! je reboote comme si de rien n’était” (non pas que ça se produise souvent, loin de là, mais je cherchais un exemple :-p) ou devant un “Ouaaaah, c’est vraiment beau cet écran bleu qui apparaît au milieu de ma gravure”.

En fait, ma réflexion fut rapide : j’ai beau être fermement convaincu de l’avenir de GNU/Linux, je suis conscient qu’il n’est actuellement pas encore tout à fait prêt pour permettre une utilisation simplissime et rapidement installable pour un utilisateur qui découvre ce qu’est une souris. Certaines distributions facilitent certes la vie, mais allez ensuite brancher à votre ordinateur le dernier truc bidule firewire et essayez de le faire fonctionner sans passer en mode administrateur énervé et vous comprendrez qu’il y a encore un peu de travail…

Ensuite, j’ai pensé à Windows. Et là je me suis dit : “non plus, non”. Quitte à conseiller un environnement propriétaire, je ne vais pas conseiller ça. Certes, certains périphériques sont détectés dès l’installation, mais pour certains autres, cela devient vite l’horreur. Je me souviens par exemple de ma webcam qui marchait fort bien, jusqu’au jour où paf, marche plus. Les drivers devaient être installés (ça marchait ptête sans jusque là, mais bien sûr…). Et puis, si c’est pour que ça me contraigne à installer moults antivirus, firewall et à aller vérifier la machine régulièrement, merci bien.

Quitte à être dans un environnement propriétaire et à payer peut-être le tout un peu cher, je préfère de loin leur conseiller un environnement complet dont l’éditeur n’a pas le souci des deux précédents : à savoir fonctionner avec des matériels et des configurations différentes et parfois pour le moins exotiques. Non, je préfère conseiller un environnement complet ou l’unification est complète, le choix clair.

Un Mac.

Je découvre cet environnement depuis quelques temps en jouant avec de temps en temps sur le portable de Vincent et il est clair que c’est MacOSX qui conviendra le mieux. Ils veulent du support, de la simplicité et quelque chose qui fonctionne.

Pour Linux, ce qui m’inquiète c’est la simplicité. Je suis sûr d’arriver à le faire fonctionner et à rendre cette machine totalement fonctionnelle pour longtemps. Ensuite, ils n’auraient plus qu’à suivre mes directives pour l’utilisation au jour le jour. Mais combien de temps cela va-t-il me prendre ? Je n’ai pas 20 ou 30 heures en ce moment à consacrer à cette installation.

Pour Windows, c’est plutôt la longévité qui m’inquiète. Comme chacun sait, il n’est pas rare sous cet OS d’avoir quelque chose qui fonctionne. Et puis un jour, tiens non… Ça marche plus. Et je ne veux pas avoir à gérer ça, hors de question. Si je n’utilise plus Windows sur ma machine depuis plusieurs années maintenant, c’est bien une des raisons qui m’y ont poussé et je ne veux pas le revivre.

Donc, Mac, voilà. Mac.

Qu’est-ce que vous en pensez ?

PS : Les avis que je donne ici des trois OS cités sont ceux issus de mon expérience personnelle. Je connais assez bien windows pour l’avoir longtemps utilisé avant d’arriver à GNU/Linux. Je connais peu Mac, mais le peu que j’en ai vu et entendu semble aller largement dans mon sens.

Maintenant, je suis sûr de ce que j'aurais dû acheter pour Noël

free

            total       used       free     shared    buffers     cached
Mem:        256628     244344      12284          0      89268      41800
-/+ buffers/cache:     113276     143352
Swap:       491360     304768     186592

Là, ça devient vraiment urgent…

Joyeux noël

Mon cul…

Enfin, joyeux noël à vous disons toujours.

Moi, j’ai été obligé de tapoter sur mon portable jusqu’à 22h00 pour terminer un compte-rendu de sécurité réseau à rendre aujourd’hui. J’ai le cerveau qui me fait mal à chaque fois que je pense à ce qu’il me reste à faire :

  • rendu cahier des charges techniques du projet de génie logiciel pour jeudi prochain au plus tard
  • CORBA JavaCard, Interceptor
  • exposé réseau, Wifi, WPA

Je suis fatigué, très fatigué.

Vivent les études et merde à ceux qui croient qu’on s’y repose.

Foutage de gueule

On se demandait quand est-ce qu’on allait entendre reparler des brevets logiciels. Vous savez, le genre de choses qui a permis à Kodak d’attaquer Sun pour “tout système ayant recours à des processus d’interaction entre programmes et notamment via la gestion d’objets ou de données partagés”… Et de gagner…

Oui, vous ne rêvez pas. Vous voyez beaucoup de systèmes qui ne tomberaient pas sous le coup d’une définition de brevet aussi vague ? Les IPC, les threads, les fichiers même (!), etc. Tous ces concepts sont alors clairement brevettés…

Ce point fait aussi en ce moment couler beaucoup d’encre (:/) sur la ml debian.

Et bien, ils ont décidé de le refaire passer au vote aujourd’hui. Ce point sera traité aujourd’hui à 15h lors d’une réunion des ministres de l’agriculture. DE L’AGRICULTURE !!!. Comment faire adopter une directive par des gens en leur soumettant un sujet totalement hors du champ de leur compétence ! C’est vraiment du foutage de gueule.

Alors, vous aussi jouez votre rôle. Parlez-en autour de vous et envoyez un mail, comme moi et beaucoup d’autres, à communication(at)agriculture(point)gouv(point)fr pour exprimer votre opposition. Vous pouvez utiliser le modèle de lettre fourni ici pour ce faire.

Mise à jour du 23 décembre 2004 :

Cette opération scandaleuse n’est pas passée grâce en grande partie au ministre de la Pologne qui s’est déplacé en personne pour faire retirer ce point de la liste ! Merci la Pologne !

Unable to compile kernel

Ce billet sera aussi en anglais mais je mettrais aussi les messages d’erreurs produits par le noyau en français. En bref, gcc-3.4 : pas glop pour la compilation du noyau (2.4.27).

Well, this one will be in english too although I’m going to put french error messages too. It will let french users find the information in typing the message in google.

If you’re trying to compile the Linux kernel with gcc 3.4, you may have noticed that it generates an error. I didn’t find quickly because I had forgotten I had changed the symbolic link to point to gcc-3.4 instead of the default 3.3 version. To be able to compile, just be sure you’re not using gcc 3.4, it worked for me :-)

In english :

sched.c:213: error: conflicting types for 'reschedule_idle'
sched.c:210: error: previous declaration of 'reschedule_idle' was here
sched.c:213: error: conflicting types for 'reschedule_idle'
sched.c:210: error: previous declaration of 'reschedule_idle' was here
sched.c:371: error: conflicting types for 'wake_up_process'
/usr/src/kernel-source-2.4.27/include/linux/sched.h:603: error: previous declaration of 'wake_up_process' was here
sched.c:371: error: conflicting types for 'wake_up_process'
/usr/src/kernel-source-2.4.27/include/linux/sched.h:603: error: previous declaration of 'wake_up_process' was here
sched.c:409: error: conflicting types for 'schedule_timeout'
/usr/src/kernel-source-2.4.27/include/linux/sched.h:148: error: previous declaration of 'schedule_timeout' was here
sched.c:409: error: conflicting types for 'schedule_timeout'
/usr/src/kernel-source-2.4.27/include/linux/sched.h:148: error: previous declaration of 'schedule_timeout' was here
sched.c:739: error: conflicting types for '__wake_up'
/usr/src/kernel-source-2.4.27/include/linux/sched.h:595: error: previous declaration of '__wake_up' was here
...
make[3]: *** [sched.o] Error 1
make[3]: Leaving directory `/usr/src/kernel-source-2.4.27/kernel'
make[2]: *** [first_rule] Error 2
make[2]: Leaving directory `/usr/src/kernel-source-2.4.27/kernel'
make[1]: *** [_dir_kernel] Error 2
make[1]: Leaving directory `/usr/src/kernel-source-2.4.27'
make: *** [stamp-build] Error 2

In french :

sched.c:213: erreur: types conflictuels pour « reschedule_idle »
sched.c:210: erreur: déclaration précédente de « reschedule_idle » était ici
sched.c:213: erreur: types conflictuels pour « reschedule_idle »
sched.c:210: erreur: déclaration précédente de « reschedule_idle » était ici
sched.c:371: erreur: types conflictuels pour « wake_up_process »
/usr/src/kernel-source-2.4.27/include/linux/sched.h:603: erreur: déclaration précédente de « wake_up_process » était ici
sched.c:371: erreur: types conflictuels pour « wake_up_process »
/usr/src/kernel-source-2.4.27/include/linux/sched.h:603: erreur: déclaration précédente de « wake_up_process » était ici
sched.c:409: erreur: types conflictuels pour « schedule_timeout »
/usr/src/kernel-source-2.4.27/include/linux/sched.h:148: erreur: déclaration précédente de « schedule_timeout » était ici
sched.c:409: erreur: types conflictuels pour « schedule_timeout »
/usr/src/kernel-source-2.4.27/include/linux/sched.h:148: erreur: déclaration précédente de « schedule_timeout » était ici
sched.c:739: erreur: types conflictuels pour « __wake_up »
...
make[3]: *** [sched.o] Erreur 1
make[3]: Leaving directory `/usr/src/kernel-source-2.4.27/kernel'
make[2]: *** [first_rule] Erreur 2
make[2]: Leaving directory `/usr/src/kernel-source-2.4.27/kernel'
make[1]: *** [_dir_kernel] Erreur 2
make[1]: Leaving directory `/usr/src/kernel-source-2.4.27'
make: *** [stamp-build] Erreur 2

Best Practices in Java

This post is a translation of this one. Many people commented it at the moment it was published although it was only available to those who speak french.

I found it very interesting to try and compare my opinion with the others. I thought it would be great to extend the possible field of this post to the world into re-publishing (and adapting) it in english. The other interest I see is that I could be corrected for my english mistakes :).

It is the first time I do that, I bet that won’t be the last one :).


Today, we’re going to speak about best practices in the Java programming language. We’ll speak about the API classes that are fonctionnally deprecated, we’ll speak about evolutivity and abusive inheritance, all of this framed by design patterns.

The forbidden classes

I still find projects on the web that are using the following classes (surely this list isn’t exhaustive, but these two are the most common) :

  • Hashtable
  • Vector

You must not use theses classes. They are still present only to assure upward compatibility. The jvm 1.4 must be able to run a program written for the 1.0, this version can in fact contain objects of this type because their alternative only appear in the 1.2 version.

Since the 1.2 so, it mustn’t be used anymore. Then why, you say, didn’t they deprecated those classes since this version ? That’s very simple : Hashtable is a hash table (a key-value list) and Vector is designed to manage an objects list… That’s to say extremely common and used objects. So, Sun decided not to deprecate it to prevent old programs developed with the 1.2 from getting hundreds, even thousands of warnings during the compilation.

Why not use them ?

Those classes are “synchronized”, they are what we call thread-safe. It means that when you’re in an environment containing more than one thread of process, if you use them, you’re sure your data will keep coherent. That wouldn’t be the case without synchronization.

The point is that this fonctionnality is far from being used in all projects. In fact, we’re not allways using our objects in a concurrent context (and that’s a good thing). Speaking about performances, this synchronization is not free (as in free beer ^^) (we’re used to hear about five times slower with synchro). So you see that using a Vector to store your lists is commonly a pure waste of performances.

The alternatives

But which classes should I use as a replacement ? Those one, their non thread-safe equivalents :

  • ArrayList for Vector
  • HashMap for Hashtable
So what if I want a thread-safe container ?

If you we’re thinking about this question, congratulations. In a concurrential environment, you must always synchronize objects in one way or another… There’s two solutions to do it :

Synchronization where it’s necessary using a non synchronized container

  • Pros : Possible performance gain because you perfectly control the synchronization of your code ;
  • Cons : More difficult because you’ve got to take care not to forget this synchro if you don’t want to get strange results, or worst : totally upset.

Use of synchronized container :

  • Pros : Just concentrate one good time on the development of the container. Then you’ll be able to use it without fearing inconsistencies during execution ;
  • Cons : Possible loss of performance because you might use synchronization where it’s not necessary.

Fortunately, you say, the class Vector which you can use when you need a _thread-safe_ container. But no, you can drop this class. Instead, use the static method Collections.synchronizedList() “Javadoc of the “Collections” class on the Sun website”). you’ll get a synchronized list from one that is not. At the same, you’ll be using the important pattern which consists in hiding implementations. Great ! That’s what I’m going to speak now ! :-)

Increase code evolutivity

Hide implementation

A lot of applications are still using Vector today, why ? Because this class has been used everywhere without being hidden by a class or an interface.

Since the 1.2, Vector implements the List interface, so do ArrayList and LinkedList. When using a list, the implementation must be hidden. To do it, just say you’re using a class that implements List. If you get used to do it everywhere, you’ll see that it becomes really simple to change implementation afterwards. For example, if you decide that ArrayList doesn’t fit you anymore, you could easily replace it by a personal implementation of List, nobody will know it and all the code that isn’t yours will keep unchanged (ant that’s the BIG point).

The factories

Use factories to create your objects. This way you’ll be easily able to hide an implementation.

Example : Pouet must be able to say hello

public interface Pouet
{
  /**
   * Displays hello to the screen
   */
  public void sayHello();
}

Very well, so the first thing to do is writing an implementation of Pouet :

public class PouetImpl implements Pouet
{
  public void sayHello()
  {
     System.out.println("Hello");
  }
}

If you only do this, the users of your class won’t have any other choice than writing

PouetImpl pouet = new PouetImpl();

And they are a bit more experienced

Pouet pouet = new PouetImpl();

Then they’ll use Pouet and not PouetImpl everywhere in their code. The problem is that you’re letting others make choices in the way of using your code. As much as possible, you’ve got to reduce the number of ways you provide to do things. If you don’t do this, you’ll meet akward maintenance problems…

If they’re a bit experienced, they’ll try to centralize this code. For example, they will write the factory you should have written :

public final class PouetFactory
{
  public Pouet createPouet()
  {
     return new PouetImpl();
  }
  /**
   * Singleton for this factory.
   */
  public static PouetFactory getFactory()
  {
     if(pouetFactory==null)
     {
        pouetFactory = new PouetFactory();
     }
     return pouetFactory;
  }
  private static final pouetFactory;

  private PouetFactory()
  {
  }
}

Here, we took care of doing 3 things :

  • provide a static method getFactory() ou getInstance() ;
  • put a private constructor to forbid the factory instantiation by external code ;
  • set the class final to prevent inheritance.

You see that if I want to use anything else than PouetImpl, nobody will know it if I correctly designed my code into forcing to use it in the way I want (putting for example the PouetImpl class protected if possible. This way, it won’t be instantiable by another object than one of the package). I’ll be able to easily change the implementation impacting the fewest code.

Abusive inheritance

In the serie of the anti-evolutive code, let’s put at the top the excessive inheritances. Have’nt you already inherit from a JFrame only to display a poor window that provides nothing more than the original JFrame ? If yes, stop it. You’ve got to use delegation in most cases. That’s to say wrap the used object and provide a getComponent() method that returns a Component for example.

Inheritance isn’t a non-important or non-impacting choice, this design choice must be motivated. When you do, that’s because you want to change a particular part of the behaviour of the object. If not, don’t inherit, use delegation.

That will do for today

Right, that’s all for today. I’ve got still other things I want to speak about. I will have to find time to do it, which is not done yet :-). I’d like to speak about DAO, de commons-logging, de JNI with you… Well, quite a lot of things.

If you disagree with some points ou if you want some more explanations, use the comments… It’s designed for that :-).

Note for english readers : if you see sentences you don’t understand. Let me know. I may have used somes expressions coming from french that aren’t understandable in english…

Adorables enfants

Une de mes proches connaissances est professeur des écoles. Elle a récemment fait passer des évaluations à ses CE1.

Dans les connaissances évaluées, il y avait la ponctuation et les types de phrase. Une petite fille, à la question “Écris une phrase qui montre que tu es en colère.”, a répondu de la façon suivante :

“Conare de seure !”

:-)

Le professeur a été obligé de constater que le point évalué, utiliser la forme exclamative, était acquis ^^.

Gérer les services lancés au démarrage de la machine

Une personne a posé une question hier soir sur la mailing-list debian au sujet des services que sa Knoppix (distribution dérivée de debian) lance au démarrage.

Comme il n’était pas d’accord avec tout ce que la machine lancait, il a essayé d’empêcher ça en supprimant les scripts présents dans /etc/init.d… Je lui ai alors expliqué comment faire mieux et plus propre à mon sens.

Voici donc l’explication en question revue un petit peu. Je pense qu’elle évoluera s’il s’avère que j’ai dit des bêtises. Je suis bien sûr conscient que ce type d’explications existe déjà en maints endroits, mais je vais le refaire moi-même pour plusieurs raisons :

  • c’est une explication rapide destinée à un problème précis : éviter de démarrer des services inutiles. Ce n’est pas une explication complète du fonctionnement des runlevels sous Linux ;
  • ça me permet de mieux comprendre ;
  • avec tes yeux et tes connaissances, lecteur, si je raconte n’importe quoi, tu pourras me le dire. J’éviterai ainsi de continuer à raconter ledit n’importe quoi :-) ;
  • et SURTOUT … je suis sur mon blog alors je fais ce que je veux, na !

Les services sur debian (selon batmat, donc…)

Déjà, première chose, si on souhaite qu’un service ne soit jamais jamais jamais lancé, a priori, la meilleure solution est de supprimer le logiciel par apt-get remove.

Si on souhaite par contre le garder, mais qu’on ne veut pas qu’il soit lancé au démarrage “normal” de ta machine, il vaut mieux simplement supprimer le lien symbolique dans /etc/rcX.d.

/etc/rcX.d ?

Le noyau Linux fonctionne avec ce qu’on appelle des runlevels, des niveaux d’exécution. Le runlevel par défaut est défini en haut du fichier /etc/inittab (man inittab) par la ligne suivante :

id:2:initdefault:

Le plus souvent, c’est comme ci-dessus le niveau 2 qui est utilisé pour le démarrage “normal” (0 pour halt, 1 pour single-user : mode sans-réseau en mode utilisateur unique, 2 à 5 pour les modes multi-utilisateurs, 6 pour le reboot).

Il y a autant de /etc/rcX.d que de runlevels (i.e. X vaut de 0 à 6). Dans le répertoire rcX.d tous les script commençant par S seront exécutés à l’entrée dans le runlevel. Ceux commençant par K seront exécutés au moment de la sortie du runlevel. Ces scripts ne sont en fait que des liens symboliques vers ceux de /etc/init.d.

Si le runlevel 2 est aussi celui par défaut sur votre machine, il suffit donc de regarder les /etc/rc2.d/S* et de supprimer ceux qui correspondent aux services qu’on ne veut pas lancer.

Comme ça, on garde la possibilité de démarrer simplement un service en cas de besoin (en root /etc/init.d/un_service start) sans pour autant qu’il soit chargé tout seul au démarrage de la machine. C’est par exemple ce que je fais pour Apache/MySQL que je n’utilise qu’occasionnellement pour des tests et que je ne veux pas lancer systématiquement sur mon poste de travail.

Empêcher le redimensionnement de la fenêtre du navigateur

Un peu comme le target=_blank, le redimensionnement de ma fenêtre de navigation m’exaspère. Et comme ça m’énerve, j’ai cherché à corriger ça.

J’ai donc ouvert cette chère adresse bien connue about:config et me suis mis en recherche d’une propriété de resize. Avec la version 1.0 de Firefox, la page about:config possède un filtre. Je tape r e s i et là, il ne reste plus que quelques propriétés.

C’est du javascript qui permet de redimensionner la fenêtre, donc j’essaie un nom qui me paraît cohérent : dom.disable_window_move_resize que je passe à true.

Ça marche ! Plus de redimensionnement sauvage :-). Décidément, j’aime beaucoup Firefox.

Par contre, je ne sais pas si cette propriété était présente dans les versions précédentes de FF. Ça marche chez vous ? En quelle version ?

Lecteur mon amour

Après une discussion aujourd’hui avec quelques lecteurs assidus de ce blog, je me suis décidé à coder un petit peu.

Résultat :

  • Il est confirmé que j’ai du mal en php… ^^ J’ai vraiment du mal à m’y mettre. J’ai pour habitude de tester les fonctions ou les choses que j’écris séparément du reste avant de l’intégrer. En php, vu mon niveau, ça veut dire abuser du echo un peu partout. Y a-t-il des méthodes plus propres et moins contraignantes (à cause du fichier sur serveur ftp distant à uploader à chaque nouvelle modification) pour tester des bouts de code en PHP que d’utiliser la méthode ancestrale de l’affichage à l’écran ? Pour l’instant, la seule solution à peu prêt convenable que j’aie trouvée est d’installer apache en local. Mais c’est un peu chiant de devoir par exemple installer dotclear ici et en local à la fois, il me semble…

  • J’ai quand même finalement réussi à ajouter la rustine qui va maintenant te permettre à toi, lecteur adoré, de pouvoir obtenir le fil rss des billets sans la catégorie blogounette

Pourquoi ?

Ben, parce qu’il parait que ce blog aurait une fâcheuse tendance à devenir inintéressant. Je suis conscient que les doses d’humour (particulier, j’en conviens) présentées assez régulièrement ici peuvent finir par lasser.

Donc, maintenant, je peux continuer à avoir mes moments de délires sans impacter ceux qui ne souhaitent suivre que les billets succeptibles d’être intéressants. À ce propos, je suis désolé de ne pas poster en ce moment beaucoup de billets de ce type, le temps me manque. C’est aussi pour ça qu’il est plus facile de marcher en mode blog-minute… :-)

Bref, paf ! pastèque, je vous redonne encore une fois le lien vers le fil rss sans les blagues. Cette fonction étant nouvelle, j’ai eu beau la tester, elle cause peut-être des soucis que je n’aurais pas repérés. Faites moi signe donc si vous décelez un petit problème.

Pour finir, mes excuses à Antoine qui me faisait remarquer aujourd’hui même que mes numéros de billets atteindraient bientôt la centaine. Chose à laquelle j’ai répondu en disant qu’il me semblait que c’en était plutôt aux alentours de 80/85. Et bien non, il avait raison. D’ailleurs, ce billet est déjà le 101e et j’ai même dédié mon 100e à Firefox :-)

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.

612M$

Via /., on apprend qu’une entreprise devrait dépenser plus de 600 millions de dollars pour redévelopper le noyau Linux !

Pfiou, ça fait quelque chose d’avoir ça d’installé sur sa machine :-).

Subversion

Ça faisait quelques temps que j’avais envie d’écrire sur un sujet plus technique. J’en ai d’autres en tête, le problème étant de trouver le temps pour les traiter durant cette dernière année d’école d’ingénieurs qui nécessite tant de travail, comme le dit aussi Vincent

Cette année, pour mes projets j’utilise Subversion alias svn à la place de CVS que j’utilisais l’année dernière.

Je parlerai surtout de son utilisation côté client parce que je n’ai installé un serveur que pour CVS. L’installation d’un serveur svn a toutefois l’air plus complexe, mais je me fourvoie très certainement, j’en conviens.

Pourquoi Subversion ? Pourquoi pas CVS ?

En fait, svn ne se pose pas en concurrent de CVS, mais en successeur. Il n’y a donc pas de raisons de chercher à trouver CVS meilleur, il ne l’est pas. C’est très simple, j’ai même entendu dire que ce sont des anciens développeurs de CVS qui ont codé svn. Ils ont repris ce qui était bon et modifié ou supprimé ce qui était mauvais.

Qu’est-ce qui change ?

Ils ont gardé les mêmes commandes (enfin, pour celles qu’on utilise le plus couramment, je n’ai pourtant vu aucune différence) :

  • cvs co … => svn co …
  • cvs update => svn update
  • cvs commit => svn commit

Donc, si vous commencez un projet, n’hésitez pas utiliser svn plutôt que CVS. Il est d’ores et déjà prêt pour une utilisation en production (dixit la FAQ de Subversion).

Mon avis

Comme je l’ai dit plus haut, je n’ai testé que le côté client. Voici en vrac quelques points que j’ai retenus. Ils ne sont pas forcément très importants, mais c’est ceux qui me viennent à l’esprit alors que j’écris ce billet :

  • Pour le checkout initial, si vous utilisez un serveur qui fonctionne en http ou https, je trouve ça plus simple. cvs co http://svn.monServeurAMoi.org/monRepository et c’est OK. Pour ceux qui connaissent, fini les export qui précédaient l’appel du checkout avec CVS. (Bon, c’est vrai qu’il peut encore y avoir des export dans certains cas avec svn, mais jusqu’à maintenant, je n’en ai pas eu besoin, mais passons).
  • Les commits sont atomiques. Ça veut dire que votre serveur Subversion ne peut plus se retrouver en vrac après un souci (de commits en concurrence par exemple). Soit vous arrivez à “commiter” correctement, soit rien ne passe et le repository revient dans un état stable. Pour ceux qui veulent en savoir un peu plus : en fait, c’est grâce au fait qu’on n’utilise plus des fichiers mais une BD (Berkeley DB) qui apporte la gestion des transactions (rollback&commit world :-))
  • Le répertoire de travail du client n’est plus visible directement sous GNU/Linux. En effet, celui-ci se nommait CVS pour… CVS, oui, bien joué, “c’est encore un militaire qui gagne une tringle à rideauuuuuu!”. Il s’appelle désormais .svn pour subversion : ce qui correspond à une sorte de fichier caché sous mon OS favori. D’aucuns pourront considérer le fait de ne pas voir tout de suite qu’on est sur une “working copy” d’un repository comme un défaut, personnellement je trouve ça très bien de ne lister que les fichiers de mon projet (et non aussi le répertoire destiné à la gestion de l’outil de travail collaboratif).
  • Un meilleur support réseau. CVS a été développé comme une surcouche à rcs, un logiciel capable (en local) de gérer l’historique d’un fichier donné et qui stockait ça dans un fichier à l’extension ,v :-). Subversion a été pensé pour être utilisé en réseau, il offre donc plusieurs moyens évolués et sécurisés d’accéder au repository, là où CVS obligeait à posséder un compte utilisateur sur la machine serveur…
  • Par la commande svn rename, svn offre la possibilité de renommer un fichier là où CVS obligeait à : déplacer le fichier, le supprimer du repository (cvs remove) et l’ajouter à nouveau avec le nouveau nom (cvs add)…

Quelques pointeurs (en anglais)

  • Un comparatif d’une dizaine d’outil de “gestion de configuration”. Vous verrez que, contrairement à CVS, Subversion n’a plus rien à envier à des outils closed-sources et très chers.
  • Un extrait d’article (merci Greg) qui résume bien les changements importants entre CVS et Subversion. Je ne sais pas d’où il provient, si quelqu’un le sait, je veux bien rajouter la référence :

CVS is aged, and it has many deficiencies. For example, you cannot move or rename files, the branch feature is very complicated, etc. Furthermore, CVS has only poor network support. To run it in a safe way, you must use it in conjunction with ssh, and this means that you must give all participants a system account. If the network connection breaks in the middle of a commit operation, this may damage your data.

Subversion seems to implement all features that are missing in CVS. The version control model is more complete, as you can check in directories. The network support is much better, as it uses the well-known WebDAV protocol. One can tunnel it easily through SSL, and it is only required to have a web server user account to get write access. Last but not least, there is a modern database behind it with transactions, so you are not lost in space if your disk gets full, or if some other unpredicted incident happens.

Bien entendu, si vous avez des questions ou des compléments sur le sujet, n’hésitez pas à utiliser les commentaires :-)

La soupe

Bon, cette nuit j’ai dormi à Champs/Marne chez Rudy, Gab était là aussi. On est rentré un peu tard de soirée et je me voyais pas trop prendre le volant…

On a donc décidé de boufer un ptit truc avant de se coucher. Rudy propose une soupe, Gab et moi trouvons que c’est une bonne idée. Et là, Gab demande : “Hey, t’aurais pas une soupe à la purée et aux knackis ?”(sic)… L’alcool fait des ravages, non ? :-)

Une autre pour la route, Rudy habite dans une résidence très près de l’école : 620€/mois pour 18m². Je remarque que son rideau de fenêtre est déchiré, alors je le lui dis et lui de me répondre : “attends ! qu’est-ce tu crois ? T’as cru que pour ce prix là, c’était le grand luxe ou quoi ?”. Sans oublier que son lit s’est cassé hier soir lorsqu’il s’est assis dessus…

C’est la vie :-)

Et là... c'est le drame...

Pour ceux qui suivent un peu, je suis dans une école en alternance où je fais 6 mois à l’école et 6 mois en entreprise. Mon école se trouve dans la cité Descartes de l’UMLV, à Champs sur Marne en Seine et Marne et mon entreprise est à Toulouse…

Alors, voilà… Le problème c’est que j’ai entendu la météo de demain : genre 16 à Paris, 17 à bidule, 24 en Corse et … 29 à Toulouse ! Oui, 29° :‘(

Et moi de me dire qu’on est en octobre et que je ne suis PAS à Toulouse en ce moment…

Et là… c’est le drame…

Le poids des entreprises

Bon, un petit extrait d’un des cours d’aujourd’hui. Juste pour montrer qu’on ne perd pas la main.

La prof nous parle du malheur des SSII qui sombrent à cause de leur petit poids face aux géants. Elle continue ensuite de parler de ces boites…

Ah, ces pauvres boites de petit poids, me dis-je…

Face au géant (vert), que je pense maintenant que j’écris ce billet :-)

Allez, ce sera tout pour la blague du jour (pour ceux qui ne l’ont pas vue, ne la cherchez pas, vous ne rirez pas. J’ai dit non, ne la cherchez pas !).

Neuf Box et Volley

Un peu de mode ma vie®.

Je viens de recevoir ma neuf box, mais j’attends toujours que ma connexion soit activée. Il semble en effet que ce ne soit pas encore le cas. Heureusement que la connexion illimitée bas-débit de secours fonctionne… Mais comment on faisait avant ?

Quelques commentaires sur ce modem. Je vais un peu la comparer avec la FreeBox, que j’ai à Toulouse :

  • Bon, évidemment le débit est inférieur à celui de la FreeBox ;
  • Un bon point pour le téléphone : j’ai l’offre ADSL 1024/téléphonie illimitée. Avec la FreeBox, il faut deux téléphones un pour la FB et un pour la liste classique. Avec la NeufBox, un seul téléphone suffit : lorsqu’un appel arrive sur la ligne normale, il est basculé sur le téléphone branché à la NeufBox… Très très bien !
  • Par contre, le fait que la FreeBox affiche l’heure automatiquement mise à l’heure par le serveur distant, c’est pas mal.
  • EDIT(2) : En fait, il y a autre chose que je préfère avec la FreeBox, c’est le fait qu’elle soit en DHCP. La NeufBox est, elle, en PPPoE, ce qui est moins simple à configurer et moins répandu.

Bon, voilà, j’ai fini pour la NeufBox

Sinon, pour terminer, eh ben je reviens du volley et ça fait franchement du bien :-) . Ce soir, un pote de ma promo est venu…

Bon, ce sera tout pour ce soir et ce billet inintéressant.

EDIT : Tiens, au fait, je voulais le dire depuis un certain temps. Mais j’ai la flemme de rajouter un lien dans le menu, il est possible de suivre les commentaires postés sur le blog par le fil rss des commentaires.

Geek Test

Bon ben voilà Vincent, j’ai aussi passé le geek test.

Eh ben, je suis moins geek que toi !

Votre fiche de geek

Votre score est de : 1058

Vous faites partie des Reasonable Geeks

Pas mal… Un bon taux de geekitude coule dans vos veines, mais vous êtes encore trop sociable pour faire un bon geek. Débarrassez-vous des quelques amis qui ont l’outrecuidance de vous tirer hors de chez vous. :-p

Comment increaser sa productivity

Pong.

Via le Blog-Note, un lien vers le good site qui va vous faire gagner du time (and “time is money”).

Sinon, j’aime beaucoup aussi.

Pourquoi je le trouve pas, ce fichu lien vers mes résultats ? Ou comment fonctionne un moteur de recherche.

À force d’entendre ma copine et d’autres se plaindre de ne pas trouver :

  • les résultats du bac de la cousine, du frère, du chien… ;
  • les résultats des dernières élections ;
  • ou que sais-je encore.

je me décide à t’expliquer, public, comment ça marche un moteur de recherche, à la base.

Pourquoi, lorsque vous tapez quelque chose du genre “bac résultats toulouse”, vous n’obtenez pas toujours de façon miraculeuse et en premier le lien direct sur la liste des bacheliers fraîchement reçus ?

C’est très simple : chaque moteur de recherche possède un robot (un logiciel) qui passe son temps à surfer et à trier tout ce qu’il lit. Il retient donc plus ou moins bêtement les mots qu’il a rencontré. Donc, si aucun site n’a écrit en toute lettre un ou plusieurs jours avant les résultats d’un examen Résultats du bac ici pour l’académie de chouette, et bien le moteur de recherche ne pourra pas deviner où l’information est succeptible de se trouver et ne pourra pas donc pas vous fournir la bonne réponse le jour venu… C’est pas plus compliqué que ça.

Exemple des traces que laisse lors de ses recherches ce type de robot :

Google

64.68.82.178 www.batmat.net - [01/Sep/2004:11:48:04 +0200] "GET /robots.txt HTTP/1.0" 404 2384 "-" "Googlebot/2.1 (+http://www.google.com/bot.html)"

Yahoo

66.196.90.232 www.batmat.net - [01/Sep/2004:00:21:44 +0200] "GET /robots.txt HTTP/1.0" 404 2384 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"

MSN

65.54.188.130 batmat.net - [01/Sep/2004:07:55:07 +0200] "GET /blog/2004/08/24/76-VolleyballAuxJoSuiteEtFin HTTP/1.0" 200 12981 "-" "msnbot/0.11 (+http://search.msn.com/msnbot.htm)"

Divers autres

192.133.61.44 www.batmat.net - [01/Sep/2004:09:04:42 +0200] "GET /robots.txt HTTP/1.0" 404 2384 "-" "lmspider (lmspider@scansoft.com)"

64.62.168.26 www.batmat.net - [01/Sep/2004:02:56:44 +0200] "GET /robots.txt HTTP/1.0" 404 2384 "-" "Gigabot/2.0"

La faute n’est donc pas à ce_fichu_internet_qui_ne_fonctionne_pas_si_bien_que_ça, mais tout simplement au fait qu’on ne sait pas encore, malgré les progrès fulgurants de la technologie, lire l’avenir dans les pages web :-).

PS aux XHTMLeux : j’ai mis les logs en <code>, qu’est-ce que vous en pensez ?

OOo que c'est bOOo !

Marre ! Bon, les gens qui essaient de me lire doivent commencer à se dire que je gueule tout le temps… C’est peut-être un peu vrai, ça doit aussi être à cause du fait que si on y prête trop attention, on a souvent l’occasion d’hurler dans la vie lorsque des choses nous énervent. Bon, je viens pour autre chose que mon autopsychoanalyse, quoi que ce soit intéressant… Bon, t’arrête oui ! J’en ai marre de toujours m’interrompre aussi impoliment :-).

Bref, marre de tous ces gens qui se plaignent et chient sur OpenOffice.org ou tout autre suite bureautique (libre ou pas, d’ailleurs) qui ne parvient pas à ouvrir et à afficher à la virgule prêt de la même façon que MSWord les documents .doc… Déjà que d’une version à une autre de Word, ça marche pas toujours bien…

Je vais essayer de te faire comprendre à toi, le néophyte qui passe ton temps à te plaindre que ton tableau créé dans Word fait 1mm de moins en largeur lorsque tu l’ouvres dans OpenOffice.org, pourquoi cela arrive.

Allons y.

Une entreprise a écrit un logiciel qui s’appelle “Mot”. Ce logiciel utilise un format propriétaire et fermé au possible (contraire de format ouvert). Donc, pour parvenir à ouvrir ce format dont aucune spécification n’a été publiée, comment peut-on faire ? Comment fait-on ?

Et oui, pour ceux qui ont compris, on y va au marteau et au burin et on tente de savoir, de comprendre tout seul, comment est organisé ce fichu format. On appelle ça le reverse engineering. Selon les qualités et le temps qu’y passent celui ou ceux qui effectuent cette analyse, on arrivera à afficher plus ou moins bien le contenu.

Problème : le format est celui de cette entreprise. S’ils décident de le changer, personne ne sera consulté et ce que je viens de décrire devra être recommencé (avec peut-être encore moins de chances si le logiciel a décidé de l’empêcher en compliquant le format par exemple).

Donc, soyez plus respectueux de ces logiciels qui font tout leur possible pour ouvrir ces formats et si ça vous énerve qu’ils ne les ouvrent pas parfaitement comme le logiciel original, n’utilisez plus le logiciel qui produit ce format fermé.

Optez pour des formats ouverts. Si vous souhaitez pouvoir utiliser, lire vos documents dans 20 ans encore, c’est la meilleure garantie, croyez moi !

Nombre d'arguments variable en Java

Les connaisseurs du langage se diront certainement que c’est impossible. Et bien, ceux là n’auront pas encore découvert la nouvelle API de Tiger, la version 1.5 de Java (parfois connue aussi sous le nom de version 5). Les varargs font en effet partie des nombreux ajouts de l’API qui devrait sortir en version finale (actuellement beta2) vers le mois d’octobre.

Je vais donc décrire brièvement comment ça marche avec des petits bouts de code. Vous verrez que c’est très simple à l’utilisation, beaucoup plus que l’équivalent C :-).

Nous allons montrer un exemple avec l’ancienne et la nouvelle méthode. Une simple fonction destinée à afficher les paramètres qui lui sont demandés.

C’était pas mieux aaavaannt (Cabrel’s moment)

On utilisait un tableau d’arguments en entrée, ce qui pouvait s’avérer lourd à l’utilisation.

public maFonctionBof(String [] args)
{
  //et paf, on fait des trucs en parcourant le tableau
  for(int i=0;i<args.length;++i)
  {
     System.out.println(args[i]);
  }
}

Pour l’appeler, ça donnait un truc assez moche :

maFonctionBof(new String[]{"nif-nif","naf-naf","nouf-nouf"});

C’est mieux mainteeenaaannnt

En fait, seule la signature de la méthode change, le corps reste totalement identique :

public maFonctionPasBof(String... args)
{
  //et paf, on fait des trucs en parcourant le tableau
  for(int i=0;i<args.length;++i)
  {
     System.out.println(args[i]);
  }
}

Vous remarquerez que c’est le même symbole qu’en C. Et pour l’appeler, ça simplifie la chose :

maFonctionPasBof("nif-nif","naf-naf","nouf-nouf");

Mais alors, mais alors, mais alors ? Quelle est donc la fonction connue par une génération de programmeur C, adulée que dis-je, utilisant ce principe avec avantage et que beaucoup demandaient ? Oui, vous l’avez rêvé, ils l’ont fait : printf est maintenant disponible dans l’API de la version 1.5 de Java :-).

float v = 1.5F;
int nb = 2;
System.out.printf("C'est-y-po formidable tout ça ? Que la version %.1f 
       nous apporte ces %05d améliorations ?",v,nb);

Pour des informations plus complètes sur les nouveautés de Tiger.

Enfin la fin de la traduction

J’avais laissé de côté la traduction de la quatrième et dernière page de toute la série d’articles publiés par Andrew Tanenbaum sur son site au sujet de la campagne de décrédibilisation de Linux. Je viens enfin de terminer, les anglophobes peuvent donc aller lire avec délice (évidemment) cette traduction terminée.

Ce que je viens de lire me fait vous parler d’un problème récent soulevé pour le noyau Linux. On accusait l’équipe de développement du noyau d’accepter sans contrôles les contributions externes au noyau. Tanenbaum répond parfaitement à cette accusation.

Accusation :

… Torvalds et l’équipe de gestion du noyau Linux acceptent aveuglément des contributions de code source. Ensuite, ils demandent une certification. Mais la certification ne tient pour responsable ni le contributeur, ni la communité Linux, ni Torvalds. Ça ne garantit pas non plus que les sources sont produites “proprement”.

Réponse de Tanenbaum :

Ce commentaire est effectivement vrai, mais c’est valable pour tout logiciel et tous produits. Comment une entreprise avec des milliers de programmeurs peut-elle savoir d’où provient tout son code ? Vous allez dire: “Les avocats vérifie chaque ligne de code pour voir si elle est copyrightée.” Bien sûr. C’est certainement pour ça qu’il y a tant d’avocats. Il y a beaucoup de code à vérifier.

La réponse me plait beaucoup parce qu’elle rappelle effectivement qu’on ne peut garantir qu’un logiciel propriétaire, parce qu’il est propriétaire, est forcément plus “propre” qu’un autre qui soit libre. Certaines condamnations ont d’ailleurs montré que des licences libres avaient été enfreintes par des logiciels propriétaires et que les contrevenants avaient été rappelés à l’ordre.

Bref, je tiens aussi à dire que les programmeurs de logiciels libres ne sont pas stupides (enfin pas tous :p et encore moins ceux du noyau, je pense). Ils savent pertinemment qu’ajouter du code illégal au noyau sera forcément repéré en tant que tel par les intéressés.

Personnellement, je vois donc peu de solutions possibles à ce genre de cas (ce qui n’engage que moi) :

  • un petit crétin a voulu se faire mousser en disant qu’il avait développé un patch pour le noyau après avoir récupéré on ne sait comment du code propriétaire venant de quelque part ;
  • ces sources ont été volontairement insérées pour causer du tort…

Volley-Ball aux JO - Suite et fin

Bon, ben c’est fini.

L’équipe de France a perdu son match contre la Grèce et sa victoire contre la Tunisie n’a pas suffi à les remonter dans le classement. Ils sont donc éliminés des JO en terminant 5ème de leur poule

E=m quoi déjà ?

Ce soir, j’ai bien rigolé en parcourant les pubs dans mon courrier. Les organisateurs de concours ne cachent même plus qu’ils prennent les gens qui jouent pour des gros cons qui vont de toute façon payer eux-mêmes 10 fois (ou beaucoup plus) le prix du cadeau offert, ici un lecteur DVD.

Comme vous le voyez, même sans avoir été le moins du monde assidu à un quelconque cours de physiques, vous devriez parvenir à trouver la bonne réponse…

Volley-Ball aux JO

Comment faire pour suivre votre équipe favorite lorsque vous ne disposez ni de télé ni de radio à proximité (ou que vous ne pouvez pas l’écouter, au boulot par exemple) ? Et bien, j’ai trouvé un bon site où c’est possible. Très régulièrement, vous pouvez suivre l’actualité des JO.

L’équipe de volley française est en train de redresser la barre, semble-t-il, nous venons de gagner 3-0 contre la Pologne.

Pour ceux qui ne suivent pas trop l’équipe de France de VolleyBall et qui ne savent pas trop ce qu’elle vaut, sachez qu’elle est quand même :

  • Vice championne d’Europe
  • Troisième aux championnats du monde

Pour la petite histoire, les bleus n’ont décroché leur ticket pour les JO que tardivement en terminant première d’un tournoi de repêchage où 8 équipes s’affrontaient pour cette qualification.

Bref, ils ont ensuite très mal commencé les jeux en perdant leurs deux premiers matches 3-0. Ils doivent terminer dans les 4 premiers de leur poule de 6 pour accéder aux quarts de finale…

Prochain match : samedi 21 août à 18h30 contre la Grèce. Allez les bleus !

Pour suivre les résultats

Zeux Jolympiques - Athènes 2004

Incroyable mais vrai, les organisateurs des jeux olympiques se donnent vraiment tous les droits, même les plus inadmissibles !

Si vous allez à Athènes voir les jeux, il vous sera interdit de boire une eau que vous auriez apportée, interdit aussi d’apporter de la nourriture, interdit de mettre des habits arborant des marques concurrentes des partenaires des jeux, etc…. Bravo la liberté d’expression…

Thierry Stoehr en a parlé sur son blog une première foisici et une seconde . Cette info est aussi relayée maintenant par linuxfr.

Dans le second lien ci-dessus, vous pourrez aussi remarquer avec effroi qu’il serait maintenant interdit de linker une page du site web ! On croit rêver.

La question que je me pose depuis ce matin, c’est de savoir si on a légalement le droit de m’interdire de faire ce lien.

Quand bien même on en aurait le droit, je trouve ça totalement stupide de le faire : lorsqu’on publie quelque chose sur Internet ou sur n’importe quel support public, n’est-ce pas pour qu’un maximum puisse le lire ? Interdire de linker un site web tel que celui des jeux olympiques relève pour moi de la bêtise pure et simple. Comme beaucoup l’ont dit avant moi, ça doit effectivement être un petit avocat qui a voulé briller en ajoutant ces clauses insensée…

Les jeux olympiques, moment de dépassement de soi dans un pur esprit sportif… Pffff, les organisateurs me donnent envie de vomir.

Mais où va le monde ?

Fini les vacances

Rebonjour à tous, oui je viens de revenir (hier, pour être précis). Je profite de ma pause déjeuner pour écrire ce petit billet.

J’ai passé de superbes vacances, j’ai des photos de rêve prises en Corse… Je pense que j’en ajouterai quelques unes ici pour vous faire baver. Plage, plongée et beach-volley ont rythmé mes congés, ça me rappelle que la saison recommence bientôt et que j’ai hâte d’aller retapoter du ballon :-).

Qu’est-ce qui m’a gonflé pendant mes vacances ?

Les voitures

Eh oui, en Corse par exemple, 10 bornes c’est tout de suite facilement une demie heure de route (ceux qui ont déjà conduit en montagne comprendront aisément pourquoi) et on rencontre alors un peu de tous les types de conducteurs.

  • Ceux qui ont décidé de vous pourrir la journée en roulant à 5km/h sans jamais vous laisser dépasser ;
  • Ceux (pire) qui, à l’inverse, font du 120 dans les petites routes et qui roulent 1m derrière vous jusqu’à ce que vous trouviez un bas côté où vous arrêter ;
  • Ceux qui n’ont pas pris l’option clignotant avec leur voiture. C’est con, ça peut être utile pourtant ;
  • Et pour finir, ceux qui ne savent pas conduire et qui bouffent votre voie dans les virages en risquant au mieux de vous arracher l’aile ou au pire de vous envoyer dans le décor. J’ai par exemple bien failli me faire écrabouiller par un poids lourd qui roulait à moitié sur ma voie …

Les deux-roues

Catastrophe : je crois que j’aurai vu de tout pendant ces vacances. Le pire étant un mec sur une 125 pourrie avec le casque bloqué au niveau du front (genre, tu tombes et c’est comme si tu n’avais pas de casque), torse nu et en tongs…

À cela s’ajoute les motards qui conduisent aussi sans gants, parfois même torse nu, alors qu’ils ont, eux, passé un permis pour savoir qu’il ne fallait pas le faire.

On pourrait me dire que je suis chiant, que ce n’est pas mon problème. Mais si, ça l’est ! Au même titre de la ceinture de sécurité !

La question que je me pose à ce sujet, c’est : “Est-ce qu’il est normal de rembourser totalement les frais hospitaliers de tels crétins?”.

En effet, pourquoi est-ce qu’on ne devrait pas foutre une grosse amende pour payer ses soins à un mec à qui on doit faire une énorme greffe de peau parce qu’il s’est vautré à 30 à l’heure en moto torse nu alors qu’il n’aurait certainement rien eu d’autre que des hématomes s’il avait été habillé correctement? Je ne vois pas pourquoi nos impôts devraient servir autant un mec qui a aggravé consciemment ses blessures qu’un autre qui aurait tout fait pour se protéger.

Rappel : les gants, comme on doit le savoir pour le permis moto, sont entre autres là pour ces raisons :

  • projections : eh oui, une guêpe qui arrive à 80km/h sur votre main et qui vous pique, c’est tout con, mais ça peut facilement provoquer la chute… Tout comme un petit caillou qui pourrait même vous entailler correctement si vous n’avez pas de gants !
  • chutes : essayez de tomber à 50km/h avec et sans gants. Je vous souhaite d’essayer plutôt avec…

Je terminerai cette partie avec cette phrase sur un panneau de pub pour la sécurité routière en Corse : “À deux roues, la carrosserie, c’est vous !”

Le gouvernement

Ça aussi, ça m’a bien fait rire (ou pleurer, je sais plus). Issu du canard enchaîné, Chirac : les membres du gouvernement (dixit lui-même) ne devaient cet été pas prendre de vacances à plus d’une heure de la capitale (pour éviter de nous refaire une canicule 2004)… Où notre président les a-t-il passées ? À la Réunion, oui :-| (situé comme chacun sait pas trop loin de Paris, c’est à dire pas à plus d’une dizaine d’heures).

Bon, sinon, j’ai quand même passé de superbes et longues vacances, j’avais juste envie de passer ce coup de gueule ici, c’est chose faite :-).

Et ça continue...

Bon, ça va peut-être mon dernier billet avant de partir enfin en vacances (1 semaine en Corse, 1 semaine dans les Pyrénées et 2 semaines à Oléron. Essuyez moi donc cette petite larme ! :-D).

Franchement, qu’est-ce que vous attendez encore pour changer de navigateur ?

Je vous rappelle l’adresse de téléchargement de mozilla, comme ça vous n’aurez plus d’excuses…

Geek cap

Je cherchais depuis longtemps un T-shirt illustrant mes goûts pour gnu/linux et le libre en général, mais je ne voulais pas non plus un truc énorme qui aurait fait autiste informatique :-). (genre dans Wayne’s World, Gart : “Toi aussi tu lis Unix ?”).

Non, je voulais que ce soit discret. Dans le style du pingouin sur le tableau de bord de la voiture d’un ami (hein Peter ;-p). Et bien, je crois que j’ai trouvé, c’est discret et en plus c’est joli (même ma copine l’a trouvée bien :-)).

Pour ceux qui cherchent une jolie casquette debian, parce que c’est de ça qu’il s’agit. Vous pourrez la trouver chez Ikarios.

Pour 12,80€ tout compris, vous recevrez la petite chose toute sobre dont voilà quelques photos en complément à celles du site d’Ikarios :

Faille de sécurité dans mozilla

Une faille de sécurité vient d’être découverte dans mozilla. Firefox et les mozilla sont affectés. Elle permet semble-t-il d’exécuter un programme sur la machine du navigateur. Évidemment, le patch est déjà disponible et la version 0.9.2 imminente contiendra aussi le correctif (évidemment aussi, on peut penser).

La partie qui m’amuse, c’est que cette faille ne s’applique qu’aux versions windows de mozilla :-|. MacOS et Linux ne sont pas concernés…

Désinformation journalistique ou comment mal faire son travail

Je vous parlais récemment de la venue de Richard Stallman à Toulouse.

Un gentil journaliste vient de publier cet article dans l’équivalent toulousain du 20 minutes parisien (un journal gratuit) :

Le papa de Linux en visite

Le Culte, club des utilisateurs du libre à Toulouse et environs, va inaugurer le 10 juillet sa nouvelle salle des machines en présence de Richard Stallman, considéré comme le père des logiciels libres. Ce dernier a commencé à s’intéresser au sujet lorsqu’il travaillait au laboratoire d’intelligence artificielle du MIT, avant de mettre au point une alternative au système d’exploitation payant comme Windows, et de créer un système gratuit : Linux. Une conférence publique aura lieu à 15 heures à l’université Paul-Sabatier.

Avant de publier des articles lus par autant de monde, ne pouvait-il pas se donner la peine de vérifier ou au moins de faire relire ces 4 (!) lignes par des gens qui auraient pû immédiatement lui expliquer que RMS n’avait nullement écrit Linux, mais que c’était Linus Torvalds ? Ça lui aurait évité d’avoir l’air idiot devant un certain nombre de personnes…

RMS a eu un rôle certes non négligeable, il a lancé le projet gnu, écrit gdb, emacs, est bien le père des logiciels libres, mais n’a pas écrit Linux.

Le C++ c'est facile, mais...

Quand on a des gros plantages en C++ on cherche toujours du coté des pointeurs mal initialisés ou des dépassements d’espaces mémoire. Or voila une petite liste d’erreur qui saute moins au yeux (donc plus difficiles à debugger) mais dont l’effet est tout aussi destructeur:

  • Utiliser le constructeur par copie pour copier un objet de classe Polymorphe:
Object* y=new ObjectDeriv;
...
Object* x=new Object(*y);

=> l’appel au constructeur par copie n’est pas le bon Pour éviter de tomber dans ce piège ou que d’autres y tombent en utilisant votre code, mettez le constructeur par copie privé.

  • Faire un tableau d’objets d’une classe dérivée et l’utiliser comme tableau d’objet de la classe de base:
void f(Object *tab,int size){
 int i;
 for(i=0;i<size;++i)
 // manipulation de tab[i];
}
...
ObjectDeriv tab[10];
f(tab,10);

Dans ce cas, le décalage effectué lors de l’accès à tab[i] est eronné.

Plus classique : oublier de surcharger le constructeurs par copie, l’opérateur operateur= et du destructeur dans une classe contenant des pointeurs.

  • Oublier de mettre virtuel le destructeur dans une classe qui peut être dérivée.
  • Dans les classes contenant des pointeurs : oublier de vérifier les auto-affectations dans l’operateur=.
const Object& operator= ( const Object& o){
    delete pt;
    pt=new PtType;
    pt=o.Pt;
}

Dans le cas d’une auto-affectation (o==*this), le pt=o.pt va échouer car o.pt est déjà libéré. Dans ce cas 2 solutions :

  • Vérifier l’auto affectation :
if( this==&o )
  return o;
  • Sauvegarder le pointeur:
  PtType* tmp=pt;
  pt=new PtType;
  pt=o.Pt;
  delete tmp;

Si vous avez d’autres erreurs du style, que vous avez planché dessus pendant des heures et que vous voulez faire par de votre expérience n’hésitez pas…

RMS à Toulouse

Oui, oui, vous ne rêvez pas, Richard M. Stallman vient à Toulouse dans 10 jours. Il est invité par le Club des Utilisateurs du Libre de Toulouse et des environs.

Le programme de sa venue est indiqué plus en détail sur le site en lien ci-dessus. Je vais tout faire pour essayer d’y aller et je ferai des photos :-).

Pour ceux qui ne savent pas qui est RMS, eh bien en gros c’est monsieur GNU et FSF. Le concept même de logiciel libre, c’est lui. Il fait des conférences dans le monde entier sur le sujet. Et le samedi 10 juillet, il va en faire une à 5km de chez moi…

Geek, moi ?

Bonnes pratiques de programmation en Java

Aujourd’hui, on va parler de best practices (ou bonnes pratiques en bon françois) de programmation en Java. On parlera entre autre des quelques classes de l’API fonctionnellement dépréciées, on parlera aussi d’évolutivité et d’héritages abusifs, le tout encadré de design patterns.

Les classes interdites

Je rencontre encore sur le net certains projets qui utilisent encore les 2 classes suivantes (cette liste n’est certainement pas exhaustive, mais ces deux là sont les plus courantes) :

  • Hashtable
  • Vector

Vous ne devez pas utiliser ces classes. Elles ne sont toujours présentes que pour assurer une compatibilité ascendante : la jvm 1.4 doit pouvoir faire tourner un programme écrit en 1.0 qui peut contenir des objets de ce type puisque leur alternative n’est apparue que pour la version 1.2.

Depuis la 1.2 donc, il ne faut plus les utiliser. Mais alors pourquoi, vous allez me dire, est-ce qu’ils n’ont pas déprécié ces classes à partir de la 1.2 ? C’est très simple : hashtable est une table de hâchage (une liste de clé-valeur) et Vector une classe qui gère une liste d’objets… C’est à dire des objets extrêmement courants et utilisés. Sun a donc décidé de ne pas les déprécier pour éviter plusieurs centaines voire milliers de lignes de warning à la compilation de projets développés à l’époque du jdk 1.2.

pourquoi ne pas les utiliser ?

Ces classes sont synchronisées, elles sont ce qu’on appelle thread-safe. Cela signifie que dans un environnement contenant plusieurs fils de processus, si vous utilisez ces objets, vous vous garantissez une cohérence de leurs données, ce qui ne serait pas le cas si elles n’étaient pas synchronisées.

Le problème c’est que cette fonctionnalité est loin d’être utilisée dans tous les projets, on n’utilise pas forcément ses objets dans un contexte concurrentiel partout (encore heureux). En terme de performances, cette synchronisation n’est pas gratuite, on peut même dire qu’elle est plutôt chère (on parle communément d’un rapport de 1 à 5). Vous vous rendez alors bien compte qu’utiliser un Vector pour stocker vos listes est le plus souvent une perte totalement inutile de performances.

Les alternatives

Mais alors donc quelles classes utiliser en remplacement ? Celles-ci, leurs équivalents non thread-safe :

  • ArrayList pour Vector
  • HashMap pour Hashtable
Et si je veux un conteneur thread-safe ?

Si vous avez pensé à poser cette question, bravo. Dans un environnement concurrentiel, il faut toujours synchroniser les objets d’une façon ou d’une autre… Il y a deux solutions pour ce faire :

Synchronisation aux endroits où c’est nécessaire en utilisant un conteneur non synchronisé

  • Avantage : Gain possible en performances car vous maîtrisez parfaitement la synchronisation de votre code ;
  • Inconvénient : Plus difficile parce que vous devez faire très attention de ne pas faire d’oubli dans cette synchro si vous ne voulez pas obtenir des résultats au mieux bizarres, au pire catastrophiques.

Utilisation de conteneur synchronisé :

  • Avantage : Il suffit de se concentrer une bonne fois sur le codage du conteneur et ensuite on peut l’utiliser sans crainte de créer des inconsistences à l’exécution ;
  • Inconvénient : Perte possible de performance parce qu’il va peut-être y avoir des synchronisation à des endroits où ce n’est pas nécessaire.

Heureusement, vous vous dites, il existe donc Vector pour les cas où on veut utiliser un conteneur _thread-safe_. Et bien non, vous pouvez jeter cette classe, vous-n’en-aurez-plus-besoin :-). À la place, utilisez la méthode statique Collections.synchronizedList “Javadoc de la classe Collections sur le site de Sun”). Vous obtiendrez ainsi une liste synchronisée à partir d’une qui ne l’est pas, en appliquant de plus l’important principe qui consiste à cacher les implémentations dont je vais maintenant parler.

Améliorer l’évolutivité du code

Masquer l’implémentation

Ce qui fait que beaucoup (trop) d’utilisations de Vector subsistent encore aujourd’hui, c’est que cette classe était utilisée partout sans être masquée par une classe ou une interface.

Depuis la version 1.2, Vector implémente l’interface List comme le font ArrayList et LinkedList. Lorsqu’on utilise une liste, il ne faut donc plus indiquer à l’extérieur qu’on utilise telle ou telle implémentation mais il faut simplement indiquer qu’on utilise une classe qui implémente l’interface List. En faisant systématiquement comme ça, vous vous laissez la possibilité de changer d’implémentation ultérieurement. S’il vous prend par exemple l’envie de ne plus utiliser une ArrayList mais une implémentation personnelle de List pour telle ou telle raison, personne ne le saura et tout le reste du code restera inchangé (et ça, c’est très important).

Les factory

Utilisez des factory pour créer vos objets. Vous pourrez ainsi facilement cacher une implémentation.

Exemple : Pouet doit pouvoir dire bonjour

public interface Pouet
{
  /**
   * Affiche bonjour à l'écran
   */
  public void sayBonjour();
}

Très bien, la première chose à faire est donc d’écrire une implémentation de Pouet :

public class PouetImpl implements Pouet
{
  public void sayBonjour()
  {
     System.out.println("Bonjour");
  }
}

Si vous ne faites que ça, les utilisateurs de votre classe n’auront pas d’autre choix que d’écrire

PouetImpl pouet = new PouetImpl();

Et s’ils sont un petit peu plus expérimentés

Pouet pouet = new PouetImpl();

Et ils utiliseront Pouet et non PouetImpl partout dans leur code, mais ce n’est pas forcément bon parce que vous laissez d’autres que vous faire des choix de méthode d’utilisation de votre code. Autant que faire se peut, il doit toujours y avoir un minimum de possibilité pour faire quelque chose, sinon vous vous exposez à de gros problèmes de maintenance…

Et s’ils le sont encore plus, ils pourront avoir envie d’utiliser un framework de découplage, communément appelé conteneur léger en opposition avec les conteneurs d’EJB beaucoup plus intrusifs et lourds à mettre en oeuvre, comme spring, PicoContainer ou Avalon qui permettent d’utiliser de simples POJOs.

Ou alors, il écriront eux-mêmes la factory que vous auriez dû fournir :

public final class PouetFactory
{
  public Pouet createPouet()
  {
     return new PouetImpl();
  }
  /**
   * Singleton pour cette factory.
   */
  public static PouetFactory getFactory()
  {
     if(pouetFactory==null)
     {
        pouetFactory = new PouetFactory();
     }
     return pouetFactory;
  }
  private static final pouetFactory;

  private PouetFactory()
  {
  }
}

Ici, on aura pris soin de faire 3 choses :

  • fournir une méthode statique getFactory() ou getInstance() ;
  • mettre un constructeur private pour interdire l’instanciation de la factory par du code extérieur ;
  • mettre la classe final pour empêcher sa dérivation.

Vous voyez bien ici que si j’ai envie d’utiliser autre chose que PouetImpl, personne ne le saura si j’ai bien contraint à utiliser correctement mon code (en mettant par exemple la classe PouetImpl protected si c’est possible afin d’éviter qu’elle soit instanciable par un autre objet que ceux du package). Je pourrai librement changer d’implémentation en impactant le moins de code possible.

Héritage abusif

Dans la série du code anti-évolutif, mettons au top les dérivations excessives. Qui n’a jamais dérivé une JFrame pour afficher une pauvre fenêtre qui n’a rien de plus que la JFrame d’origine ? Et bien non, vous devez déléguer dans la plupart des cas. C’est à dire encapsuler l’objet que vous utilisez et fournir une méthode getComponent() renvoyant un Component par exemple pour le fournir à l’extérieur.

On ne décide pas de faire une dérivation à la légère, ce choix de conception doit être motivé par le fait que l’objet que vous voulez est une variante de la classe dont vous souhaitez hériter. Si ce n’est pas le cas, il y a de fortes chances pour que vous ne deviez pas hériter mais plutôt déléguer.

Ça ira pour aujourd’hui

Voilà, ce sera tout pour aujourd’hui. J’ai encore d’autres trucs dont je veux parler. Il faudra que j’en trouve le temps, ce qui n’est pas gagné. J’ai envie de vous parler de DAO, de commons-logging, de JNI … Bref, encore de quoi dire pleins de choses :-).

Si vous n’êtes pas d’accord avec certains points ou que vous souhaitez des éclaircissements, les commentaires sont là pour ça :-).

L'orthographe, eh j'men fous chui en vacances

Cette phrase, je l’ai tant entendu qu’elle me donne des nausées… J’ai l’impression que c’est un peu l’excuse bidon qu’on donne quand on est un peu jeune. C’est aussi celle que je m’attends à recevoir de ceux qui osent poster des sentences du genre de celle qui va suivre.

Quand je parlais de l’orthographe et que je vous disais que rien ne va plus… Sans aller jusqu’à l’extrême suffisance dont fit preuve notre étudiant modèle en trackbackant cybercodeur (je vous laisse retrouver le fil, j’ai pas envie de linker vers ce pauvre type, François pour vous aider), suscitant ainsi un torrent de critiques bien méritées, je dois avouer que j’ai véritablement eu mal aux yeux en voyant ça :

“que ce ne soit pas qu’un effet d’anonce destiné à faire un appel du pier à une certaine sociétée américaine”

Je vous laisse trouver où cette phrase a été écrite …

Je trouve regrettable de faire aussi peu d’effort quant à l’utilisation du français. Je veux bien admettre que ce n’est peut-être pas aussi facile pour tout le monde. Toutefois, à moins d’être hautement dyslexique, il n’aurait pas été si difficile d’écrire la phrase ci-dessus sans fautes. Même Syl y parviendrait :-) !

J’ai un petit frère comme ça, il a toujours un surnom MSN à se tirer une balle. Tout à l’heure, il s’appelait XXX qui ai* crevé* (non, il n’a pas crevé un pneu de sa voiture, il n’en a pas, il est fatigué quoi :-)). Pourtant dès que je lui signale, il dit “Ah oui ! Merci !”… Il s’en fout, c’est tout, il s’en contrefout et c’est bien dommage parce qu’il ne pourra jamais se débrouiller seul, comme beaucoup, pour écrire des lettres officielles sans se faire relire par ses proches…

Alors pensez y, faites un petit effort tous les jours pour vous mêmes mais aussi dans le respect de ceux qui vous lisent.

La petite souris... Ken Brown vs le reste du monde

Malgré l’effort de mat de chez totalementcrétin pour m’aider dans ma tâche de traduction, personne ne s’est proposé…

C’est pas grave, j’ai donc continué tout seul. Le blog me semblait quelque peu inapproprié pour ce travail, j’ai donc choisi de mirrorer complètement les pages concernant Ken Brown du site de Tanenbaum et de les traduire toutes…

Mais où donc les ai-je mises ? Ben sur mon site, ici quoi.

Comme vous le verrez, ces pages ont donc la même charte graphique que la version anglaise (normal, c’est la même CSS). La différence, c’est ce que c’est maintenant du XHTML 1.0 (fallait au moins ça :-D).

Il y a 4 articles, les 3 premiers sont entièrement traduits :

  • Le premier a déjà été publié sur ce billet, il a donc été relu quelques fois ;
  • Les deux suivants sont bruts de décoffrage. Comme j’ai pas mal de travail en dehors de ces traductions et que je n’ai pas trop le courage de relire tout de suite, je vous laisse le soin de m’indiquer les éventuelles fautes de tout type qui peuvent subsister afin d’améliorer ensemble le document ;
  • Le quatrième le sera au fur et à mesure. J’en ai déjà fait environ ¼, si quelqu’un veut m’aider à le finir, je serais heureux de recevoir sa contribution et d’ajouter son nom au bas de la page :-).

Je suis bien entendu prêt à ajouter tout lien vers des traductions ou toute page html que vous m’enverriez concernant l’affaire. J’aimerais par exemple trouver le temps de traduire la réponse de Linus à Ken Brown, mais je pense que je n’y arriverai pas… :-( Allez ! Quelqu’un peut s’y coller, y a pas grand chose :-).

Tout est relatif...

Allez…un p’tit peu de physique, ça peut pas faire de mal.

Mamie et la relativité restreinte

Moi j’trouve ça marrant la façon dont c’est expliqué… même si j’ai pas tout compris. Alors si y en a pour qui c’est super clair… N’hésitez pas à poster.

Votez Bon sang !

Demain, vous qui utilisez l’informatique ou vous qui travaillez dans le domaine, votez !

Procuration

C’est très simple à faire, je l’ai fait récemment, il suffit de suivre les quelques étapes suivantes :

  • Trouver quelqu’un qui vote dans la même ville que vous.
  • Vous allez à la gendarmerie ou au commissariat le plus proche avec votre carte d’identité et votre carte d’électeur
  • Vous dites que vous souhaitez remplir une demande de procuration
  • Vous remplissez la paperasse
  • Environ 15 minutes plus tard, vous êtes repartis et c’est fini…

Pourquoi et pour qui voter

Parce que votre vote aura d’autant plus de poids que le taux d’abstention est annoncé fort ! Si 20% de la population seulement vote, le vôtre en vaut 5 fois plus.

Personnellement, je pense voter à gauche indépendamment de mes opinions politiques habituelles parce que c’est le seul parti à posséder une section dédiée à l’informatique (TemPS réels) et à lutter contre les brevets.

Rappel pour ceux qui ont oublié : Chirac était contre les brevets et le gouvernement a voté pour…

DEMAIN, VOTEZ ET VOTEZ BIEN

Utilisation de StringBuffer et autres ruses

Mise à jour 2009 : Aujourd’hui, préférez simplement l’utilisation de la classe StringBuilder à la place de StringBuffer. Le reste de l’article reste valable.

Voici donc le premier billet traitant de programmation, je pense que ce n’est que le premier d’une longue série. J’espère aussi que ça sera le petit coup de pouce qui manque à Syl pour savoir sur quoi blogguer plus souvent :-).

Aujourd’hui on va faire du Java.

Exemple de code qu’il est MAL®

Vous le savez certainement ou vous l’avez au moins entendu dire : la classe String est non mutable. Qu’est-ce que ça signifie ? Ça veut dire qu’une fois instanciée vous ne pouvez plus la modifier… Vous pouvez vérifier, il n’existe aucun mutateur (setter) pour cette classe.

Exemple : écrivons une méthode qui ajoute à hello les chiffres 1 à 9.

public static String sayBadHello(){   String bonjour = "bonjour";   for(int i=1;i<10;++i)   {       bonjour += i;   }   return bonjour;}

Ici, qu’est-ce qui se passe ? On instancie un objet String et on y met “bonjour”. Ensuite, on fait quoi ? Ben, à chaque boucle, on prend la variable bonjour, on lui concatène le chiffre en cours et on affecte le résultat à bonjour.

En faisant ça : on instancie une nouvelle String à chaque fois et l’ancienne String est garbagée (comme l’utilisateur-développeur ne possède alors plus aucune référence vers cette variable, la machine virtuelle sait qu’elle peut supprimer cet ancien objet dès qu’elle le voudra).

Vous voyez le problème maintenant ? Pour une boucle de n éléments, on va instancier n objets ! Si vous passez votre temps à appeler cette méthode, vous déclencherez autant de fois cette aberration.

StringBuffer

Pour éviter ces nombreuses instanciations inutiles, il existe la classe StringBuffer qui, elle, est mutable. J’ose espérer que vous les utilisez déjà et que pour les étudiants d’entre vous, vos profs ont pensé à insister dessus. S’ils ne connaissent pas, ben je m’inquiéterai pour votre formation. Si vous ne connaissiez pas, à partir de maintenant vous n’aurez plus d’excuse :-).

Utilisation des méthodes append

Ces méthodes permettent d’ajouter un grand nombre de types différents à la chaîne stockée sous forme de caractères.

Voici un exemple simple d’utilisation pour corriger l’exemple précédent :

public static String sayGoodHello(){   StringBuffer bonjour = new StringBuffer(20);   bonjour.append("bonjour");   for(int i=1;i<10;++i)   {       bonjour.append(i);   }   return bonjour.toString();}

Plus de finesse

Quelques petits compléments pour les plus affamés :-).

  • Les plus attentifs auront remarqué le ++i là où on rencontre le plus souvent un i++. Ce n’est pas anodin, c’est juste un léger gain en terme de performances mais tellement simple à obtenir que je ne vois pas pourquoi je m’en priverais. À l’origine, je tiens ce conseil d’Anubis qui m’a fait réaliser que dans l’un des cas, on a besoin d’une variable temporaire supplémentaire et non dans l’autre.

    Grossièrement, c’est dû à ça (ces deux déclarations sont environ celles du C++, d’après les quelques souvenirs qu’il m’en reste. Avec ma chance, d’ailleurs, c’est sûrement l’inverse puisque je les remets au pif. Pas grave, l’objectif n’est pas de faire du C++ mais de faire saisir la différence entre la pré et la post-incrémentation) :

    Post-incrémentation : i++

    int operator++() {   int sauvegarde = i;   this.i = this.i +1;   return sauvegarde;}
    

    Pré-incrémentation : ++i

    int operator++(int) {   this.i = this.i +1;   return this.i;}
    
  • Si vous utilisez un StringBuffer avec plusieurs append statiques qui se suivent (merci Linux Magazine) :

    buffer.append("bonjour");buffer.append("au revoir");
    

    Utilisez plutôt :

    buffer.append("bonjour")      .append("au revoir");
    

    Vous éviterez ainsi d’empiler inutilement le retour de la méthode append sans vous en servir.

Houaaa! T'as vu le canon là bas!

On vient de célébrer l’anniversaire du débarquement, je reste donc dans le sujet en vous donnant un lien sur site qui parle des canons les plus effrayants qui existent comme le canon de Paris ou la Grosse Bertha.

Donc si ça vous intéresse, allez donc faire un tour sur le site des canons de l’apocalypse.

Mangeur de cigogne

Vincent a raison ! Nous ne serions rien sans notre mangeur de cigogne préféré. Ce site DOIT gagner parce qu’il est très beau tout en étant, ce qui ne gâte rien, valide XHTML et valide CSS.

Vous qui trouvez ce site agréable, ajoutez un lien vers celui-ci sur votre site (recopiez par exemple ce bout de code html : <a href="http://mangeur-de-cigogne.info/" title="mangeur de cigogne">mangeur de cigogne</a>).

Allez ! Ensemble nous pouvons faire de ce site le vainqueur du concours en ajoutant chacun un lien vers lui.

Mais pourquoi ajouter un lien sur mon site va-t-il aider ce site à gagner, me direz vous ?

C’est très simple : le concours se termine le 15 juin 2004 et le vainqueur sera celui qui est le premier résultat dans google à la recherche de “mangeur de cigogne”. Google utilise pour classer ses résultats (entre autre) le nombre de liens vers un site parce qu’il considère qu’un site souvent lié est certainement le meilleur, pas totalement saugrenu, vous en conviendrez. En tapant ces mots sur google, vous verrez que ce site est actuellement classé environ à la 4ème position : tout est donc encore largement jouable !

Bref, vous comprenez maintenant pourquoi le moindre lien supplémentaire peut l’aider à gagner, vous savez donc ce qu’il vous reste à faire…

Linus a-t-il écrit Linux, traduction d'un des contacts de Ken Brown

À la fois pour relayer totalementcrétin et pour continuer sur le sujet qui m’a occupé un certain temps. Voici la traduction d’un email transmis à Andrew S. Tanenbaum par Alexey Toptygin. Celui-ci a effectué une comparaison du code de Linux avec celui de Minix sur la demande de Ken Brown, voici ce qu’il en dit, lisez-le, c’est édifiant :

Aux alentours de mi-avril, j’ai été contacté par un de mes amis qui m’a demandé si je voulais faire une analyse de code en tant que consultant pour son patron, Ken Brown. J’ai finalement travaillé pendant 10 heures à comparer les premières version de Linux et de Minix et à chercher du code copié.

Mes résultats sont . Pour résumer, mon analyse n’a pas trouvé la moindre preuve que du code était copié dans un sens ou dans l’autre. (Je sais que Minix précède Linux, mais j’ai fait la comparaison bidirectionnellement dans un souci d’objectivité).

Alors que je travaillais à ça pendant mon temps libre, Ken n’arrêtait pas de me harceler pour que je me dépêche et que je finisse. Il me disait qu’il avait un papier en attente de publication et que mon analyse constituait les dernières données qui lui manquait. Je lui ai envoyé les résultats finaux (qui sont ceux fournis à l’URL ci-dessus, exactement dans le même état que ceux donnés à Ken Brown) le 17 mai. Lorsque je l’ai appelé pour lui demander s’il avait des questions à propos de l’analyse ou des résultats et pour lui demander s’il souhaitait voir l’opération répétée avec d’autres outils de comparaison, j’ai été pour le moins choqué. Apparemment, Ken attendait de moi que je trouve de beaux morceaux de code source copiés. Il a passé la plus grande partie de la conversation à tenter de me convaincre que j’avais dû faire un erreur, puisqu’il était clairement impossible pour une personne d’écrire un OS et que du ‘vol de code’ avait dû avoir lieu.

Donc, je crois que ce que je veux dire c’est : ne prêtez pas attention à cet homme, d’après moi il ne connait rien à ce dont il parle (NDT : Traduction aimable de [he is talking out of his ass]). Je m’excuse pour tout désagrément que j’ai pu vous causer en participant (indirectement toutefois) au [pet project] de Ken.

N’hésitez pas à reproduire cet email et le contenu de la page de mon analyse.

– Alexey Toptygin

Comme toujours, je suis ouvert à toute critique et à toute proposition pour mieux respecter le sens initial du texte de l’auteur original. Vous pouvez me contacter ici, merci d’avance.

Mails libérés place Beauvau

Migration

Comme beaucoup d’entre vous le savent déjà, le ministère de l’intérieur migre son système de messagerie électronique. Pourquoi je trouve ça bien ? Bon, ceux qui me connaissent se diront que c’est parce que je crois vraiment aux logiciels libres et au business model associé, certes mais pas seulement. Chaque fois, donc, que j’entends qu’un évènement important comme celui-ci s’est produit, ça me fait effectivement très plaisir.

Toutefois, dans ces situations où ce sont carrément des instances publiques qui sont mises en cause, nous (les partisans du LL) ne devrions plus être les seuls à apprécier : cette joie devrait être nationale. Pourquoi ?

Ah les économies

L’un des premiers arguments avancés lorsque l’on parle de libre en général, c’est la gratuité. Il faut tout de même savoir que ce n’est ni synonyme ni obligatoire : on peut très bien payer pour un logiciel libre. C’est même évidemment ce vers quoi je suis persuadé qu’il faut tendre pour que ce système puisse survivre. Mais non pas payer pour essayer, mais dans l’autre sens. Si vous estimez qu’un logiciel vous rend des services et que vous l’utilisez très régulièrement, pourquoi n’envisageriez vous pas de verser quelque chose aux auteurs. Faites le calcul : si vous versez dès maintenant 50€ pour ce super logiciel dont vous ne pouvez plus vous passer, qu’est-ce que c’est en comparaison des 150€ minimum que vous paieriez rien que pour Windows, puis pour le pack office, pas grand chose …

Je me répète parce que ce n’est pas assez clair le plus souvent : libre ne veut pas dire gratuit. Pour casser le mythe des économies, rappelons bien une chose : le plus souvent les économies ne se ressentent pas sur le court terme. On ne va pas diviser ses coûts par 10 la première année, évidemment. Le coût pourra généralement être effectivement inférieur, mais pas dans les proportions qu’on a tendance à s’imaginer. J’ai encore lu récemment que justement, ce sentiment de déception dû au fait qu’on s’aperçoive finalement que les économies sont moins importantes que prévu est courant. Certains demandent même une plus grande qualité pour un coût moindre et s’étonnent de ne pas toujours l’obtenir…

Pourquoi est-ce nuisible ? {style=“text-align:center;“}

C’est très simple : si avant de mettre en route, le responsable qui vous confie les rennes de la migration (cas le plus courant) s’attend à ce que tout devienne rose et que vous ne vous souciez pas de lui dire que ça reste de l’informatique avec les problêmes courants associés, amoindris certes : virus, sécurité, mais néammoins toujours potientiellement présents, ça risque de très mal se passer. Il faut que vous preniez du temps pour lui expliquer les résultats qu’il peut attendre au lieu de le laisser faire une synthèse suroptimiste de tout ce qu’il a lu un peu partout. Sinon, lorsqu’il va vous demander pourquoi il ne voit pas de baisse dans ses factures et que vous lui répondrez que “c’est normal au début”, il y a de fortes chances qu’il apprécie beaucoup moins que si vous l’y aviez préparé correctement avant.

De plus, si on considère une migration progressive et itérative, le passage des machines d’un environnement à un autre amènera nécessairement une durée plus ou moins longue où les deux environnements vont devoir cohabiter : deux fois plus de travail (voire plus). De même, si vous n’avez pas prévu ça et qu’il n’est pas prévenu, il ne risque pas d’apprécier…

Bon, le tableau que je viens de vous dépeindre est plutôt noir. Pourquoi je vous dis ça ? Parce que je ne supporte pas qu’on ne dise pas la vérité : tenter de la masquer aura un résultat 100 fois plus néfaste lors de sa mise au jour que si vous aviez joué franc-jeu dès le début.

Les gens qui ne suivent pas ces règles produisent l’effet inverse de celui escompté : les gens ressortent insatisfaits et ça fait boule de neige… À un moment où certains hésitent à se lancer, ce sont ces opinions déçues qui peuvent encourager à ne pas tenter l’expérience.

Une petite parenthèse au sujet des nains boutonneux qui hurlent trop communément à la seule évocation de *wind…* : “Argh ! windows suxxx , linux roxxxx, bsd rulezzzzzzzzzzzzzz”. Je les déteste, ils sont pitoyables et ne font que jeter le discrédit sur le libre en général et vont à l’encontre de l’ouverture d’esprit qu’est la philosophie de base du libre. Je ne crois pas que ce genre d’argument dignes d’un enfant de 3 ans puissent aider en quoi que ce soit à défenestrer un utilisateur (pour reprendre une expression amusante vue dans un Linux magazine il y a quelques mois).

Les avantages

Bref, revenons donc au sujet qui nous occupe : “tout le monde devrait aimer la migration vers le libre des services publics”.

  • Plutôt que d’envoyer un argent excessif à la firme de Redmond, on embauche des employés locaux et on fait travailler des entreprises locales. Argument certes protectionniste, mais généralement convaincant. Je ne sais pas si Sarkozy y a pensé, mais pour relancer la consommation, c’est plutôt une bonne idée.
  • Facilité de re-migration ultérieure : si dans dix ans, on décide de rechanger de système, le fait d’avoir des format de stockages ouverts facilitera nécessairement le travail.

    Pour exemple, voici une description rapide du format de stockage d’OOo Write, l’offre alternative à MSWord : ce logiciel stocke ses fichiers en XML dans une arborescence claire et les images dans des formats classiques et ouvrables par n’importe quel logiciel (PNG). Le tout est ensuite simplement zippé pour ne former qu’un seul fichier, habituellement enregistré sous l’extension .sxw.

    Formidable, non ? Il suffit de dézipper ce fichier sxw pour récupérer les données brutes afin d’en faire ce qu’on veut. Avec un analyseur syntaxique XML qui va bien, n’importe quel développeur est alors en mesure de traiter ces données afin de vous créer un nouveau format que vous demanderiez. Plus besoin de passer des jours et des jours à tenter un reverse engineering d’un fichier .doc ou .xls que vous voulez modifier alors que vous n’avez plus Word ou Excel. C’est ce genre de choses qui font que dans le monde du libre, il est possible d’ouvrir un fichier avec des dizaines de logiciels différents sans aucun problème de compatibilité…

  • C’est mon argent ! Eh oui, les ministères sont payés par nous, les citoyens : si je peux récupérer une partie de ce que je verse pour en profiter moi aussi, je ne vais pas m’en priver. J’ai lu que le le logiciel commandé par le ministère était en GPL : donc, “Tous les modules développés pour nous seront donc reversés à la communauté des développeurs et publiés sur le net”. Après tout, ça vous parait pas normal à vous qu’un service public fasse profiter au public de son travail ? Ce ne serait un peu le but d’un service public ?

Conclusion

En me relisant, je me rends compte que j’ai pu laisser penser qu’utiliser des logiciels libres ne présentait pas un intérêt en termes de coûts. Soyons sérieux, c’est le cas et toutes les études sérieuses le montrent (par étude sérieuse, j’entends celles qui ne sont pas commandées par Microsoft ou toute autre boîte qui lutte contre le LL en général).

Ce que j’ai voulu rappeler, c’est que les économies ne sont pas immédiates. Il est évident que les coûts de formation, les coûts de mise en place et de maintenance vont certainement compenser les licences des logiciels propriétaires utilisés dans un premier. Attention toutefois à ne pas non plus penser que les logiciels propriétaires ne nécessitent pas de maintenance… Un firewall, qu’il tourne sous Linux, Windows, *BSD ou UNIX nécessitera toujours un administrateur. Si ce n’est pas le cas, vous devriez sérieusement vous inquiéter de la sécurité informatique de votre entreprise.

Mais une fois que votre personnel aura appréhendé la base, les économies vont commencer à apparaître.

Des exemples ?

  • Vous allez pouvoir mettre à jour votre système beaucoup plus régulièrement et bénéficier ainsi rapidement des améliorations.
  • Au fil de l’appréhension du nouveau système, les coûts de formation vont baisser.
  • Si vous avez besoin d’une nouvelle fonctionnalité pour le logiciel que vous utilisez, vous pouvez la développer en interne plutôt que de la demander au fournisseur qui, s’il accepte, vous la fera sûrement payer très cher.

J’espère que ces quelques arguments auront contribué à vous convaincre un peu plus ou au moins à vous informer sur le sujet. Si vous avez des questions sur le sujet, n’hésitez pas à m’écrire, je me ferai un plaisir de répondre à toutes vos questions.

Blogentaire

Très fort, les commentaires sportifs dans un blog. Je suis en train d’inventer le blogentaire sportif ! Même pas en direct, c’est ça qu’est fort. Je vais essayer de vous faire vivre ce match en différé :-).

Je suis en train de coder en regardant en même temps la télé (merci freebox) et je suis impressionné par Venus Williams (j’ai un doute sur le prénom, c’est celle qui mesure 1,85m), elle tape comme une dingue dans toutes les balles ! Elle a laminé son adversaire (Zuluaga) au premier set 6/1 et là cette dernière est en train de reprendre du poil de la bête. Elle a rivalisé avec Williams au cours du second set, celle-ci fait beaucoup plus d’erreur qu’au premier set où elle semblait imbattable.

Le score actuel est donc de 6 jeux à 5 pour Williams : hélas, Zuluaga vient de se faire breaker (elle a perdu son service). Elle menait 5/4 mais s’est donc fait prendre les 2 jeux suivants…

Les joueuses entrent sur le terrain, Williams sert : double faute ! 0-15. Eh hop un superbe lob de Zuluaga qui lui permet de mener 0-30… Mais elle fait malheureusement deux retours directs dans le filet… 30-30.

Après deux fautes directes de Venus, Zuluaga gagne finalement le jeu. Ce qui ramène le score à 6 jeu partout.

Je récapitule : 6/1 6/6 => Le tie break sera soit le jeu de retour à égalité aux sets pour Zuluaga soit le jeu du match pour Williams…

À 2-1 au tie-break, l’arbitre estime qu’une balle plutôt litigieuse est out au service de Zuluaga ce qui ramène le score à 2-2. Le stress semble gagner celle-ci car elle fait alors trois fautes directes, une derrière la ligne de fond, une tapée à la verticale par boisage et une trop à droite… 5-2

Ça s’annonce plutôt mal, elle pert encore le point suivant : 6-2. Elle parvient après une longue course en long et en large du terrain à ramener plusieurs balles tapées très fort par Williams. 6-3.

Williams sert une deuxième balle et parvient à mettre en difficulté Zuluaga qui monte une balle un peu trop haut pour Williams qui est au filet et termine en frappant fort de l’autre côté…

Résultat, Williams gagne : 6/1 - 7/6. Dommage, je trouvais intéressant la remontée de Zuluaga, j’aurais aimé que ça dure plus longtemps.

Je hais les lundi

Dévolution

Et hop, voilà comment on évolue… Vous en êtes où, vous ?

Linus a-t-il écrit Linux, traduction de la réponse de Tanenbaum

Mise à jour du 3 mai 2005.

J’ai finalement décidé de tout mirrorer à un seul endroit.

Mise à jour du 1^er^ juin.

Je viens de recevoir la réponse de Andrew Tanenbaum et il m’autorise à laisser la traduction :

I don’t mind the translation, but please put in the banner ad at the time.\ Andy Tanenbaum

Comme il le demande, j’ajoute le bandeau publicitaire du site d’origine

www.TellAnAmericanToVote.com

Après ce billet sur tc indiquant que le cher Ken Brown de l’institut Alexis de Tocqueville avait publié un livre remettant en question l’écriture de Linux par Linus Torvalds, ce dernier avait initialement répondu qu’il n’en était effectivement pas l’auteur, mais qu’il était un homme de paille pour le père Noël et la petit souris…

Ensuite, c’est carrément la principale source de Ken Brown, le célèbre Andrew S. Tanenbaum, qui a démolli l’accusation. J’ai trouvé qu’il serait intéressant que la communité francophone bénéficie d’une version française de ce document pour qu’il ait un impact plus important et une diffusion plus large, j’ai donc pris mon temps, mon courage et mon dictionnaire à deux mains (en gardant une main sur le clavier, oui je sais, ça fait trois mains… Je suis multihanded…) et je l’ai fait.

La traduction ci-dessous a été effectuée par mes soins et ne se prétend en aucun cas un travail d’une qualité et d’une justesse irréprochable. Je ne suis pas traducteur professionnel et je suis encore assez peu habitué aux longues traductions. J’ai donc certainement fait des choix qui ne s’avèrent pas des plus judicieux. Si certaines parties vous paraissent bizarres et que avez le temps de faire une relecture en fonction de l’original pour me proposer des améliorations, si vous remarquez des fautes de frappes ou des parties qui vous semblent ne pas sonner très français (ce qui est fort possible car on peut finir, lorsqu’on traduit, par mélanger certaines tournures de la langue source et de la langue cible), je vous encourage à m’en faire part, je vous en serai très reconnaissant et je vous promets que j’en tiendrai compte.

Comme vous pourrez le voir, j’ai quelquepeu outrepassé la consigne de AST indiquant que seules des versions identiques peuvent être diffusées… Comme toujours, une traduction étant aussi un travail d’interprétation, on ne peut pas considérer cette version comme une copie stricte de l’original. Au moment où vous lirez cet article, cela signifiera que je l’aurai rendu public et que j’aurai donc certainement déjà envoyé une demande de publication à AST.

Toutefois, comme il indique recevoir énormément d’emails et qu’il risque de rater le mien, je publierai ce document avant la réponse afin d’éviter que le travail de traduction que j’ai fournie n’ait été totalement inutile (je ne l’ai en effet évidemment pas traduit pour moi, mais pour la communauté… S’il ne restait que sur mon disque dur, cela serait stupide).

Donc, si je recevais finalement une réponse de l’auteur original me demandant instamment de retirer cette traduction, je le ferais immédiatement, si elle vous intéresse, lisez la donc vite au cas où :-). De même, si je recevais une réponse m’autorisant à diffuser librement ce document, vous verriez immédiatement une note apparaître… En attendant, je vous demande de ne pas copier cette version partout, merci d’avance…

Quelques Notes sur l’article “Qui a écrit Linux, Release 1.5”


Contexte

L’histoire d’UNIX et de ses différents enfants et petits-enfants a été à l’actualité récemment grâce au livre de l’institut Alexis de Tocqueville. Étant donné que j’ai été impliqué dans une partie de cette histoire, je ressens l’obligation de la mettre au clair et de corriger quelques erreurs extrêmement sérieuses. Mais avant cela, quelques informations sur le contexte.

Ken Brown, Président de l’institut Alexis de Tocqueville, m’a contacté début mars. Il m’a annoncé qu’il était en train d’écrire un livre sur l’histoire d’UNIX et qu’il aimerait m’interviewer. Comme j’ai écrit 15 livres et que j’ai été impliqué dans l’histoire d’UNIX de plusieurs façons, j’ai dit que je voulais bien aider. J’ai été interviewé par beaucoup de gens pour beaucoup de raisons à travers les années, je suis passé à la radio et à la télé néerlandaise et dans divers journaux et magasines, donc je ne m’en inquiétais pas trop.

Brown est arrivé par avion à Amsterdam pour m’interviewer le 23 mars 2004. Apparemment je n’étais la seule raison de sa venue en Europe. L’interview a commencé de façon plutôt incertaine, grossièrement paraphrasée comme suit :

AST : “Qu’est-ce que l’institut Alexis de Tocqueville ?”

KB : “Nous produisons des travaux politiques publics.”

AST : “Un comité d’experts, comme la Rand Corporation ?”

KB : “En quelque sorte.”

AST : “Qu’est-ce qu’il fait ?”

KB : “Il publie des rapports et des livres.”

AST : “Qui le subventionne ?”

KB : “Nous avons de multiples sources de financement.”

AST : “Est-ce que SCO est l’une d’elles ? Est-ce à propos du procès de SCO  ?”

KB : “Nous avons de multiples sources de financement.”

AST : “Est-ce que MicroSoft est l’une d’elles ?”

KB: “Nous avons de multiples sources de financement.”

Il était extrêmement évasif au sujet de la raison pour laquelle il était là et qui le financait. Il ne cessait de dire qu’il était simplement en train d’écrire un livre au sujet de l’histoire d’UNIX. Je lui ai demandé ce qu’il pensait du livre de Peter Salus, Un quart de siècle d’UNIX. Il n’en avait jamais entendu parlé ! Je veux dire, si vous êtes en train d’écrire un livre sur l’histoire d’UNIX et vous faites 3000 miles (NDT : environ 4800 km) pour interview un mec sur le sujet, est ce que ça ne vous viendrait pas à l’esprit d’aller sur amazon.com et de taper “history unix” dans la boîte de recherche, pour laquelle le livre de Salus est le premier résultat  ? Pour 28$ (et livraison gratuite si vous payez par carte bleue) vous pourriez en apprendre un énorme bout sur le sujet et éviter ainsi de manquer quoi que ce soit. Comme je l’ai rapidement appris, Brown n’est pas le pire de l’équipe, mais j’étais déjà suspicieux. En tant qu’auteur depuis longtemps, je sais qu’il est sensé d’être au moins au courant de ce qui est en compétition. Lui ne s’en inquiétait pas.

UNIX et Moi

Je n’ai pas trouvé anormal que Brown veuille m’interviewer à propos de l’histoire d’UNIX. Il y a des gens pire à qui demander. À la fin des années 70 et au début des années 80, j’ai passé plusieurs étés dans le groupe UNIX (Dept. 1127) des Bell Labs. J’ai connu Ken Thompson, Dennis Ritchie, et le reste des gens impliqués dans le développement d’UNIX. Je suis resté dans la maison de Rob Pike et celle de Al Aho pour des périodes de temps assez longues. Dennis Ritchie, Steve Johnson, and Peter Weinberger, parmi d’autres ont séjourné dans ma maison à Amsterdam. Trois de mes thésards ont travaillé dans le groupe UNIX des Bell Labs et l’un d’eux est aujourd’hui un membre permanent de l’équipe.

Bizarrement, quand j’étais aux Bell Labs, je ne m’intéressais pas aux systèmes d’exploitation, bien que j’en aie écrit un et publié un document à ce propos (voir “Software - Practice & Experience,” vol. 2, pp. 109-119, 1973). Je m’intéressais alors aux compilateurs, comme j’étais le designer en chef du “Amsterdam Compiler Kit” (see Commun. of the ACM, vol. 26, pp. 654-660, Sept. 1983.). J’ai passé quelques temps là-bas à discuter de compilateurs avec Steve Johnson, tout en travaillant en réseau avec Greg Chesson, écrivant des outils avec Lorinda Cherry, et rédigeant des ouvrage avec Brian Kernighan, entre autres auteurs. Je suis aussi devenu ami avec l’autre “étranger” là-bas, Bjarne Stroustrup, qui allait plus tard concevoir et implémenter le C++.

En résumé, bien que je n’aie rien eu à voir avec le développement de l’UNIX original, je connaissais tous les gens impliqués et plutôt bien une grande partie de l’histoire. De plus, mon contact avec le groupe UNIX des Bell Labs n’était pas un secret; Je les ai même remercié pour m’avoir accueilli comme visiteur d’été dans la préface de la première édition de mon livre Computer Networks. Étonnamment, Brown ne savait rien de tout ça. Il n’a pas fait ses devoirs avant de s’embarquer dans son petit projet.

MINIX et Moi

Des années plus tard, je donnais des cours un cours sur les systèmes d’exploitation en utilisant le libre de John Lions sur UNIX Version 6. Quand AT&T a décidé d’interdire l’enseignement du fonctionnement interne d’UNIX, j’ai décidé d’écrire ma propre version d’UNIX, libre de toute code d’AT&T et de toutes restrictions, afin de pouvoir enseigner sur son sujet. Mon inspiration n’a pas été mon temps passé aux Bell Labs, bien que de savoir qu’une personne avait pu écrire un système d’exploitation UNIX-like (Ken Thompson avait écrit UNICS sur un PDP-7) me disait que c’était possible. Ma réelle inspiration fût une remarque de Butler Lampson dans un de ses cours sur les systèmes d’exploitation que j’ai suivi alors que j’étais en thèse à Berkeley. Lampson venait juste de finir de décrire le système d’exploitation pionnier CTSS et dit, de sa façon inimitable : “Y a-t-il quelqu’un ici qui ne pourrait pas écrire CTSS en un mois ?” Personne ne leva la main. J’en conclus qu’il fallait être vraiment stupide pour ne pas être capable d’écrire un système d’exploitation en un mois. Le papier cité ci-dessus concerne un système d’exploitation que j’ai écrit à Berkeley avec l’aide de Bill Benson. Ça a pris beaucoup plus qu’un mois, mais je ne suis pas aussi rapide que Butler. Personne ne l’est.

Je me suis donc proposé d’écrire un clone minimal d’UNIX, MINIX, et je l’ai fait tout seul. Le code était 100% libre de la propriété intellectuelle d’AT&T. Le code source complet fût publié en 1987 comme annexe d’un livre, Operating Systems : Design and Implementation, dont une seconde édition a été coécrite avec Al Woodhull. MINIX 2.0 était même conforme à la norme POSIX. Les deux éditions contenaient des centaines de pages de texte décrivant le code de façon très détaillée. Une boîte de 10 disquettes contenant tous les binaires et le code source était disponible séparément chez Prentice Hall pour 69$.

Cela n’était pas un logiciel libre dans le sens “entrée libre”, c’était bien un logiciel libre dans le sens “liberté d’expression” (NDT : cf. la définition du logiciel libre) étant donné que le code source était disponible pour un tout petit peu plus que le coût de production . Mais même la “liberté d’expression” n’est pas complètement “gratuite”–[think about slander, yelling “fire” in a crowded theater, etc.] Rappelez vous aussi (si vous êtes suffisamment vieux) qu’en 1987, une licence universitaire éducative pour UNIX coûtait 300$, une licence commerciale pour une université coûtait 28 000$, et une licence commerciale pour une entreprise beaucoup plus. Pour la première fois, MINIX baissait le prix d’un code source “UNIX-like” à une somme qu’un étudiant pouvait se permettre. Prentice Hall ne s’intéressait pas vraiment à la vente du logiciel. Ils étaient intéressés par la vente de livres, il y eu donc une politique plutôt libérale en ce qui concerne la copie de MINIX, mais si une compagnie voulait le vendre pour ramener beaucoup d’argent, PH voulait des royalties. Donc les avocats de PH équipèrent MINIX de beaucoup de protections, mais sans jamais avoir l’intention de les utiliser contre des universités ou des étudiants. Utiliser Internet pour distribuer tout ce code n’était pas envisageable en 1987, même pour les gens avec un modem haut-débit (i.e., 1200 bps). Quand la distribution par Internet est devenu possible, j’ai convaincu Prentice Hall d’abandonner leurs (extrêmement modestes) ambitions commerciales et ils m’autorisèrent à mettre le source sur mon site web en libre téléchargement, où il l’est encore.

Quelques mois après cette sortie, MINIX devint un genre d’objet de culte, avec son propre newsgroup USENET, comp.os.minix, avec 40 000 abonnés. Beaucoup de gens ajoutèrent de nouveaux utilitaires et améliorèrent le noyau de nombreuses façons, mais le noyau original était le travail d’une seule personne–moi. Beaucoup de personnes commencèrent à me harceler pour que je l’améliore. En plus des nombreux messages dans le newgroup USENET, je recevais 200 e-mails par jour (à une époque où seuls quelques privilégiés avait même un e-mail) disant des trucs du genre : “J’ai besoin de pseudo-terminaux et j’en ai besoin pour vendredi.” Ma réponse était généralement rapide et précise : “Non.”

La raison pour mes fréquents “non” était que tout le monde essayait de transformer MINIX en un système UNIX utilisable en production et que je ne voulais pas le rendre si compliqué qu’il deviendrait inutile pour mon but désigné, l’enseigner aux étudiants. J’espérais aussi que la niche pour un système UNIX libre utilisable en production serait comblé par GNU ou Berkeley UNIX rapidement, donc je ne visais pas vraiment cela. Finalement, l’OS GNU n’alla pour ainsi dire nulle part (même si beaucoup d’utilitaires UNIX furent écrits) et Berkeley UNIX se trouva embarqué dans un procès quand ses concepteurs créèrent une entreprise, BSDI, pour le vendre et choisirent 1-800-ITS UNIX comme numéro de téléphone. AT&T jugea que c’était une violation de copyright et les poursuivit. Cela prit quelques années pour que ce problème soit résolu. Ce délai pour sortir free BSD donna à Linux le temps dont il avait besoin pour devenir populaire. Si les poursuites n’avaient pas eu lieu, BSD aurait sans doute comblé la niche avec un client UNIX puissant et libre étant donné qu’il avait déjà un système stable et mature doté d’une base importante d’utilisateurs.

Ken Brown et Moi

C’est alors que Ken Brown a rappliqué et a commencé à poser des questions. Je me suis rapidement aperçu qu’il ne connaissait rien à l’histoire d’UNIX, n’avait jamais entendu parler du livre de Salus et ne savait rien au sujet du procès BSD/AT&T. J’ai commencé à lui parler de l’histoire d’UNIX, mais il m’a interrompu et m’a dit qu’il était plus intéressé par les aspects légaux. J’ai dit : “Oh vous parlez du brevet numéro 4135240 de Dennis Ritchie sur le setuid bit?” Alors j’ai ajouté : “Ce n’est pas un problème. Les Bell Labs ont dédié le brevet.” C’est comme ça que j’ai découvert que (1) il n’avait jamais entendu parler du brevet, (2) ne savait pas ce que signifie dédier un brevet (i.e., le mettre dans le domaine public), et (3) ne savait vraiment rien à propos des lois de propriété intellectuelle. Il ne connaissait pas grand chose à propos des brevets, copyrights, et marques déposées. Au cours de la discussion, je lui ai demandé s’il était avocat, mais c’était évident que non et il l’a reconnu. À ce moment, je pensais encore qu’il pourrait être un espion de chez SCO, mais que s’il l’était, SCO n’aurait pas un retour qui vaille l’investissement.

Il voulait parler des problèmes de propriété, mais il tentait aussi d’éviter de me dire quel était son véritable but, il ne formulait donc pas très bien ses questions. Finalement, il m’a demandé si je pensais que Linus avait écrit Linux. J’ai répondu qu’à ce que je sache, Linus avait écrit tout le noyau lui-même, mais qu’après qu’il soit sorti, d’autres personnes ont commencé à améliorer ce noyau initialement très primitif. Ensuite de nouveaux logiciels furent ajoutés – essentiellement avec le même modèle de développement que MINIX. Ensuite il a commencé à focaliser là-dessus, avec des questions du genre : “A-t-il volé des parties de MINIX sans permission?” Je lui ai dit que MINIX avait clairement eu une énorme influence sur Linux en différents points, depuis la forme du système de fichier jusqu’aux noms dans l’arbre des sources, mais que je ne pensais pas que Linus avait utilisé la moindre partie de mon code. Linus utilisait aussi MINIX comme plate-forme de développement initialement, mais il n’y avait aucun mal à ça. Il m’a demandé si j’avais quelque chose à redire à ce sujet et j’ai répondu que non, pas du tout, les gens étaient libre de l’utiliser comme ils l’entendaient pour des utilisations non commerciales. Plus tard, MINIX fut publié sous la licence Berkeley, ce qui le libéra pour toutes les utilisations. De façon surprenante, il est encore largement utilisé, à la fois pour l’éducation et dans le tiers-monde, ou des millions de personnes sont heureux comme tout d’avoir un vieux castoff 1-MB 386, sur lequel MINIX tourne parfaitement. La page d’accueil de MINIX citée ci-dessus reçoit encore plus de 1000 hits par semaine.

Finalement, Brown commença à focaliser plus durement. Il n’arrêtait pas de demander, de différentes façons, comment une personne pouvait écrire un système d’exploitation entièrement par lui-même. Il ne croyait simplement pas que ce soit possible. J’ai alors dû lui conter un peu plus l’histoire [soupir]. Pour démarrer, Ken Thompson écrivit UNICS pour le PDP-7 entièrement seul. Quand plus tard ce fut porté sur PDP-11 et réécrit en C, Dennis Ritchie rejoignit l’équipe, mais se concentra plutôt sur la conception du langage C, écrivant le compilateur C, le système d’entrée/sortie et les pilotes de périphériques. Ken écrivit presque tout le noyau lui-même.

En 1983, une compagnie qui a maintenant disparu appelée la Mark Williams company a été créé et a vendu un très bon clone d’UNIX du nom de Coherent. La plus grosse partie de ce travail était faite par trois ex-étudiants de l’université de Waterloo : Dave Conroy, Randall Howard et Johann George. Cela leur a pris deux ans. Mais ils n’ont pas écrit que le noyau, mais aussi le compilateur C, le shell, et TOUS les utilitaires UNIX. C’est beaucoup plus de travail que d’écrire juste le noyau. On peut considérer que le noyau a pris moins qu’une année-homme.

En 1983, Ric Holt publia un livre, qui n’est plus édité aujourd’hui, sur le système TUNIS, un système UNIX-like. C’était forcément une réécriture puisque TUNIS était écrit dans un langage complètement nouveau, concurrent Euclid.

Ensuite Doug Comer écrivit XINU. Bien que n’étant pas un clone d’UNIX, c’était un système comparable.

Lorsque Linus démarra, cinq personnes ou petites équipes avait indépendamment implémenté le noyau UNIX ou quelque chose approchant.Nommément, Thompson, Coherent, Holt, Comer, et moi. Tout ceci était parfaitement légal et personne n’avait rien volé. Étant donné cette histoire, il est plutôt difficile d’affirmer qu’une personne ne peut pas implémenter un système de la complexité de Linux, dont la taille originale était environ la même que la  V1.0 de MINIX.

Bien sûr, il est toujours vrai en science que les gens créent à partir du travail de leurs prédécesseurs. Même Ken Thompson n’était pas le premier. Avant d’écrire UNIX, Ken avait travaillé sur le système MULTICS (MULTiplexed Information and Computing Service) du MIT. En fait, le nom original d’UNIX est UNICS, une blague faite par Brian Kernighan pour le UNIplexed Information and Computing Service, parce que la version PDP-7 ne supportait qu’un utilisateur–Ken. Après trop de mauvais jeux de mots à propos d’EUNUCHS qui était un MULTICS castré, le nom fut changé pour UNIX. Mais même MULTICS n’était pas le premier. Avant il y avait eu le CTSS déjà mentionné, conçu par la même équipe au MIT.

Toutefois, bien sûr, Linus ne s’est pas assis et tourné les pouces pour soudain taper le code source de Linux. Il avait mon livre, utilisait MINIX, et connaissait sans aucun doute l’histoire (puisqu’elle est dans mon livre). Mais le code était le sien. La preuve est qu’il a un peu gâché la conception. MINIX est un système micro-noyau joli et modulaire, avec les processus de gestion du système de fichier et le gestionnaire de mémoire tournant en espace utilisateur. Cela rend le système plus propre et plus sûr qu’un gros noyau monolithique ainsi que plus facile à débuger et à maintenir, pour un faible coût en terme de performances, même sur 4.77 MHz 8088 ça bootait en peut-être 5 secondes (contre une minute pour Windows sur un hardware 500 fois plus rapide). Un exemple de micro-noyau commercial qui a réussi est QNX. Au lieu d’écrire un nouveau système de fichiers et un nouveau gestionnaire de mémoire, ce qui aurait été simple, Linus a réécrit le tout dans un gros noyau monolithique, complété avec du code assembleur inline :-( . La première version de Linux était comme une machine à remonter le temps. Elle retournait à un système pire que celui qu’il avait déjà sur son bureau. Évidemment, il n’était qu’un enfant et ne pouvait pas faire beaucoup mieux (à moins qu’il n’aie prêté une attention un peu meilleure en classe comme il aurait dû), mais il a donc produit un système fondamentalement différent de la base dont il était parti, ce qui semblait une bonne preuve que c’était une reconception. Je ne pense pas qu’il pourrait avoir copié UNIX parce qu’il n’avait pas accès au code source d’UNIX, à part peut-être par le livre de John Lions, qui parle d’une des premières versions d’UNIX qui ne ressemble pas trop à Linux.

Ma conclusion est que Ken Brown ne connait pas ce dont il parle. Je me pose aussi de graves questions à propos de sa méthodologie. Après m’avoir parlé, il a rôdé dans les halls de l’université coinçant des étudiants au hasard pour leur poser des questions. Pas vraiment des sources idéales.

Les six personnes que je connaisse qui ont (ré)écrit UNIX l’ont tous fait indépendamment et personne n’a rien volé à personne. La remarque de Brown selon laquelle les gens ont essayé et raté pendant 30 ans la construction de systèmes UNIX-like est une bêtise manifeste. Six personnes différentes l’ont fait indépendamment l’une de l’autre. En science, on considère qu’il est important de reconnaître les gens pour leurs idées et je pense que Linus a fait cela beaucoup moins qu’il n’aurait dû. Ken et Dennis sont les vrais héros ici. Mais le manque d’attention de Linus au sujet des attributions n’est pas une raison pour affirmer qu’il n’a pas écrit Linux. Il n’as pas écrit CTSS, il n’a pas écrit MULTICS, il n’a pas écrit UNIX et il n’a pas écrit MINIX, mais il a écrit Linux. Je pense que Brown doit des excuses à un certain nombre d’entre nous.

Linus et Moi

Quelques-uns d’entre vous pourrait trouver bizarre que je sois ici en train de défendre Linus. Après tout, lui et moi avons eu un “débat” public mouvementé il y a quelques années. Mon premier objectif est d’essayer de faire surgir la vérité et non de critiquer tout sur une adolescente des montagnes reculées [back hills of West Virginia]. De plus, Linus et moi ne sommes pas “ennemis” ou quoi que ce soit de ce genre. Je l’ai rencontré une fois et il avait l’air d’un type sympa et intelligent. Mon seul regret est qu’il n’ait pas développé Linux en se basant sur la technologie micro-noyau de MINIX. Avec tous les problèmes de sécurité que Windows a maintenant, il est de plus en plus évident pour tout de monde que les petits micro-noyaux, comme celui de MINIX sont une meilleure base pour les systèmes d’exploitation que les énormes systèmes monolithiques. Linux a été la victime de moins d’attaques que Windows parce qu’il (1) est en effet plus sécurisé, mais aussi (2) parce que la plupart des attaquants pensent que frapper Windows offre un plus gros impact financier, ce qui fait que Windows est simplement plus attaqué. Comme je le croyais il a 20 ans, je crois toujours que la seule façon de faire des logiciels sécurisés, sûrs et rapide est de les faire petits. [Fight Features].

Si vous êtes arrivés jusqu’ici, merci de votre temps. Permission vous est donnée de mirrorer cette page du moment que la version originale et non modifiée est utilisée.

Andy Tanenbaum, 20 Mai 2004

Remplacement de commande

Voici donc le premier billet sur les astuces linux, j’espère qu’il y en aura beaucoup d’autres :-). Ci-dessous et par la suite, comme partout ailleurs, le dollar représentera la ligne de commande.

Comment remplacer très rapidement la commande précédente par une autre ?

Cas classique : vous avez machinalement tapé $more /etc/X11/XF86Config-4 et vous avez soudainement envie de modifier le fichier pré-cité et vous utilisez bash (je ne sais pas si ça marche sur d’autres shells, peut-être mais je n’ai pas testé).

Zut ! Au plus rapide, ça donne :

  • flèche vers le haut,
  • flèche début ou CTRL-A
  • suppr suppr suppr suppr
  • puis finalement vi et [ENTRÉE]

Un peu lourd, n’est-il point ?

Au lieu de ça, tapez simplement $^more^vi et c’est fini…

PS : Vous pouvez voir au passage avec l’image de la catégorie mes premiers pas avec Gimp… Ce que j’ai ramé…

Deuil 2

Les premières victimes des brevets logiciels tombent…

J’ai le regret de vous annoncer la fermeture du site de Christian Casteyde.

Christian avait réuni une somme impressionnante d’informations sur la programmation et l’informatique, allant de l’installation de linux à des benchs de compilo C. Son cours de C était même considéré comme le meilleur qui existe par certaines personnes.

Bref aujourd’hui toutes ces infos ne sont plus disponibles, et je trouve que c’est un énorme gâchi.

Deuil

Je tiens à faire passer par la (faible) voix de ce blog ma tristesse et ma rage contre le crétin qui vient de détruire des centaines d’heures de travail mais surtout de réflexions couchées sur le clavier, si je puis dire, sur le site de Vincent.

Il semble en effet que ledit crétin soit parvenu à hacker son compte ftp par un moyen ou un autre pour effectuer un travail des plus destructeurs…

À toi qui a trouvé du plaisir à faire ça : sache que tu n’es qu’un SALE PETIT MINABLE.

Brevets logiciels - Raaaaaa

Ils n’en ont vraiment rien à foutre des boîtes européennes, ça me rend dingue !

Ouvrons la fenêtre

Je reprends ici le titre d’une rencontre organisée par un lug français (je ne sais plus lequel, désolé, mais je crois que c’en est un de la région Lyonnaise).

Alors là, je trouve ça tellement fort que je transmets l’info telle quelle. Effectivement, comme Olivier, je dirais : “mais ils ont une stratégie chez MS ? Je parle d’une vraie, une qui dit pas blanc, noir puis reblanc, puis renoir (ça c’est de l’art, non. Je vais me pendre et je reviens) puis…”.

Microsoft sponsorise la présidence de l'UE ?

On croit rêver

Version française du document

Comme je commence à prendre l’habitude de faire des traductions (les intéressés chercheront par eux-mêmes), en voici une de plus. Je l’ai faite rapidement pour aider les anglophobes ou ceux qui ont simplement quelques difficultés pour déchiffrer l’anglais. Si vous trouvez qu’il y a une faute de traduction, n’hésitez pas à m’en faire part, je vous promet que j’en tiendrai compte.

===================================

Microsoft, un sponsor pour la présidence de l’UE ?

===================================

Bruxelles, le 14 mai.

À l’initiative d’Olga Zrihen, membre du parlement européen et du PS belge, de la section Internet “TemPS réels” du parti socialiste français et du VOV, “Virtueller Ortsverein”, la section virtuelle allemande du SPD (NDT : le parti socialiste allemand majoritaire, celui-ci du chancelier Schröder), une action de protestation prendra place en face du siège de l’Union Européenne, le 17 mai 2004 à 13h00 ndt : heure française ? (Rue Froissart 89, 1040 Bruxelles), pendant laquelle des CD-ROM contenant des logiciels libres seront distribués, notamment aux diplomates irlandais, comme signal de l’existence d’une alternative européenne libre au monopole de la compagnie américaine Microsoft.

Le brouillon de législation européenne sur les brevets logiciels, crucial pour le futur de l’industrie européenne de l’information et après la première lecture du parlement européen qui a substantiellement amendé la proposition initiale du commissaire Bolkestein, est sur l’agenda du conseil des ministres de la “compétivité” du 17 mai. Cette proposition de directive met directement en confrontation les intérêts matériels des PME qui représentent le gros de l’industrie européenné du logiciel à ceux des grosses multinationales comme l’américaine Microsoft.

Aujourd’hui, nous avons noté que Microsoft sponsorise officiellement la présidence Irlandaise de l’Union Européenne. D’après Olga Zrihen, “Nous avons le droit de nous interroger sur cette situation : la présidence de l’UE, qui est un élement central du processus législatif européen, et qui est supposé obéir à des principes démocratiques, accepte d’être sponsorisé par une compagnie privée dont les intérêts économiques sont directement mis en cause par une proposition législative sur l’agenda du conseil ! De plus, quand on sait que la proposition de “compromis” émanant de la présidence irlandaise rejette tous les amendements de première lecture du parlement européen, ce qui correspond aux demandes de Microsoft, nous avons un sentiment de grande inquiétude.”

Une conférence de presse doit se tenir à 15h00 au parlement européen. Une contribution des socialistes européens pour le contrôle démocratique des technologies de l’information sera présentée par Olga Zrihen, membre du parlement européen en collaboration avec Maurice Ronai, délégué national aux problèmes de la société de l’information pour le parti socialiste français, Thierry Noisette, le secrétaire de la section Internet “TemPS réels” du parti socialiste français et Anne Brand, une porte-parole de VOV (Virtueller Ortsverein, la section virtuelle du parti socialiste allemand - le SPD).

Franhoiss

Petit redesign du site

Avec le temps, on s’aperçoit que certaines parties sont moins importantes… C’est l’enthousiasme qui m’avait fait mettre en valeur le bloc concernant l’orthographe, lorsque je l’avais codé. J’ai finalement décidé de le remettre à sa place :-) pour deux raisons :

  • Celle que je viens de donner : quand tu passes, ne serait-ce qu’1 heure, à écrire quelques lignes de php pour les intégrer à l’existant, tu as l’impression que c’est génial et tu veux le montrer… Après l’enthousiasme revient donc la réflexion. La page sur l’orthographe n’a pas non plus une si grande importance qu’elle doive être isolée de la sorte. Elle conservera donc son bloc personnel mais réintegrera dorénavant le menu =).
  • Afin et d’intégrer une caricature de moi (un dessin en fait) faite par un de mes plus vieux amis, donc je vais parler ci-après.

Le Hoiss

François alias FranHoiss donc, et moi nous connaissons depuis sa naissance (ben, oui, chui plus vieux que lui :p). Il a toujours été un fanatique de dessin. Je le revois encore passer des heures à dessiner des personnages plus fantasmagoriques les uns que les autres. Je crois qu’il a enfin trouvé son style, vu de l’extérieur, je trouve que ça se stabilise, le dessin sus-cité mis à côté de son site en est une preuve évidente.

Il ne connait pas encore le XhtmlCss, si ce n’est depuis que je lui en ai parlé. Il est encore au flash qui lui permet pour l’instant plus de nous faire rentrer dans son monde. Il a en tout cas eu l’air d’aimer parce que je suis parvenu à lui faire installer firefox dans la foulée de la démo de csszengarden. Je lui ai ensuite demandé de regarder le site de Darken avec IE puis avec firefox… Voilà, démo terminée, public convaincu (faut dire que Dk a particulièrement abusé des png transparents comme il le dit lui-même et que la différence entre firefox et IE est plutôt choquante :-)).

Bref, j’espère qu’il trouvera le temps de s’y mettre et qu’il sera capable de mettre son talent de graphiste au service d’un magnifique design en css qui valide :-).

Si vous avez des remarques au sujet de son site et/ou que vous êtes intéressé par ce qu’il fait, n’hésitez pas à laisser un commentaire à ce sujet, je m’empresserai de lui transmettre.

Méfions-nous de l’angélisme linuxien

“Ce n’est pas parce qu’un “source” est offert aux yeux de la communauté qu’il en est plus sur pour autant” dit en substance ce livre blanc édité par Green Hills. Ce genre de déclaration n’est pas franchement révolutionnaire, la communauté Linuxienne ou BSDiste étant parfaitement consciente qu’une porte dérobée pourrait se cacher dans n’importe quel source « touffu ». Ce qui change ici, c’est le développement du propos, une somme d’arguments clairement expliqués, une approche détaillée et didactique du problème. Tout y passe, y compris l’outsourcing des logiciels auprès de développeurs « pauvres mais honnêtes » des pays de l’ex bloc de l’Est –l’ombre de la Lubianka flotte toujours au dessus de Moscou-. En quelques mots, le message de Green Hills insiste sur le fait que ce n’est pas parce que les troyens ne pouvaient pas voir Ulysse et ses soldats qu’ils ne se sont pas méfié du cheval, mais parce qu’ils on choisi d’ignorer ce qu’il pouvait y avoir dedans. S’ajoute à ceci le nombre de sources de distribution, autant de « points de vulnérabilité » qui augmentent les risques. « The chance of someone infiltrating a back door into Linux is close to 100% »insistent les auteurs, qui enchaînent, après un légitime passage publicitaire, sur le problème des bugs de conception et de codage« Removing the majority of the bugs by source code inspection is pure fantasy ». Voilà qui est clairement envoyé. Et de citer le papier Ken Thompson que tout bon codeur et dévermineur doit avoir lu au moins 10 fois. Les techniciens de Green Hills sont, c’est incontestable, excessivement partiaux. Mais, sous ce prétexte, ne pas tenir compte de leurs arguments semble tout aussi inconséquent.

Source : les cahiers réseaux

Thunderbird (mozillimecat)

Bon, après 2 coups de gueule, on va rigoler un peu (si, si !). Je fais un bête relai d’information, mais ça me fait rire et pis je fais ce que je veux.

Bref, je me suis marré (tout seul…) devant mon écran en lisant ce billet sur le blog de Michel Valdrighi. Bref, il trouve (et moi aussi à la lumière de ces images) que l’icône de thunderbird fait penser à celle du limecat… Attention, drôle.

Loi de Murphy

Vous l’appliquez tous les jour… mais la connaissez vous ?

J’suis tombé la dessus en cherchant des articles scientifiques sur le net : \ loi de murphy [fr]

Les licences de logiciels libres ne sont pas des demi-licences !

Qu’on se le dise !

J’ai trop souvent vu des gens affirmer que la GPL n’avait pas de fondement juridique et qu’elle était donc caduque. Ce jugement prouve une fois de plus que ce n’est pas le cas.

Aberration

Je me souviens même avoir quelques une phrase du type “je n’utilise pas la licence GPL parce que c’est une aberration”. Mais de quel droit ces personnes osent-elles affirmer cela ? La licence propriétaire n’est qu’un mode de licence parmi tant d’autres et il est anormal qu’on dise que les autres sont illégales.

Il n’y a pourtant pas d’argumentation possible, c’est un fait : les licences libres ont été rédigées par des avocats dans le but, justement, d’être légales, autant que pour toutes les licences propriétaires existantes. Elles ont des bases juridiques aussi solides que les licences proprio.

Que vous ne vouliez pas mettre votre logiciel sous cette licence est une chose. Après tout, c’est vous qui décidez de ce que vous voulez faire de votre travail, mais laissez aux autres ce même choix. Un ami me disait récemment par exemple : “Définitivement, je ne veux pas de fork de mon projet”, pas de problème, il choisira certainement un autre type de licence libre (de chez Creative Commons, par exemple).

Emploi dans l'informatique

Incroyable…

Je comprends que mat ait honte et hâte d’en finir. Pour ceux qui n’auraient pas suivi, cette annonce a lancé un troll sans nom. Certains anciens étudiants d’épitech ont tristement commenté ce post “Pour une école à 40 000 francs l’année (un peu moins de 6000 euros), on pourrait s’attendre à avoir des profs bardés de diplômes”. Tous les posts ont depuis été modéré, dont le mien où, particulièrement énervé, j’avais pété un cable en demandant si être en thèse signifiait forcément être “trop théorique” (sic.). J’avais en effet expliqué que même mes profs de td étaient des thésards et qu’ils étaient pourtant hyper techniques et passionnés (pour aller coder des patches pour netfilter, vous me direz pas qu’il faut être le dernier des neuneus et qu’on fait ça en se tripotant la nouille). Faut pas se foutre de la gueule du monde : on arrive pas en thèse d’info sans être passionné par ça ! Sinon, on devient fou avant ou on commence la drogue !

Bref, incroyable mais vrai, epitech recrute des enseignants à BAC+2. En indiquant donc que ce profil est recherché parce qu’on ne recherche pas des “fins théoriciens”, mais plutôt des très bons techniciens avec de l’expérience… J’avais donc répondu à cela que je pensais surtout que c’était un moyen de gagner encore de l’argent sur l’une des formations déjà les plus chères de France.

En même temps, je mélange un peu Epita et Epitech, mais si je ne m’abuse, il me semble qu’Epitech est simplement une version plus mode en alternance de l’Epita (ben oui, fallait ramasser aussi là).

Bref, si vous voulez avoir des enseignants qui seront ptête moins diplômés que vous, vous avez trouvé votre école…

Raaaaa, m’a énervé !

Linux pour les femmes !

J’ai trouvé ça sur Internet et cela me fait bien rire :

À bas Intermarché

Après le formidable slogan de ce supermarché, on apprend sur le blog d’Olivier Risacher qu’intermarché a fait un choix stratégique de plus : utiliser windows pour ses serveurs :-). Un choix qui ne peut que m’encourager à aller encore plus dans le sens indiqué ci-dessous.

Campagne de pub à deux balles

Intermarché a choisi Windows Le slogan de ce magasin m’insupporte franchement !

Pour ceux qui ne le connaitraient pas encore parce qu’ils ne vivent pas en France ou qu’ils n’ont pas écouté la radio depuis 2 ans, je vous le rappelle, non sans douleur (attention, ça peut choquer quand on le découvre) : “Intermarché, donnons plus à celles qui donnent tant”…

Bref, très fort, en 2004, on parvient encore à trouver des crétins de publicitaires qui osent produire de tels trucs. Attendez ! Parce que, encore plus stupides, il y a les dirigeants de cette chaîne qui auraient dû dire au publicitaire : “Bon, maintenant que vous m’avez bien fait rire, ils sont où le vrai slogan et la vraie campagne de pub que je vous commandés ?”.

À force d’entendre ce truc à la radio (que j’écoute beaucoup), j’ai fini par craquer à la n^ième^ fois où je l’ai entendu… J’étais comme souvent devant mon ordinateur, j’ai décidé d’aller chercher sur leur site l’adresse email des chiennes de garde pour leur demander pourquoi elles ne réagissaient pas à cette provocation.

Je craque

Mon mail :

Bonjour,

Je trouve qu’on entend rarement parler de vous. Je ne suis pas non plus pour un militantisme ss limite qui ne contribuerait qu’à vous décrédibiliser. Toutefois, s’il y a bien récemment une chose qui aurait dû vous faire hurler et que ça se sache c’est ce slogan “Donnons plus à celles qui donnent tant”. En cherchant sur le net, je m’aperçois que je ne suis pas le seul à être très choqué par ce slogan :

Ma copine et moi ne comprenons franchement pas que des publicitaires aient osé mettre ça en place ?!? MAIS que VOUS ne réagissiez pas me parait encore plus incroyable.

Je revois encore cette affiche avec la super woman avec son caddie de supermarché… Franchement, vous dormez ou quoi ?

Ce slogan existe encore ! http://www.stationmarche.com/_mousquetaires/_mousquetaires.php

Pour finir, en tant qu’homme je trouve ça totalement inadmissible de donner cette image anti progressiste. De plus, je fais personnellement plus souvent les courses que ma copine :-), et je peux vous garantir que je ne les ferai jamais chez Intermarché…

La réponse

Un peu trop résignée à mon goût. Elle a toutefois la mérite d’être honnête.

Bonjour,

Nous trouvons ce slogan tout aussi inadmissible que vous… Mais nous ne sommes pas spécialisées dans la lutte contre la pub sexiste : c’est effectivement La Meute qui s’en occupe de manière systématique, même si nous en parlons occasionnellement.

Les sujets contre lesquels s’élever sont si nombreux qu’on ne peut bien sûr pas se faire entendre sur tous.

Cela ne veut pas dire que certains sont moins graves à nos yeux et en particulier, la pub Intermarché, avec ses relent vichyiste me déplait bien plus que la pub Lejaby, sur laquelle pourtant on nous demande sans cesse notre avis.

Pour cette pub en particulier, nous en avons beaucoup parlé au moment de sa sortie, mais malheureusement, nous n’avons pas rencontré beaucoup de soutien.

Cordialement

___________________

Leirn pour les Chiennes de garde

Preview de Longhorn

Je viens de lire sur le blog de Sami Jaber sur DGN que je suis par syndication XML que Microsoft aurait récemment proposé une preview de Longhorn, le futur OS de la firme de Redmond.

Ça me fait bien rire de voir ça… Après l’annonce récente de suppressions de certaines des fonctionnalités par manque de temps, ça ternit encore un peu plus l’image que MS veut donner de son futur bébé.

Mise à jour du 10 mai 2004

J’ai retrouvé où j’avais vu le lien indiquant que MS revoyait les fonctionnalités de longHorn à la baisse, c’est .

Un extrait alléchant :

“What’s more, the e-mails disclose Microsoft’s plans to cut some of the most far-reaching pieces of Longhorn in order to get the product shipped.”

Vous croyez que Sasser, Blaster ou autres seront des fonctionnalités portées sur LongHorn ? :-D

<troll>Je rappelle aussi que la meilleure solution pour ne pas subir Sasser, ce n’est pas de patcher ou de mettre un firewall sur son windows comme le préconise MS (d’ailleurs, une chose inadmissible que je remarque, c’est que quand je vais voir les comptes-rendus sur ce genre de problème, je ne vois jamais d’excuses)… C’est plutôt d’utiliser GNU/Linux</troll>

Lavez moi ça

On enchaîne sur un nouveau billet.

J’ai reçu cette photo aujourd’hui (merci à Pierrot). Je me demande si elle a été trafiquée, j’ai zoomé un peu dessus, si c’est un faux modifié à l’ordinateur, je dis chapeau !

Sac de voyage

Vive la moto ! (et les motards)

La semaine dernière, j’ai voulu aller me détendre un peu dans la région toulousaine. Pour ceux qui connaissent, je voulais aller à la Ramée pour jouer au Basket (un endroit gigantesque avec des lacs et installations sportives. Idéal pour pratiquer roller, football, basket, vélo, etc.). Bref, je prends la route en moto et je me dirige vers ma destination. À mi-chemin environ, la moto commencait à montrer quelques signes de panne sèche…

“pas de problème !” me dis-je. “C’est normal, il faut que j’aille faire le plein.”

Note pour ceux qui ne connaissent pas le fonctionnement d’une moto :

Il n’y a pas ni jauge ni voyant d’essence sur une moto, on fonctionne en fait avec deux modes : On et Res. On doit toujours rouler en mode On, lorsque le manque d’essence se fait sentir, on passe sur la réserve (Mode Res) et on sait qu’on doit aller faire le plein (avec une autonomie plus ou moins équivalente à celle d’une voiture quand le voyant rouge vient de s’allumer).

Je ne m’affole donc nullement, je passe la moto sur la réserve et m’attends à la sentir “repartir”… Eh ben non, raté, elle ne repart pas et je finis lentement par m’arrêter connement et dangereusement sur la bande d’arrêt d’urgence à la sortie d’une bretelle d’accès à une autre autoroute (plus précisément la bretelle après Empalot pour aller vers Portet/Garonne).

Et c’est là que le plus fort commence : environ 15 secondes après mon arrêt, deux motos s’arrêtent devant moi et deux mecs descendent pour venir m’aider. Je précise que je ne les connaissais “ni des lèvres ni des dents” :-). Après quelques vérifications de base, nous avons bel et bien constaté que je n’avais plus d’essence… J’avais dû merdoyé avec les modes… L’un d’eux m’a donc proposé de m’emmener en chercher dans une station service des environs, ce que nous avons fait.

Après quelques minutes de recherche de station service, achat de bouteille d’eau, vidage de celle-ci, remplissage d’essence, retour à la moto et redémarrage, me voilà reparti !

C’est pas formidable, cette solidarité ? Ça ne vous donne pas envie de vous mettre à la moto pour ressentir ça ? En tout cas, j’avais beau le savoir, j’ai été impressionné de la rapidité avec laquelle j’ai été sorti de ma merde :-). Merci encore aux deux motards qui m’ont rendu service.

Logiciel anti-web-standards

Les Web Standards

Absolute HTML Compressor, moi j’aurais plutôt appelé ça deletor ou corruptor…

Depuis que je m’intéresse au monde des standards du web, je remarque beaucoup plus les immondices en terme de html qui peuvent traîner sur le net. Je pense que c’est dû comme toujours à l’effet de loupe, je n’aurais en effet pas eu l’idée il y en encore un an de regarder systématiquement le source html d’un site qui me plaisait graphiquement.

Donc, en surfant tel un webfool (mouai…), j’ai encore été brusqué. Je ne sais pas ce qu’en pensent les autres ni si ce logiciel a déjà été décrié, mais en lisant les features, j’ai eu à la fois envie de rire et de taper.

Les “fonctionnalités”

En vrac, en voici donc les “meilleures” fonctionnalités de ce formidable outil :

  • merge lines;
  • remove unnecessary whitespace characters

Ça commence déjà très fort… Après le passage de ce rouleau compresseur, vous pouvez oublier l’édition de fichier avec un simple éditeur, le source devient tout simplement illisible ! (cf. le source du site de l’éditeur)

  • remove unnecessary quotation marks. For example, <table BORDER=“0” CELLSPACING=“0” CELLPADDING=“0” align=“center”> will be converted to <table BORDER=0 CELLSPACING=0 CELLPADDING=0 align=center>;
  • replace some tags with the short ones - replace STRIKE tags with S, STRONG with B and EM with I

Pas mal ça, non ? Comment aller dans le sens contraire de la norme ?

  • remove HTML comments. The comments within the scripts and styles aren’t removed;

Mouai, à la limite.

  • remove <!DOCTYPE …> tags;

Ça c’est la ligne qui me donne envie de taper…

  • remove meta tags. You can specify names of the meta tags to be removed.

Et tu crois ptête que j’ai mis mes meta pour rigoler ? Si je les ai mises, c’est pas pour les enlever ensuite…

Best Practices

Bon sang, mais il y a quand même plus simple pour alléger son code que d’utiliser ce genre de merde ! Il suffit de coder proprement en html, que ce soit au marteau et au burin ou avec un éditeur WYSIWYG compatible avec les spécifications (X)HTML du W3C.

Il est amusant de constater que les sites qui utilisent ce logiciel sont ceux qui utilisent encore une mise en page avec tableaux… Sans tableaux, une page peut pourtant parfois peser deux fois moins lourd ! Alors, pourquoi pourrir une page html avec un tel logiciel alors que ça devient totalement inutile avec un minimum de rigueur ?

Les résultats qu’on peut obtenir sont si jolis en plus ! :-) : Debian-fr.

Conclusion

Si toi, lecteur, tu ne connais pas encore le XhtmlCss, n’hésite pas à poser des questions autour de toi (ou même ici, mais je ne me prétends absolument pas une référence en la matière), tout le monde sera content de t’aider à migrer vers cette formidable technologie.

En tout cas, en ce qui concerne, l’utilisation de cette technologie est un délice de tous les jours à la maintenance du code.

Un logiciel anti-standards

Les Web Standards

Absolute HTML Compressor, moi j’aurais plutôt appelé ça deletor ou corruptor…

Depuis que je m’intéresse au monde des standards du web, je remarque beaucoup plus les immondices en terme de html qui peuvent traîner sur le net. Je pense que c’est dû comme toujours à l’effet de loupe, je n’aurais en effet pas eu l’idée il y en encore un an de regarder systématiquement le source html d’un site qui me plaisait graphiquement.

Donc, en surfant tel un webfool (mouai…), j’ai encore été brusqué. Je ne sais pas ce qu’en pensent les autres ni si ce logiciel a déjà été décrié, mais en lisant les features, j’ai eu à la fois envie de rire et de taper.

Les “fonctionnalités”

En vrac, en voici donc les “meilleures” fonctionnalités de ce formidable outil :

  • merge lines;
  • remove unnecessary whitespace characters

Ça commence déjà très fort… Après le passage de ce rouleau compresseur, vous pouvez oublier l’édition de fichier avec un simple éditeur, le source devient tout simplement illisible ! (cf. le source du site de l’éditeur)

  • remove unnecessary quotation marks. For example, <table BORDER=“0” CELLSPACING=“0” CELLPADDING=“0” align=“center”> will be converted to <table BORDER=0 CELLSPACING=0 CELLPADDING=0 align=center>;
  • replace some tags with the short ones - replace STRIKE tags with S, STRONG with B and EM with I

Pas mal ça, non ? Comment aller dans le sens contraire de la norme ?

  • remove HTML comments. The comments within the scripts and styles aren’t removed;

Mouai, à la limite.

  • remove <!DOCTYPE …> tags;

Ça c’est la ligne qui me donne envie de taper…

  • remove meta tags. You can specify names of the meta tags to be removed.

Et tu crois ptête que j’ai mis mes meta pour rigoler ? Si je les ai mises, c’est pas pour les enlever ensuite…

Best Practices

Bon sang, mais il y a quand même plus simple pour alléger son code que d’utiliser ce genre de merde ! Il suffit de coder proprement en html, que ce soit au marteau et au burin ou avec un éditeur WYSIWYG compatible avec les spécifications (X)HTML du W3C.

Il est amusant de constater que les sites qui utilisent ce logiciel sont ceux qui utilisent encore une mise en page avec tableaux… Sans tableaux, une page peut pourtant parfois peser deux fois moins lourd ! Alors, pourquoi pourrir une page html avec un tel logiciel alors que ça devient totalement inutile avec un minimum de rigueur ?

Les résultats qu’on peut obtenir sont si jolis en plus ! :-) : Debian-fr.

Conclusion

Si toi, lecteur, tu ne connais pas encore le XhtmlCss, n’hésite pas à poser des questions autour de toi (ou même ici, mais je ne me prétends absolument pas une référence en la matière), tout le monde sera content de t’aider à migrer vers cette formidable technologie.

En tout cas, en ce qui concerne, l’utilisation de cette technologie est un délice de tous les jours à la maintenance du code.

Le serveur de logs d'OVH a sauté

Je ne comprenais pourquoi, d’un seul coup, mes statistiques n’indiquaient plus aucune visite sur Batmat.net :-). Vous nous auriez ainsi si lâchement abandonné ? Avec une peur un peu dissimulée :-), j’ai donc joint le support d’OVH : leur serveur de logs avait rendu l’âme, ce n’est pas donc pas Batmat.net qui a été renié par son (faible) lectorat, bonne nouvelle ! Voici l’échange avec l’équipe d’OVH :

Avant de vous livrer ici le contenu de cet échange, je tiens à remercier ici la réactivité et la franchise d’OVH qui a tout de suite reconnu son tort et expliqué clairement ce qu’ils faisaient sans chercher à dissimuler le problème. Ils n’ont pas cherché non plus à me faire croire que je puisse être à l’origine du souci. De plus, ce qui ne gâte rien, la réponse est arrivé une heure seulement après la question.

Bref, bravo OVH !

Mon message :

Bonjour,

Il semble y avoir un souci avec les logs. Je possède le nom de domaine batmat.net que vous hébergez et depuis quelques jours, il s’affiche soit 1 visite soit 0 par jour…

Rien qu’avec mes visites depuis différentes machines, je suis sûr d’en faire 2 ou 3 par jour au moins et si on s’en réfère au trafic des jours précédents, ce nombre semble imcohérent.

Merci de corriger ça au plus vite ou de m’indiquer comment le faire si l’erreur est de mon fait.

Merci

La réponse :

Bonjour,

Nous avons bien reçu votre message

Le serveur de logs a explosé, rsync (la technologie qu’on utilise pour transferer les fichiers de logs) sature aussi. Nous l’avons prevu et nous avons contruit un nouveau serveur de logs avec 3.5To de disque (16x250Go en 4U). Pour le mettre en place et changer completement la manière de decharger les logs, il nous faudra quelques jours de travail. Nous allons mettre aussi en place d’autres types de statistiques qu’urchin.

On espere que les logs vont revenir courant de la semaine prochaine.

En esperant avoir répondu à votre attente

Cordialement, Frederic

Miss France

J’ai toujours rêvé d’être Miss France ! Non, je déconne en fait…

Voici un lien amusant pour voir un peu la trombine des Miss depuis 1949 (ils annoncent 1947 sur le site, mais je ne sais pas ce qu’ils ont fumé).

to post or not to post

alors là j’avais mis un truc qui claquait et puis en fait ce dotclear d’amour a chié une pendule et mon post (billet billet billet !!!) d’élite en même temps. “Flush it baby…”

trop de pression tue la cocotte-minute. moi ça va.

de toute façon il fallait agir. le plus vite possible, faire sortir cette flagornerie de graphique de la page principale.

bon. Baptiste a parlé de moi sur ce site, entre autre il a fait l’erreur de donner mon nom complet (même si le mal est fait, tu veux bien changer ça mon bichou ?). ce qui me permet de constater, en direct, en pleine écriture, en même temps que vous, que j’ai un homonyme de l’autre côté de l’Atlantique qui 1/ fait de la politique et 2/ a plus de résultats en première page de Google que moi. MON honneur et MON nom sont ruinés.

Il a dit aussi quelque chose qui pourrait s’interpréter comme : “raf82 est drôle”. c’est faux. raf82 peut être drôle. mais c’est difficile pour moi. (tout le contraire de Baptiste. quand il est drôle (euh…) c’est difficile pour nous. messieurs de l’IUT de ‘Bleau, je vous laisse citer quelques-unes de ces blagues à répétition favorites, ou évoquer la délicate situation des blagues en autarcie. si toi aussi, visiteur égaré, grand inconnu, belle amazone, veux participer, tu es ici chez toi. pour les belles amazones, elles sont aussi bienvenues chez moi.)

une petite précision avant d’aller, qui sait !, plus loin. j’ai choisi, non, Pilou/Pilif s’est imposé à moi comme souffre-douleur/tête-de-turc/encore-plus-si-affinités. c’est pas de sa faute, c’est parce que je l’aime comme seul peut l’aimer un de ses colocataires. bon d’accord ! un de ses ex-colocataires. mais allez-y doucement, la rupture a été rude. l’avantage, très accessoire, d’avoir Pilou comme exutoire, c’est qu’il sera rarement là pour se défendre, je gage.

voilà, ce sera tout pour cette fois. la prochaine fois, des réponses à vos questions existentielles :

  • l’Islande est-elle le premier pas des extra-terrestres sur Terre ? nan elle est trop facile celle-là, je vais y répondre tout de suite, grâce à cet indice que vous pourrez retrouver dans les bacs : “múm - summer make good”, très exactement la toune 4, “the ghost you draw on my back”. la preuve est irréfutable. ceci dit je préfère encore, pour l’instant, les albums précédents. un jour je rapporterai des preuves supplémentaires directement de là-bas.\ hum, on me signale par ici que ce jeune homme a une petite annonce à passer ? c’est mon heure de bienveillance, vas-y jeune homme : “euh, recherche colocataire de l’extrême pour voyage à l’étranger très étranger.” pas toutes à la fois mes petites chéries ! il ne peut en rester qu’une ! (il me souffle qu’il n’est ni désespéré ni schizophrène.)
  • par défi personnel (appelons ça comme ça ;)), je me demande si on peut “s’agrandir” la langue. donc je m’entraîne, hop, je tire la langue et tout, en espérant bien que ce foutu frein lâche (un peu de lest, au moins). je n’envisage pas encore l’opération (voir l’Humanité et absolument cet article), ce serait trop facile. mais ! vais-je parler de langue à chaque fois ?!? (oui oui, je me suis tendu une belle perche, mais avouez que vous n’aviez rien vu)
  • quelles sont les relations entres Pilou/Pilif et raf82 ? je vous promets de développer cette réponse ;)

“see you space cowboy”

Monitorer son site

En allant jeter tout à l’heure un coup d’oeil chez ikoula, je suis tombé sur un service gratuit très intéressant. Celui-ci permet d’effectuer un monitoring d’un site web qu’on indique, on peut ensuite visualiser le temps up dudit site. Je ne me suis inscrit qu’aujourd’hui mais je n’ai pas eu la patience d’attendre d’avoir testé pendant plusieurs jours pour vous donner ce lien, j’ai configuré mon compte pour monitorer server.batmat.net et www.batmat.net, je referai certainement un billet là dessus d’ici quelques temps après l’avoir essayé plus longuement.

Voici le graphe obtenu pour www.batmat.net :

Graphique de disponibilité chez
Ikoula

Service Ping de chez
Ikoula

Vos meilleures citations...

Je propose que vous postiez vos citations préférées.

Moi j’aime bien :

  • “Si haut que vous montiez, soyez polis avec ceux que vous dépassez; vous les croiserez en descendant.”

Pas honte...

La page de traduction française de csszengarden est de mauvaise qualité.

Quel travail

Les gens qui ont traduit la page de csszengarden en français n’ont pas dû lire mon premier billet :-) .

Il reste dans cette version un grand nombre de petites fautes de français :

  • courament à la place de couramment ;
  • fonctionelle pour fonctionnelle ;
  • Le plus fort, survolez le lien envoyez nous un lien, le title c’est ça : “Utilisez la forme de contacte pour nous envoyez fotre document CSS” ;

C’est moi qui l’ai fait

Bref, je ne sais comment ils osent apposer leurs signatures en bas de la page pour un travail pareil ! Oui, parce qu’ils sont deux en plus, je ne sais pas lequel des deux a relu l’autre, mais il devait être malade…

Ils ont quand même contribué, on ne va pas leur jeter la pierre ?

Ben si ! Toutefois, je ne veux pas non plus totalement les enfoncer parce qu’ils ont quand même le mérite d’avoir contribué à ce site. Étant un fervent partisan du libre, je ne peux qu’encourager ce type d’initiative. Dans le même temps, cela me rappelle quelqu’un sur la liste de diffusion debian-user-french qui disait, à juste titre, que ce n’était pas parce que le travail était non rémunéré qu’on pouvait excuser qu’il soit de mauvaise qualité : c’est trop facile de toujours se reposer sur ça pour produire des choses qu’on n’a pas vérifiées parce qu’on se dit par exemple que quelqu’un va repasser derrière. C’est ce genre de supposition qui contribue à donner une mauvaise image du libre dans le monde de l’entreprise et ça, ça me révolte.

Mais pourquoi est-il si méchant ?

Parce que ! <mauvaise foi>Je me demande s’ils ne se sont pas précipités sur cette traduction pour se faire de la pub…</mauvaise foi>.

En effet, l’un des traducteurs est webdesigner freelance (je ne me souviens plus de l’autre), mais je crois qu’elle n’a peut-être pas songé au fait que cette publicité lui serait très négative. Quand bien même l’idée de pub n’aurait aucunement été présente, et bien la mauvaise publicité s’est quand même faite : personnellement si je devais choisir un webdesigner, j’en prendrais un qui accorde de l’importance à la qualité de sa syntaxe et de son orthographe.

Ma contribution

Ce billet serait incomplet et même inadmissible si je ne proposais pas une solution alternative, j’ai donc mis en local une correction effectuée par mes soins. Comme toujours, je ne prétends pas qu’elle soit pas parfaite : il se peut que quelques erreurs subsistent encore. Je peux simplement dire qu’elle est mieux que l’original.

J’ai corrigé toutes les fautes évidentes de frappe ou d’inattention, ensuite j’ai fait quelques choix plus discutables comme par exemple :

  • Ajout d’espace insécable entre texte et point d’interrogation ou deux-points ;
  • remplacement de : “le css” par “la css” ;
  • remplacement de : “clique-droit” par “clic-droit”, j’hésite même à supprimer le tiret ;

Je demande donc au généreux lectorat d’en effectuer une relecture avant que je soumette cette version au gestionnaire de csszengarden.

Merci.

Récapitulatif des liens :

À Pâques, la période de migration commence ...

Il faut croire qu’en ce moment, c’est la période de migration pour les informaticiens. Après Darken qui a récemment changé d’hébergeur, j’en prends moi-même un tout court… Et le même que lui en plus : ovh avec la 60gp.

L’ancien site était hébergé at home :p : comme cette machine fonctionne très bien quand même, je l’ai réléguée au nom de server.batmat.net. C’est simplement la disponibilité pour le moins aléatoire de celle-ci qui me fait décider de choisir un hébergement externe géré par des pros que je pourrai incendier si mon site est indisponible. J’en avais assez d’être dépendant des déconnexions de free ou de mes parents. La machine se trouve en effet chez eux et ils l’ont encore éteinte récemment pour partir en vacances alors que j’ai répété 100 fois de ne jamais l’éteindre…

Je pense par contre que je mettrai les fichiers trop volumineux que je voudrais éventuellement distribuer dessus puisque je n’y ai aucune limite :-).

Bref, voici donc le renouveau de batmat.net qui verra, je l’espère, les blogs des 2 contributeurs qui n’ont pas encore sévi :

  • Draven ou Pilou, mon portugais à moi, qui devrait avoir pleins de choses intéressantes à nous dire à son retour de Bosnie ;
  • raf82, Raf quoi, qui nous montrera bientôt de quoi il est capable, je l’espère :p.

Au programme, quelques tites choses qui me tiennent à coeur devraient voir le jour :

  • Catégorie Trucs et astuce linux : cette rubrique relaiera parfois les tips de linuxfr, tout autre que je découvrirai ou n’importe quel autre qu’un lecteur me soumettrait (dont je citerais alors bien entendu le nom en référence ;p. Oui, c’est bien une proposition à toi public !) ;
  • Même chose pour win* ? Par contre, je n’ai ni l’envie ni les connaissances pour ce faire, alors je verrais bien Noir animer cette partie ;
  • Design Css : j’ai envie de faire que les blogs s’affichent un peu plus séparément (genre a19s pour ceux qui connaissent) avec une classe css selon la catégorie qui permettrait par exemple d’afficher un pingouin à côté des tips linux, ou que sais-je encore…

Ce sera tout pour cette fois.

Non aux brevets logiciels !

Il n’est plus besoin d’expliquer les méfaits des brevets logiciels en Europe. Pour afficher votre opposition, récupérez l’un des fichiers html sur ce site (version 1.05 ou 1.01 pour un site web par exemple) et mettez le à la place de votre page d’accueil après avoir modifié le lien en fin de page pour qu’il pointe vers le contenu habituel de votre site.

Exemples :

Conférences et activités autour des Logiciels Libres

3 jours de conférences et activités autour des Logiciels Libres sont organisés le 23-24-25 avril 2004 à l’ESIEE (Noisy-Le-Grand, campus de Marne La Vallée).

Au programme :

  • Install Party (installation sur votre propre machine de logiciels libres) ;
  • GPG Keysigning Party ;
  • Présence de stands d’acteurs du Logiciel Libre (FSF, APRIL, PARINUX, Léa, Gnome…) ;
  • Atelier de démonstration ;
  • Conférences sur le nouveau noyau Linux 2.6, les brevets lociciels, sur le Wi-fi (sécurité et risques)… et bien d’autres.

pour plus d’info allez voir sur le site de l’association IDILE

Quand les SAV se prennent pour des commerciaux !

Cette petite aventure m’est arrivée l’année dernière quand je travaillais pour une petite entreprise qui voulait l’ADSL !

Je viens de m’en souvenir ce soir car une amie qui a l’ADSL chez Free a perdu la synchro avec la ligne ADSL, le DSLAM a crâmé. Paix à son âme…

Mais revenons sur l’aventure !

J’avais donc commandé l’ADSL et tout m’était arrivé : les paramètres de compte, le routeur/modem…. Je le configure et je le branche ! Mais pas de synchro ! Après avoir appelé le FAI (Free pour ne pas les citer), j’appelle France Telecom car Free utilise le réseau cuivre de FT avec ses propres DSLAM dans les locaux de FT, mais branchés et maintenus par FT. (Free est en option 3 pour ceux qui connaissent le fonctionnement de l’ADSL).

Conversation téléphonique :

André : “Bonjour, je vous appelle car mon modem ne fait pas la synchro avec la ligne. Je pense qu’il manque le branchement dans le CL”

FT : “Vous êtes chez quel FAI ?”

André : “Free !”

FT : “Ben fallait acheter Wanadoo !”

No comment…

Brevets pour l'utilisation d'éditeurs de texte pour l'édition de documents XML

Un article paru sur XmlFr le 1er avril m’inquiète. Comme il est paru ce jour là, je tente de me convaincre que c’est forcément une blague, mais comme je n’ai pas trouvé de notes sur le site indiquant que c’était une plaisanterie, je garde une légère crainte… En cherchant sur google, je ne parviens pas à retrouver d’article parlant de ce brevet, ce qui contribue donc à me rassurer :-).

Alors ? Blague ou pas ? suze au lieu de suse : faute de frappe ou indice volontaire ? Je vais suivre ce dossier de près, parce que si c’est vrai, il y a de quoi foutre le feu à l’administration qui aurait accepté de valider cette demande de brevet :-|.

OVH migre ses serveurs Linux sous Windows !

Ce titre est choquant, je sais…

En lisant les news J2EE sur le site application-servers, je suis finalement venu à lire un blog de Sami Jabber expliquant comment il s’est fait berner par les administrateurs d’OVH comme beaucoup de clients : ceux-ci expliquent qu’à la suite des attaques répétées sur le noyau Linux, ils ont décidé de passer à une solution _plus stable_ tout Microsoft :-) .

Pourquoi l'open source va continuer à prendre de l'ampleur

J’ai lu ce sujet à partir d’un lien du site application servers, mais je ne le retrouve pas.

Marc Andreessen, co-founder of trailblazer Netscape Communications, can spot a long-term trend. So when Opsware Inc.–another company Andreessen co-founded and chairs–introduced its Opsware System 4 software on Linux in December, some of his faithful fans doubtless took the move as a sign of things to come.

L’open source va continuer à prendre de l’ampleur au cours des dix prochaines années, voici donc les 12 points jouant en cette faveur relevés par Marc Andreessen.

Blog collaboratif

Comme vous avez pu le constater, je ne suis plus seul ici… Non, ce n’est pas un piratage, quoi qu’il est vrai que je me demande si je ne me suis pas sabordé tout seul quand je vois l’attention que Syl prête à sa syntaxe.

Bref, nous sommes maintenant 5, oui 5. J’ai trouvé que le blog était un bon moyen de rassembler 5 copains de DUT. Cette époque fut propice à de bons moments de rigolades et j’espère que cette ambiance parviendra à resurgir ici. Bon, sans plus attendre, je vais donc vous présenter chacun d’eux (par ordre alphabétique pour ne pas faire de jaloux).

André-Paul Navoizat alias Noir : Actuellement en école d’ingénieurs à l’ESIGETEL, ce jeune chien fou trouvera peut-être le temps de donner quelques bons liens entre deux soirées. Si vous avez des questions Citrix, vous pouvez vous adresser à lui (encore plus si vous êtes prêts à prêter votre petite amie =^) ). Philippe Da Silva alias Draven : Après le DUT, il a décidé de laisser l’informatique de côté et il s’est mis à faire du cinéma. Ça marche plutôt bien pour lui : il part (ou est parti) cette semaine faire un film en Bosnie. Portugais de son état, il sera aussi mon excuse pour pouvoir publier des mauvaises blagues portugaises :p. Raphaël Antico alias raf82 : Le fou-furieux de Mangas en tous genres, je pense qu’il postera parfois sur ce sujet mais rien n’est garanti. Raf a parfois été capable de me faire pleurer de rire à la lecture de mails de son cru dont il garde précieusement le secret. Bon, posé comme ça, je lui mets un peu la pression, mais je suis sûr qu’il resssortira grandi de cette épreuve :D. Sylvain Guéant alias Syl : Bon, lui il est particulier. Si vous lisez ses blogs et que vous ne comprenez pas ce qu’il dit, ce n’est pas forcément anormal. Il termine brillament cette année sa maîtrise à l’IUP à l’université de Marne La Vallée. Il est maintenant en stage et c’est la raison pour laquelle il a produit le blog de toute beauuuuuutééééé indiqué ci-dessus.

Et pour finir : moi qui, il est vrai, ne me suis jamais véritablement présenté. Je vais donc donner une définition factuelle de mes activités présentes en attendant peut-être une définition ultérieure par l’un des membres sus-cités :

Baptiste Mathus alias Batmat : Après avoir fait l’IUT d’informatique de Fontainebleau, j’ai continué mes études dans l’école d’ingénieurs en alternance Ingénieurs 2000 dans la filière Informatique Réseaux. Je suis actuellement en deuxième année et en séquence professionnelle depuis un mois comme mon confrère Anubis

Wouhouuuuuuuuuuuuuuuuu

Bon, je vais en dégoûter certains, mais bon…

Eh oui, encore un billet sur la livraison de ma FreeBox qui semble enfin être (presque) arrivée à terme… On me l’envoie !!! Bon, je vous laisse, j’ai encore de la lecture sur J2EE :p

Enfin !!!

Batmat s'en va en guerre...

OUARGGHHH!!! Guerre à l’orthographe!!! OUAI!!!

Après nous avoir mis un post sur son site pour savoir comment se défendre contre les méchantes fautes d’orthographes, le chevalier Batmat a remis ça… Je viens de trouver ce thread sur le forum de l’université de Marne la Vallée :

Mais jusqu’où va t-il aller ?

FreeAdsl

J’habite à Toulouse actuellement et j’ai demandé à avoir une connexion ADSL chez Free le 25 février… Je ne l’ai pas encore, mais je sens qu’on y est presque : je suis resté un mois bloqué à l’étape 2 des 7 étapes de que comprend la procédure d’inscription et paf ! Hier, j’ai passé trois étapes d’un coup. Ca fait plaisir ! Quand on me dit que certains sont inscrits depuis le 25 janvier !!! Je me dis que je suis bien loti…

Les différentes méthodes pour répondre aux démarcheurs téléphoniques

Je vais vous donner plusieurs méthodes pour parvenir à repousser (définitivement ?) les démarcheurs téléphoniques. La dernière méthode est, vous le verrez, beaucoup plus longue à expliquer. On croirait presque à une histoire drôle mais c’est en fait ce qu’a fait le cousin d’un des mes collègues au demeurant calme, mais qu’il ne faut surtout pas énerver :-) :

Simple mais direct : : Lorsque vous vous apercevez que la personne “au bout du fil” est un démarcheur et qu’il vous demande s’il peut parler à M. Bidule, répondez simplement : “Ah… Monsieur Bidule nous a quitté la semaine dernière…” Aussi simple mais moins grave : : “Ah, non. Impossible, M. Bidule est en vacances en Tasmanie”. : Notez qu’il vaut mieux faire attention au nom de pays donné pour ne pas se retrouver dans une situation délicate lorsque le vendeur demande où se trouve le pays que vous avez indiqué. Veillez aussi à informer votre entourage afin d’éviter qu’ils se demandent de quoi leur parle le vendeur : “Alors, M. Bidule est-il revenu de Tasmanie :? :-)”. Le meilleur pour la fin : : Je ne vais ici pas adopter comme pour les méthodes précédentes une forme impérative pour vous expliquer celle-ci mais plutôt narrer simplement ce qu’a fait le “créateur de cette méthode”. Je pense que ça n’en sera que plus agréable et amusant à lire ;-) :

Notre ami rentrait donc tranquillement du boulot et était sur le
point de manger lorsque le téléphone se mit à sonner dans l'entrée
(où il fait, soit dit en passant, beaucoup plus froid que dans la
cuisine, car notre ami habite dans une vieille maison). Bon... Il se
déplace pour aller décrocher et s'ensuit le dialogue suivant :

Vendeur : “Bonsoir monsieur, cuisines pozkk [...]”

“Non merci, j'ai déjà une cuisine depuis plusieurs années qui me
convient très bien. Au revoir monsieur.”

Jusque là rien de bien folichon, vous me direz, mais c'est bien
entendu après que ça devient intéressant. Quelques jours après donc.
Même heure, même tableau : heure de manger, pièce froide, etc...

Vendeur : “Bonsoir monsieur, cuisines pozkk [...]”

“Non merci, vous m'avez déjà appelé il y a quelques jours de cela et
je vous ai dit la même chose ! Au revoir monsieur.”

On sent l'échauffement naître dans le coeur de "notre ami", mais il
reste toutefois presque imperceptible... Encore quelques jours
après, comme vous vous en doutez, rebelotte et là c'est “de toute
beaaauuuutééé” :-)

Un autre vendeur de chez pozkk : “Bonsoir monsieur, cuisines pozkk
[...]”

En se levant, notre ami s'était douté que ce serait pozkk... “Ah, ça
tombe bien que vous appeliez ! Justement, je cherche une cuisine,
mais il faut que vous m'indiquiez qui je dois rencontrer pour ce
faire, à quel endroit, etc.”

Le vendeur (un peu surpris mais content) : “Aah ?! Très bien
monsieur, eh bien, c'est très simple, vous prenez le boulevard
machin, vous tournez à gauche après le feu. Là, vous verrez la
petite rue du truc, l'agence pozkk se trouve à l'angle, vous ne
pourrez pas la manquer. Adressez vous donc à M. Chose.”

Notre ami (notant les informations) : “... à gauche... à l'angle de
la rue du truc ... M. Chose. Très bien, M. Chose donc ?”

Le vendeur : “C'est ça monsieur.”

“Bon, très bien, eh bien vous direz à M. Chose que si vous rappelez,
*je vais lui péter la gueule*. J'ai son adresse, je sais maintenant
exactement où il travaille, si jamais vous rappelez je prends ma
voiture et je viens lui péter la gueule”...

C'est un perfect !

Après avoir lu ce billet et si tu ne connais pas déjà, public, tu penseras forcément à moi les prochaines fois où tu iras aux toilettes :-) … C’est mon cas depuis que j’ai entendu ce truc sur Europe 2.

Bref, la prochaine fois que tu iras faire la grosse commission, une fois que tu auras fini, après t’être essuyé, regarde la couleur du papier (ne fais pas l’innocent, je sais que tu le regardes toujours, de toute façon). S’il est bien propre (comme s’il ne s’était rien passé, alors que si en fait), sors en chantant “C’est un peeeerfect” (NDLR : sur l’air de “like a virgin”, ça marche bien) de ce lieu de culte et montre à toute l’assemblée réunie la qualité du travail que tu viens de produire.

Alors ? Déjà hâte d’aller essayer ? :-)

Propulsé par DotClear

Alors, là je n’ai que deux mots à vous dire Braaaa vo ! Passage à dotclear effectif.

Encore bravo aux auteurs de cet outil. Très simple à installer, documentation très claire et écrite avec une syntaxe et un français parfaits.

Bon, ben il ne me reste plus qu’à refaire une css qui me soit propre… :-)

DTC

Dans ton cul, elle est bonne celle-là.

Les navigateurs mode texte ne sont pas qu'une légende !

En regardant ce matin la liste des navigateurs utilisés pour surfer sur mon site, j’ai vu apparaître la ligne suivante : Lynx/2.8.5rel.1 libwww-FM/2.14

Alors, je me suis dit Bon sang ! Quelqu’un est venu chez moi avec un navigateur mode texte ! Je suis curieux de voir ce que ça donne….

Je ne peux pas affirmer que la clarté de la page en mode texte soit due à la sémantique Xhtml, parce que je ne me suis pas amusé à refaire une version old style pour constater une éventuelle différence, mais je le pense très fortement…

Bref, j’ai donc trouvé ça plutôt lisible. Clairement, l’usage de listes ul, ol permet par exemple d’obtenir des listes propres et bien mises en valeur par indentation (ce qui n’aurait certainement pas été le cas avec des tirets ou des étoiles écrits en dur…)

Pour finir, voici donc un aperçu de la fenêtre de lynx ouverte dans cygwin pour effectuer ce test :

Capture d'écran d'une fenêtre du navigateur lynx ouverte dans
cygwin

Et paf, du jaune partout

Après l’agressive feuille de style toute bleue, en voilà une autre toute jaune… J’ai décidément du mal avec le design :-), alors forcément en ajoutant ça au fait que je sois débutant, ça cartonne pas :-|. Je pourrais participer au challenge de la css la plus illisible de csszengarden, là j’aurais ptête mes chances…

Mais, j’y crois, tout est possible tout est réalisable, c’est le jeu de la vie !

Blagounette power

Bon, c’est une blague qui ne fonctionne vraiment bien que si vous respectez plusieurs conditions qui, vous allez le voir, peuvent la rendre inutilisable à un dîner de famille ou dans n’importe quel endroit un peu trop “out of fashion” :-).

Les conditions :

  • cette blague ne fonctionne que pour parler du jeudi soir ;
  • elle ne fonctionnera bien qu’avec des gens pratiquant les jeux vidéos depuis un certain temps ;
  • euu… l’auditoire a intérêt à avoir de l’humour (beaucoup).

Bon, bref, en parlant du jeudi soir, si vous êtes par exemple invité à une soirée, dites :

“Ok, pour djeudaille night, je suis dispo”

Désolé…

Xhtml/Css (Or not ?) : appel à contribution

Je viens de me faire la refonte XhtmlCss du site de l’association avenIR. Cette association a pour but de promouvoir dans le monde de l’entreprise la filière Informatique Réseaux de l’école Ingénieurs 2000Anubis et moi sommes depuis déjà 2 ans.

Bref, cette page a été réalisée l’année dernière avec force tableaux, comme vous pourrez le constater. Je me suis donc mis en tête d’en faire une version XhtmlCss pour convaincre les membres de l’association de l’intérêt de se plier à cette norme en leur montrant le nouveau code html produit pour un résultat identique…

Le problème, c’est que je débute, alors si quelqu’un avait une remarque, un conseil ou toute autre chose pouvant m’aider à approcher la forme de cette page en XhtmlCss, il serait le bienvenu. Vous pouvez m’écrire , d’avance merci.

ServerTokens, kééé ?

En lisant une fois de plus (un peu plus attentivement, faut-il croire) le fichier de conf de mon serveur web, je suis tombé sur un des paramètres de sécurité dont j’avais déjà entendu parler (ça fait déjà deux choses aujourd’hui dont “j’ai entendu parler”, notez) : celui qui indique le niveau de “verbosité” des réponses du serveur. Avec Apache 2, il y a par exemple 6 niveaux de configuration possibles (les numéros étant croissants avec l’augmentation du niveau de sécurité du serveur) :

  1. Full
  2. OS
  3. Minor
  4. Minimal
  5. Major
  6. Prod

Si vous êtes un peu comme moi, vous devriez vous dire  : “Mais qu’est ce que ce paramètre peut bien changer concrètement dans la réponse ?!?” Eh bien, j’ai un début de réponse pour vous, bande de brigands. Je ne suis toutefois pas allé jusqu’à regarder les en-têtes http envoyés (quoi qu’en partie si en fait, mais je n’en parlerai pas ici (-:), j’ai simplement regardé les modifications du niveau de détail dans le code html de la page renvoyé en cas d’erreur 404 (page introuvable) (ne me dites pas que vous ne connaissez pas et n’avez jamais eu cette erreur, je ne vous croierai pas…).

Voici donc les résultats de ce formidable test qui a bien me prendre 15 minutes :-) :

  1. Full : Apache/2.0.48 (Win32) PHP/4.3.4 Server at localhost Port 80
  2. OS : Apache/2.0.48 (Win32) Server at localhost Port 80
  3. Minor : Apache/2.0 Server at localhost Port 80
  4. Minimal : Apache/2.0.48 Server at localhost Port 80
  5. Major : Apache/2 Server at localhost Port 80
  6. Prod : Apache/2 Server at localhost Port 80

C’est y pas formidable de savoir encore une chose de plus ? Que de mystères nous reste-t-il à découvrir… Vers l’infini et au delààààà —>[] Au lit !

Books online - Bruce Eckel

J’en avais déjà entendu parler, mais comme je découvre ça en vrai, je vous en fais profiter. Vous pourrez vous procurer des versions électroniques de livres du célèbre Bruce Eckel, une des références dans le domaine de la programmation C++ et Java. Pour ceux qui se poseraient la question, ce n’est nullement un site underground et/ou illégal, l’auteur lui-même explique le pourquoi de cette distribution en ligne ici.

Doonnez, donnez, doooonnez, mozilla vous le rendra

Juste un nouveau billet pour rappeler à tous les fans du web qui utilisent mozilla* et consorts que songer à une petite donnation n’est pas totalement saugrenue pour supporter (dans le sens anglais du terme) les logiciels que vous utilisez si couramment. En plus, il y a un t-shirt en retour ! Mais que demande le peuple ?

Le système n’est pas encore totalement en place : pour l’instant, vous ne pouvez que fournir votre adresse e-mail pour qu’ils vous recontactent dès que vous pourrez régler votre dette :-) mais c’est déjà bien parti.

Un peu rachitique, cette page de liens...

Bon, alors là forcément, ça fait un peu vide… Va quand même falloir que je m’y colle (que je m’y code ? Non ? Bon, je vais me pendre et je reviens.). Pour l’instant, n’en vlà djà une version statique, mais j’ai bon espoir de trouver le temps de créer la table adéquate dans la base pour gérer la liste des liens.

Ouuuh, j’en entends déjà se foutre de ma g… en disant “comment ça une table ? On s’en tamponne, c’est dégommer une mouche avec un bazooka !”. Eh ben non, on est codeur ou on l’est pas. Pour l’instant, j’ai déjà les blogs et les fautes gérés dans la base MySQL, alors pourquoi pas les liens aussi ? Non mais…

Comme le disait Darken à Anubis ici, avec du XHTML, plus besoin de BD… Oui, ptête mais moi chui à domicile alors j’installe ce que jveux, Na ! Chui pas limité par mon hébergeur :-), pis ça me donne l’occasion de me mettre un peu plus au php…

Licences Creative Commons

Je suis linuxien… Je ne vais pas le cacher, je passe pendant mes loisirs (informatiques) 98% de mon temps sur ma debian amoureusement tunée, les 2% parasites restants étant dus au fait que je viens de m’acheter, presque en même temps, un superbe appareil photo et une imprimante multi-fonction… Et je n’ai pas envie de chercher tout de suite les drivers.

Je suis abonné à Linux Mag depuis environ 2 ans parce que ce mag regorge d’infos et de cours autrement plus intéressants que la majorité des magazines indiquant la dernière carte graphique à 1000 euros qui en vaut 200 le mois suivant… Mais bref, je m’égare, le décor étant planté, je vais enfin pouvoir parler du sujet qui m’amène :-).

Sur le CD joint au magazine d’un des précédents mois était fourni l’enregistrement de l’émission “Divergence numérique”, une émission dédiée aux logiciels libres en général. Et cette fois ci, on y parlait des licences Creative Commons, très intéressant et instructif. Des licences créées pour encourager le travail créatif et faciliter la protection des oeuvres en général. J’ai repensé à ça en tombant récemment sur un blog publié sous cette licence, mais j’étais trop pressé pour écrire à ce moment et paf ! C’est le drame ! Je ne sais plus où je l’ai vu :-(…

Mais bref, trève de blabla, trève de blablaaaaa, voici donc l’objet du billet et plutôt que de tenter une hasardeuse paraphrase de ce qui a été dit au long de cette émission, je préfère vous donner le lien, c’est ici et plus précisément le fichier ogg est .

Un point toutefois important à noter dans cette émission est le travail actuel de traduction de ces licences, travail de longue haleine car il faut éviter au “licenciés” de risquer dans un futur plus ou moins lointain de regretter d’avoir utilisé l’une des ces licences…

Sauvons l'orthographe

Ben oui, je craque ! J’en ai tellement assez de voir des pages moisies de fautes sur le web que j’ai décidé d’écrire dessus. L’orthographe semble n’avoir plus aucune espèce d’importance pour les gens qui publient sur internet et particulièrement pour les informaticiens j’ai l’impression (malheureusement)…

Je crois que les fans du web sémantique devraient se pencher sur ce problème pour éradiquer les vilaines fautes qui ternissent l’image de leurs superbes sites. En effet, lorsque je lis une page truffée de fautes, j’ai véritablement du mal à me concentrer sur le contenu… Il m’est encore arrivé récemment de ne pas lire une documentation très intéressante jusqu’au bout, parce que je ne parvenais plus à me concentrer suffisamment sur les explications. J’étais trop consterné à chaque nouvelle phrase pseudo-française.

Plutôt que de simplement me plaindre de ce fléau, j’ai décidé de dédier une page où je tenterai d’apporter ma pierre à l’édifice qui pourrait parvenir à faire avancer un peu plus dans le bon sens toutes ces brebis égarées (Oulà, fo que je fasse gaffe, je commence à me prendre pour une secte :-)).

Pour finir, comme je l’explique aussi sur la page indiquée plus haut, je ne prétends pas que ce site soit exempt de toute faute. Mon propos est simplement que je souhaiterais que les gens qui publient des documents en général prennent conscience de l’importance de l’orthographe et de la syntaxe qui va avec le contenu lui-même.