<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux Attitude&#187; Développement</title>
	<atom:link href="http://linux-attitude.fr/category/developpement/feed" rel="self" type="application/rss+xml" />
	<link>http://linux-attitude.fr</link>
	<description>Le libre est un état d&#039;esprit</description>
	<lastBuildDate>Thu, 09 Feb 2012 08:10:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>La magie de l&#8217;ascii art</title>
		<link>http://linux-attitude.fr/post/la-magie-de-lascii-art?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=la-magie-de-lascii-art</link>
		<comments>http://linux-attitude.fr/post/la-magie-de-lascii-art#comments</comments>
		<pubDate>Mon, 24 Jan 2011 18:01:59 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Commande]]></category>
		<category><![CDATA[graphisme]]></category>
		<category><![CDATA[planet-libre]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=1267</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: ditaa Aujourd'hui je voudrais partager avec vous un petit soft que je viens de découvrir&#160;: ditaa. Qu'est-ce que ça fait&#160;? C'est un outil très simple qui vous permet de faire des diagrammes en ascii art. Non pas de les dessiner comme le ferait emacs artist-mode mais de les transformer en un vrai [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;: ditaa</p>


<p>Aujourd'hui je voudrais partager avec vous un petit soft que je viens de découvrir&nbsp;: <a href="http://ditaa.sourceforge.net/" hreflang="en">ditaa</a>.</p>


<h3>Qu'est-ce que ça fait&nbsp;?</h3>

<p>C'est un outil très simple qui vous permet de faire des diagrammes en ascii art. Non pas de les dessiner comme le ferait emacs <a href="http://www.cinsk.org/emacs/emacs-artist.html" hreflang="en">artist-mode</a> mais de les transformer en un vrai png propre et beau.</p>


<p>Exemple&nbsp;: Je dessine ceci (par exemple avec <a href="http://search.cpan.org/dist/App-Asciio/" hreflang="en">asciio</a>)</p>
<pre>
    +--------+   +-------+    +-------+
    |        | --+ ditaa +--&gt; |       |
    |  Text  |   +-------+    |diagram|
    |Document|   |!magic!|    |       |
    |cRED {d}|   |cBLU   |    |cRED   |
    +---+----+   +-------+    +-------+
        :                         ^
        |       Lots of work      |
        +-------------------------+
</pre>


<p>Cela devient automatiquement ceci&nbsp;:</p>
<img src='/public/ditaa/e423f2cd38009afcee9e10a290cf25ff.png'>


<h3>Intégration</h3>

<p>C'est tellement magique que je n'ai pas hésité et je l'ai intégré à mon site directement. En effet avant à chaque fois que je devais faire un diagramme il fallait que je sorte inkscape, que fasse attention à caler correctement les cases et les flèches et que je pense à sauvegarder l'image et l'uploader sur le serveur.</p>


<p>Maintenant j'intègre tout simplement le code dans le texte de mon article et ca marche&nbsp;!</p>


<p>Je n'ai pas trouvé de code qui faisait cela, je l'ai donc fait moi-même. Un peu rapidement il est vrai, il n'y a pas de gestion des différents cas d'erreur. Mais je vous laisse le code au cas où vous voudriez faire de même chez vous.</p>

<pre>
    function __macroDITAA($s)
    {
        $base=$_SERVER['DOCUMENT_ROOT'].&quot;/public/ditaa&quot;;
        $tmp=&quot;/tmp/ditaa&quot;;

        # first line of code is for ditaa parameters
        $p = strpos($s, &quot;\n&quot;);
        $args = substr($s, 0, $p-2);
        $data = substr($s, $p+1 );

        # md5sum to generate a unique id
        $id = md5($data);

        # file test
        if(!file_exists(&quot;$base/$id.png&quot;)) {
            # create tmp
            $f = fopen(&quot;$tmp&quot;, &quot;w&quot;);
            fwrite($f, $data);
            fclose($f);

            # call ditaa (beware of safe mode)
            system(&quot;ditaa $args $tmp &gt; /dev/null&quot;);

            # move file
            rename(&quot;$tmp.png&quot;, &quot;$base/$id.png&quot;);
        }

        return &quot;&lt;img src='/public/ditaa/$id.png'&gt;&quot;;
    }
</pre>


<p>Puisque ditaa est malgré tout un peu lourd, on crée un identifiant d'image avec le md5 de la ligne de commande et le contenu. Et on ne fait l'appel qu'une fois (attention je n'ai pas de safe_mode ici), lorsque le fichier n'existe pas encore. Ensuite le serveur web l'utilise le fichier directement comme n'importe quel autre.</p>


