<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Neolyse</title><link href="http://neolyse.info/blog" rel="alternate"></link><link href="http://neolyse.info/blog/feeds/all.atom.xml" rel="self"></link><id>http://neolyse.info/blog</id><updated>2011-06-20T00:00:00Z</updated><entry><title>Utiliser ccache pour compiler Qt plus vite</title><link href="http://neolyse.info/blog/utiliser-ccache-pour-compiler-qt-plus-vite.html" rel="alternate"></link><updated>2011-06-20T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2011-06-20:/blog/utiliser-ccache-pour-compiler-qt-plus-vite.html/</id><summary type="html">&lt;p&gt;Pour ceux qui recompilent souvent Qt, et qui &lt;em&gt;détestent&lt;/em&gt; passer 3 heures à le faire à chaque fois qu'ils font une modification assez lourde pour justifier une recompilation complète, voici une petite astuce: utilisez &lt;a href="http://ccache.samba.org/"&gt;ccache&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Je l'utilise dans la plupart de mes projets, car il est extrémement simple à utiliser. Il suffit de l'installer (sous n'importe quelle distribution Linux, Windows ne semble pas bien supporté), et d'ajouter devant l'invocation du compilateur le petit keyword &lt;code&gt;ccache&lt;/code&gt;. Ccache est assez intelligent pour détecter qu'il cross-compile, donc cette astuce marche très bien même pour des compilateurs d'archis exotiques.&lt;/p&gt;
&lt;p&gt;Pour Qt, c'est plus compliqué: en effet, le processus de compilation se sert de ce qu'on appelle les &lt;em&gt;mkspecs&lt;/em&gt; pour déterminer quel compilateur utiliser. Ça lui permet de compiler pour n'importe-quelle architecture très simplement (changer d'archi = spécifier un autre mkspec).
Du coup, pour utiliser ccache lors de la compilation de Qt, il faut aller modifier le fichier &lt;code&gt;qmake.conf&lt;/code&gt; qui se trouve dans le dossier mkspec associé à votre architecture.&lt;/p&gt;
&lt;p&gt;Ne vous inquiétez pas, c'est plus simple qu'il ne le paraît. 
Tout ce que vous avez à faire, c'est:&lt;br /&gt;
1- de lancer le script &lt;code&gt;./configure&lt;/code&gt; avec vos options habituelles, en ajoutant l'option &lt;code&gt;-no-pch&lt;/code&gt;, qui désactive l'utilisation des &lt;a href="http://en.wikipedia.org/wiki/Precompiled_header"&gt;headers précompilés&lt;/a&gt; (ccache ne les prend pas en charge)&lt;br /&gt;
2- d'ajouter &lt;em&gt;ccache&lt;/em&gt; devant les noms des compilateurs, dans le fichier mkspecs/default/qmake.conf, de cette façon: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt; &lt;span class="n"&gt;QMAKE_CC&lt;/span&gt;                &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ccache&lt;/span&gt; &lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="c1"&gt;# ajouter ccache devant le nom du compilo&lt;/span&gt;
 &lt;span class="n"&gt;QMAKE_CXX&lt;/span&gt;               &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ccache&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Le répertoire mkspecs/default est un lien symbolique qui se trouve à la racine des sources de Qt, et qui est mis à jour lors du &lt;code&gt;./configure&lt;/code&gt; pour pointer vers l'architecture correcte. Pas besoin de le faire pour les étapes de link et de génération de librairies, dans ce cas ccache ne sert à rien.&lt;/p&gt;
