CV en ligne
Par Pierrick, jeudi 4 août 2005 à 23:02 / categorie: Développement / tags: perl, travail / #40 / rss
Après plusieurs mois d'absence suite au changement d'hébergeur (et à l'absence d'utilité réelle), mon CV n'était plus en ligne. Je viens de l'y remettre, mais en changeant complètement le petit outil de création de la page. Voici les explications de l'avant/après, les choix techniques, les liens pour le téléchargement.
Solution précédente
C'est vers 2002 que j'ai mis en ligne mon CV avec un petit outil qui, à partir d'un fichier de données formaté en XML produisait à la volée du HTML ou du PDF selon la demande du visiteur. Cet outil était basé sur un script PHP qui lisait un fchier XML et (grâce à un mini parser grossier développé par mes soins) le transformait soit en un fichier XHTML (respect théorique du standard, mais non respect de la sémantique) soit un en fichier PDF grâce à FPDF. Le script PHP traçait les visites dans une table MySQL. Pas de système de cache : le fichier HTML de sortie pouvait être regénéré 100 fois dans la même journée à partir du même fichier de données.
Après la lecture de Design web : utiliser les standards web et de CSS 2 - Pratique du design web, je me suis décidé à reprendre la sortie HTML catastrophique (ultra verbeuse et bourré d'inutiles tableaux) pour la rendre sémantiquement irréprochable :-). Mais une chose en entraînant une autre, c'est la totalité de l'outil qu'il a fallu revoir.
Liste des besoins
- Versionner le CV et pouvoir ainsi retrouver dans le temps les informations disparues de la version en cours. Pour cela CVS fera parfaitement son boulot. L'affichage du mot clef de substitution $Id$ mettra automatiquement à jour les informations de version et date de dernière mise à jour.
- Analyser les statistiques de consultation : pourquoi réinventer la roue ? les logs du serveur web (Apache sur mon hébergeur actuel) fournissent toutes les informations nécessaire : referrer (le visiteur consulte le CV grâce au résultat d'un moteur de recherche ?), date et heure, adresse IP et domaine (la même entité est-elle venue consulter le CV à plusieurs reprises ?).
- Affichage simple et sobre, aller à l'essentiel. La feuille de style devra correspondre à ce pré-requis.
- Utilisation correcte des standard du web : le HTML produit, en plus d'être valide (ce qui est simple), devra être sémantiquement correct. Exit les tableaux pour faciliter (par habitude) l'organisation de la page. Plus de divite non plus. Pour les titres, on utilise h1, h2, etc. pour les listes, c'est ul, pour les listes de définitions c'est dl/dt/dd.
- Impression : le précédent outil considérait le HTML comme non imprimable (surtout à cause de la mise en page en tableaux) et la solution PDF semblait à propos. L'expérience m'a montré que lorsque je donnais l'URL de mon CV à un recruteur, c'était toujours la version HTML qu'il imprimait sans se poser de question. Ce coup-ci, je vais plutôt utiliser une feuille de style dédiée CSS aux impressions (media "print" dans le header), qui sera utilisée automatiquement lorsque le recruteur cliquera sur "imprimer" dans son navigateur.
Solution technique
Le résultat final (visible sur le site) sera donc constitué d'une page HTML, d'une photo et de plusieurs feuilles de style CSS. J'aurai pu travailler directement en HTML et versionner ce fichier, mais j'aime l'idée de séparer complètement le contenu et la forme, et de ne pas totalement me fermer à l'éventualité de créer le CV au format PDF. Le contenu sera donc dans un fichier XML, à l'image de la solution précédente.
Pour transformer le XML en HTML, 1 solution m'apparaît évidente : XSL. Sauf que XSL est un langage extrêmement verbeux (basé sur XML, CQFD) et que j'avais envie de faire du Perl (je l'avoue). Finalement, j'ai retenu Perl : XML::Simple et Text::Template. C'est, à mon goût, incroyable de simplicité par rapport à la solution XSL. En effet, le programme de conversion tient dans les quelques lignes suivantes :
my $preconfig = XMLin($opt{datafile});
my $template = Text::Template->new(SOURCE => $opt{template});
my $result = $template->fill_in(HASH => $preconfig);
if (defined $result) { print $result }
else { die "Couldn't fill in template: $Text::Template::ERROR" }
Je travaille donc en local sur ma machine et lorsque je met à jour l'un des éléments (parmi le fichier XML, le CSS, le template, le convertisseur) je le valide dans CVS et je lance une synchronisation avec mon hébergeur. La petite contrainte supplémentaire étant que le fichier HTML doit être en UTF-8 (et qu'éditer le fichier XML en UTF-8 n'est pas toujours pratique), j'ai donc rajouté une conversion d'encoding dans le shell de synchronisation. Voici ce shell complet (ne faisant pas parti de la liste des fichiers téléchargeables) :
#!/bin/bash
# 0. CVS export
cd /tmp
rm -rf cv
cvs export -D now cv
cd cv
# 1. preparation
./cv_convert.pl --datafile=pierrick.xml \
--template=cv_template.html \
> index.iso-8859-1.html
iconv -f iso-8859-1 -t utf8 -o index.html index.iso-8859-1.html
perl -pi -e 's/iso-8859-1/utf-8/g' index.html
# 2. send files through internet
rsync -avr \
--rsh="ssh" \
* \
user@domain:/path/to/cv
On notera que la nouvelle solution technique consomme beaucoup moins de ressources sur le serveur. D'une part moins de ressources processeur parce que le fichier final HTML n'est regénéré qu'en local et synchronisé à la demande et qu'aucun enregistrement en base n'est nécessaire pour les statistiques. D'autre part moins de ressource réseau car la page HTML (respectant les standards du web) est vraiment plus légère (passe de 13KB à 4.5KB).
Téléchargement
On m'a demandé plusieurs fois l'outil précédent. Je n'avais pas vraiment prévu de diffuser les scripts. Cette fois-ci, j'anticipe... L'archive téléchargeable cvtool.tar.gz contient les fichiers suivants :
- cv_convert.pl : le convertisseur XML vers HTML. cv_convert.pl --help témoignera de la simplicité d'utilisation.
- cv_template.html : le fichier répondant à la syntaxe de Text::Template (très simple à remplir). Ce template permet de générer du HTML (4.01).
- pierrick.jpg et pierrick.xml : ma photo et les données relatives à mon CV (à remplacer par vos propres infos...)
- screen.css : la feuille de style pour l'affichage sur un écran.
Reste à faire
- La feuille de style pour impression à l'écran.
- Un fichier README pour expliquer comment faire fonctionner le tout.
- Etudier les solutions Perl pour fabriquer du PDF aussi facilement qu'avec FPDF.
Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.