<p>Sur mon site, j'ai une syntaxe <a href="http://fr.dotclear.org/" hreflang="fr">dotclear2</a>, j'ai donc dû enregistrer un nouveau mot clé pour la syntaxe ditaaa "///ditaa"&nbsp;:</p>
<pre>
# dans class.wiki2xhtml.php / class wiki2xhtml / function __construct()
$this-&gt;registerFunction('macro:ditaa','__macroDITAA');
</pre>


<p>A vous de faire de même pour la syntaxe wordpress&nbsp;!</p>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/prompt-string' rel='bookmark' title='Permanent Link: Prompt String'>Prompt String</a></li>
</ol>
	Tags:<a href="http://linux-attitude.fr/tag/commande" title="Commande" rel="tag">Commande</a>, <a href="http://linux-attitude.fr/tag/graphisme" title="graphisme" rel="tag">graphisme</a>, <a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/la-magie-de-lascii-art/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Perle fraîche</title>
		<link>http://linux-attitude.fr/post/perle-fraiche?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=perle-fraiche</link>
		<comments>http://linux-attitude.fr/post/perle-fraiche#comments</comments>
		<pubDate>Wed, 10 Nov 2010 17:00:45 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=1084</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: "Perl moderne" La vie des huîtres selon saint Larry (soûlant ...). Aujourd'hui il est sujet d'un livre. Un livre dont le titre est "Perl moderne", tout simplement. Je ne vais pas vous le cacher, si je vous en parle c'est que je connais un des auteurs. Remarquez que c'est peut-être l'occasion de [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;: <a href="http://perlmoderne.fr/">"Perl moderne"</a></p>


<p>La vie des huîtres selon saint Larry (soûlant ...).</p>

<a href="http://www.amazon.fr/gp/product/2744024198?ie=UTF8&tag=linuatti-21&linkCode=as2&camp=1642&creative=6746&creativeASIN=2744024198"><img border="0" src="http://ecx.images-amazon.com/images/I/51bXPAFlDuL._SL500_AA300_.jpg"></a><img src="http://www.assoc-amazon.fr/e/ir?t=linuatti-21&l=as2&o=8&a=2744024198" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />



<p>Aujourd'hui il est sujet d'un livre. Un livre dont le titre est "Perl moderne", tout simplement. Je ne vais pas vous le cacher, si je vous en parle c'est que je connais un des auteurs. Remarquez que c'est peut-être l'occasion de commencer une section recommandations de bouquins.</p>


<h3>L'acheter ou pas&nbsp;?</h3>

<p>Alors pourquoi acheter ce livre&nbsp;? Pour les arguments commerciaux, je vous laisse aller voir le site de l'éditeur. Pour les vraies raisons ...</p>
<ul>
<li>parce qu'il fait 450 pages et que c'est beaucoup</li>
<li>parce qu'il est assez petit pour tenir dans la poche (enfin avec un bon treillis)</li>
<li>parce que comme moi vous avez appris Perl en lisant du code Perl</li>
<li>parce que vous ne savez pas qu'il est possible d'écrire du Perl orienté objet</li>
</ul>

<p>Mais pourquoi je vous déconseillerais d'acheter ce livre&nbsp;?</p>
<ul>
<li>parce que vous aimez Python et que vous voulez considérer les espaces de fin de ligne comme des erreurs de code</li>
<li>parce que pour vous le seul code lisible c'est du code C façon K&amp;R</li>
<li>parce que vous êtes Larry Wall et que vous n'allez rien apprendre</li>
</ul>

<h3>Le contenu du livre</h3>


<p>La première partie ravira les débutants en Perl qui apprendront que contrairement à la croyance populaire "$^£¨%*" n'est pas un code Perl valide. Remarquez que même moi, qui sais que "Perl '-sp0777i&lt;X+d*lMLa^*lN%0]dsXx++lMlN/dsM0&lt;j]dsj'" est une ligne de commande valide en Perl, j'y ai appris des choses.</p>


<p>Hé oui, le Perl a bien évolué depuis la première version 5. La partie 2 m'a d'ailleurs appris qu'il y avait une nouvelle façon d'écrire de l'objet en Perl. Moi bêtement je pensais que Perl avait fait les choses super bien en n'ajoutant qu'un mot clé "bless" pour devenir orienté objet. Mais en fait non, il paraît qu'il en faut un peu plus pour entrer proprement dans le paradigme objet. Qu'a cela ne tienne, on utilisera Moose, l'héritage, des setter, des getter et du typage.</p>


<p>Ça vous parait compliqué&nbsp;? Mais pas du tout le livre contient des exemples simple pour chaque mot clé présenté.</p>


<p>Pour résumer cette partie, ce que j'ai découvert de plus utile ce sont les trigger sur propriétés d'un objets et les méthodes pour intercepter d'autres méthodes.</p>


