Monthly Archive for février, 2008

Commentaires

L'intérêt du logiciel libre est non seulement de pouvoir lire le code source des logiciels ilbres qu'on utilise, mais en plus de lire les commentaires laissés à l'intérieur.

On assiste parfois à des discussions du style :

 
/* Remap low number numerics, not that I understand WHY.. --Nemesi  */
/* numerics below 100 talk about the current 'connection', you're not
 * connected to a remote server so it doesn't make sense to send them
 * remotely - but the information they contain may be useful, so we
 * remap them up.  Weird, but true.  -- Isomer */
if (numeric < 100)
  numeric += 100;
 

Je prends cet exemple car c'est le dernier que j'ai eu l'occasion de rencontrer, mais je peux assurer que le nombre de commentaires de ce style est proportionnel à l'ancienneté du logiciel (nombre de hacks) au nombre de contributeurs (incompréhension de ce qu'a pu faire d'autres personnes).

PHP sucks

J'avais un TP noté de PHP l'autre jour, l'occasion pour moi de découvrir les classes en PHP5, ce que je n'avais jamais vu. En effet, j'utilise très peu php, préférant le Python pour INL ou le HTML statique pour mon usage personnel.

Cela dit, j'ai redécouvert à quel point le PHP est un langage de merde.
En effet, pendant le développement de mon application web j'ai constaté que PHP échappait tout seul les chaînes récupérées par POST. Comportement de merde servant à contrer les attaques classiques de SQL injection ou autre, je suppose.
Malheureusement ça ne s'arrête pas là. En plus de ça, ce comportement est définissable dans la configuration de PHP ! Cela signifie que d'un serveur Apache à un autre le comportement peut différer !

En bref, je peux avouer que j'étais sur le cul, et me suis retrouvé contraint d'écrire la fonction suivante que j'appelle pour chaque chaîne récupérée via $_POST :

/* PHP REALLY SUCKS DICKS IN HELL */
function mystrip($string)
{
        if(get_magic_quotes_gpc())
                return stripslashes($string);
        else
                return $string;
}

Ce qui est débile, c'est que maintenant il faut appeler une autre fonction pour échapper les chaînes de caractères que je veux inclure dans une requête vers ma base mySQL. On strip pour rééchapper...
Détail amusant, la fonction à appeler n'est pas mysql_escape_string comme on pouvait s'y attendre, mais mysql_real_escape_string. En effet, on imagine que la première fonction n'échappe pas vraiment les chaînes, bien sûr, c'est probablement un petit jeu pour rendre le dev PHP encore plus frustrant.

J'en profite pour rajouter une petite anecdote. Le TP noté était en fait la réalisation d'un blog avec diverses fonctions, je ne vais pas détailler, j'ai trouvé le sujet intéressant (pour changer), et comme je l'ai dis plus haut ça m'a permis d'apprendre des trucs (plus ou moins agaçants);

Le rendu devait être accompagné d'un dump de la base SQL, et comme le formateur est un garçon charmant qui a entre autres organisé un concours au sein de l'école pour faire gagner des goodies récupérés aux TechDays (un sac Microsoft, une démo de Visual Studio 2008 et SQL Server 2008, super trop cool quoi) avec des questions "geeks" (sic) dont "Quel est le nom de la femme de Bill Gates", "Où se se situe geographiquement le siège de Microsoft" et "Quel est le meilleurs blog sur les technologies Microsoft" (la réponse à la dernière question est le blog de cette personne), j'ai donc décidé de mettre en premier billet l'excellent article de pankkake concernant la fin de l'empire Microsoft.

J'ai du mal à comprendre qu'on puisse être fanboy Microsoft. Je n'aime pas spécialement plus les fanboys Linux ou Apple (et y en a un certain nombres), mais eux ont la légitimité d'avoir un "combat" contre "la grosse méchante boite qui fait du fric car l'argent c'est mal". C'est quelque chose d'éthique.
Au contraire, fanboy Microsoft implique de kiffer grave des logiciels de piètre qualité, ce dont on se rends compte facilement quand on connaît un minimum le domaine, ce qui j'espère est le cas pour quelqu'un étant formateur dans une école d'informatique.