&lt;p&gt;Vous allez me dire que de désactiver les headers précompilés fait perdre en vitesse de compilation, ce qui est le cas la première fois; mais lors d'une recompilation, ccache va prendre en charge les 99% de fichiers non changés en piochant dans son cache, ce qui coûte bien moins cher.&lt;/p&gt;
&lt;p&gt;Pour petit exemple, la recompilation complète de Qt en mode debug:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt; &lt;span class="n"&gt;gmake&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j3&lt;/span&gt;
&lt;span class="n"&gt;real&lt;/span&gt;    &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;m19&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;755&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;    &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;m13&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;655&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;     &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;m54&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;516&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Les statistiques de ccache, qu'on obtient en tapant &lt;code&gt;ccache -s&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;                     &lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;ccache&lt;/span&gt;
&lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="n"&gt;hit&lt;/span&gt;                           &lt;span class="mi"&gt;3180&lt;/span&gt;
&lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="n"&gt;miss&lt;/span&gt;                             &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;called&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nb"&gt;link&lt;/span&gt;                        &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;                     &lt;span class="mi"&gt;19581&lt;/span&gt;
&lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;                           &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="n"&gt;Gbytes&lt;/span&gt;
&lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;                       &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;Gbytes&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;J'avais bien sûr compilé Qt juste avant, la ligne "&lt;em&gt;cache hit&lt;/em&gt;" indique que la compilation a utilisé le cache 3180 fois, et "&lt;em&gt;cache miss&lt;/em&gt;" montre qu'aucun fichier n'a été réellement recompilé.
Si vous changez un seul fichier dans Qt, la recompilation réelle ne se passera que pour &lt;em&gt;ce&lt;/em&gt; fichier, le reste sortira du cache.&lt;/p&gt;</summary><category term="code"></category><category term="qt"></category></entry><entry><title>Constructeur automatique</title><link href="http://neolyse.info/blog/constructeur-automatique.html" rel="alternate"></link><updated>2011-05-22T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2011-05-22:/blog/constructeur-automatique.html/</id><summary type="html">&lt;p&gt;Je viens de tomber sur un truc assez sympathique en C++, et que j'ai mis un peu de temps à comprendre: l'utilisation automatique du constructeur.&lt;/p&gt;</summary><category term="code"></category></entry><entry><title>Conversion de type/classe implicite en C++</title><link href="http://neolyse.info/blog/conversion-de-typeclasse-implicite-en-c.html" rel="alternate"></link><updated>2011-05-22T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2011-05-22:/blog/conversion-de-typeclasse-implicite-en-c.html/</id><summary type="html">&lt;p&gt;Je viens de tomber sur un truc assez sympathique. Je ne sais pas si c'est documenté quelque part, mais il existe probablement une astuce sur l'insertion d'objets dans une liste C++ (le fameux &lt;code&gt;std::list&lt;/code&gt;).&lt;/p&gt;</summary><category term="code"></category></entry><entry><title>Merger deux PDF en alternant les pages</title><link href="http://neolyse.info/blog/merger-deux-pdf-en-alternant-les-pages.html" rel="alternate"></link><updated>2011-05-09T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2011-05-09:/blog/merger-deux-pdf-en-alternant-les-pages.html/</id><summary type="html">&lt;p&gt;J'ai récemment commencé à m'intéresser à &lt;a href="http://linuxfr.org/forums/linuxg%C3%A9n%C3%A9ral/posts/scanner-mes-cours-quels-logiciels-scanner-ocr-gestion"&gt;ce qu'il faut&lt;/a&gt; pour numériser mes vieux cours.
Ils prennent une place qui me semble bien trop grande par rapport à ce que j'en fait (c'est à dire... rien), et puis je me dis que c'est peut-être un coup d'essai pour plus tard faire de même avec ma comptabilité et les factures.&lt;/p&gt;
&lt;p&gt;On dispose de tout un tas d'imprimantes au boulot, une d'elle disposant d'un scanner avec un tiroir, pratique pour les photocopies. 
Du coup ce midi j'ai commencé à scanner un lot de cours sur les réseaux de neurones qui date de 2007. La photocopieuse sort les numérisations dans un format PDF, mais le problème c'est qu'elle ne scanne pas en recto-verso; je me suis donc retrouvé avec deux gros PDFs, l'un contenant les pages recto et l'autre les pages verso.&lt;/p&gt;
&lt;p&gt;Je me suis donc tourné vers &lt;a href="http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/"&gt;pdftk&lt;/a&gt;, qui permet de faire tout un tas d'opérations sur les PDF.&lt;/p&gt;
&lt;p&gt;Il ne dispose pas nativement d'un mode de merge "mixé", du coup il faut le feinter.&lt;/p&gt;
&lt;p&gt;Donc en gros il faut:&lt;br /&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Extraire de chaque PDF toutes les pages (à l'aide de pdftk), en les nommant correctement; j'ai choisi "Recto_XXX.pdf" et "Verso_XXX.pdf".&lt;br /&gt;
  La commande est assez simple: &lt;code&gt;pdftk fichier_recto.pdf output "Recto_%04d.pdf"&lt;/code&gt;, pareil pour les versos.&lt;/li&gt;
&lt;li&gt;Préparer la ligne de commande à passer à pdftk en usant, pour ma part, d'un script en &lt;em&gt;python3&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;J'ai encore une fois été &lt;em&gt;bluffé&lt;/em&gt; par la facilité avec laquelle on peut obtenir un truc extrêmement potable avec Python.&lt;/p&gt;
&lt;p&gt;Le script en question:&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/env python3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;blob&lt;/span&gt;

&lt;span class="n"&gt;recto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;glog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Recto_*.pdf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;verso&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;glog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Verso_*.pdf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;pdftk &amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recto&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verso&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; cat output Merged.pdf&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary><category term="code"></category><category term="python"></category></entry><entry><title>PHP et unlink(): plus de sécurité</title><link href="http://neolyse.info/blog/php-et-unlink-plus-de-securite.html" rel="alternate"></link><updated>2011-03-27T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2011-03-27:/blog/php-et-unlink-plus-de-securite.html/</id><summary type="html">&lt;p&gt;J'ai récemment joué avec PHP pour réaliser un petit script d'upload et de partage de fichiers pour ma copine.&lt;/p&gt;
&lt;p&gt;À un moment donné, j'ai dû fournir la possibilité de supprimer des fichiers, et c'est alors que j'ai touché plus en profondeur à la fonction &lt;a href="http://php.net/manual/en/function.unlink.php"&gt;unlink()&lt;/a&gt; de PHP.&lt;/p&gt;
&lt;p&gt;L'un des problèmes, avec cette fonction, c'est qu'on lui passe un nom de fichier à supprimer, et ça pose de gros problèmes de sécurité. Si jamais quelqu'un a connaissance du fichier PHP qui permet de supprimer quelque chose, il peut envoyer n'importe quel nom à supprimer et vider mon/votre site très facilement (imaginez un &lt;code&gt;unlink("../index.html")&lt;/code&gt; dans un répertoire quelconque et il vous supprime votre page d'accueil).&lt;/p&gt;
&lt;p&gt;Bref, l'astuce que j'ai utilisée: prendre le &lt;em&gt;basename&lt;/em&gt; du fichier passé en paramètre pour être sûr que la suppression se réalise dans le dossier voulu.&lt;/p&gt;
&lt;p&gt;Au final, ça ressemble à ça:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;unlink&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nv"&gt;$fullPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;unlink&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$fullPath&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nv"&gt;$success&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;unlink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$fullPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="n"&gt;refresh&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;
   &lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Location: .&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="n"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Bon après, il faut s'assurer que tous les fichiers que vous avez dans ce répertoire sont "supprimable"; si vous laissez traîner un fichier que vous souhaitez garder, faites un filtre avant d'executer &lt;code&gt;unlink()&lt;/code&gt;.&lt;/p&gt;</summary><category term="php"></category><category term="code"></category><category term="sécurité"></category></entry><entry><title>Mon nouveau jouet</title><link href="http://neolyse.info/blog/mon-nouveau-jouet.html" rel="alternate"></link><updated>2011-03-20T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2011-03-20:/blog/mon-nouveau-jouet.html/</id><summary type="html">&lt;p&gt;Oh bordel, oh bordel, voilà ce que j'ai trouvé dans le grenier des beaux parents:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Une Super Nintendo!" src="http://neolyse.info/blog/content/snes.JPG" /&gt;&lt;/p&gt;
