<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://cygal.info/blog/index.php/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Dissidents - Script</title>
  <link>http://cygal.info/blog/index.php/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Tue, 01 Apr 2008 21:56:24 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Même les foetus mentent ...</title>
    <link>http://cygal.info/blog/index.php/post/Meme-les-foetus-mentent</link>
    <guid isPermaLink="false">urn:md5:d4f94b55791878ea8d83a74515d956ed</guid>
    <pubDate>Sun, 04 Nov 2007 15:24:00 +0100</pubDate>
    <dc:creator>Dark-Side</dc:creator>
        <category>Script</category>
        <category>prolog</category><category>sex</category>    
    <description>Bonjour, bonjour.&lt;br /&gt;
Bon avant de commencer : le titre n'a rien à voir avec l'article, mais depuis 3x17 je reve de sortir cette phrase, alors bon ... c'est fait ! :]    &lt;h3&gt;Le prolog&lt;/h3&gt;

&lt;h4&gt;Présentation&lt;/h4&gt;

Le Prolog est un langage de programmation. Sa particularité est d'être un langage de programmation &lt;i&gt;logique&lt;/i&gt;, d'où son nom : PROgrammation LOGique. Ce type de programmation se démarque des autres par son absence de notions tels que les fonctions (qu'on retrouve bien entendu, mais c'est pas aussi explicite qu'en impératif ou même en fonctionnel) ou boucles, ...&lt;br /&gt;
Par contre on y trouve des idées intéressantes. En effet un programme développé en prolog repose sur un ensembles de &lt;b&gt;clauses&lt;/b&gt;, des &lt;i&gt;faits&lt;/i&gt; ou des &lt;i&gt;règles&lt;/i&gt;.&lt;br /&gt;
Il faut savoir que le &lt;b&gt;&lt;i&gt;prolog&lt;/i&gt;&lt;/b&gt; est très utilisé pour établir des &lt;i&gt;intelligences artificielles&lt;/i&gt;, en effet grâce on clauses on va très facilement définir le comportement de notre IA.
&lt;br /&gt;&lt;br /&gt;
&lt;h4&gt;Un code en exemple : factoriel&lt;/h4&gt;

Oui, je sais, j'ai dit que les fonctions n'éxistaient pas. Mais ça ne veut pas dire qu'on ne peut pas en créer, ça veut dire qu'elles sont moins apparentes que d'habitude.&lt;br /&gt;
Comment ça je suis tordu ?&lt;br /&gt;
Bref voici le code :
&lt;pre&gt;fact(0,1). % ceci est un fait
fact(X, Y) :- N is X-1, fact(N, M), Y is X * M. % et ça une règle&lt;/pre&gt;
Comme vous pouvez le voir la première clause est un fait, c-a-d que pour tout X fact(0, X) renverra X = 1. Ce qui est marrant avec les faits c'est que leur réciproque marche de la même manière, ainsi fact(X, 1) renverra toujours X = 0. Donc avec un unique fait on a déclaré deux clauses.&lt;br /&gt;
Un autre truc marrant c'est que si jamais vous demandez à l'interpreteur si la relation fact(0,2) est vrai il va gentillement vous répondre : «No.»&lt;br /&gt;
L'autre truc fun c'est que si après on avait écrit fact(0, 2). lorsqu'on aurait demandé fact(0, X). l'interpreteur nous aurait fait la liste de toutes les réponses possibles.
&lt;br /&gt;&lt;br /&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;

Il est vrai que je n'ai pas fini de vous détailler le code précédent mais je suis pas là pour vour apprendre à coder, juste pour vous faire découvrir.&lt;br /&gt;
J'essayerai de vous montrer une belle IA un de ces jours histoire que vous vous rendiez bien compte de l'interet du prolog. En attendant j'espère vous avoir suffisament intéressé pour que vous vous documentiez un peu sur le prolog.&lt;br /&gt;
Au revoir.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Liens externes :&lt;/h4&gt;
:: &lt;a href=&quot;http://fr.wikipedia.org/wiki/Prolog&quot;&gt;Le prolog sur wikipedia&lt;/a&gt;. (fr)&lt;br /&gt;
:: &lt;a href=&quot;http://bat710.univ-lyon1.fr/~csolnon/prolog.html&quot;&gt;Une bonne introduction pour débuter en prolog&lt;/a&gt;. (fr)&lt;br /&gt;
:: &lt;a href=&quot;http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/contents.html&quot;&gt;Un bon tuto&lt;/a&gt;. (en)</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Meme-les-foetus-mentent#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Meme-les-foetus-mentent#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/41</wfw:commentRss>
      </item>
    
  <item>
    <title>Les property</title>
    <link>http://cygal.info/blog/index.php/post/Les-property</link>
    <guid isPermaLink="false">urn:md5:4c90537e04262440dbe6fe5525630683</guid>
    <pubDate>Sat, 01 Sep 2007 16:27:00 +0000</pubDate>
    <dc:creator>Pmol</dc:creator>
        <category>Script</category>
        <category>python</category>    
    <description>&lt;p&gt;Ou comment appeler une fonction lorsque l'on accède à un attribut.&lt;/p&gt;    &lt;p&gt;Prenons un exemple.
Vous avez une classe &lt;code&gt;Rectangle&lt;/code&gt; qui a deux attributs&amp;nbsp;: &lt;code&gt;longueur&lt;/code&gt; et &lt;code&gt;largeur&lt;/code&gt;. Vous pouvez les redéfinir à volonté, bien.&lt;/p&gt;

&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; class Rectangle(object):
...     def __init__(self, longueur, largeur):
...             self.longueur = longueur
...             self.largeur = largeur
... 
&amp;gt;&amp;gt;&amp;gt; a = Rectangle(10, 1)
&amp;gt;&amp;gt;&amp;gt; a.longueur
10
&amp;gt;&amp;gt;&amp;gt; a.longueur = 15
&amp;gt;&amp;gt;&amp;gt; a.longueur
15
&lt;/pre&gt;


&lt;p&gt;Mais s'il vous prend l'idée subite et stupide d'ajouter un attribut &lt;code&gt;aire&lt;/code&gt;, comment allez-vous faire pour que sa valeur soit toujours exacte&amp;nbsp;? Si vous modifiez la longueur du rectangle, il y aura un problème.&lt;/p&gt;
&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; a.aire = a.longueur * a.largeur
&amp;gt;&amp;gt;&amp;gt; a.aire
15
&amp;gt;&amp;gt;&amp;gt; a.largeur = 3
&amp;gt;&amp;gt;&amp;gt; a.aire
15
&lt;/pre&gt;

&lt;p&gt;Bien que la largueur du rectangle ait changée, l'aire n'a pas bougé d'un poil. C'est un comportement normal (c'est une simple variable), mais ce n'est pas le comportement souhaité. On peut utiliser une fonction &lt;code&gt;trouverAire()&lt;/code&gt; ou &lt;code&gt;aire()&lt;/code&gt;, mais c'est nettement moins sex' qu'une variable non&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Mais Python nous offre (comme d'autres langages) une solution adaptée à notre problème&amp;nbsp;: les &lt;em&gt;properties&lt;/em&gt;. Grâce au type prédéfini &lt;code&gt;property&lt;/code&gt;, on va pouvoir créer un attribut spécial de la classe Rectangle, qui sera (du côté utilisateur de la classe) identique à un attribut simple.
Cet attribut est spécial dans le sens où, lorsqu'on veut accéder à sa valeur, la modifier ou le supprimer, on passe part des fonctions.
Même si vous vous en foutez sûrement, voici  la signature de &lt;code&gt;property&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;
property(fget = None, fset = None, fdel = None, doc = None) -&amp;gt; property attribute
&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;fget&lt;/code&gt; est appelé quand on demande la valeur de l'attribut, &lt;code&gt;fset&lt;/code&gt; lorsqu'on affecte à l'attribut une valeur et &lt;code&gt;fdel&lt;/code&gt; quand on veut supprimer l'attribut. &lt;code&gt;doc&lt;/code&gt; est l'éventuelle docstring de l'attribut.&lt;/p&gt;


&lt;p&gt;Si on reprend notre exemple de rectangles, lorsque l'utilisateur va demander la valeur de l'aire de notre rectangle, Python appellera une fonction prédéfinie qui va renvoyer, après calcul, la valeur de l'aire. Cette valeur sera toujours correcte, puisque recalculée à chaque demande. Exemple&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; class Rectangle(object):
...     def __init__(self, largeur, hauteur):
...             self.largeur = largeur
...             self.hauteur = hauteur
...     def _getAire(self):
...             return self.largeur * self.hauteur
...     aire = property(_getAire)
... 
&amp;gt;&amp;gt;&amp;gt; a = Rectangle(10, 5)
&amp;gt;&amp;gt;&amp;gt; a.aire
50
&amp;gt;&amp;gt;&amp;gt; a.largeur = 3
&amp;gt;&amp;gt;&amp;gt; a.aire
15
&lt;/pre&gt;


&lt;p&gt;Ici, chaque instance la classe Rectangle a un attribut &lt;code&gt;aire&lt;/code&gt; en &lt;strong&gt;lecture seule&lt;/strong&gt; (si un des trois paramètres n'est pas donné, alors l'opération correspondante lève une exception), recalculé à chaque demande.&lt;/p&gt;</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Les-property#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Les-property#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/37</wfw:commentRss>
      </item>
    
  <item>
    <title>Du code en Python</title>
    <link>http://cygal.info/blog/index.php/post/Du-code-en-Python</link>
    <guid isPermaLink="false">urn:md5:d33df24537929e09dcd02a575ab2d56f</guid>
    <pubDate>Sun, 22 Jul 2007 09:19:00 +0000</pubDate>
    <dc:creator>Poulet</dc:creator>
        <category>Script</category>
        <category>python</category>    
    <description>    &lt;p&gt;Parce que trop de sucre rend &lt;del&gt;idiot&lt;/del&gt; diabétique. &lt;a href=&quot;http://docs.python.org/lib/defaultdict-examples.html&quot;&gt;Visit my website&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Du-code-en-Python#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Du-code-en-Python#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/31</wfw:commentRss>
      </item>
    
  <item>
    <title>Du sucre en ruby</title>
    <link>http://cygal.info/blog/index.php/post/Du-sucre-en-ruby</link>
    <guid isPermaLink="false">urn:md5:dfe4b1861f1f4ffdfacc4e4ef8f797af</guid>
    <pubDate>Sat, 21 Jul 2007 14:57:00 +0200</pubDate>
    <dc:creator>ArtMoonik</dc:creator>
        <category>Script</category>
        <category>hachage</category><category>ruby</category>    
    <description>&lt;p&gt;Les Hash faciles et pratiques.&lt;/p&gt;    &lt;p&gt;Quand on est amené à faire du &lt;a href=&quot;http://fr.wikipedia.org/wiki/Fonction_de_hachage&quot; hreflang=&quot;fr&quot;&gt;hachage&lt;/a&gt; en ruby, on fait des trucs genre:&lt;/p&gt;
&lt;pre&gt;
tableau[cle] &amp;lt;&amp;lt; donnee
&lt;/pre&gt;


&lt;p&gt;Bien sur si c'est la première fois qu'on croise cette clé alors on aura une erreur genre:&lt;/p&gt;
&lt;pre&gt;
NoMethodError: undefined method `&amp;lt;&amp;lt;' for nil:NilClass
&lt;/pre&gt;

&lt;p&gt;Donc à la place on fait:&lt;/p&gt;
&lt;pre&gt;
tableau[cle] = [donnee]
&lt;/pre&gt;

&lt;p&gt;Au final ca donne:&lt;/p&gt;
&lt;pre&gt;
if tableau[cle].nil? then
   tableau[cle] = [donnee]
else
    tableau[cle] &amp;lt;&amp;lt; donnee
end
&lt;/pre&gt;


&lt;p&gt;Bien sûr c'est horriblement laid et ca prend de la place et ca fait perdre du temps, bref ca pue. Donc, alternative, donnons à notre Hash 'tableau' une valeur par défaut autre qu'un nil, soit un Array ici:&lt;/p&gt;
&lt;pre&gt;
tableau = Hash.new { |h,k| h[k] = [] }
tableau[cle] &amp;lt;&amp;lt; donnee
&lt;/pre&gt;


&lt;p&gt;Et puis le hachage, c'est bien :)
Bonsoir les loutres.&lt;/p&gt;</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Du-sucre-en-ruby#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Du-sucre-en-ruby#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/30</wfw:commentRss>
      </item>
    
  <item>
    <title>Debout les gars, réveillez-vous !</title>
    <link>http://cygal.info/blog/index.php/post/Debout-les-gars-reveillez-vous</link>
    <guid isPermaLink="false">urn:md5:b697ea589dc1e5c026862ac062ad70f7</guid>
    <pubDate>Mon, 02 Jul 2007 07:23:00 +0000</pubDate>
    <dc:creator>Poulet</dc:creator>
        <category>Script</category>
        <category>fonctionnel</category><category>python</category>    
    <description>&lt;p&gt;Salut les poulpes. &lt;q&gt;Ouaaaaais !&lt;/q&gt; firent les poulpes.&lt;/p&gt;


&lt;p&gt;Comme vous êtes un peu morts ces jours-ci, un petit truc pour vous détendre les zygomatiques, à vous, oui, vous qui ne pratiquez pas des langages pseudo-fonctionnels, mais des vrais langages de mâles.&lt;/p&gt;    &lt;p&gt;Dans un langage normal, disons, &quot;sympa&quot;, on aurait ça&amp;nbsp;: &lt;code&gt;let sommelong = map length&lt;/code&gt;. C'est lisible (sous réserve d'un peu d'habitude peut-être), c'est efficace. Après, on rigole bien, on a une fonction de type &lt;code&gt;[[a]] -&amp;gt; [Int]&lt;/code&gt;, on peut écrire &lt;code&gt;sommelong [[1, 2, 3], [3,4]]&lt;/code&gt; aussi bien que &lt;code&gt;sommelong [&quot;Foo&quot;, &quot;BarBarBar&quot;]&lt;/code&gt;, ce qui est totalement inutile (ça prouve bien que mon exemple est à chier), mais c'est bien et tout. Pour les étrangers incultes et barbares, c'est une application partielle&amp;nbsp;: map est de type &lt;code&gt;(a -&amp;gt; b) -&amp;gt; [a] -&amp;gt; [b]&lt;/code&gt;, c'est à dire que son premier argument est une fonction prenant un type a quelconque (enfin, je crois) et renvoyant un type b tout aussi quelconque (même pas forcément le même). Or si on écrit &lt;code&gt;map length&lt;/code&gt; (comme on l'a fait juste au début, ça n'est pas un hasard), on crée une nouvelle valeur fonctionnelle qui correspond à un map dont le premier argument est length - cependant cette valeur fonctionnelle est directement utilisable comme fonction. On peut donc lui nommer un nom (comme on a fait) et l'appliquer après à des listes (comme on a fait aussi), genre &lt;code&gt;sommelong uneliste&lt;/code&gt;. C'est comme si l'on avait fait &lt;code&gt;map length uneliste&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Dans un langage moins sympa (zB. Python) mais qui essaye de se faire des potes poulpes (&lt;q&gt;Ouaaaaais !&lt;/q&gt;), on est bien emmerdé, parce que&amp;nbsp;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On a bien une fonction map, qui prend en argument une fonction et une liste (en fait, &quot;pas seulement&quot;, mais compliquons pas, tfaçon ça marche).&lt;/li&gt;
&lt;li&gt;On a bien une fonction len, qui sert à calculer la longueur d'une séquence^W liste.&lt;/li&gt;
&lt;li&gt;Mais on sait pas comment combiner les deux.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On pourrait faire une fonction chiante qui se tape ce rôle, mais ça sert à rien que je le fasse puisque la doc officielle donne de toute façon le code correspondant. Moi, je voulais juste vous dire que ça existe, sous le nom de functools.partial dans Python 2.5&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; import functools
&amp;gt;&amp;gt;&amp;gt; sommelong = functools.partial(map, len)
&amp;gt;&amp;gt;&amp;gt; sommelong([[1,2,3], &amp;quot;foo&amp;quot;])
[3, 3]
&lt;/pre&gt;

&lt;p&gt;L'exemple est toujours foireux, mais vous êtes cultivé (ou hilare, ce qui est bien aussi).&lt;/p&gt;


&lt;p&gt;Voici donc &lt;a href=&quot;http://docs.python.org/lib/module-functools.html&quot; hreflang=&quot;en&quot;&gt;la page officielle de functools&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;C'est puissant.&lt;/p&gt;</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Debout-les-gars-reveillez-vous#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Debout-les-gars-reveillez-vous#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/28</wfw:commentRss>
      </item>
    
  <item>
    <title>Une corbeille en console [mis à jour][et corrigé]</title>
    <link>http://cygal.info/blog/index.php/post/Une-corbeille-en-console</link>
    <guid isPermaLink="false">urn:md5:b4f438c3d5e00c13eed2c067261eadfe</guid>
    <pubDate>Sun, 03 Jun 2007 15:33:00 +0200</pubDate>
    <dc:creator>Cygal</dc:creator>
        <category>Script</category>
            
    <description>Parce que moi j'ai peuur de perdre mes fichiers.    &lt;p&gt;Lorsque vous travaillez en console (ou avec un quelconque terminal graphique), un conseil répandu est de placer un alias sur rm pour éviter &lt;a hreflang=&quot;en&quot; href=&quot;http://www.justpasha.org/folk/rm.html&quot;&gt;tout plein de malheurs&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;alias rm='rm -i'&lt;/pre&gt;
&lt;p&gt;Une simple erreur de phrase peut être dévastatrice.&lt;/p&gt;
&lt;pre&gt;rm * ~&lt;/pre&gt;
&lt;p&gt;Ce que je vous propose, c'est d'utiliser une &quot;corbeille&quot;, qui, au lieu de supprimer vos fichiers définitivement, les mettra dans un dossier qui vous servira de corbeille. Supposons dans notre cas que ce dossier s'appelle &quot;trash&quot; (vous pouvez aussi le préfixer d'un point pour qu'il soit caché). Il suffit alors de créer un fichier, genre, rm.sh, dans le dossier que vous voulez (ici, on dira &quot;bin&quot;).&lt;/p&gt;
&lt;pre&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;mv &quot;$@&quot; ~/trash/&lt;/pre&gt;&lt;p&gt;La première ligne indique que c'est un script qui devra être lu par sh, et la seconde indique qu'il faudra déplacer tous les arguments dans la corbeille. Ensuite, vous rendez ce programme éxecutable, à l'aide de la commande &lt;code&gt;chmod u+x rm,sh&lt;/code&gt;. Ensuite, vous voulez peut-être &quot;remplacer&quot; &lt;code&gt;rm&lt;/code&gt; par votre rm :
&lt;/p&gt;
&lt;pre&gt;alias rm='~/bin/rm.sh'&lt;/pre&gt;
&lt;p&gt;Et si vous voulez que ça soit définitif, plus qu'à le mettre dans votre fichier .bashrc, par exemple. Vous pouvez aussi une fonction qui videra la poubelle avec des \rm (pour empêcher que l'alias rentre en jeu). Genre, euh :&lt;/p&gt;
&lt;pre&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;\rm ~/trash/*&lt;/pre&gt;
&lt;p&gt;C'est très rustique, parce qu'on ne sait pas où les fichiers étaient avant, et donc pour les restaurer c'est plus chiant (on dira ça sort de l'objet de ce billet, pour s'esquiver sans paraitre trop lâche.). Et puis au moins ils sont pas perdus. Enfin y'a de quoi s'amuser. N'est-il pas ?&lt;/p&gt;</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Une-corbeille-en-console#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Une-corbeille-en-console#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/18</wfw:commentRss>
      </item>
    
  <item>
    <title>Il pleut des tips !</title>
    <link>http://cygal.info/blog/index.php/post/Il-pleut-des-tips</link>
    <guid isPermaLink="false">urn:md5:0eb4067a2fee0edd0a2250dc34ba22a6</guid>
    <pubDate>Wed, 30 May 2007 17:22:00 +0200</pubDate>
    <dc:creator>lasts</dc:creator>
        <category>Script</category>
            
    <description>&lt;p&gt;Aujourd'hui, j'avais envie de me synchroniser avec mon hébergeur favori de manière à gérer mes fichiers sans me préoccuper de l'aspect ftp (ouais ouais, je sais, ça serait plus simple si j'utilisais konqueror, mais non).&lt;/p&gt;    &lt;p&gt;Pour me synchroniser, j'utilise un script lftp :&lt;/p&gt;
&lt;pre&gt;open &amp;lt;ftp.bidule.truc&amp;gt;&lt;br /&gt;user &amp;lt;login&amp;gt; &amp;lt;pass&amp;gt;&lt;br /&gt;mirror -R &amp;lt;localdir&amp;gt; &amp;lt;ftpdir&amp;gt;&lt;br /&gt;exit&lt;/pre&gt;
&lt;p&gt;L'option &lt;code&gt;-R&lt;/code&gt; permet de copier les fichiers du dossier local vers le ftp (et sans, bah, c'est dans l'autre sens et ça peut aussi être pratique). Suivant votre utilisation, on notera aussi les options &lt;code&gt;-c&lt;/code&gt;, &lt;code&gt;-n&lt;/code&gt; et &lt;code&gt;-N&lt;/code&gt; (&lt;code&gt;help mirror&lt;/code&gt; dans l'invite d'lftp pour en savoir plus). Le script s'utilise via la commande &quot;&lt;code&gt;lftp -f ftpsync.script&lt;/code&gt;&quot;. Bref, ça marche bien et ça permet de révolutionner le web2.0 en produisant des pages webs statiques qui s'actualisent à interval irrégulier.&lt;/p&gt;
&lt;p&gt;Par exemple, si vous voulez créer un pastebin-like :&lt;/p&gt;
&lt;pre&gt;#!/usr/bin/zsh&lt;br /&gt;&lt;br /&gt;FTP='ftp.goldzoneweb.info'&lt;br /&gt;LOGIN='lastsseldon'&lt;br /&gt;PASS='whatever'&lt;br /&gt;URL='http://lasts.goldzoneweb.info/'&lt;br /&gt;FTP_DIR='/home/lasts/ftp/'&lt;br /&gt;PASTE_DIR='paste/'&lt;br /&gt;&lt;br /&gt;source-highlight -i $1 -o $FTP_DIR$PASTE_DIR$1:t.html&lt;br /&gt;lftp -f =(echo &quot;open $FTP&lt;br /&gt;user $LOGIN $PASS&lt;br /&gt;mirror -R $FTP_DIR$PASTE_DIR $PASTE_DIR:t&lt;br /&gt;exit&quot;)&lt;br /&gt;echo $URL$PASTE_DIR$1:t.html&lt;/pre&gt;
&lt;p&gt;Script qui s'utilise via la commande &quot;&lt;code&gt;./pastebin.sh mon-super-code.truc&lt;/code&gt;&quot; et qui retourne l'url du fichier uploadé et colorisé (dépendances: zsh, source-highlight et lftp). En attendant que j'apprenne à commenter mes sources (mais c'est pas de ma faute si vous parlez pas le zsh), mon mien est &lt;a hreflang=&quot;fr&quot; href=&quot;http://lasts.goldzoneweb.info/paste/&quot;&gt;là&lt;/a&gt;, à titre de démo technologique.&lt;/p&gt;
&lt;p&gt;On peut aussi imaginer monter une galerie d'images (&lt;code&gt;apt-cache search gallery&lt;/code&gt;), un blog ou autre avec ce système. Bref, un tips magique qui permet de faire le malin lors des concours du bureau le productif (&quot;&lt;em&gt;woh l'autre, pff l'autre, trois clics pour paster ses fichiers, la hoonte&lt;/em&gt;&quot;).&lt;/p&gt;
&lt;p&gt;Youpi.&lt;/p&gt;</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Il-pleut-des-tips#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Il-pleut-des-tips#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/16</wfw:commentRss>
      </item>
    
  <item>
    <title>Vlà une idée qu'elle est pas terrible</title>
    <link>http://cygal.info/blog/index.php/post/2007/05/19/7-vla-une-idee-qu-elle-est-pas-terrible</link>
    <guid isPermaLink="false">urn:md5:ac77a583358a61323cfd8a3c1f36edc0</guid>
    <pubDate>Sat, 19 May 2007 11:52:06 +0000</pubDate>
    <dc:creator>Poulet</dc:creator>
        <category>Script</category>
        <category>python</category>    
    <description>&lt;p&gt;La tarte, ça appelle le poulet. Ou “comment contre-attaquer avant qu'il se soit rien passé”.&lt;/p&gt;    &lt;p&gt;Bien le bonjour. Une fois n'est pas coutume, je viens de trouver le moyen d'être chiant, d'une part en étant plus productif que mes collègues, d'autre part en produisant de l'inutilité.&lt;/p&gt;


&lt;p&gt;Vlà-t'y pas que pas plus tard qu'hier, sur le canal où nous nous retrouvons pour le moment (#sdz-unix sur irc.epiknet.org), ArtMoonik a une super idée (comme ça lui arrive souvent d'ailleurs), et ne résiste pas au plaisir de nous en faire part&amp;nbsp;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;ArtMoonik: va falloir qu'on floode de ruby&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Si c'est pas génial, ça, madame.&lt;/p&gt;


&lt;p&gt;Donc moi, naturellement pas trop favorable à la chose, je prends sur moi, et réfléchis. Et là je me dis&amp;nbsp;: &quot;mais on n'a qu'à faire l'inverse !&quot;.&lt;/p&gt;


&lt;p&gt;Ce que j'essaye de dire au moyen de mon &lt;a href=&quot;http://jclat.typepad.com/think/2005/03/immarcescible.html&quot; hreflang=&quot;fr&quot;&gt;immarcescible&lt;/a&gt; talent de comédien-metteur en scène (si, on peut placer immarcescible dans cette phrase, je vois pas le problème), ce que désormais, tous les jours sauf le dimanche (d'où l'intérêt de commencer un samedi), j'aurai la joie de vous infliger “Le Truc En Python Du Jour”. Ça va être pénible, inutile, je doute tenir la longueur, mais ça me fera une raison pour faire de la pub pour le blog&amp;nbsp;: “Hé, toi qui kiffes le Python, tu savais ça&amp;nbsp;? Et ça ?”.&lt;/p&gt;


&lt;p&gt;Permettez-moi donc d'introduire le premier de cette longue liste de scripts (ou de bouts de) niaiseux&amp;nbsp;: &lt;a href=&quot;http://dashuhn.free.fr/kamoulox.rb.py&quot; hreflang=&quot;fr&quot;&gt;kamoulox.rb.py&lt;/a&gt;. C'est une traduction du &lt;a href=&quot;http://cygal.info/blog/index.php/2007/05/19/5-rubykamoulox-parce-que-une-tarte-ecarlate-ca-appelle-la-corne-contractuelle&quot; hreflang=&quot;fr&quot;&gt;script kamoulox d'ArtMoonik&lt;/a&gt;. Vous devriez pouvoir à peu près tout lire, mais détaillons un petit peu.&lt;/p&gt;


&lt;p&gt;Le début me semble à peu près compréhensible, on note la traduction de empty? des chaînes par une comparaison avec la chaîne vide, celle du mystérieux caractère 35 par un '#' (parce que oui ce sont les mêmes), un &quot;strippage&quot; quasi inutile (mais j'aime bien) sur clef et contenu, la traduction une nouvelle fois du empty? sur le hash par un truc un peu plus riche sémantiquement parlant (ne niez pas §§), et l'utilisation d'une fonction nommée (définie de façon interne) pour sub, là où Ruby utilise un bloc (encore une fois si on avait de vraies lambdas en Python...). De plus, plutôt que de rajouter une méthode à list (ce qui aurait été compliqué vu que c'est pas possible par défaut), on utilise choice du module random. On note également que ce que sub transmet à la fonction qu'il invoque, c'est un &lt;a href=&quot;http://www.python.org/doc/2.1.3/lib/match-objects.html&quot; hreflang=&quot;en&quot;&gt;objet match&lt;/a&gt;, pas une chaîne.&lt;/p&gt;


&lt;p&gt;La fonction sub permet donc d'appeler une fonction (ici, on peut aussi lui transmettre une chaîne de remplacement à la place) en lui passant le résultat d'une capture à l'aide d'une regex. Ici, la regex [(\w)_\|]* qu'elle est belle sert à capter tous les mots, plus les _ et les |.&lt;/p&gt;


&lt;p&gt;Voilà voilà, ce script est un peu plus compliqué que ce qui suivra (normalement), étant donné que je montrerai par la suite plus &quot;d'astuces&quot; Pythonniques que de vrais programmes, mais on ne sait jamais.&lt;/p&gt;</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/2007/05/19/7-vla-une-idee-qu-elle-est-pas-terrible#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/2007/05/19/7-vla-une-idee-qu-elle-est-pas-terrible#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/6</wfw:commentRss>
      </item>
    
  <item>
    <title>RubyKamoulox, parce que une tarte écarlate, ca appelle la corne contractuelle.</title>
    <link>http://cygal.info/blog/index.php/post/2007/05/19/5-rubykamoulox-parce-que-une-tarte-ecarlate-ca-appelle-la-corne-contractuelle</link>
    <guid isPermaLink="false">urn:md5:5795cc1653d309280e0c8f31a1e61003</guid>
    <pubDate>Sat, 19 May 2007 00:15:00 +0000</pubDate>
    <dc:creator>ArtMoonik</dc:creator>
        <category>Script</category>
        <category>inutile</category><category>ruby</category>    
    <description>&lt;p&gt;Il s'agit donc de coder un script qui génère des Kamoulox automatiquement, c'est à dire faire générer un truc sans sens à une machine logique. Tout ceci en ruby évidemment.&lt;/p&gt;    &lt;p&gt;First of all, si vous ne savez pas ce qu'est un Kamoulox, documentez vous chez nos confrères communautaires de chez &lt;a href=&quot;http://fr.wikipedia.org/wiki/Kamoulox&quot; hreflang=&quot;fr&quot;&gt;Wikipédia&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Second of all, pour profiter de la formidable aventure dans laquelle je vous entraine, il vous faut un interpréteur ruby d'installé, disons version 1.8 (c'est la plus en vogue à ce jour).&lt;/p&gt;


&lt;p&gt;Codons donc. En fait on triche puisque on utilise les fonctions random que les gentils développeurs du langage se sont fait suer à programmer (au passage, et note personnelle, ca doit être assez intéressant de voir comment c'est fait). Le problème c'est donc de faire un truc le plus large possible, tout en étant le plus simple possible. Vous codez ca comme vous voulez, chez moi ca donne ca:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://artmoonik.free.fr/gag/kamoulox.rb&quot;&gt;kamoulox.rb&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Expliquer le code n'a ici rien d'intéressant, vous pouvez juste noter la définition de la méthode random de Array, et la méthode (oui parce qu'on ne dit pas fonction en ruby) récursive kamoulox.&lt;/p&gt;


&lt;p&gt;L'idée est de demander à cette fonction de prendre une phrase de base, répondant au mot-clé 'kamoulox' (ligne 42), et d'en analyser chacun des mots. Si le mot est un mot-clé, alors on appelle la fonction kamoulox avec ce mot-clé, et on le remplace avec le résultat, sinon on garde le mot normal.&lt;/p&gt;


&lt;p&gt;Comme vous mourrez d'envie d'essayer, je vous offre sans supplément un fichier data2.txt (la version 1 était moins bien): &lt;a href=&quot;http://artmoonik.free.fr/gag/data2.txt&quot; hreflang=&quot;fr&quot;&gt;data2.txt&lt;/a&gt;&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Placez le dans le même dossier que kamoulox.rb, et lancez kamoulox.rb. Ca donne approximativement:&lt;/p&gt;


&lt;pre&gt;artmoonik@woodstock:~/Desktop/Kamoulox$ ruby kamoulox.rb

Kamoulox...
Appuyer sur Entrée pour générer une phrase ('q' pour quitter):

Jalouse urbanisée !
Masqué masqué !
Transatlantique urbanisée !&lt;/pre&gt;


&lt;p&gt;Notez la pauvreté du vocabulaire, qui fait qu'on se retrouve avec plusieurs fois le même mot, assez rapidement. Pour y remédier il suffit d'ajouter des entrées dans le fichier data2.txt.&lt;/p&gt;


&lt;p&gt;Cela dit, promis, la prochaine fois on parle d'un truc utile.&lt;/p&gt;


&lt;p&gt;PS: Comme le disait Lao Tseu, 'Une corne, ca appelle une pêche.'&lt;/p&gt;</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/2007/05/19/5-rubykamoulox-parce-que-une-tarte-ecarlate-ca-appelle-la-corne-contractuelle#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/2007/05/19/5-rubykamoulox-parce-que-une-tarte-ecarlate-ca-appelle-la-corne-contractuelle#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/4</wfw:commentRss>
      </item>
    
</channel>
</rss>