Arrêter de fumer, c’est pas simple

Bref billet pour dire quelques techniques que j'utilise pour le moment, pour m'aider à supporter l'absence de nicotine dans mes veines :

  • J'ai rangé ma boite de tabac, ma boite de tube et mon entubeuse à trois endroits différents, et ça marche car je sais plus où je les ai foutu. Sachant qu'il me faut les trois pour me faire une cigarette, c'est cool.
    On peut se demander pourquoi je n'ai pas jeté tout simplement ces trois accessoires. La réponse est que ça coûte cher et qu'on sait jamais, au cas où je rechuterais subitement, que je ne meurs pas. C'est pessimiste mais bon..
  • lodesi m'a conseillé de faire vingt pompes à chaque fois que j'ai envie de fumer. J'ai décidé d'adopter le système, mais avec cinq pompes (en effet, je n'arrive pas à en aligner plus de huit). J'ai finalement abandonné par fatigue, vive les courbatures demain.
  • Autre technique: manger quelque chose chaque fois qu'on a envie de fumer. J'ai essayé, il n'y a maintenant plus rien à bouffer chez moi, je ne peux plus continuer.
  • Boire de l'eau à chaque fois que j'ai envie de fumer. Contrairement à la bouffe, c'est une ressource qui ne nécessite pas de sortir dehors pour la renouveler (à part si on aime l'eau de pluie).
    Je l'ai placée en lieu et place de la boite de tabac, comme ça à chaque fois que je tourne la tête à droite dans le but mécanique de me faire une cigarette, je vois la bouteille et je bois.
  • Je gueule sur haypo pour me défouler, ça aide.

Voilà, je ne peux pas jouer de guitare pour me défouler car j'ai pété une corde et j'en ai plus et en acheter nécessite de sortir de chez moi.

Je suis pleinement concentré sur les specs de Peerfuse, un système de fichier distribué peer-to-peer dont j'ai commencé le développement avec lodesi.
Je donnerai plus de détails ultérieurement.

Santé

Aujourd'hui, j'arrête définitivement de fumer.

Écrire ça maintenant est un peu prématuré dans le sens où la dernière clope date d'hier soir et que j'ai très envie de fumer, ma boite de tabac étant juste à côté de moi. Mais au moins comme ça tout le monde est au courant et si je reprends je passerai pour un gros loser.

Donc notez bien que si vous me voyez avec une cigarette, vous pouvez me flageler.

NB: Vu les conneries que je peux dire et faire quand je suis bourré, je me demande parfois si il ne faudrait pas que j'arrête également de boire.

Mutt et ses amis

J'utilisais KMail jusqu'alors pour lire mon courrier, cependant le manque de raccourcis claviers et de souplesse de celui-ci m'ont fait passer à un superbe MUA qu'est Mutt.

mutt.png

Introduction

Tout d'abord il faut oublier ce que vous savez sur les clients mails tout en un. En effet, Mutt part du principe qu'il doit assurer uniquement la fonction minimale d'un client mail, c'est à dire afficher les mails. Il passe par d'autres programmes pour récupérer les mails, les envoyer, les filtrer, les écrire, etc.

Cependant, dans les dernières versions, il est tout de même possible de l'utiliser pour faire ces actions (SMTP POP3 et IMAP), mais nous allons faire avec des outils externes, c'est plus drôle.

Personnellement j'ai choisi les programmes suivants :

  • postfix pour envoyer les mails en relayant au serveur SMTP de mon FAI. L'intérêt pour moi est qu'il me sert également comme serveur MX pour lmes domaines afin de stocker dans ma boite système.
  • fetchmail pour récupérer les mails POP de mes différents comptes.
  • procmail pour trier mes mails dans les différents dossiers.