&lt;p&gt;Rien que d'y penser, ça fait rêver. Les jeux fournis avec sont les suivants:&lt;br /&gt;
- &lt;a href="http://www.grospixels.com/site/smworld.php"&gt;Super Mario World&lt;/a&gt;, avec Yoshi, celui que j'avais préféré&lt;br /&gt;
- &lt;a href="http://fr.wikipedia.org/wiki/Super_Mario_All-Stars"&gt;Super Mario All Stars&lt;/a&gt;, qui regroupe les vieux Marios en version remasterisée&lt;br /&gt;
- et &lt;a href="http://www.snescentral.com/article.php?id=0866"&gt;Eric Cantona: Football Challenge&lt;/a&gt;, que je me tâte à tester, ça a l'air bien pourri...&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;En tout cas, sur la nouvelle télé, ça &lt;em&gt;arrache&lt;/em&gt;!&lt;/p&gt;</summary><category term="divers"></category><category term="snes"></category></entry><entry><title>Évolution du travail sur The Island</title><link href="http://neolyse.info/blog/evolution-du-travail-sur-the-island.html" rel="alternate"></link><updated>2011-02-06T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2011-02-06:/blog/evolution-du-travail-sur-the-island.html/</id><summary type="html">&lt;p&gt;Je pense reprendre un peu le travail sur la traduction de The Island, que j'avais déjà  réécrit en LaTeX, mais qui s'exportait assez mal.&lt;br /&gt;
La sortie de &lt;a href="http://linuxfr.org/~andrianarivony/30740.html"&gt;LyX 2 en béta 3&lt;/a&gt; m'a motivé à me lancer dans l'adaptation de la nouvelle à l'outil.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;Cela permettra plusieurs choses:&lt;br /&gt;
-  l'export simple en format &lt;a href="http://fr.wikipedia.org/wiki/Livre_%C3%A9lectronique"&gt;eBook&lt;/a&gt;&lt;br /&gt;
-  la modification simple de la traduction&lt;br /&gt;
-  probablement une maintenance plus simple&lt;/p&gt;
&lt;p&gt;À suivre, donc...&lt;/p&gt;</summary><category term="traduction"></category><category term="lyx"></category></entry><entry><title>Amazon et la galère de la carte Musique</title><link href="http://neolyse.info/blog/amazon-et-la-galere-de-la-carte-musique.html" rel="alternate"></link><updated>2010-12-18T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2010-12-18:/blog/amazon-et-la-galere-de-la-carte-musique.html/</id><summary type="html">&lt;p&gt;La &lt;a class="reference external" href="http://www.carte-musique.gouv.fr/"&gt;carte&lt;/a&gt; &lt;a class="reference external" href="http://linuxfr.org/~Tethis/29745.html"&gt;musique&lt;/a&gt; du &lt;a class="reference external" href="http://www.pcinpact.com/actu/news/60912-carte-musique-jeune-vente-chiffre.htm?vc=1"&gt;gouvernement&lt;/a&gt;.
Elle aura fait parler d'elle, en bien et en mal (surtout en mal...).&lt;/p&gt;
&lt;p&gt;J'ai pris cette carte chez Amazon, n'étant pas fan d'iTunes, et j'ai peut être fait une erreur: se servir de la carte Musique 12-25 (ça sonne SNCF) est extrémement compliqué. Pourtant l'idée est simple et intéressante: pour contrer le piratage, le gouvernement propose de participer dans la limite de 25 euros aux achats de musique électronique des jeunes de 12 à 25 ans. Mais les difficultés à utiliser cette carte m'ont vraiment découragé.&lt;/p&gt;
&lt;p&gt;Pour dire, la méthode d'enregistrement sur Amazon passe par l'utilisation détournée de leur champ &amp;quot;code de réduction&amp;quot;, une double commande de cette carte (sur le site du gouvernement, puis sur Amazon, mais on ne paye que sur Amazon), puis un clic sur un lien de confirmation dans un mail pour obtenir un code, et enfin la validation de ce code sur Amazon.&lt;/p&gt;
&lt;p&gt;Tout ceci pour piteusement voir ma CB débitée lors du premier achat de MP3 sur la plateforme Amazon. La faute à leur système de panier absolument désastreux, où l'on passe à la caisse en un clic, où le numéro de CB est enregistré et où tout est fait pour vous faire acheter le plus vite possible. 32€ d'albums + les 25€ euros de la carte le mois dernier.&lt;/p&gt;
&lt;p&gt;Je viens de passer 45 minutes au téléphone avec l'assistance Amazon, qui ne peut rien faire. On m'a &amp;quot;transféré&amp;quot; vers une &amp;quot;cellule&amp;quot; qui est censé me rappeler. Un peu tard, j'ai tilté qu'ils n'ont pas mon numéro de téléphone: je suis bon pour rapeller.&lt;/p&gt;
&lt;p&gt;Quelqu'un a déjà réussi à faire fonctionner cette carte musique?&lt;/p&gt;
</summary><category term="amazon"></category><category term="carte musique"></category><category term="web"></category></entry><entry><title>Les Widgets Twitter et Facebook ralentissent le web</title><link href="http://neolyse.info/blog/les-widgets-twitter-et-facebook-ralentissent-le-web.html" rel="alternate"></link><updated>2010-12-05T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2010-12-05:/blog/les-widgets-twitter-et-facebook-ralentissent-le-web.html/</id><summary type="html">&lt;p&gt;Un exemple parmi tant d’autres, le chargement de la page clubic:&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://neolyse.info/blog/content/clubic-lent.jpeg"&gt;&lt;img alt="http://neolyse.info/blog/content/clubic-lent.jpeg" src="http://neolyse.info/blog/content/clubic-lent.jpeg" style="width: 686.4px;" /&gt;&lt;/a&gt;
&lt;p&gt;18 secondes.&lt;/p&gt;
&lt;p&gt;Les requêtes sur l’API de twitter pour afficher leur widget prennent… 12 secondes!&lt;/p&gt;
&lt;p&gt;C’est n’importe quoi, en utilisant l’extension « &lt;a class="reference external" href="https://chrome.google.com/extensions/detail/hgiihiookhijpbhaflohognbhmamdnol"&gt;Widget Block&lt;/a&gt; » et « Facebook Disconnect », la page se charge en.. 7 secondes:&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://neolyse.info/blog/content/7secondes.jpeg"&gt;&lt;img alt="http://neolyse.info/blog/content/7secondes.jpeg" src="http://neolyse.info/blog/content/7secondes.jpeg" style="width: 477.0px;" /&gt;&lt;/a&gt;
</summary><category term="facebook"></category><category term="twitter"></category><category term="web"></category></entry><entry><title>The Island - Finished</title><link href="http://neolyse.info/blog/the-island-finished.html" rel="alternate"></link><updated>2010-10-24T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2010-10-24:/blog/the-island-finished.html/</id><summary type="html">&lt;p&gt;Et voilà, terminé.&lt;/p&gt;
&lt;p&gt;Vous la trouverez ici: &lt;a class="reference external" href="http://neolyse.info/the_island/"&gt;Traduction de The Island&lt;/a&gt;.&lt;/p&gt;
</summary><category term="francais"></category><category term="the island"></category><category term="traduction"></category></entry><entry><title>Traduction de la nouvelle « The Island »</title><link href="http://neolyse.info/blog/traduction-de-la-nouvelle-the-island.html" rel="alternate"></link><updated>2010-10-13T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2010-10-13:/blog/traduction-de-la-nouvelle-the-island.html/</id><summary type="html">&lt;p&gt;J'ai traduit la nouvelle « The Island », de Peter Watts, en Français.
La relecture me prendra encore un certain moment, je pense que je publierais la chose ici quand je serais certain que je n'ai pas fait de trop grosses choses.&lt;/p&gt;
&lt;p&gt;Je vais déjà raconter un peu la méthode que j'ai employée, si ça peut intéresser quelqun.&lt;/p&gt;
&lt;p&gt;L'auteur publie depuis longtemps des romans en licence Creative Commons, et cette nouvelle m'a beaucoup plu. Comme je n'imaginais pas qu'elle sortirais en Français avant un bon moment, je m'y suis pris de mon propre chef.&lt;/p&gt;
&lt;p&gt;Traduire un texte aussi long, avec un vocabulaire aussi technique, a requis une petite organisation.&lt;/p&gt;
&lt;p&gt;J'ai d'abord été chercher s'il existait des logiciels qui soient utiles pour ce boulot, et on trouve dans le paysage Mac quelques petits logiciels orientés vers les « auteurs ». Mais Scrivener ou StoryMill sont trop précisément faits pour l'écriture proprement dite, pas pour une traduction. La taille du manuscrit étant faible, je me suis finalement dit que je pourrais le faire en mode « texte simple ».&lt;/p&gt;
&lt;p&gt;Tout d'abord, je me suis appuyé sur le texte que Peter diffuse sur son &lt;a class="reference external" href="http://www.rifters.com/real/shorts.htm"&gt;site internet&lt;/a&gt;, au format texte. Il existe une version PDF, mais une version texte est largement préférable.
En effet, le texte peut alors être découpé en plusieurs sous-ensembles (que j'ai appelés ici chapitres), ce qui permet de répartir l'effort.
Comme la nouvelle en elle-même présentait des « chapitres », j'ai procédé au découpage ainsi:&lt;/p&gt;
&lt;a class="reference external image-reference" href="./content/chapitres.png"&gt;&lt;img alt="http://neolyse.info/blog/content/chapitres.png" class="align-left" src="http://neolyse.info/blog/content/chapitres.png" style="width: 754px;" /&gt;&lt;/a&gt;
&lt;p&gt;Cela permet de mesurer assez facilement l'effort qui reste à faire.&lt;/p&gt;
&lt;p&gt;Dans le même temps, j'ai mis en place un dépôt Git pour garder trace des évolutions, voici l'état du dépôt à la fin du projet:&lt;/p&gt;
&lt;img alt="http://neolyse.info/blog/content/git.jpg" class="align-left" src="http://neolyse.info/blog/content/git.jpg" /&gt;
&lt;p&gt;Enfin, pour le travail traduction en lui-même, j'ai utilisé un simple éditeur de texte gratuit, en mettant l'un à côté de l'autre les textes, ce qui permet de travailler relativement confortablement:&lt;/p&gt;
&lt;img alt="http://neolyse.info/blog/content/ecriture.jpg" class="align-left" src="http://neolyse.info/blog/content/ecriture.jpg" /&gt;
&lt;p&gt;J'ai aussi maintenu un petit fichier de « notes », où j'ai gardé des références sur les traductions ardues que j'ai dû un peu improviser.&lt;/p&gt;
&lt;p&gt;Il m'aura fallu donc un petit mois pour arriver à une traduction que je considère comme « béta ». Il reste encore du boulot pour repasser sur le texte et reformuler certaines phrases qui « colleraient » trop à l'expression anglaise.&lt;/p&gt;
&lt;p&gt;Quelques statistiques intéressantes:&lt;/p&gt;
&lt;img alt="http://neolyse.info/blog/content/stats.png" class="align-left" src="http://neolyse.info/blog/content/stats.png" /&gt;
&lt;p&gt;On voit que j'ai utilisé en moyenne 12% de mots en plus pour le Français.&lt;/p&gt;
&lt;p&gt;A bientôt!&lt;/p&gt;
</summary><category term="traduction"></category><category term="the island"></category></entry><entry><title>Chaleur</title><link href="http://neolyse.info/blog/chaleur.html" rel="alternate"></link><updated>2010-07-11T00:00:00Z</updated><author><name>Guillaume</name></author><id>tag:neolyse.info,2010-07-11:/blog/chaleur.html/</id><summary type="html">&lt;p&gt;Il faisait bien chaud à la campagne, imaginez à Grenoble...&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://neolyse.info/blog/content/chaleur.jpeg"&gt;&lt;img alt="http://neolyse.info/blog/content/chaleur.jpeg" src="http://neolyse.info/blog/content/chaleur.jpeg" style="width: 400.0px;" /&gt;&lt;/a&gt;
</summary><category term="divers"></category></entry></feed>