<p>La troisième partie assez classique avec ce qu'on peut trouver dans les bibliothèque Perl pour traiter les données. Elle parle entre autre de l'infernal problème des dates ...</p>


<p>Passons à un chapitre bien plus passionnant pour qui s'y connaît déjà un peu en Perl, POE. Intuitivement j'aurais dit quelque chose comme "Perl orienté évènement", perdu, il s'agit de "Perl Object Environment". En fait c'est un système puissant de gestion d'évènements et d'états. Le but étant de passer à une programmation événementielle. C'est très pratique lorsque vous codez un serveur, d'autant qu'il existe déjà un grand nombre de méthodes existantes qui vous éviteront de réinventer la roue (la POE::Wheel pour ceux qui connaissent).</p>


<p>Enfin la dernière partie traite d'une chose qui sera bien plus utile à ceux qui ne connaissent pas encore bien Perl, le framework web de Perl. Il permet de parser du HTML, de lire des formulaires, de jouer des séquence complètes de requêtes pour vous faire passer pour un navigateur auprès de votre serveur préféré (pensez-y vous qui devez remplir toutes les semaines le même formulaire dans votre boite ...).</p>


<p>Pour conclure, je dirais que c'est un bon bouquin. <del>Dommage qu'il n'y ait pas un petit site depuis lequel on puisse faire copier/coller des exemples du livre. Heureusement, ils sont assez courts en général.</del> Il y a maintenant un <a href="http://perlmoderne.fr/" hreflang="fr">site dédié à ce livre</a> et les exemple y sont disponibles au téléchargement</p>

<a href="http://www.amazon.fr/gp/product/2744024198?ie=UTF8&tag=linuatti-21&linkCode=as2&camp=1642&creative=6746&creativeASIN=2744024198"><img border="0" src="http://ecx.images-amazon.com/images/I/51bXPAFlDuL._SL500_AA300_.jpg"></a><img src="http://www.assoc-amazon.fr/e/ir?t=linuatti-21&l=as2&o=8&a=2744024198" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />



<p>Allez, soyez gentil, achetez-le, si vous en prenez 2000, je vous promet de faire un article par jour&nbsp;!</p>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/usrbingcc-bis' rel='bookmark' title='Permanent Link: #!/usr/bin/gcc (bis)'>#!/usr/bin/gcc (bis)</a></li>
<li><a href='http://linux-attitude.fr/post/le-perl-completement-inutile' rel='bookmark' title='Permanent Link: Le perl complètement inutile'>Le perl complètement inutile</a></li>
<li><a href='http://linux-attitude.fr/post/perles' rel='bookmark' title='Permanent Link: Perles'>Perles</a></li>
</ol>
	Tags:<a href="http://linux-attitude.fr/tag/perl" title="Perl" rel="tag">Perl</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/perle-fraiche/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Expression régulière</title>
		<link>http://linux-attitude.fr/post/expression-reguliere?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=expression-reguliere</link>
		<comments>http://linux-attitude.fr/post/expression-reguliere#comments</comments>
		<pubDate>Thu, 07 Oct 2010 17:02:43 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Commande]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=1038</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: test d'expression régulière Vous essayez de développer une expression régulière mais vous ne savez pas pourquoi ça ne marche pas&#160;? Tester une expression Je vous propose le petit programme suivant qui vous aidera dans la compréhension du fonctionnement de votre regex. Son usage est simple&#160;: ./regtest.pl &#60;regex&#62; &#60;chaine&#62; Exemple&#160;: ./regtest.pl "(\d+7)\.1\." "127.127.1.12" [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;: test d'expression régulière</p>


<p>Vous essayez de développer une expression régulière mais vous ne savez pas pourquoi ça ne marche pas&nbsp;?</p>


<h3>Tester une expression</h3>

<p>Je vous propose le petit <a href="http://linux-attitude.fr/public/Code/regtest.pl">programme suivant</a> qui vous aidera dans la compréhension du fonctionnement de votre regex. Son usage est simple&nbsp;:</p>
<pre>
./regtest.pl &lt;regex&gt; &lt;chaine&gt;
</pre>


<p>Exemple&nbsp;:</p>
<pre>
./regtest.pl "(\d+7)\.1\." "127.127.1.12"
<span style="color: #F00">127</span>.127.1.12 : \d+
<span style="color: #F00">127</span>.127.1.12 : \d+7
<span style="color: #F00">127</span>.127.1.12 : (\d+7)
127.<span style="color: #F00">127.1.</span>12 : (\d+7)\.1\.
    127      : $1
</pre>



<p>Le programme découpe l'expression en éléments syntaxiquement  corrects et les applique à la chaine pour voir ce qui matche et le met en évidence. A la fin la liste des groupes qui ont matchés est affiché.</p>