Il est à noter enfin que tout (y compris mutt) se trouve sur le serveur pour pouvoir accéder à ma boite mail depuis n'importe où.

Compilation

J'ai choisi de recompiler la dernière version à cette date de Mutt (1.5.17) afin d'appliquer un patch permettant d'avoir une sidebar avec la liste des dossiers, ce qui simplifie l'utilisation.
J'ai activé après les options suivantes pour la compilation :

$ ./configure --with-sasl --with-slang --enable-hcache --enable-imap --with-ssl

Ainsi que vous pouvez le voir, j'ai activé le support d'IMAP afin de jouir des fonctionnalités de celui-ci pour mon compte IMAP.

Maildir

Pour récupérer les mails que vous aviez avec votre ancien client mail, si ce dernier supportait le format Maildir il est aisé de récupérer le répertoire et de l'utiliser. J'ai mis le miens en tant que ~/Mail/.

Petite subtilité pour KMail, la gestion des sous répertoires est un peu chiante, en effet ils sont dans ~/Mail/.inbox.directory/, pareil pour les sous sous répertoires, etc. Personnellement j'ai tout déplacé afin que chaque répertoire soit directement dans ~/Mail/. Ainsi j'ai :

3 rom1@sunigav ~/Mail $ ls
cache    ircu       maa-commits  sent-mail      Taches
CoderZ   libcaca    mail.sh      server.rdl.fr  Tâches
Gunther  libodbc++  MenAreAnts   Spam           Wormux
inbox    listen.sh  Nekeme

Nous verrons l'intérêt des scripts mail.sh et listen.sh plus tard.

Postfix

