Des projets enthousiasmants

, , , vendredi, janvier 20, 2012 0 comments

Après une nouvelle période de pouponage (ma deuxième fille Tessa est née le 22 Décembre dernier), je reprends le clavier pour une nouvelle liste de projets enthousiasmants.
Après les projets Java (petits exemples : ici et  mais surtout, à l'époque, une grosse communauté et un énorme écosystème) et les projets Google (des produits qui sortent en pagaille, une croissance hallucinante et un dynamisme...), je dois avouer que c'est du coté Javascript que je trouve aujourd'hui le plus de projets intéressants.
Les projets sont souvent plus petits mais quel dynamisme et c'est souvent très joli (et j'aime quand c'est joli !). Mes derniers chouchous en date sont :

  • d3.js : après highcharts et raphael.js, voici une bibliothèque offrant des représentations très avancées et très design de vos données.
  • impress.js : faîtes vos présentations Prezi, sans prezi...
  • visualSearch.js : après la superselectbox sur extjs à son clone chosen sur jquery, et bien voici une petite variante plutôt sympa : c'est simple, élégant et cela permet d'exploiter "en ligne" des recherches multicritères dit "à facette".

Ce ne sont pas des projets révolutionnaires mais, selon moi, ils font partie de ces petites initiatives sympas qui tirent les sujets vers le haut.

NB : visualSearch est un projet de documentCloud. DocumentCloud est aussi un projet qui m'intéresse car même s'il est fait initialement pour les journalistes, je trouve que ce serais très intéressant de le forker pour y gérer des sources généalogiques. J'ai toujours souhaité que les logiciels de généalogie mette plus l'accent sur les actes que sur les données, DocumentCloud semble faire cela très bien pour les sources journalistiques... A creuser !



Spécifications fonctionnelles

samedi, décembre 03, 2011 3 comments

Ceux qui suivent ce blog savent que j'apprécie l'outil Concordion  (lire [1][2][3][4][5]).
J'apprécie sa simplicité et son ambition de rendre les spécifications à la fois lisible (rédaction libre contrairement à FIT ou Fitnesse) et chaînée au code.
Armé d'un tel outil et en suivant les recommandations de Joel Spolky, j'étais convaincu d'avoir trouvé la solution pour avoir des spécifications vivantes (merci Concordion), claires (merci Joel),  et donc lues ...
Hélas, ce ne fut pas le cas, et après avoir cherché à comprendre ce qui n'allait pas, il semble que la lecture des spécifications était freinée pour une raison assez incroyable : une arborescence de fichiers html fait peur au lecteur !
Le format html fait penser à "site web" mais pas à "document de référence" et une arborescence de fichiers semble effrayé le lecteur qui croit qu'il va oublier de lire des pages.
Pour vérifier cette hypothèse, j'ai donc décidé de convertir mes spécifications html arborescentes et un seul document pdf (pdf :  ça, au moins, ça fait sérieux !).
Les taches à réaliser pour parvenir à 1 seul pdf sont :

  1. la lecture du sommaire pour déterminer l'ordre et la liste des spécifications
  2. le sommaire est une page html qui référence d'autres pages html. Le plus simple pour parser cela est, à mon avis, PHP avec simplexmlelement
  3. la conversion d'une page html en pdf.
  4. Première pensée : xslt et xsl-fo, je vais y passer des heures... seconde pensée : un navigateur comme chrome fait cela très bien mais une ligne de commande serait beaucoup plus confortable. La solution : wkhtmltopdf. Sur ubuntu, pour l'installer il suffit de demander : sudo apt-get install wkhtmltopdf
  5. la fusion de toutes les pages.
  6. La encore, première pensée : fusionner les pages html; oui mais chaque page a ces balises html, head, body, qu'il faut remplacer cela par des div (en gérant les sauts de pages  via les attributs page-break-after/page-break-before). Mais finalement, il y a plus simple : fusionner les pdf; Une simple recherche sur google "pdf merge command" m'a permis de voir que GhostScript (gs) faisait cela très bien. Et bien sur, gs est de base sur Ubuntu !
Résultat : une dizaine de lignes php ! 
 
<?php  
    function pdfify($html){   // transform html to pdf thx to wkhtmltopdf
 $pdf = str_replace('.html','.pdf',$html);
        exec("wkhtmltopdf $html $pdf");
        return $pdf;
    }

 // first page containing concordion:run in
 $in = 'index.html';  
 // convert first page to pdf
 $pdfs[]=pdfify($in);  
 // parse index to find child files
 $names = simplexml_load_file($in)->xpath('//li/a'); 
 // generate pdf for each of them
 foreach($names as $name) { $pdfs[]=pdfify($name['href']);}
 exec("gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=STL.pdf ".implode(' ',$pdfs)); 
 // clean temporary pdfs
 foreach($pdfs as $pdf) { unlink($pdf);} 

Programmer au 21ième siècle

jeudi, août 04, 2011 1 comments