<p>Il est aussi possible de remplacer une des paramètres (la chaine ou la regex) par un '-'. Le programme boucle alors sur l'entrée et vous permet d'entrer une ligne à chaque fois. Vous pouvez donc faire un test en continu. L'avantage et surtout pour les regexp, cela permet de s'affranchir des caractères spéciaux qui pourraient être interprétés par le shell.</p>


<p>Notez que vous aurez besoin de Regexp::Parser qui n'est pas installé par défaut.
<span id="more-1038"></span>
Pour cela le plus simple est de se connecter en root puis de faire</p>
<pre>
$ perl -e shell -MCPAN
install Regexp::Parser
</pre>


<p>Et oula, maintenant plus de problème, vous pouvez tester vos expression régulières facilement&nbsp;!</p>


<h3>Comment ca marche&nbsp;?</h3>

<p>En écrivant ce petit programme, voici quelques petites astuces que j'ai utilisé.</p>


<p>Écrire en couleur dans le terminal de façon portable&nbsp;:</p>
<pre>
use Term::ANSIColor;
print colored(&quot;string&quot;, 'red');
</pre>


<p>Parser une expression régulière perl dans une structure lisible (arbre)&nbsp;:</p>
<pre>
use Regexp::Parser;
my $parser = Regexp::Parser-&gt;new;
$parser-&gt;parse($reg);
</pre>