Rien de spécial à faire, installez le et configurer (simple, personnellement c'est l'installeur Debian qui m'a posé les bonnes questions).

Fetchmail

Créez le fichier ~/.fetchmailrc et remplissez le avec vos comptes à la manière :

set postmaster "rom1"
set bouncemail
set no spambounce
set properties ""
poll pop.pro.proxad.net with proto POP3
       user 'ident' there with password 'pass' is 'rom1' here ssl
poll pop.1and1.fr proto POP3
        user 'ident' there with password 'pass' is 'rom1' here ssl
...

N'oubliez pas de chmod 600 le fichier, en effet il contient vos mots de passe en clair !

Lancez maintenant fetchmail en démon en compte utilisateur avec la commande suivante :

$ fetchmail -d 30 -a -m "/usr/bin/procmail -Y -d %T"

Fetchmail va récupérer les mails toutes les trente secondes et va les passer à procmail.

Procmail

Créez le fichier ~/.procmailrc et remplissez le de la manière suivante :

# caractère verbeux de procmail ; mettre 'yes' permet d'avoir des messages
# supplémentaires
VERBOSE=no

SHELL=/bin/sh

# chemin d'accès aux exécutables ; en mettre le minimum, pour n'accéder qu'aux
# programmes indiqués dans le fichier de configuration
PATH=/bin:/usr/bin:/usr/local/bin

# répertoire où seront stockés les mails ; s'assurer que votre MUA sait y
# accéder aussi
MAILDIR=/home/rom1/Mail

# si procmail n'arrive pas à délivrer le courrier, cette boîte sera utilisée
# en dernier ressort : il vaut mieux définir cette variable !
ORGMAIL=/home/rom1/emergency-inbox

# boîte de réception par défaut
DEFAULT=$MAILDIR/inbox/new

# fichier de log de procmail ; si vous définissez cette variable,
# procmail gardera une trace de son exécution dans le fichier
# indiqué. À consulter périodiquement !
LOGFILE=$MAILDIR/.procmail.log

# Fichiers de règles à inclure
INCLUDERC=/home/rom1/.procmail/spam.rc
INCLUDERC=/home/rom1/.procmail/ml.rc

Les fichiers de règles doivent juste contenir les règles les unes à la suite des autres. Voici un exemple simple de quelques règles :

:0
* ^Subject: .*libcaca.*
$MAILDIR/libcaca/new

:0
* ^Subject: .*Your partner will worship you for it.*
$MAILDIR/Spam/new

:0
* ^To: .*menareants.*
$MAILDIR/MenAreAnts/new

Il faut tout d'abord écrire une première ligne avec :0 (ajouter à cela quelques flags si nécessaire), ensuite une ou plusieurs lignes commençant par * contenant une regexp, et enfin l'action à mener dans le cas où toutes les regexp matchent. Notez que là c'est très basique, les possibilités sont immenses. Par exemple dans un avenir proche je compte le coupler avec spamassassin.
Voir la doc de postfix.

Mutt

Le plus chiant reste la configuration de Mutt. J'ai personnellement été fouillé de tous les côtés, pompé des bouts de configurations d'autres personnes, lu la doc, etc. C'est tellement paramétrable que c'est pas facile d'y arriver tout seul au début je pense.

Ma config (malgré sa taille) reste basique et va probablement évoluer au fur et à mesure de mon utilisation.

Voici les différents fichiers :

  • .muttrc - Configuration principale qui contient les options générales
  • gpg.rc - Configuration GPG. En theorie il n'y a que la clef à changer dans pgp_sign_as
  • mailboxes.rc - Contient les définitions des différentes boites, ainsi que du compte IMAP. Ainsi qu'on peut le voir, je ne l'ai pas encore configuré, mais les paramètres commentés peuvent être utile comme base
  • theme.rc - Thème de mutt

Je ne commenterai pas plus que ça, après tout la doc de Mutt est très complète là dessus.

En tous cas relisez chaque paramètre et personnalisez, ne prenez pas ça comme une configuration fonctionnelle. Mutt a la particularité justement que personne n'aura exactement les mêmes besoins et donc la même conf.

Indicateur de nouveaux mails

Il est toujours très plaisant d'avoir une indication des nouveaux mails sur une partie visible en permanence de son bureau. La subtilité ici est que Mutt est lancé sur une autre machine.

La solution que j'ai trouvé est super crade, mais elle marche, ce qui est déjà ça.
L'idée est d'écouter un port côté serveur et de balancer le nombre de nouveaux mails et de couper la connexion. Côté client il suffit donc de se connecter à ce port pour récupérer la valeur.

Voici donc l'uniligne ~/Mail/listen.sh :

#!/bin/sh
while [ 1 ]; do socat EXEC:"/home/rom1/Mail/mail.sh" TCP4-LISTEN:4875,reuseaddr; done

Comme vous pouvez le voir, on peut faire plus sexy. Il exécute le script ~/Mail/mail.sh dont le contenu est le suivant :

#!/bin/sh
find ~/Mail/ | grep new | grep -v "new$" | grep -v Spam | wc -l

La séparation est nécessaire car socat exécute un fichier et pas des commandes (utilisation de execvp() et non de system()). De toute façon je trouve pas ça plus mal de séparer les deux, ça permet de réutiliser mail.sh ailleurs.

Vous pouvez constater que mail.sh est carrément dégueulasse, mais bon on fait avec. Notez le grep -v Spam qui permet de ne pas compter les éventuels nouveaux mails qui se situent dans le dossier Spam.

Côté client il suffit de faire exécuter la commande suivante :

socat TCP4:sunigav:4875 STDOUT

Merci en tous cas à lodesi pour l'astuce du socat car je connais aussi mal bash que les chiens qui lechent leur gode.

Conclusion

Voilà un super Mutt fonctionnel, qui envoie, reçoit et trie les mails, lit avec elinks les mails HTML (malheureusement il y en a) et m'affiche un indicateur dans la statusbar de ion3 :

mutt1.png

Pensez à bien configurer mailcap pour les applications à utiliser.




Bear