<p>Récupérer 3 parties d'une chaine lors d'un matching&nbsp;:</p>
<ul>
<li>$`&nbsp;: avant le match</li>
<li>$&amp;&nbsp;: tout le match</li>
<li>$'&nbsp;: après le mach</li>
</ul>

<p>Récupérer les position des éléments matchés et des groupes dans la chaine en question&nbsp;:</p>
<ul>
<li>@-&nbsp;: tableau des positions de début de chaque groupe</li>
<li>@+&nbsp;: tableau des positions de fin de chaque groupe</li>
</ul>

<p><a href="http://linux-attitude.fr/public/Code/regtest.pl">Vous trouverez le code ici</a>.</p>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/en-vrac-14' rel='bookmark' title='Permanent Link: En vrac (14)'>En vrac (14)</a></li>
<li><a href='http://linux-attitude.fr/post/soyez-reguliers-1' rel='bookmark' title='Permanent Link: Soyez réguliers (1)'>Soyez réguliers (1)</a></li>
<li><a href='http://linux-attitude.fr/post/lignes-de-commande-en-sed' rel='bookmark' title='Permanent Link: Lignes de commande en sed'>Lignes de commande en sed</a></li>
</ol>
	Tags:<a href="http://linux-attitude.fr/tag/commande" title="Commande" rel="tag">Commande</a>, <a href="http://linux-attitude.fr/tag/perl" title="Perl" rel="tag">Perl</a>, <a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/scripting" title="Scripting" rel="tag">Scripting</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/expression-reguliere/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Latence</title>
		<link>http://linux-attitude.fr/post/latence?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=latence</link>
		<comments>http://linux-attitude.fr/post/latence#comments</comments>
		<pubDate>Tue, 28 Sep 2010 17:51:57 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Matériel]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[Savoir-faire]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=953</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: quelques ordre de grandeur Voici quelques ordre de grandeur qui vous permettront d'avoir les idées un peu plus claires sur les performances de votre système. Imaginez que le swap est 100 000 fois plus lent que la mémoire du processus&#160;! Qu'un algorithme de création d'arbre peut être plus lent qu'un algorithme linéaire [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;: quelques ordre de grandeur</p>


<p>Voici quelques ordre de grandeur qui vous permettront d'avoir les idées un peu plus claires sur les performances de votre système. Imaginez que le swap est 100 000 fois plus lent que la mémoire du processus&nbsp;! Qu'un algorithme de création d'arbre peut être plus lent qu'un algorithme linéaire si chaque nœud de l'arbre se retrouve sur une page différente (pensez à vos centaines de malloc pour remplir un arbre)&nbsp;!</p>

<table>
<caption><b>Valable en 2010</b></caption>
<tr><th>Objet</th><th>Latence</th><th>Débit</th></tr>
<tr><td>Internet</td><td>80 ms</td><td>2 Mo/s</td></tr>
<tr><td>Accès au swap</td><td>8 ms</td><td>50 Mo/s</td></tr>
<tr><td>Disque10krpm</td><td>3 ms</td><td>50 Mo/s</td></tr>
<tr><td>Ethernet gigabit</td><td>1 ms</td><td>100 Mo/s</td></tr>
<tr><td>Disque SSD</td><td>0.5 ms</td><td>100 Mo/s</td></tr>
<tr><td>fork</td><td>0.1 ms</td><td></td></tr>
<tr><td>context switch</td><td>3 µs</td><td></td></tr>
<tr><td>gettimeofday</td><td>1 µs</td><td></td></tr>
<tr><td>Interface pci</td><td>0.1 µs</td><td>133 Mo/s</td></tr>
<tr><td>malloc/mmap</td><td>0.1 µs</td><td></td></tr>
<tr><td>RAM</td><td>30 ns</td><td>8 Go/s</td></tr>
<tr><td>Interface pci-express 16x</td><td>10 ns</td><td>8 Go/s</td></tr>
<tr><td>Cache L2</td><td>5 ns</td><td></td></tr>
<tr><td>Cache L1</td><td>1 ns</td><td></td></tr>
<tr><td>Registre processeur</td><td>0.3 ns</td><td>40 Go/s</td></tr>
</table>


<p>Notez que l'important ce sont les ordres de grandeur, vous pouvez facilement trouver des éléments qui font le double ou la moitié de ces performances.</p>


<h3>Interprétations</h3>

<p>Sérieusement, pas besoin de giga de swap sur votre serveur. Mettez un tout petit peu et vous monitorez dès que ca dépasse, imaginez la division par un nombre à 5 chiffres du nombre de pages vues sur votre serveur&nbsp;! Pour ma part je préfère répondre à moins de requêtes par seconde et garder un serveur utilisable.</p>


<p>Mais sur votre station de travail vous faites ce que vous voulez, on est en général plus patient :-)</p>


<p>Pas de gettime à gogo dans votre code pour mesurer les perf, ça tue les perfs ...</p>


<p>Le réseau fait a peu près aussi bien que votre disque.</p>


<p>Pas de malloc à gogo pour des structures morcelées et très utilisées. faites une structure unique si vous devez en avoir beaucoup.</p>


<p>Le SSD c'est bien mais ca vaut pas l'accès direct au flash.</p>


<p>Étant donné la vitesse de compression un swap compressé peut vraiment valoir le coup.</p>


<p>Le cache processeur sert vraiment à quelque chose ... si on sait coder pour qu'il soit utilisé (ou laisser le compilateur faire).</p>


<p>Le fork c'est un peu lent, prévoyez un prefork correct sur vos applications fréquemment appelées.</p>


<p>Avoir beaucoup de processus n'est pas si coûteux en soi (context switch).</p>


<p><br />
<strong>PS</strong>&nbsp;: Si vous avez des données pour compléter ce tableau, n'hésitez pas à me laisser des commentaires.</p>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/que-faire-et-ne-pas-faire-en-raid' rel='bookmark' title='Permanent Link: Que faire et ne pas faire en raid'>Que faire et ne pas faire en raid</a></li>
</ol>
	Tags:<a href="http://linux-attitude.fr/tag/materiel" title="Matériel" rel="tag">Matériel</a>, <a href="http://linux-attitude.fr/tag/planet-libre" title="planet-libre" rel="tag">planet-libre</a>, <a href="http://linux-attitude.fr/tag/savoir-faire" title="Savoir-faire" rel="tag">Savoir-faire</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/latence/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Le xml n&#8217;est pas pour les humains</title>
		<link>http://linux-attitude.fr/post/le-xml-nest-pas-pour-les-humain?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=le-xml-nest-pas-pour-les-humain</link>
		<comments>http://linux-attitude.fr/post/le-xml-nest-pas-pour-les-humain#comments</comments>
		<pubDate>Mon, 17 May 2010 17:12:36 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=884</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: Aujourd'hui un thème un peu polémique mais pas trop quand même. Le XML est un descendant du SGML. C'est un format structuré de données comme l'est l'ASN1 ou le LDIF. Tous ces formats ont été inventés dans une seule optique&#160;: être facile à parser par une machine. Et pourtant quand on voit [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;:</p>


<p>Aujourd'hui un thème un peu polémique mais pas trop quand même.</p>


<p>Le <a href="http://fr.wikipedia.org/wiki/Extensible_Markup_Language" hreflang="fr">XML</a> est un descendant du <a href="http://fr.wikipedia.org/wiki/Standard_Generalized_Markup_Language" hreflang="fr">SGML</a>. C'est un format structuré de données comme l'est <a href="http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One" hreflang="en">l'ASN1</a> ou le <a href="http://fr.wikipedia.org/wiki/LDAP_Data_Interchange_Format">LDIF</a>.</p>


<p>Tous ces formats ont été inventés dans une seule optique&nbsp;: être facile à parser par une machine. Et pourtant quand on voit les subtilités du XML et les difficultés à faire un parseur, on peut avoir des doutes... Mais de ce fait ils sont peu lisibles.</p>


<p>Ne vous méprenez pas, le XML a tout à fait sa place dans les échange de données, dans la communication entre machines. Le format est bien défini et fonctionne quel que soit le type de machine. Il est d'ailleurs très utilisé car on trouve des parseurs partout, dans presque tous les langages, et dans presque tous les frameworks.</p>


<p>Mais à force d'en user on en abuse.</p>


<p>Non le XML n'est PAS fait pour les humains&nbsp;! Le xml n'est pas à sa place dans les fichiers de configuration, à moins que vous n'ayez pour objectif que l'utilisateur ne touche jamais à ces fichiers et que vous ayez le temps de développer une interface entre l'utilisateur et la modification (texte&nbsp;? graphique&nbsp;? sonore ?).</p>


<p>Le XML est pratique car il permet au développeur d'éviter l'usage de protocoles binaires incompréhensibles et mal parsés entre deux applications. Il est pratique car un autre développeur peut lire ce protocole sans l'avoir appris. Mais vous remarquerez que je ne parle que de développeurs, pas d'utilisateurs.</p>


<p>Alors par pitié arrêtez le XML dans les fichiers destinés aux HUMAINS. Il existe bien d'autres formats ayant des parseurs et tout aussi lisibles&nbsp;:</p>
<ul>
<li>le <a href="http://fr.wikipedia.org/wiki/Fichier_INI" hreflang="fr">format INI</a></li>
<li>le <a href="http://fr.wikipedia.org/wiki/Yaml" hreflang="fr">format YAML</a></li>
<li>le <a href="http://fr.wikipedia.org/wiki/Json">format JSON</a></li>
</ul>

<p>Mieux, il existe <a href="http://onlamp.com/pub/a/onlamp/2006/02/16/introducing-lua.html" hreflang="en">LUA</a> qui vous permet à la fois d'avoir un fichier de configuration simple et lisible, mais qui en plus autorise l'utilisateur à faire des choses que vous n'auriez pas prévu, comme des configuration conditionnelles&nbsp;!</p>
	Tags:<a href="http://linux-attitude.fr/tag/code" title="Code" rel="tag">Code</a>, <a href="http://linux-attitude.fr/tag/scripting" title="Scripting" rel="tag">Scripting</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/le-xml-nest-pas-pour-les-humain/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Un interpréteur fantôme</title>
		<link>http://linux-attitude.fr/post/un-interpreteur-fantome?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=un-interpreteur-fantome</link>
		<comments>http://linux-attitude.fr/post/un-interpreteur-fantome#comments</comments>
		<pubDate>Mon, 03 May 2010 16:32:31 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Curiosité]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/?p=413</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: Maintenant que nous savons nous servir d'un interpréteur postscript, nous allons pouvoir développer. Postscript est un langage complet au sens de Turing. C'est à dire qu'on peut tout faire avec, même faire décoller une fusée. Mais bon, avant d'en arriver là, on va essayer de faire quelque chose d'utile. Pour vous présenter [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;:</p>


<p>Maintenant que nous savons nous servir d'un interpréteur postscript, nous allons pouvoir développer. Postscript est un langage complet au sens de Turing. C'est à dire qu'on peut tout faire avec, même faire décoller une fusée. Mais bon, avant d'en arriver là, on va essayer de faire quelque chose d'utile.</p>


<p>Pour vous présenter le langage, je vous propose un exemple basé sur la fourmi de Langton. C'est une fourmi qui a ceci de particulier qu'elle ne sait que tourner. Son univers ressemble beaucoup à celui du jeu de la vie, c'est-à-dire une grille infinie de cases noires ou blanches. Lorsque la fourmi est sur une case noire, elle tourne à droite, lorsqu'elle est sur une case blanche, elle tourne à gauche. De plus elle inverse la couleur de la case sur laquelle elle se trouve.</p>


<p>Le concept est assez simple, et lorsqu'on lance la fourmi sur une grille blanche, son comportement a l'air aléatoire. Et pourtant au bout d'un moment elle fabrique ce qui ressemble à une autoroute.</p>


<p>Tout ça pour dire que le postscript c'est bien. C'est un langage à pile, qui fonctionne en notation inversée. Les possesseurs de <a href="http://fr.wikipedia.org/wiki/HP-48" hreflang="fr">HP48</a> et amateurs de RPL y retrouveront leurs petits (ou de vieux souvenirs). Les développeurs  <a href="http://fr.wikipedia.org/wiki/Forth_(langage)" hreflang="fr">forth</a> (faite sous savoir si vous êtes dans la salle) apprécieront aussi probablement.</p>


<h3>La base</h3>

<h4>Les commentaires</h4>

<p>Toute ligne commençant par un % est un commentaire.
Exemple&nbsp;:</p>
<pre>
% Rien
</pre>


<h4>Les commandes</h4>

<p>Les commandes sont des mots simples. Étant donné la notation inversée, la commande se trouve après ses arguments. Par exemple une addition&nbsp;:</p>
<pre>
5 9 add
</pre>


<p>A cette notation est associée une pile. 5 pose 5 sur la pile, 9 pose 9 sur la pile, add retire les 2 derniers éléments (donc 9 et 5) puis additionne et repose le résultat sur la pile. D'où la représentation de la pile&nbsp;:</p>
<pre>
    %avant la ligne de commande
5   % 5 
5 9 % 9
    %pendant le add (invisible)
14  % après le add 
</pre>


<p>Les commandes peuvent être séparées par des espaces ou des retours à la ligne.
<span id="more-413"></span></p>


<h4>Les variables</h4>

<p>Les variables sont définie avec la commande def. Un nom de variable se pose sur la pile avec le préfixe /. Donc pour définir la variable pi</p>
<pre>
/pi 3.1415 def
</pre>


<p>Une variable se lance ou se pose sur la pile avec son nom dans préfixe. Donc pour poser pi sur la pile&nbsp;:</p>
<pre>
pi
</pre>


<h4>Les fonctions</h4>

<p>Une fonction est tout simplement un ensemble d'instruction placées entre { }. Une fonction toute seule n'a que peu d'intérêt, mais une fonction peut être mise dans une variable avec la commande def ce qui permet de la réutiliser autant de fois que voulu.</p>


<p>Exemple une fonction qui incrémente un élément de la pile de 1&nbsp;:</p>
<pre>
/incremente { 1 add } def
</pre>


<h4>Manipulation de la pile</h4>

<p>La pile étant un élément central, il existe des opérateurs pour la manipuler. Le principaux sont&nbsp;:</p>
<ul>
<li>pop&nbsp;: retire un élément de la pile</li>
<li>dup&nbsp;: duplique un élément de la pile</li>
<li>exch&nbsp;: échange les 2 derniers éléments de la pile</li>
<li>pstack&nbsp;: affiche le contenu de la pile (utile pour le debug)</li>
<li>clear&nbsp;: vide la pile</li>
</ul>


<h4>L'affichage</h4>

<p>L'affichage étant le but ultime de postscript, vous comprendrez qu'il y a beaucoup de primitives d'affichage, essentiellement vectoriel.</p>


<p>Regardez bien ça vous rappellera le <a href="http://fr.wikipedia.org/wiki/Logo_%28langage%29" hreflang="fr">logo</a>. Dessinons un carré&nbsp;:</p>
<pre>
newpath
0 0 moveto
10 0 rlineto
10 10 rlineto
0 10 rlineto
0 0 rlineto
stroke
</pre>


<p>Petite astuce si vous testez les commandes, chaque dessin doit se terminer par un showpage (ici par exemple, juste après le stroke), cela affiche le contenu du buffer sur une page et passe à la feuille suivante.</p>


<p>Quelques exemples de commande&nbsp;:</p>
<ul>
<li>setlinewidth (un paramètre&nbsp;: la largeur de trait)</li>
<li>closepath (ferme le dessin)</li>
<li>fill (remplit un chemin fermé)</li>
</ul>

<h4>Contrôle de flux</h4>

<p>Tous comme n'importe quel langage, le postscript permet des boucles et des if sous la forme "booléen méthode if". Par exemple&nbsp;:</p>
<pre>
% incrémente le dernier élément de la pile s'il est inférieur à 10
dup 10 lt { 1 add } if
</pre>


<p>Pour une boucle for, même topo. Exemple une somme de 1 à 10&nbsp;:</p>
<pre>
% valeur initiale
0 
% début incrément fin méthode for
1 1 10 { add } for
</pre>


<p>Voilà, je n'ai fait que survoler le langage, vous trouverez plus de détail dans ce livre <a href="http://www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF" hreflang="en">référence</a>.</p>


<h3>Un exemple</h3>

<p>Pour continuer, j'ai écrit un petit exemple commenté <a href="http://linux-attitude.fr/public/Code/fourmi.ps">disponible en téléchargement</a>. Vous pouvez l'ouvrir avec un éditeur de texte ou utilise ps2pdf pour le rendre affichable. Cet exemple génère 75 pages visibles en PDF, chaque page correspond à 150 itérations du mouvement de la fourmi.</p>


<p>Lisez-le vous verrez que finalement le postscript c'est pas trop compliqué quand c'est pas écrit par une machine sur une seule ligne.</p>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/postscript-est-un-langage-de-script' rel='bookmark' title='Permanent Link: Postscript est un langage &#8230; de script'>Postscript est un langage &#8230; de script</a></li>
<li><a href='http://linux-attitude.fr/post/torture-de-cerveau' rel='bookmark' title='Permanent Link: Torture de cerveau'>Torture de cerveau</a></li>
<li><a href='http://linux-attitude.fr/post/calculatrice-en-ligne-de-commande' rel='bookmark' title='Permanent Link: Calculatrice en ligne de commande'>Calculatrice en ligne de commande</a></li>
</ol>
	Tags:<a href="http://linux-attitude.fr/tag/code" title="Code" rel="tag">Code</a>, <a href="http://linux-attitude.fr/tag/curiosite" title="Curiosité" rel="tag">Curiosité</a><br />
]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/un-interpreteur-fantome/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl est votre ami</title>
		<link>http://linux-attitude.fr/post/perl-est-votre-ami?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=perl-est-votre-ami</link>
		<comments>http://linux-attitude.fr/post/perl-est-votre-ami#comments</comments>
		<pubDate>Mon, 18 May 2009 18:57:00 +0000</pubDate>
		<dc:creator>peck</dc:creator>
				<category><![CDATA[Développement]]></category>

		<guid isPermaLink="false">http://linux-attitude.fr/post/perl-est-votre-ami</guid>
		<description><![CDATA[Niveau&#160;: &#160;&#160;&#160;&#160;&#160; Résumé&#160;: perlconsole Vous développez régulièrement vos scripts en perl&#160;? Si oui&#160;: lisez ceci ou cela ou encore d'autres choses plus ou moins utiles. Si oui vous devez faire des tests de temps en temps. Je me suis habitué à faire des perl -e ou perl -pe pour des petites choses. Mais il existe [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Niveau</strong>&nbsp;: <span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="s">&nbsp;</span><span class="e">&nbsp;</span><span class="e">&nbsp;</span><br />
<strong>Résumé</strong>&nbsp;: perlconsole</p>


<p>Vous développez régulièrement vos scripts en perl&nbsp;?
Si oui&nbsp;: lisez <a href="http://linux-attitude.fr/post/Perles">ceci</a> ou <a href="http://linux-attitude.fr/post/Soyez-r%C3%A9guliers-%281%">cela</a> ou <a href="http://linux-attitude.fr/post/Soyez-r%C3%A9gulier-%282%29">encore</a> d'autres <a href="http://linux-attitude.fr/post/En-finir-avec-sed-awk-grep">choses</a> plus ou moins <a href="http://linux-attitude.fr/Le-perl-completement-inutile">utiles</a>.</p>


<p>Si oui vous devez faire des tests de temps en temps. Je me suis habitué à faire des perl -e ou perl -pe pour des petites choses.
Mais il existe un outil bien plus pratique&nbsp;: perlconsole.</p>


<p>Son usage est simple&nbsp;:</p>
<pre>
$ perlconsole
</pre>


<p>Pour le debug, cet outil est sympa puisqu'il permet de taper les commandes une par une et d'en avoir la valeur de retour.</p>


<p>Pour le développement cet outil est parfois un peu lourd puisqu'il renvoie la valeur de retour de toutes les commandes tapées, même si cela ne nous intéresse pas vraiment.</p>


<p>Autre fonctionnalité qui ravira certains, les valeurs de retours peuvent être affichées sous différentes formes. Ce qui veut dire qu'il est possible d'avoir un dump complet du résultat de chaque commande.
Il suffit pour cela d'entrer la commande suivante pour les habitués de Data::Dumper&nbsp;:</p>
<pre>
:set output=dumper
</pre>


<p>Mais il existe aussi une sortie yaml, que je trouve personnellement plus lisible pour des structures ne dépassant pas une page.</p>
<pre>
:set output=yaml
</pre>

<p></p><p>Si vous avez aimé, il y a aussi : </p><ol><li><a href='http://linux-attitude.fr/post/le-perl-completement-inutile' rel='bookmark' title='Permanent Link: Le perl complètement inutile'>Le perl complètement inutile</a></li>
<li><a href='http://linux-attitude.fr/post/perles' rel='bookmark' title='Permanent Link: Perles'>Perles</a></li>
<li><a href='http://linux-attitude.fr/post/le-c-est-plus-lisible-que-le-perl' rel='bookmark' title='Permanent Link: Le C est plus lisible que le perl'>Le C est plus lisible que le perl</a></li>
</ol>Aucun tag pour cet article.]]></content:encoded>
			<wfw:commentRss>http://linux-attitude.fr/post/perl-est-votre-ami/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced (User agent is rejected)
Database Caching 22/94 queries in 0.210 seconds using apc
Object Caching 1691/1764 objects using apc
Content Delivery Network via N/A

Served from: linux-attitude.fr @ 2012-02-10 10:46:30 -->
