<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.finiderire.com/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/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Vim est ton ami.</title>
  <link>http://www.finiderire.com/</link>
  <atom:link href="http://www.finiderire.com:82/feed/rss2" rel="self" type="application/rss+xml"/>
  <description>Pour les codeurs qui ne perdent pas leur temps avec les IDE.</description>
  <language>fr</language>
  <pubDate>Tue, 07 Feb 2012 13:32:34 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>IRC: Wee ou non ?</title>
    <link>http://www.finiderire.com/post/2011/12/11/IRC%3A-Wee-ou-non</link>
    <guid isPermaLink="false">urn:md5:3e21c8abc9d1ebfe182b2b208a7a5afb</guid>
    <pubDate>Sun, 25 Dec 2011 19:29:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Linux</category><category>tools</category>    
    <description>&lt;p&gt;&lt;em&gt;Vous connaissez tous IRC, et principalement Freenode, l'auberge
espagnole du Logiciel Libre.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Pour le client à utiliser, c'est une autre histoire…&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Pendant des années, j'ai utilisé Irssi. Et puis, un jour…&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Un jour j'en ai eu marre d' Irssi.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Irssi est le choix par défaut des utilisateurs Linux pour IRC.&lt;/li&gt;
&lt;li&gt;Il faut dire que la concurrence n'est (n'était) pas brillante,&lt;/li&gt;
&lt;li&gt;Pourtant, on ne peut pas dire que Irssi soit le parangon du client
IRC.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Irssi la branche sur laquelle il est assis&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Irssi présente de nombreux défauts, ou tout du moins de sérieuses
limitations:
&lt;ul&gt;
&lt;li&gt;son horrible fichier de configuration (colorer différement la barre de
stats du buffer actif fut un vrai défi).&lt;/li&gt;
&lt;li&gt;un scripting limité à Perl.&lt;/li&gt;
&lt;li&gt;une ergonomie discutable (la configuration par défaut est
inutilisable).&lt;/li&gt;
&lt;li&gt;une documentation incomplète et incompréhensible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;C'est vrai, il y a d'autres clients IRC&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;BitchX : ha-ha-ha, je vous laisse essayer (il y en a qui
aiment…).&lt;/li&gt;
&lt;li&gt;XChat : qu'il est de bon ton de dénigrer, mais qui a le mérite d'être
simple. On en fait vite le tour, cependant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Voici WeeChat&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Certe, je débarque: ce logiciel existe depuis un certain temps.
&lt;ul&gt;
&lt;li&gt;2005 pour les premières versions exploitables.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il est cependant toujours développé, et comprend de nombreux avantages par
rapport à Irssi.
&lt;ul&gt;
&lt;li&gt;Une doc claire et complète, et en français qui plus est.&lt;/li&gt;
&lt;li&gt;Une configuration aisée. Toutes les modifications sont applicables sans
relancer WeeChat, et peuvent être sauvées depuis celui-ci.&lt;/li&gt;
&lt;li&gt;Une prise en main rapide.&lt;/li&gt;
&lt;li&gt;Scripting avec Lua! Yäh ! Ftaghn Cthulhu Lua ! Et pour le reste
d'entre-vous, il y a aussi la possibilité de scripter en Python, en Perl, en
Ruby ou en TCL.&lt;/li&gt;
&lt;li&gt;Possibilité d'utiliser un client différent du client ncurses proposé par
défaut (pour ceux qui ont honte d'installer XChat).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Premier contact avec WeeChat&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vous retrouverez dans la doc tout ce que je n'ai évidemment pas &lt;a href=&quot;http://www.weechat.org/files/doc/stable/weechat_quickstart.fr.html&quot;&gt;sorti de
nulle part&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Comment qu'ça s'installe ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Boudiou: &lt;code&gt;pacman -S weechat&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Ne vous laissez pas impressionner par le numéro de version (en ce moment:
0.3.6).&lt;/li&gt;
&lt;li&gt;C'est du vrai logiciel libre pleinement fonctionnel, et qui ne cherche pas
à en mettre plein la vue avec une numérotation stratosphérique des
versions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Déroulement d'une session typique&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Quelques commandes de base devraient vous sortir d'affaire, sans rien avoir
à configurer pour commencer.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Commençons par lancer WeeChat:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;weechat-curses&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/connect irc.freenode.org&lt;/code&gt; : c'est une connexion
temporaire, nous verrons plus loin comment la rendre permanente.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/join archlinux-fr&lt;/code&gt; : notez la barre des nicks sur le
côté. C'est bien, mais ça prend de la place. Mais comme c'est un élément
d'interface, c'est désactivable.&lt;/li&gt;
&lt;li&gt;À ce stade, il peut être utile de savoir comment se déplacer dans les
fenêtres: &lt;strong&gt;ALT + flèches curseur&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Par défaut, une fenêtre affiche un seul buffer. Par la suite, vous pourrez
afficher plusieurs buffers dans une fenêtre avec les commandes &lt;em&gt;split&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/window splith&lt;/code&gt; : splitte horizontalement.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/window splitv&lt;/code&gt; : coupe verticalement.&lt;/li&gt;
&lt;li&gt;Utilisez &lt;strong&gt;F7&lt;/strong&gt; et &lt;strong&gt;F8&lt;/strong&gt; pour naviguer dans les
splits.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/window zoom&lt;/code&gt; : permet de sortir d'un split (raccourci:
&lt;strong&gt;alt+z&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;N'oubliez pas … &lt;code&gt;/help&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Et pour une commande particulière: &lt;code&gt;/help commande&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Raccourcis clavier&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;En reprenant l'exemple de &lt;strong&gt;F7&lt;/strong&gt; et &lt;strong&gt;F8&lt;/strong&gt; pour
naviguer dans les splits, on prend conscience de l'impérieuse nécessité de
configurer son clavier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alt+k (touche)&lt;/strong&gt; donne la touche et la commande associée.
&lt;ul&gt;
&lt;li&gt;Ex: &lt;strong&gt;Alt+k F8&lt;/strong&gt; affichera: &lt;code&gt;meta2-19~ window
-1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ceci nous permet de passer au split précédent.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;De même, nous pouvons obtenir facilement le code de la combinaison
alt+curseur bas:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Alt+k Alt+curseur bas&lt;/code&gt; : meta-meta2-B&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Armés de ces informations, nous n'avons plus qu'à associer alt+curseur bas
(par exemple) comme nouveau raccourci à &lt;code&gt;window -1&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/key bind meta-meta2-B /window -1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et pour la flèche du curseur haut associée à alt, je propose de
désactiver/activer la barre des pseudos.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/key bind meta-meta2-A /bar toggle nicklist&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;À vous de voir pour le reste…
&lt;ul&gt;
&lt;li&gt;Sachez que vous pourrez être amené à éditer directement le fichier de
configuration contenant les raccourcis.&lt;/li&gt;
&lt;li&gt;Mais uniquement en cas d'erreur bloquante, ou trop compliquée à corriger à
coup de &lt;em&gt;/key bind&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Bref, rien de tout cela ne devrait vous arriver. Le fichier est
&lt;em&gt;.weechat/weechat.conf&lt;/em&gt; , section &lt;em&gt;key&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Configuration de WeeChat&lt;/h3&gt;
&lt;h5&gt;Une simplicité biblique&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/set config.section.option valeur&lt;/code&gt; : pour modifier un
élément de configuration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/set config.*&lt;/code&gt; : pour voir un sous-ensemble de la
configuration (&lt;code&gt;set&lt;/code&gt; pour tout voir).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/help config.section.option&lt;/code&gt; : raison d'être d'une option
précise.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/save&lt;/code&gt; : sauve dans un fichier de config l'état actuel de
la configuration (la sauvegarde est automatique dans le fichier utilisé par
WeeChat).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/reload&lt;/code&gt; : recharge la configuration, au cas où vous
préféreriez modifier de façon externe les fichiers concernés (en cas de blocage
par exemple).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/plugin&lt;/code&gt; : voir les extensions chargées (vous devez avoir
au minimum l'extension &lt;em&gt;irc&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Exemple: définir une connexion&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons paramétrer une connexion permanente, dont les paramètres seront
sauvegardés dans la configuration.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/server add fn irc.freenode.org&lt;/code&gt; : défini un alias
&lt;em&gt;fn&lt;/em&gt; pour freenode, pour référencer la connexion.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/set irc.server.fn.nicks VotrePseudo&lt;/code&gt; : si il est
différent du login, utilisé par défaut. On peut préciser plusieurs pseudos, au
cas où le premier serait indisponible sur ce serveur (déja utilisé par exemple,
ou interdit).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/set irc.server.fn.command &amp;quot;/msg nickserv identify
xxxxx&amp;quot;&lt;/code&gt; : si vous voulez vous authentifier automatiquement.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;save&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Et par la suite, pour vous connecter rapidement à freenode en rappellant la
connexion sauvée:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/connect fn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pour retrouver rapidement la liste des serveurs déja paramétrés:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/server list&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;La peinture facile&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;WeeChat possède des facilités pour la gestion des couleurs.&lt;/li&gt;
&lt;li&gt;Tapez &lt;code&gt;/color&lt;/code&gt; pour passer dans le buffer des couleurs.
&lt;ul&gt;
&lt;li&gt;Vous y trouverez les paires de couleurs utilisées, ainsi que la palette
utilisable dans votre terminal (avec &lt;strong&gt;alt+c&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je passe sur la syntaxe pour envoyer des kikoos multicolorés dans les
buffers. Vous la trouverez dans la doc.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons maintenant nous intéresser à la colorisation de
l'interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Comme vous le savez, un &lt;code&gt;/set&lt;/code&gt; peut être suivi d'un joker
&lt;ul&gt;
&lt;li&gt;Pour avoir tous les paramètres liés aux couleurs: &lt;code&gt;/set
weechat.color.*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Avec ces informations, nous pourrions personnaliser les différents éléments
de l'interface.&lt;/li&gt;
&lt;li&gt;Pour faire original, je vais simplement changer quelques couleurs peu
lisibles sur le fond de mon terminal.
&lt;ul&gt;
&lt;li&gt;C'est extrèmement aisé, grâce au buffer &lt;em&gt;color&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous avez sans doute remarqué que le nom des intervenants dans un chat est
affiché avec des couleurs très variées.
&lt;ul&gt;
&lt;li&gt;Les couleurs dépendens de cette variable de configuration, qui a pour
valeur par défaut:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weechat.color.chat_nick_colors =
&amp;quot;cyan,magenta,green,brown,lightblue,default,lightcyan,lightmagenta,lightgreen,blue&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Le choix d'une couleur sur un pseudo se fait grace à un hash sur
celui-ci.&lt;/li&gt;
&lt;li&gt;Pour modifier la couleur de son propre pseudo, on utilise la variable
&lt;code&gt;weechat.color.chat_nick_self&lt;/code&gt; (et pour les conversations en privé,
vous avez également &lt;code&gt;weechat.color.chat_nick_other&lt;/code&gt; ).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour avoir la liste des codes couleurs utilisables, on a deux possibilités:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/color&lt;/code&gt; dans weechat, puis &lt;strong&gt;alt+c&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;ou depuis un terminal: &lt;code&gt;weechat-curses -c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Je préfère utiliser &lt;code&gt;/color&lt;/code&gt; , suivi d'un &lt;strong&gt;e&lt;/strong&gt;
pour afficher la représentation des couleurs utilisées actuellement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;On peut rentrer des noms de couleurs, ou bien directement les codes
couleurs obtenus ci-dessus. On peut également préciser des attributs.&lt;/li&gt;
&lt;li&gt;On peut également utiliser &lt;code&gt;/color alias&lt;/code&gt; pour nommer un code
couleur dans WeeChat.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ouvrez une fenêtre une fenêtre splittée, tapez des commandes de couleur
dans l'une, et regardez le résultat dans le buffer &lt;code&gt;color&lt;/code&gt; visible
dans l'autre.
&lt;ul&gt;
&lt;li&gt;Par exemple:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/set weechat.color.chat_nick_colors =
&amp;quot;118:091,232:105,238:219,234:216,152:090,10:20,255:091,118:009&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Les scripts&lt;/h3&gt;
&lt;h5&gt;Lest scripts s'utilisent par le biais des extensions&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Un script Weechat n'appelle pas directement les fonctions de l'API
WeeChat.&lt;/li&gt;
&lt;li&gt;Le script passe par un wrapper qui appelle ensuite l'API. Il y a un wrapper
par langage de script.&lt;/li&gt;
&lt;li&gt;Ces wrappers font partie des &lt;strong&gt;extensions&lt;/strong&gt; (terminologie
WeeChat).&lt;/li&gt;
&lt;li&gt;Les &lt;strong&gt;extensions&lt;/strong&gt; se controlent avec la commande
&lt;code&gt;plugin&lt;/code&gt; (&lt;code&gt;/help plugin&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;L'avantage de cette façon de procéder est que les différences entre
langages de scripts deviennent minimes. L'inconvénient est qu'il faut écrire un
wrapper pour chaque langage concerné, puisque l'accès direct à l'API WeeChat
n'est pas la méthode conseillée (bien que l'on puisse surement utiliser quelque
chose comme FFI du projet LuaJIT, mais cela sort largement de notre
propos).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Installation d'un script existant&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Avant d'écrire un script, commençons par en installer un.&lt;/li&gt;
&lt;li&gt;J'ai choisi le &lt;em&gt;bip&lt;/em&gt;, pour ne rien rater sur IRC.&lt;/li&gt;
&lt;li&gt;À propos, avez-vous remarqué l'angoisse diffuse instillée par la
possibilité de plus être joignable vingt-quatre heures sur vingt-quatre ?
Ou pire, de &lt;em&gt;rater un appel&lt;/em&gt; ?
&lt;ul&gt;
&lt;li&gt;Les marchands de téléphones ont fondé leur business là dessus.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous trouverez le script Perl qui fait bipper dans le dépot WeeChat
consacré aux scripts.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.weechat.org/files/scripts/beep.pl&quot;&gt;bipper en
Perl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vérifier que l'extension Perl est chargée:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/plugin list&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si ce n'est pas le cas, c'est probablement parce que Perl n'est pas
installé (et on vous comprend).
&lt;ul&gt;
&lt;li&gt;Il faudra donc installer Perl, et charger l'extension (pas besoin de
quitter WeeChat) : &lt;code&gt;/plugin load perl&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et pour charger le script:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/perl load ~/.weechat/perl/beep.pl&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tous les scripts sont référencés ici:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.weechat.org/scripts/&quot;&gt;http://www.weechat.org/scripts/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Écriture d'un script minimaliste à l'aide de Lua&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.weechat.org/files/doc/stable/weechat_scripting.fr.html&quot;&gt;Une
introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vous aurez également besoin du &lt;a href=&quot;http://www.weechat.org/files/doc/stable/weechat_plugin_api.fr.html&quot;&gt;guide de
référence de l'API C de WeeChat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Où se trouve le wrapper Lua ?
&lt;ul&gt;
&lt;li&gt;Comme dit précédemment, vous ne chargerez &lt;strong&gt;pas&lt;/strong&gt; vous même le
wrapper avec un &lt;code&gt;require&lt;/code&gt; dans le script Lua. Vous allez devoir
passer par les &lt;strong&gt;extensions&lt;/strong&gt; WeeChat, qui dans ce cas consiste en
un wrapper Lua vers l'api C de WeeChat.&lt;/li&gt;
&lt;li&gt;Il faut charger votre script de cette façon depuis WeeChat: &lt;code&gt;/lua load
chemin/vers/script.lua&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Attention, pour décharger le script, il faudra passer le nom défini en tant
que &lt;em&gt;name&lt;/em&gt; dans la fonction &lt;code&gt;weechat.register&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Passons au script proprement dit. Il faut commencer par enregistrer son
script.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;weechat.register(name, author, version, license, description,
shutdown_function, charset)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weechat.register(&amp;quot;test_lua&amp;quot;,&amp;quot;jseb&amp;quot;,&amp;quot;0.1&amp;quot;,&amp;quot;beerware&amp;quot;,&amp;quot;pas de desc&amp;quot;,
nil, &amp;quot;utf-8&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;On peut tenter une sortie dans le buffer &lt;em&gt;core&lt;/em&gt; de WeeChat (celui
qui affiche les messages du programme).
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;weechat.print (&amp;quot;&amp;quot;,&amp;quot;ça marche&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Notez que le &lt;em&gt;print&lt;/em&gt; intégré à Lua, qui écrit sur la sortie
standard, est fonctionnel, mais ne vous attendez pas à ce que la sortie suive
la logique de votre script. Comme l'exécution du script est séquentielle, vous
aurez déja la sortie de vos &lt;em&gt;print&lt;/em&gt;, puis la reconstruction de l'écran.
Cette méthode est donc déconseillée, hormis pour des messages de diagnostics
pour le debug (et autant utiliser &lt;code&gt;weechat.print&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le script sera exécuté une seule fois, et ensuite il faudra le recharger
pour recommencer le traitement. Il peut donc être plus pratique d'ajouter une
commande à WeeChat en créant un &lt;em&gt;hook&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Nous allons utiliser la fonction de l'API &lt;em&gt;hook_command&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;Nous pourrions également programmer une temporisation
(&lt;code&gt;weechat.hook_timer&lt;/code&gt;) ou une commande batch (lancée en fond avec
&lt;code&gt;weechat.hook_procees&lt;/code&gt; et qui permet peut être l'écriture de
coroutines, même si à mon avis &lt;code&gt;weechat.hook_timer&lt;/code&gt; sera plus
adaptée pour cela).&lt;/li&gt;
&lt;li&gt;Pour le transformer en commande, il faut utiliser
&lt;code&gt;weechat.hook_command&lt;/code&gt;, en précisant le nom de la commande, son mode
d'emploi (pour &lt;code&gt;/help&lt;/code&gt; et le nom de la fonction callback dans le
script).&lt;/li&gt;
&lt;li&gt;À noter que les paramètres de la fonction callback seront imposés: buffer
où a été lancée la commande, paramètres de la commande et data (non utilisé
dans le script, tout passe dans la variable qui contient les paramètres).&lt;/li&gt;
&lt;li&gt;Description dans l'API de &lt;a href=&quot;http://www.weechat.org/files/doc/stable/weechat_plugin_api.fr.html#_weechat_hook_command&quot;&gt;
hook_command&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant que le script est enregistré et transformé en commande, il ne
reste plus qu'à transformer en majuscule la chaine passée en paramètre.
&lt;ul&gt;
&lt;li&gt;J'utilise pour cela une fonction de la classe &lt;em&gt;string&lt;/em&gt; de Lua, qui
malheureusement ne fonctionne qu'avec les caractères ascii et ne mettra donc
pas en majuscule les accents. J'aurais bien utilisé la fonction
&lt;code&gt;weechat_string_toupper&lt;/code&gt;, mais elle n'est pas disponible en dehors
de l'api et semble d'après l'exemple de la doc ne pas convertir non plus les
accents.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour afficher dans le buffer en cours, j'utilise une petite astuce. Je
demande l'exécution de la commande irc &lt;code&gt;say&lt;/code&gt; dans le buffer en
cours.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;weechat.command(buffer,&amp;quot;/say &amp;quot;..la_chaine_en_majuscules)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il aurait été tentant d'utiliser cette commande:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;weechat.print(buffer,str_up)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;mais elle ne ferait qu'afficher la chaine en majuscules dans le buffer
actuel, et vos interlocuteurs ne la verrait pas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voici le listing complet du script:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~/.weechat/lua$ cat hello.lua 
#!/usr/bin/env lua

--pour faire un /lua reload, il faut soit que le script soit dans autoload, soit spécifier son nom (celui déclaré dans weechat.register, pas le nom de fichier). Autrement, il sera bien déchargé, mais jamais recharge.                        

function hurler_fx(data, buffer, args)
  local str_up = args:upper()
  weechat.command(buffer,&amp;quot;/say &amp;quot;..str_up)
end

--weechat.register(name, author, version, license, description, shutdown_function, charset)
weechat.register(&amp;quot;test_lua&amp;quot;,&amp;quot;auteur&amp;quot;,&amp;quot;0.1&amp;quot;,&amp;quot;noware&amp;quot;,&amp;quot;pas de desc&amp;quot;, nil, &amp;quot;utf-8&amp;quot;)

hook = weechat.hook_command (&amp;quot;hurler&amp;quot;, &amp;quot;script pour hurler dans un buffer&amp;quot;,
                             &amp;quot;[chaine à hurler]&amp;quot;, &amp;quot;la chaine que vous souhaitez hurler&amp;quot;,&amp;quot;&amp;quot;,
                             &amp;quot;hurler_fx&amp;quot;,&amp;quot;&amp;quot;)

weechat.print (&amp;quot;&amp;quot;,&amp;quot;le script est chargé&amp;quot;)

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;À tester depuis weechat avec :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

/lua load lua/hello.lua 
/hurler et maintenant, tout le monde va m'écouter

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NB&lt;/strong&gt; : je décline toute responsabilité en cas de
&lt;em&gt;kick&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Terriblement t'efficace (nanananana nanana)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;J'espère vous avoir convaincu de tenter un essai avec WeeChat.&lt;/li&gt;
&lt;li&gt;Pour en savoir en plus, je vous renvois à l' &lt;strong&gt;&lt;a href=&quot;http://www.weechat.org/doc/&quot;&gt;excellente documentation&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=Cjrh4nka6dU&quot;&gt;Bon t'chat , lol
!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Je remercie FlashCode, l'auteur de WeeChat, pour son excellent soft, et
pour avoir bien voulu répondre à quelques-unes de mes questions… sur son canal
IRC, bien entendu &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;
&lt;ul&gt;
&lt;li&gt;irc.freenode.org : #weechat-fr&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2011/12/11/IRC%3A-Wee-ou-non#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2011/12/11/IRC%3A-Wee-ou-non#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/654693</wfw:commentRss>
      </item>
    
  <item>
    <title>Des cookies à accepter sans hésiter !</title>
    <link>http://www.finiderire.com/post/2011/11/22/Des-cookies-%C3%A0-accepter-sans-h%C3%A9siter-%21</link>
    <guid isPermaLink="false">urn:md5:63fb2781d25dc365bb5304cbd4ae5d37</guid>
    <pubDate>Thu, 24 Nov 2011 20:44:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Cuisine</category>
        <category>cuisine</category>    
    <description>&lt;p&gt;&lt;br /&gt;
&lt;em&gt;Bonne nouvelle, j'ai enfin réussi à calibrer ma recette de
cookies.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Afin d'en faire profiter l'humanité, voici le résultat de longs mois
d'expérimentations (c'est pour cela que je ne postais plus rien et que j'ai
pris vingt kilos).&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Ces cookies là, je vous le garantis, ce ne sont pas les cookies pourris de
votre navigateur internet.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Merci à Marie pour la relecture, les suggestions, et les photos.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;h5&gt;Un magnifique spécimen: le Cookus-chocolatus-classicus&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;http://www.finiderire.com/public/images/cookie1.JPG&quot;&gt;&lt;img src=&quot;http://www.finiderire.com/public/images/.cookie1_m.jpg&quot; alt=&quot;cookus classicus&quot; title=&quot;cookus classicus, nov. 2011&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Ingrédients&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;200g de farine.&lt;/li&gt;
&lt;li&gt;1 sachet de levure chimique (bicarbonate).&lt;/li&gt;
&lt;li&gt;1 sachet de sucre vanillé.
&lt;ul&gt;
&lt;li&gt;le sucre vanillé est facultatif, mais c'est meilleur avec.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;70g de cassonade
&lt;ul&gt;
&lt;li&gt;ou 60g de sucre en poudre si vraiment vous n'avez pas de cassonade.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;60g de chocolat en morceaux.
&lt;ul&gt;
&lt;li&gt;ou 60g de pépites de chocolat, ça vous évitera de le faire vous-même.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;60g de raisins secs.&lt;/li&gt;
&lt;li&gt;60 à 80g de noisettes grillées, selon vos goûts.&lt;/li&gt;
&lt;li&gt;1 œuf.&lt;/li&gt;
&lt;li&gt;5 cuillères à soupe d'huile de noix.
&lt;ul&gt;
&lt;li&gt;qui correspondent à environ 100g. de beurre, si vous n'avez pas
d'huile.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5cl d'eau (environ un tiers de verre à moutarde).
&lt;ul&gt;
&lt;li&gt;ceci &lt;strong&gt;uniquement&lt;/strong&gt; si vous utilisez de l'huile. L'eau est
utilisée pour compenser la différence beurre/huile. Il y a de l'eau dans le
beurre, contrairement à l'huile.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1 pincée de sel. Ne l'oubliez pas!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Pré-requis&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cette recette nécessite un peu de patience.&lt;/li&gt;
&lt;li&gt;Elle nécessite également quelques ingrédients que vous pourrez préparer à
l'avance afin de gagner du temps le moment venu.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Les noisettes&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Décortiquez et coupez les noisettes en deux.&lt;/li&gt;
&lt;li&gt;Faites revenir à la poêle, sans matière grasse.&lt;/li&gt;
&lt;li&gt;Quand les noisettes en contact avec la poêle commencent à brunir,
remuez-les pour répartir la cuisson.&lt;/li&gt;
&lt;li&gt;Une fois toutes les noisettes brunies, retirez du feu et laissez refroidir.
&lt;ul&gt;
&lt;li&gt;Pendant que les noisettes refroidissent, que diriez-vous de commencer le
découpage du chocolat ?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Frottez les noisettes entre vos doigts et retirez la pellicule qui se
détache la plupart du temps.&lt;/li&gt;
&lt;li&gt;Les noisettes grillées peuvent se conserver quelques semaines dans un bocal
en verre.
&lt;ul&gt;
&lt;li&gt;Dans le cas d'un stockage dépassant quinze jours, goûtez une noisette avant
de les utiliser.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Les pépites de chocolat&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le moment idéal pour opérer est pendant le refroidissement des
noisettes.&lt;/li&gt;
&lt;li&gt;Découpez les carreaux de chocolat en morceaux à l'aide d'un couteau bien
aiguisé, sur une planche à découper.
&lt;ul&gt;
&lt;li&gt;Avec mon chocolat, j'obtiens neuf morceaux pour chacun des carreaux. Ne
vous coupez pas les doigts non plus et restez raisonnables.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Préparation&lt;/h3&gt;
&lt;h5&gt;Dans un saladier&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Mélangez farine, levure, sucre vanillé &lt;strong&gt;et&lt;/strong&gt; la pincée de
sel.&lt;/li&gt;
&lt;li&gt;Ajoutez à la farine les noisettes grillées, les raisins secs et les pépites
de chocolat.&lt;/li&gt;
&lt;li&gt;Mélangez bien le tout, pour répartir les ingrédients,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Dans un bol&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Si vous n'aviez pas d'huile, faites fondre le beurre à feu très doux et en
remuant pendant toute la durée de l'opération.&lt;/li&gt;
&lt;li&gt;Mesurez les 70g de cassonade, et ajoutez un œuf. Mélangez le tout.&lt;/li&gt;
&lt;li&gt;Si vous utilisez de l'huile, ajoutez l'eau. Mélangez bien.&lt;/li&gt;
&lt;li&gt;Ajoutez l'huile ou le beurre, et mélangez jusqu'à obtenir une indistincte
mélasse.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Merge (bol, saladier)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Versez en trois étapes le contenu du bol dans le saladier, en remuant
continuellement.&lt;/li&gt;
&lt;li&gt;Quand le mélange présente une agglomération certaine, et qu' il devient
difficile à manœuvrer, continuez le pétrissage à la main.&lt;/li&gt;
&lt;li&gt;Stoppez quand vous obtenez une boule de pate homogène, dont les morceaux ne
se décollent plus.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le grand cylindre&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Découpez une feuille de plastique transparent alimentaire.&lt;/li&gt;
&lt;li&gt;Placez la boule de pâte sur cette feuille, en l'étirant en rouleau.&lt;/li&gt;
&lt;li&gt;Refermez la feuille sur la pâte. Une fois bien emballée, faites la rouler
sur votre plan de travail, de façon à lui donner un aspect circulaire.&lt;/li&gt;
&lt;li&gt;Placez le tout au réfrigérateur 1/2h, ou 10mn au congélateur. Cela va
donner une certaine tenue à la pâte, afin de faciliter son découpage
ultérieur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Cuisson&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Découpez la pâte en cylindres de 1 ou 2cm d'épaisseur.&lt;/li&gt;
&lt;li&gt;N'hésitez pas à rassembler le morceau en un monticule cylindrique bien
aggloméré, en poussant la circonférence extérieure de vos petits doigts
vigoureux.&lt;/li&gt;
&lt;li&gt;Placez les cylindres (ou monticules, selon votre degré de finesse) de façon
espacée sur du papier cuisson.&lt;/li&gt;
&lt;li&gt;Mettre le tout sur une plaque (ou une grille si comme moi, vous n'avez
toujours pas de plaque).&lt;/li&gt;
&lt;li&gt;Faites cuire 1/4h dans un four préchauffé à 180°.&lt;/li&gt;
&lt;li&gt;Renouvellez l'opération découpage/disposition/cuisson jusqu'à épuisement du
stock ou de votre patience.&lt;/li&gt;
&lt;li&gt;Le secret du gourmand : la pâte se congèle très bien, pour une
utilisation ultérieure !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Dégustation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Là, je crois que les explications ne sont plus nécessaires !&lt;/li&gt;
&lt;li&gt;Je n'accepte aucune responsabilité quand à une éventuelle prise de
poids.&lt;/li&gt;
&lt;li&gt;Une dernière photo pour achever de convaincre les plus indécis.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://www.finiderire.com/public/images/cookie4.JPG&quot;&gt;&lt;img src=&quot;http://www.finiderire.com/public/images/.cookie4_m.jpg&quot; alt=&quot;cookies miam&quot; title=&quot;cookies miam, nov. 2011&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2011/11/22/Des-cookies-%C3%A0-accepter-sans-h%C3%A9siter-%21#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2011/11/22/Des-cookies-%C3%A0-accepter-sans-h%C3%A9siter-%21#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/650978</wfw:commentRss>
      </item>
    
  <item>
    <title>Enfin RAID!</title>
    <link>http://www.finiderire.com/post/2010/04/27/Better-RAID-than-dead</link>
    <guid isPermaLink="false">urn:md5:f8d610a87640f278df7b7d6c98f8a32f</guid>
    <pubDate>Sun, 16 Oct 2011 19:51:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Arch</category><category>Linux</category>    
    <description>&lt;p&gt;&lt;em&gt;Sous ce titre ne se cache pas l'annonce de la fermeture du blog. Que
nenni! Lisez plutôt la suite, et tant pis pour la fausse joie.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Que feriez-vous si vous preniez possession de trois disques identiques
?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Mais non! Vous ne les revendriez pas sur Ebay !&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Vous vous monteriez un RAID, bien sûr !&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;em&gt;Remerciements particuliers à Frédéric Jolliton, qui m'a donné un sérieux
coup de main.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Dis papa, le serveur il est tout RAID&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bon pas besoin d'en faire une tartine, ni d'expliquer les différentes
formes de RAID.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ici, je parlerai de deux type de RAID (RAID1 et RAID5), avec trois disques.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RAID1&lt;/strong&gt; : C'est du mirroring. Chaque disque réplique
complètement les autres.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAID5&lt;/strong&gt; : Chaque disque perd 33% de sa capacité, afin
d'être en mesure de reconstruire un disque tombé en panne. Il faut bien sûr que
deux disques soient en état de marche pour reconstruire le troisième.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour ceux qui veulent tout savoir
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://wiki.archlinux.org/index.php/Installing_with_Software_RAID_or_LVM&quot;&gt;excellent
article de la doc Arch-Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;La doc Arch aborde également le problème du MBR sur les disques modernes,
et qui pourrait vous intéresser si vous installer un MS-Windows en RAID. Ceci
ne sera pas abordé dans ce billet qui est déja suffisement long comme ça.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La route est droite mais la pente est RAID&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Il y a différentes façons d'envisager le RAID.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;RAID matériel&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le RAID matériel se matérialise (haha) sous la forme d'une carte
d'extension qui supportera des disques SCSI , IDE ou SATA.&lt;/li&gt;
&lt;li&gt;Les disques sont reconnus dès le boot par la carte, et le support est
transparent pour l'OS qui verra les disques tels que le controleur RAID lui
présente.&lt;/li&gt;
&lt;li&gt;Pas de bol, c'est souvent associé à du matériel bien propriétaire, avec des
disques bien spécifiques. Malheur à vous si vous osez utiliser un disque qui
n'est pas absolument identique!&lt;/li&gt;
&lt;li&gt;Bien entendu, les disques de votre array ne seront plus disponibles à la
vente au moment où ils auront besoin d'être remplacés.&lt;/li&gt;
&lt;li&gt;Les processeurs sont aujourd'hui largement plus puissants que les chipsets
intégrés des cartes RAID (sauf cartes couteuses pour usages bien spécifiques,
voir ci-dessous).&lt;/li&gt;
&lt;li&gt;N'espérez pas récupérer vos disques avec un controleur RAID différent de
celui d'origine.&lt;/li&gt;
&lt;li&gt;Bref, aucun intêret, si ce n'est pour des cas bien spécifiques. Par
exemple, dans le cas de grosses unités RAID montées sur une dizaine de disques.
Le bus de la carte RAID sera plus efficace.&lt;/li&gt;
&lt;li&gt;En réalité, le seul intêret est que le RAID matériel rassure le windozien,
pour qui le &lt;q&gt;RAID logiciel&lt;/q&gt; évoque la prise en charge foireuse par le bios
buggé de sa carte mère &lt;em&gt;Asuxxtoc&lt;/em&gt;. Le pauvre homme.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;RAID logiciel&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pas besoin de matériel coûteux.&lt;/li&gt;
&lt;li&gt;Le kernel Linux est tout a fait adapté au RAID logiciel, et la mise en
oeuvre ne pose pas de problèmes particuliers.&lt;/li&gt;
&lt;li&gt;On peut mélanger les disques (différents modèles ou constructeurs).
&lt;ul&gt;
&lt;li&gt;C'est même mieux de procéder ainsi, car on considère que les disques de
même série vont avoir tendance à tomber en panne... en même temps. C'est
d'ailleurs ce qu'on appelle la loi des séries.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;On peut également mélanger différentes interfaces. Pour mon test, j'avais
un disque en IDE, et deux en SATA. (je vous rassure, en prod c'est fait
proprement. Les budgets pour la recherche, ce n'est plus ce que c'était, ma
bonne dame.)&lt;/li&gt;
&lt;li&gt;Vous n'êtes même pas obligés d' utiliser des disques de même taille. Il
faut bien sûr qu'ils aient une taille suffisante pour contenir la/les
partition(s) RAID.&lt;/li&gt;
&lt;li&gt;En résumé, le RAID logiciel est tellement mieux pour les serveurs (je ne
parle pas des grosses fermes de disques) qu'à part pour les fatigués de
naissance et les pusillanimes, il s'impose de lui même.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Arch : mise en place d'un RAID logiciel&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Situation de départ&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous avez trois disques qui n'ont jamais servis, et vous souhaitez
installer une machine sous Arch.&lt;/li&gt;
&lt;li&gt;Il faut donc commencer par s'occuper de la mise en place du RAID.&lt;/li&gt;
&lt;li&gt;Vous venez de booter sur le CD d'installation de Arch, et le curseur de la
ligne de commande clignote impatiemment…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Partionnement&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez utiliser &lt;code&gt;cfdisk&lt;/code&gt; pour partitionner votre disque, en
général disponible par défaut lors des installations.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voici mon schéma de partionnement, avec trois disques sata
(sda,sdb,sdc) :
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]1&lt;/strong&gt; :
&lt;strong&gt;/boot&lt;/strong&gt; (agrégé en raid1, partition bootable)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]2&lt;/strong&gt; :
&lt;strong&gt;/&lt;/strong&gt; (agrégé en raid5)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]3&lt;/strong&gt; :
&lt;strong&gt;swap&lt;/strong&gt; (non agrégé, hors raid)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Note: la partition &lt;strong&gt;/boot&lt;/strong&gt; sera marquée avec le flag
&lt;em&gt;bootable&lt;/em&gt; sur &lt;strong&gt;chacun&lt;/strong&gt; des disques.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pas la peine de faire trois fois de suite un &lt;code&gt;cfdisk&lt;/code&gt; avec les
mêmes paramètres.
&lt;ul&gt;
&lt;li&gt;Partionnez le premier disque, puis copiez le partitionnement sur les deux
autres (assurez-vous d'opérer sur des disques vides).&lt;/li&gt;
&lt;li&gt;Avec &lt;code&gt;sfdisk&lt;/code&gt; (et non plus &lt;code&gt;cfdisk&lt;/code&gt;), nous allons
dupliquer les données.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sfdisk -d /dev/sda &amp;gt; partitions&lt;/code&gt; : pour dumper les
infos de partitionnement.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sfdisk /dev/sdb &amp;lt; partitions&lt;/code&gt; : pour écrire sur le
second disque le partitionnement du premier.&lt;/li&gt;
&lt;li&gt;Vous pouvez vérifier le partitionnement: &lt;code&gt;fdisk -l /dev/sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour info, le dump est une simple description ascii:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

[root@archiso arch]# sfdisk -d /dev/sda
# partition table of /dev/sda
unit: sectors

/dev/sda1 : start=       63, size= 48821472, Id=83, bootable
/dev/sda2 : start= 48821535, size=923833890, Id=83
/dev/sda3 : start=972655425, size=  4112640, Id=82
/dev/sda4 : start=        0, size=        0, Id= 0

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;création des arrays&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous utilisons &lt;strong&gt;mdadm&lt;/strong&gt;, couteau suisse du Raid.&lt;/li&gt;
&lt;li&gt;La lecture de sa manpage n'est pas conseillée, elle est obligatoire.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour créer une array en RAID-1 (partition &lt;strong&gt;/boot&lt;/strong&gt;):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

mdadm --create /dev/md1 --level=1 --raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1 --metadata=0.90

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour créer une array en RAID-5 (partition &lt;strong&gt;/&lt;/strong&gt;) :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

mdadm --create /dev/md2 --level=5 --raid-devices=3 /dev/sda2 /dev/sdb2 /dev/sdc2

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour vérifier que tout s'est bien passé, deux possibilités:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat /proc/mdstat&lt;/code&gt; : le strict minimum.&lt;/li&gt;
&lt;li&gt;Pour avoir plus de détails:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm -q --detail /dev/md[1-2]

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans tous les cas, vous allez voir que les différents disques sont en train
de se synchroniser, sauf si vous avez créé des arrays minuscules (dans ce cas,
il y a des chances pour que ce soit déja fini).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un exemple de sortie de /proc/mdstat pendant la reconstruction de l'array
en RAID-5 (un gros morceau):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

Personalities : [raid1] [raid6] [raid5] [raid4] 
md2 : active raid5 sdc2[3] sdb2[1] sda2[0]
      923833728 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
      [=&amp;gt;...................]  recovery =  9.1% (42417280/461916864) finish=64.2min speed=108744K/sec
      
md1 : active raid1 sdc1[2] sdb1[1] sda1[0]
      24410624 blocks [3/3] [UUU]

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez bien sûr utiliser votre RAID pendant la reconstruction (sinon,
le RAID n'aurait pas grand intêret).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Montage du RAID&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A noter que cette partie pourra vous resservir hors installation, en cas de
gros pépin par exemple.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Schéma du partitionnement RAID&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pour chacun des disques:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]1&lt;/strong&gt; :
&lt;strong&gt;/boot&lt;/strong&gt; (agrégé en raid1 sur /dev/md1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]2&lt;/strong&gt; :
&lt;strong&gt;/&lt;/strong&gt; (agrégé en raid5 sur /dev/md2)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]3&lt;/strong&gt; :
&lt;strong&gt;swap&lt;/strong&gt; (non agrégé, hors raid)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Assemblage des partitions RAID&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Normalement, un &lt;em&gt;modprobe&lt;/em&gt; sur les modules RAID n'est pas nécessaire
(ces modules seront chargés lors de la première utilisation de &lt;em&gt;mdadm&lt;/em&gt;).
&lt;ul&gt;
&lt;li&gt;Au cas où, voici la liste des modules impliqués : md_mod et
raid&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[456&quot; title=&quot;[456&quot;&gt;[456&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Avant de pouvoir mounter le RAID, il faut l'assembler (uniquement si vous
venez de rebooter sur un système ne prenant pas encore en charge le RAID au
moment du boot).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#Assemblage de la partition boot
[root@archiso ~]# mdadm --assemble /dev/md1 /dev/sda1 /dev/sdb1 /dev/sdc1
mdadm: /dev/md1 has been started with 3 drives.

#Assemblage de la partition home
[root@archiso ~]# mdadm --assemble /dev/md2 /dev/sda2 /dev/sdb2 /dev/sdc2
mdadm: /dev/md2 has been started with 3 drives.

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Formatage des partitions&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Rappel : md1 correspond à la représentation d'un disque complet.
&lt;ul&gt;
&lt;li&gt;On peut rapprocher ce nom de device de sda , qui représente également la
totalité du disque.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ici, on veut utiliser le disque complet, donc on formate sans partitionner
le device RAID. Exemple:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkfs.ext4 /dev/md1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;attention au flag &lt;strong&gt;HUGE_FILE&lt;/strong&gt; lors du formatage , il peut
poser problème plus tard et est relativement inutile pour l'instant
&lt;ul&gt;
&lt;li&gt;pour les problèmes possibles, voir la section &lt;em&gt;premier boot&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;HUGE_FILE permet le support de fichiers de plus de 2 teraoctets (nous ne
sommes pas prêt d'y arriver, tout comme &lt;q&gt;640Kb should be enough for
everyone&lt;/q&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Montage des partitions.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Je n'ai monté que la première partition (root) qui servira à contenir le
système.
&lt;ul&gt;
&lt;li&gt;La partition &amp;quot;home&amp;quot; n'a pas d'intêret pour l'instant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#Montage des partitions
[root@archiso ~]# mount /dev/md1 /mnt

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Ajout du swap&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le swap est réparti sur les trois disques.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;mkswap /dev/sda3&lt;/code&gt; : à faire pour les 3 partitions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On utilise la même priorité pour les 3 partitions de swap (avec &lt;strong&gt;-p
0&lt;/strong&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;swapon -p 0 /dev/sda3 /dev/sdb3 /dev/sdc3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;A noter que le swap n'est donc pas en RAID, donc en cas de claquage d'un
disque, il peut se passer des choses bizarres. Le swap ne sert pratiquement
plus de nos jours, mis à part pour l'hibernation. Je préférais vous prévenir
afin que vous agissiez en connaissance de cause. Faites le chez vous les
enfants, mais ne venez pas vous plaindre ensuite!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Installation et configuration du système&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Il faut maintenant installer les paquets.&lt;/li&gt;
&lt;li&gt;Dans le cas d'une Arch, il vous faudra au minimum &lt;strong&gt;base&lt;/strong&gt;.
Pour le reste, c'est vous qui voyez.&lt;/li&gt;
&lt;li&gt;Ça y est ? Tous les paquets sont installés ?&lt;/li&gt;
&lt;li&gt;Nous allons poursuivre la configuration en gardant à l'esprit que votre
disque n'est pas encore à la racine, mais simplement mounté dans un tmpfs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Création de la config mdadm&lt;/h5&gt;
&lt;pre&gt;

mv /mnt/etc/mdadm.conf /mnt/etc/mdadm.conf.old
mdadm --examine --scan &amp;gt;&amp;gt; /mnt/etc/mdadm.conf

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Attention à bien écrire dans le /etc du mount, et non pas dans celui monté
en RAM pour l'installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Gardez précieusement le fichier &lt;em&gt;mdadm.conf&lt;/em&gt; original. Il vous
servira plus tard pour compléter la configuration (adressse mail pour le
monitoring, etc..)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;le double &lt;q&gt;&amp;gt;&amp;gt;&lt;/q&gt; pour la redirection dans &lt;em&gt;mdadm.conf&lt;/em&gt;,
c'est uniquement dans le cas où vous referiez la manip avec un fichier qui a
déja servi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Autres fichiers à éditer&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez éditer ces fichiers depuis le menu d'installation de Arch.
&lt;ul&gt;
&lt;li&gt;Il s'agit du menu &amp;quot;Install Packages&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Editez au minimum &lt;em&gt;rc.conf&lt;/em&gt; pour avoir les locales en français au
démarrage.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;locale.gen&lt;/em&gt; : décommenter la locale choisie dans rc.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si vous voulez utiliser un ramdisk pour charger les modules RAID (plutôt
que de recompiler un noyau avec ledit support), c'est le moment de modifier:
&lt;em&gt;/etc/mkinitcpio.conf&lt;/em&gt; .
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;mkinitcpio&lt;/em&gt; se lance depuis un environnement chrooté, mais Arch se
charge fort bien de cette tâche lorsque vous quittez le menu d'édition des
fichiers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La configuration de &lt;em&gt;pacman&lt;/em&gt; fera l'objet d'un billet à part.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;N'oubliez pas de changer le mot de passe root.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Sortie de l'installeur&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez quitter l'installeur.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;N' &lt;strong&gt;installez pas&lt;/strong&gt; Grub depuis le menu Arch. Nous allons le
faire depuis le shell, dès que nous aurons chrooté le RAID.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Installation de GRUB&lt;/h3&gt;
&lt;h5&gt;Chroot du RAID&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il nous faut maintenant chrooter pour continuer l'installation&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

[root@archiso ~]# mount -o bind /dev /mnt/dev
[root@archiso ~]# mount -t proc none /mnt/proc
[root@archiso ~]# chroot /mnt /bin/bash

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;GRUB sur le premier disque&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;L' opération est détaillée pour le premier disque.
&lt;ul&gt;
&lt;li&gt;Elle sera à refaire pour chacun des disques, afin de pouvoir booter avec
n'importe quel disque.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous installerons GRUB sur les autres disques après le premier boot.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il nous faut commencer par ramener les fichiers de GRUB au bon endroit.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cp -a /usr/lib/grub/i386-pc/* /boot/grub/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un petit coup d'oeil à &lt;em&gt;/boot/grub/menu.lst&lt;/em&gt; afin de nous assurer
que les paramètres par défaut sont corrects...
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;root&lt;/em&gt; est sur &lt;em&gt;/dev/sda3&lt;/em&gt;. Ce qui est faux. Correction, avec
remplacement par &lt;em&gt;/dev/md1&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Un autre problème que vous pourriez rencontrer: vous n'avez fait qu'une
seule partition racine, avec /boot inclus dedans. Dans ce cas, le noyau est
dans &lt;strong&gt;/boot&lt;/strong&gt;, et non pas dans &lt;strong&gt;/&lt;/strong&gt; .&lt;/li&gt;
&lt;li&gt;Voici ma config grub:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

timeout   5
default   0
color light-blue/black light-cyan/blue

title  Arch Linux  [/boot/vmlinuz26]
root   (hd0,0)
kernel /boot/vmlinuz26 root=/dev/md1 ro md=1,/dev/sda1,/dev/sdb1,/dev/sdc1
initrd /boot/kernel26.img

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensuite, nous invoquons grub avec ... &lt;code&gt;grub&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et sous l'interface, nous rendons le premier disque bootable&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

grub&amp;gt; root (hd0,0)
grub&amp;gt; setup (hd0)
grub&amp;gt; quit

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Avant de rebooter&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Assurez vous d'avoir changé le password de root, sinon vous ne pourrez pas
utiliser ce compte.&lt;/li&gt;
&lt;li&gt;Vous pouvez aussi créer un utilisateur : &lt;code&gt;adduser -m toto&lt;/code&gt;
puis &lt;code&gt;passwd toto&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Support par Linux au boot&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Support par modules
&lt;ul&gt;
&lt;li&gt;Par défaut, votre noyau de distrib a tous les drivers possibles compilés en
modules (le noyau serait trop gros avec les drivers compilés en dur).&lt;/li&gt;
&lt;li&gt;Il faudra donc utiliser une image montée en ram juste après le chargement
du noyau, pour utiliser les modules RAID.&lt;/li&gt;
&lt;li&gt;Je ne détaille pas cette option ici, mais j'ai préparé un billet que je
posterai bientôt pour les gens intéressés.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Support dans le kernel
&lt;ul&gt;
&lt;li&gt;Le plus facile est de se compiler un kernel avec le support RAID
built-in.&lt;/li&gt;
&lt;li&gt;L'inconvénient est que l'on perd le noyau fourni par sa distribution. Sauf
si bien sûr on crée un paquet avec le noyau nouvellement compilé.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Premier boot : alors ça, c'est RAID!&lt;/h3&gt;
&lt;h5&gt;Montage en lecture seule des devices RAID (md&lt;em&gt;x&lt;/em&gt;)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le boot semble bien se passer, tout va très bien Madame la Marquise ...
sauf qu'on déplore un tout petit rien.&lt;/li&gt;
&lt;li&gt;Les partitions md0 et md1 sont montées en lecture seule
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;EXT4-fs (md0) : Filesystem with huge files cannot be mounted
RDWR without CONFIG_LBDAF&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mais à part ça, Madame la Marquise, tout va très bien, tout va très
bien.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Résolution 1 : bête et méchante.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez rebooter sur votre CD d'install, ré-assembler le RAID, et
recompiler un noyau avec l'option CONFIG_LBDAF
&lt;ul&gt;
&lt;li&gt;Cette option sert à supporter les fichiers de plus de 2 Tera-octets.&lt;/li&gt;
&lt;li&gt;Vu que mon RAID est composé de 3*40Go, ceci parait un peu inutile ... nous
allons enquêter un peu plus sur ce message.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Résolution 2 : un poil de réflexion.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons inspecter les systèmes de fichiers (cette erreur ne concernant
pas le RAID).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Reboot avec le CD d'install, et ré-assemblage du RAID. Mais cette fois, pas
de recompilation du noyau!&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tune2fs -l /dev/md1&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;nous voyons le flag &lt;strong&gt;HUGE_FILE&lt;/strong&gt; , qui provoque le
problème.&lt;/li&gt;
&lt;li&gt;répéter l'opération pour md2 (normalement, c'est la même chose si vos
partitions ont été créées de la même façon).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons enlever le flag HUGE_FILE
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tune2fs -O ^HUGE_FILE /dev/md1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;si nécessaire, répéter l'opération sur les autres unités RAID.&lt;/li&gt;
&lt;li&gt;vérifier que les opérations ont été répercutées (ex: &lt;code&gt;tune2fs -l
/dev/md1&lt;/code&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Lancer un &lt;code&gt;e2fsck&lt;/code&gt; sur les devices RAID (ex: &lt;code&gt;e2fsck
/dev/md1&lt;/code&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si tout est ok, reboot !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Dernières opérations après reboot&lt;/h3&gt;
&lt;h5&gt;GRUB sur le disques supplémentaires&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il ne nous reste plus qu'à installer GRUB sur les disques restants, afin
d'avoir trois disques identiques et substituables.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Relancez grub et tapez ces commandes:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

grub&amp;gt; device (hd0) /dev/sdb
grub&amp;gt; root (hd0,0)
grub&amp;gt; setup (hd0)
grub&amp;gt; device (hd0) /dev/sdc
grub&amp;gt; root (hd0,0)
grub&amp;gt; setup (hd0)
grub&amp;gt; quit

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Sauvegarde de la structure des disques&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Afin de reconstruire rapidement un disque raid, il est utile de sauvegarder
sa structure.
&lt;ul&gt;
&lt;li&gt;Il faudra bien sûr un disque de taille identique ou supérieure pour
restaurer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

 sfdisk --dump /dev/sda &amp;gt;sfdisk_sda
 sfdisk --dump /dev/sdb &amp;gt;sfdisk_sdb
 sfdisk --dump /dev/sdc &amp;gt;sfdisk_sdc

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;A mettre en lieu sûr. La partition raid devrait faire l'affaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour restaurer, il vous suffira de pratique l'opération inverse.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sfdisk /dev/sda &amp;lt; sfdisk_sda&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Base de monitoring&lt;/h3&gt;
&lt;h5&gt;/proc/mdstat&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;On commence par utiliser les processus.&lt;/li&gt;
&lt;li&gt;Pour l'admin, un &lt;code&gt;cat /proc/mdstat&lt;/code&gt; suffit.
&lt;ul&gt;
&lt;li&gt;ce n'est pas très pratique pour les scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le strict minimum peut être obtenu facilement:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

cat /proc/mdstat | awk '/^md[0-9]/ { dev=$1 } /\[[U_]+\]/ { match($0,/\[[U_]+\]/,state); print dev &amp;quot;:&amp;quot; state[0] }'

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;à adapter selon ce que vous souhaitez en faire.
&lt;ul&gt;
&lt;li&gt;par exemple, cette sortie pourrait être lue avec beuglement de la machine
en cas de détection d'un disque en rade.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;mdadm&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;On peut utiliser tout simplement &lt;code&gt;mdadm&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Il suffit de le placer en mode &lt;em&gt;monitor&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

mdadm -F -m toto@foo.com --scan -1 -t

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Signification des flags:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-F&lt;/strong&gt; : mode monitor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-m&lt;/strong&gt; : précise le mail où envoyer le rapport.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;scan&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-1&lt;/strong&gt; : une seule itération et sort (sans ce flag, lancé
en daemon).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-t&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour recevoir des emails en cas d'alerte, vous avez un paramètre dans
&lt;em&gt;mdadm.conf&lt;/em&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MAILADDR moi@bigcorp.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;RAID is dead (ou: RAID en rade)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant, simulons une panne afin de nous assurer que tout est
d'équerre.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Où sont les disques ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pour commencer, il faut repérer les ports SATA pour retrouver les disques
facilement dans le boitier.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Explorons un peu les devices pour retrouver tout ça:
&lt;ul&gt;
&lt;li&gt;/sys/block/sda/device -&amp;gt; ../../../0:0:0:0&lt;/li&gt;
&lt;li&gt;qui pointe en fait vers&lt;/li&gt;
&lt;li&gt;/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous en déduisons:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1f.2&lt;/strong&gt; : controleur sata de sda.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;target&lt;/strong&gt; : donne le port pour sda.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour faire plus court: &lt;code&gt;readlink -f /sys/block/sda/device&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;résultat de readlink sur sda, sdb, sdc :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

sda: /sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0
sdb: /sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:1/0:0:1:0
sdc: /sys/devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un coup d'oeil sur la carte mère..
&lt;ul&gt;
&lt;li&gt;Sur l'epoxy de la carte mère, il est sérigraphié un libellé à côté de
chaque port sata: &lt;em&gt;sata-a&lt;/em&gt;, &lt;em&gt;sata-b&lt;/em&gt;… jusqu'à &lt;em&gt;sata-d&lt;/em&gt;
pour ma part.&lt;/li&gt;
&lt;li&gt;Ces ports sont reliés à des disques. Une étiquette sur le cordon sata côté
disque indique: hd0, hd1, hd2.&lt;/li&gt;
&lt;li&gt;Nous en déduisons assez logiquement que le nommage du controleur sata suit
la même progression.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;host0&lt;/em&gt; pour les deux premiers, logique au vu du branchement
physique.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;q&gt;Logique&lt;/q&gt; et &lt;q&gt;Informatique&lt;/q&gt; ne riment que dans le dictionnaire.
&lt;ul&gt;
&lt;li&gt;Nous pouvons vérifier notre théorie en débranchant le premier disque,
machine éteinte.&lt;/li&gt;
&lt;li&gt;Ensuite, nous rallumons la machine en bootant sur le media d'installation
ou sur un live-CD (surtout pas sur votre OS à ce stade!).&lt;/li&gt;
&lt;li&gt;Il ne reste plus qu'à vérifier, en faisant la manipulation ci-dessus. Vous
devriez retrouver facilement l'emplacement physique du disque déconnecté.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tout ceci devrait faciliter le remplacement d'un disque grillé, sans avoir
besoin de l'horrible méthode &lt;em&gt;essai/erreur&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Simulation d'une panne soft&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Les possibilités ne manquent pas, avec option &lt;em&gt;électrocution&lt;/em&gt; pour
les aventuriers de tous les dangers.
&lt;ul&gt;
&lt;li&gt;Pour commencer, j'ai choisi la méthode douce: marquage d'une partition raid
en &lt;em&gt;fail&lt;/em&gt;, et retrait de celle-ci.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Marquage en fail:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# mdadm -f /dev/md1 /dev/sda1
mdadm: set /dev/sda1 faulty in /dev/md1

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retrait de la partition:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# mdadm -r /dev/md1 /dev/sda1
mdadm: hot removed /dev/sda1 from /dev/md1

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vérification du retrait de sda1 de md1
&lt;ul&gt;
&lt;li&gt;La première partition est arrêtée: &lt;strong&gt;_UU&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md2 : active raid5 sdb2[1] sdc2[2] sda2[0]
      923833728 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md1 : active raid1 sdc1[2] sdb1[1]
      24410624 blocks [3/2] [_UU]

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remise en route du raid
&lt;ul&gt;
&lt;li&gt;Auparavant, nous créons un gros fichier sur md1, juste pour rire.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dd if=/dev/urandom of=garbage count=1M bs=1K&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et nous ajoutons sda1 à l'array md1
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mdadm -a /dev/md1 /dev/sda1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ça bosse ? Un petit coup d'oeil à mdstat&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# mdadm -a /dev/md1 /dev/sda1
mdadm: re-added /dev/sda1

# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md2 : active raid5 sdb2[1] sdc2[2] sda2[0]
      923833728 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md1 : active raid1 sda1[3] sdc1[2] sdb1[1]
      24410624 blocks [3/2] [_UU]
      [&amp;gt;....................]  recovery =  1.2% (293632/24410624) finish=2.7min speed=146816K/sec

unused devices: &amp;lt;none&amp;gt;

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Simulation d'une panne hard&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Cette fois, c'est du sérieux. Terminé les marquages &lt;em&gt;fail&lt;/em&gt;, place au
tournevis.&lt;/li&gt;
&lt;li&gt;Éteignons la machine, et retirons le disque correspondant à
&lt;strong&gt;sda&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Nous en plaçons un autre en &lt;q&gt;remplacement&lt;/q&gt;.
&lt;ul&gt;
&lt;li&gt;Nous avons vu plus haut comment repérer les disques dans le boitier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Bien entendu, nous n'avons pas pu sortir proprement de l'array raid le
disque &lt;q&gt;grillé&lt;/q&gt;.
&lt;ul&gt;
&lt;li&gt;Il faut donc rebooter sur un live CD, pour reconstruire l'array.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pas de bol, le nouveau disque inséré est identifié comme étant sdb (les
joies de udev).
&lt;ul&gt;
&lt;li&gt;En situation critique, il faudrait donc au plus deux reboots (et les fsck
afférents) pour trouver un disque grillé.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dans mon test de restauration, le disque de remplacement avait une capacité
très inférieure aux autres disques. Cela ne gêne pas pour du raid soft, et je
me suis contenté de reconstruire la partition système.
&lt;ul&gt;
&lt;li&gt;Opérons un fdisk sur un disque faisant partie de l'array, afin de récupérer
les valeurs &lt;q&gt;start&lt;/q&gt; et &lt;q&gt;end&lt;/q&gt; de la ppartition système. Ensuite, nous
re-créons la partition sur le disque de remplacement, en utilisant bien sûr les
mêmes valeurs.&lt;/li&gt;
&lt;li&gt;Il y a encore plus simple: si vous aviez sauvé les valeurs de vos
partitions raid avec &lt;em&gt;sfdisk&lt;/em&gt;, vous pouvez faire l'opération inverse
pour initialiser le nouveau disque (il faut cependant qu'il soit de capacité
identique ou supérieure aux disques déja présents).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une fois le disque de remplacement paramétré, nous pouvons assembler le
raid.
&lt;ul&gt;
&lt;li&gt;Nous commençons par intégrer les deux disques corrects.&lt;/li&gt;
&lt;li&gt;C'est un assemblage en mode dégradé (d'où le paramètre &lt;q&gt;--run&lt;/q&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm --assemble --run /dev/md1 /dev/sda1 /dev/sdc1

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Normalement, nous obtenons: &lt;em&gt;mdadm: /dev/md1 has been started with 2
drives (out of 3)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Un &lt;code&gt;cat /proc/mdstat&lt;/code&gt; donne plus de précisions&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

md1: active raid1 sda1[0] sdc1[2]
     24410624 blocks [3/2] [U_U]

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il ne nous reste plus qu'à ajouter le disque de remplacement à
l'array:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm --add /dev/md1 /dev/sdb1
~# cat /proc/mdstat # indique que le recovery est en cours.

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le mount du disque RAID est possible, pour vérifier que tout est bien là.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mount /dev/md1 /mnt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Attention à éditer mdadm.conf et /etc/fstab sur votre array, si vous n'avez
pas restauré toutes les partitions!&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Rebootons sur notre RAID remis en état.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voilà.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si vous avez fait un test et que vous désirez remettre l'ancien disque,
enlevé uniquement durant le test:
&lt;ul&gt;
&lt;li&gt;bootez sur un live CD.&lt;/li&gt;
&lt;li&gt;agrégez le raid sur les deux disques synchronisés dans le raid.&lt;/li&gt;
&lt;li&gt;ajoutez le disque (même procédure que ci-dessus).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une astuce pour finir. Vous pouvez très bien faire:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#ici, /dev/sdb1 n'a pas encore été remis dans l'array

~# mdadm --assemble /dev/md1 /dev/sd1 /dev/sdb1 /dev/sdc1
mdadm: /dev/md1 assembled from 2 drives - need all 3 to start it
       (use --run to insist).

~# mdadm --run /dev/md1
mdadm: started /dev/md1

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;code&gt;cat /proc/mdstat&lt;/code&gt; montre que sdb est manquant.
&lt;ul&gt;
&lt;li&gt;Il ne reste qu'à ajouter sdb1 à md1, et c'est reparti!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Mais je serai RAID avant qu'il n'ait fini !&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous avez sans doute remarqué que la reconstruction d'une array pouvait
prendre un certain temps.&lt;/li&gt;
&lt;li&gt;Heureusement, il y a moyen d'accélérer les choses.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous ne voulez rien synchroniser, car vous avez juste déplacé un disque de
port SATA sur la carte mère. Ceci peut arriver dans le cas d'un changement de
cable par exemple, cable qui sera trop court. Dans ce cas, votre troisième
disque contient déja toutes les données et vous n'avez pas besoin de le
reconstruire.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt; cette option n'est valable que si vous n'avez
pas encore monté le RAID que vous voulez reconstruire. &lt;strong&gt;Si vous avez
booté sur le RAID ou monté vos disques RAID&lt;/strong&gt;, c'est fichu, cette option
n'est plus valable.&lt;/li&gt;
&lt;li&gt;Faites un resync du &lt;q&gt;nouveau&lt;/q&gt; disque avec l'option
&lt;code&gt;——assume-clean&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un cas plus classique de grande lenteur.
&lt;ul&gt;
&lt;li&gt;Dans un cas plus réaliste, c'est à dire si vous ajoutez un disque neuf,
vous serez obligé de tout reconstruire. Mais même dans ce cas, vous pouvez
également accélérer les choses.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# cat /proc/sys/dev/raid/speed_limit_min
1000
~# cat /proc/sys/dev/raid/speed_limit_max 
200000

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ceci signifie que pour chaque disque, la limite minimale de reconstruction
est de 1mo par seconde. Et la limite haute est de 200mo/s.&lt;/li&gt;
&lt;li&gt;La limite basse est vraiment peu élevée. On peut l'augmenter.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

echo 20000 &amp;gt; /proc/sys/dev/raid/speed_limit_min
 
OU
 
sysctl -w dev.raid.speed_limit_min=20000
 
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Nous passons ainsi à un objectif de 20mo/s.
&lt;ul&gt;
&lt;li&gt;Ces modifications sont temporaires. Il faudrait placer le &lt;em&gt;sysctl&lt;/em&gt;
dans un fichier de démarrage pour les rendre résistantes au reboot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous disposons également de l'option &lt;q&gt;bitmap&lt;/q&gt;, qui accélère la
reconstruction.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm --grow --bitmap=internal /dev/md0

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une fois l'array reconstruite, il faut désactiver l'option.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm --grow --bitmap=none /dev/md0

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une autre option susceptible d'accélérer les choses est de &lt;em&gt;mounter&lt;/em&gt;
les partitions avec l'option &lt;code&gt;noatime&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Cette option n'est pas spécifique au RAID, mais elle accélérera les
transactions sur les partitions journalisées avec EXT4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fstab&lt;/strong&gt; : &lt;code&gt;/dev/md1 / ext4 defaults,noatime 0
1&lt;/code&gt; (partition root)&lt;/li&gt;
&lt;li&gt;suivi d'un &lt;code&gt;mount / -o remount&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;puis d'un controle avec &lt;code&gt;cat /proc/mounts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un petit exemple de vitesse avec ces paramètres modifiés (speed_limit_min
et bitmap):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm --grow --bitmap=internal /dev/md1

~# mdadm -a /dev/md1 /dev/sdc5

# cat /proc/mdstat 

Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] 
md1 : active raid5 sdc5[3] sda5[0] sdb5[1]
      1718745088 blocks level 5, 512k chunk, algorithm 2 [3/2] [UU_]
      [&amp;gt;....................]  recovery =  0.5% (4840064/859372544) finish=150.8min speed=94402K/sec
      bitmap: 3/7 pages [12KB], 65536KB chunk

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Better RAID than dead&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sur ce, j'arrête les jeux de mots faciles. Avant que tout cela ne ressemble
au style des admins BSD.&lt;/li&gt;
&lt;li&gt;Merci d'avoir pris le temps de lire ce long billet (oserais-je parler
d'article ?). J'ai passé encore plus de temps à l'écrire.&lt;/li&gt;
&lt;li&gt;Dernière chose: j'ai utilisé mes notes provenant de l'installation de deux
machines. Il se peut que certains devices vers la fin ne correspondent plus à
ceux du début. J'ai tout relu et corrigé, bien sûr, mais certains détails ont
pu m'échapper.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/04/27/Better-RAID-than-dead#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/04/27/Better-RAID-than-dead#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/512067</wfw:commentRss>
      </item>
    
  <item>
    <title>RTFM</title>
    <link>http://www.finiderire.com/post/2011/03/14/RTFM</link>
    <guid isPermaLink="false">urn:md5:2e00a1c38130a2b2414b4358417b9e06</guid>
    <pubDate>Tue, 15 Mar 2011 00:17:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>FreeBSD</category><category>Linux</category><category>vim</category>    
    <description>&lt;p&gt;&lt;em&gt;RTFM! Qui n'a jamais entendu cette injonction, tant laconique que
définitive, à la suite d'une innocente question ?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Alors on lance man... et les pages de manuel s'accumulent dans les
terminaux.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Mais il existe une solution.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Dans tous les moments de la vie, Vim est votre ami.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Apprendre à lire&lt;/h3&gt;
&lt;h5&gt;man, classique&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;man&lt;/code&gt; est lancé depuis le terminal actif, puis fermé pour
utiliser la commande.
&lt;ul&gt;
&lt;li&gt;Bien entendu, juste après la fermeture, la moitié des paramètres est déja
oubliée.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;man, séparé&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous utilisez un autre terminal, et vous lancez &lt;code&gt;man&lt;/code&gt; au sein de
celui-ci.
&lt;ul&gt;
&lt;li&gt;Le terminal principal reste libre, et vous gardez le manuel ouvert à
l'endroit qui vous intéresse.&lt;/li&gt;
&lt;li&gt;Cette façon de faire est un peu meilleure, mais les terminaux ont tendance
à se multiplier, voire s'empiler (sous X).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;man avec Vim&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vim possède depuis plusieurs années déja le support des &lt;em&gt;tabs&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;Chaque &lt;em&gt;tab&lt;/em&gt; correspond à une zone de saisie différente au sein de
Vim.&lt;/li&gt;
&lt;li&gt;A ne pas confondre avec le mode splitté de la zone de saisie (&lt;code&gt;:help
split&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Très pratique pour l'édition multiple de sources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour tester les tabs:
&lt;ul&gt;
&lt;li&gt;Lancez Vim.&lt;/li&gt;
&lt;li&gt;Et en mode commande: &lt;code&gt;:tabnew&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour avoir la liste de toutes les possibilités associées aux &lt;em&gt;tabs&lt;/em&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:help tabs&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons utiliser les &lt;em&gt;tabs&lt;/em&gt; afin d'ouvrir chaque nouvelle page
de man dans un nouveau tab.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Contrôle de Vim à distance&lt;/h3&gt;
&lt;h5&gt;Tout cela est bien beau...&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous allez me dire (et vous aurez bien raison) que tout cela est bien
beau.&lt;/li&gt;
&lt;li&gt;Et vous ajouterez (toujours avec raison) qu'encore faudrait-il avoir la
possibilité de contrôler une instance de Vim depuis le shell.&lt;/li&gt;
&lt;li&gt;Comme vous vous en doutez, on peut. A la seule condition que Vim ait été
compilé avec l'option &lt;strong&gt;clientserver&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Le paquet officiel de Arch comporte cette option. Utilisateurs Ubuntu, ne
pleurez pas, vous bénéficiez du même traitement de faveur.&lt;/li&gt;
&lt;li&gt;Les vrais mecs sous Gentoo n'ont plus qu'à recompiler avec le bon flag.
Quand aux Slackers, ils ont d'autres soucis: Pango vient de se téléscoper Cairo
après une mise à jour douteuse, et plus rien ne fonctionne.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Vim! Lève toi et marche!&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il faut lancer Vim en mode serveur, avec un nom d'instance pour le repérer
par la suite:
&lt;ul&gt;
&lt;li&gt;Afin de bien appuyer le propos, &lt;em&gt;finiderire&lt;/em&gt; est utilisé comme nom
d'instance.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim --servername finiderire&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et ensuite, on ouvre un fichier dans l'instance &lt;em&gt;finiderire&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gvim --servername finiderire&lt;/code&gt; &lt;code&gt;--remote-tab
/etc/passwd&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;A noter l'option &lt;code&gt;--remote-tab-silent&lt;/code&gt; qui ne provoquera pas
d'avertissement de Vim si l'instance est créée en même que l'ouverture de la
tab.
&lt;ul&gt;
&lt;li&gt;Nous allons utiliser cette option pour notre pager, afin d'éviter de tester
l'existence de l'instance pour la première ouverture.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et pour tout voir sans rien payer:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:help remote&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Communication man/Vim&lt;/h3&gt;
&lt;h5&gt;MANPAGER&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$MANPAGER&lt;/code&gt; est une variable d'environnement du shell qui permet
d'indiquer quel pager utiliser pour ouvrir une page man.
&lt;ul&gt;
&lt;li&gt;Il faudra penser à l'initialiser avec le nom et l'emplacement de notre
script, une fois celui-ci au point.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour le moment, nous lançons &lt;code&gt;man&lt;/code&gt; avec l'option &lt;code&gt;-P&lt;/code&gt;
qui a une priorité supérieur à &lt;code&gt;$MANPAGER&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Pour avoir le comportement par défaut de man (ouverture dans le terminal de
la page de manuel):&lt;/li&gt;
&lt;li&gt;&lt;code&gt;man -P &amp;quot;less -s&amp;quot; ls&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Les opérations à réaliser&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;On commence par récupérer la sortie de man avec un simple cat:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;man -P &amp;quot;cat &amp;quot; ls &amp;gt;/tmp/man.$$&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Récupération de la page dans Vim:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gvim --servername finiderire&lt;/code&gt; &lt;code&gt;--remote-tab-silent
/tmp/man.$$&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Effacement du fichier temporaire:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rm /tmp/man.$$&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Script final&lt;/h3&gt;
&lt;h5&gt;Voici un script plus complet.&lt;/h5&gt;
&lt;pre&gt;

#!/bin/bash

pageman=/tmp/$$.man

rm -f /tmp/*.man

cat | col -b -x &amp;gt; $pageman

man_asked=/tmp/&amp;quot;$(head -1 $pageman | sed 's/\(^[^\ \(]\+\).*/\1/')&amp;quot;.man
mv &amp;quot;$pageman&amp;quot; &amp;quot;$man_asked&amp;quot;

gvim -R -c 'set ft=man nomod nolist nonumber guioptions=&amp;quot;-T -m&amp;quot;' -font &amp;quot;Terminus (TTF) 12&amp;quot; -c 'map q :q!&amp;lt;CR&amp;gt;' --servername finiderire --remote-tab-silent $man_asked

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Et voici les explications&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Effacer les anciens fichiers man en entrée du script.
&lt;ul&gt;
&lt;li&gt;On ne peut pas le faire en sortie du script, car il n'y aurait plus rien
dans Vim.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rm -f /tmp/*.man&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Formatter la sortie de man.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat | col -b -x &amp;gt; $pageman&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Récupérer le nom de la page de manuel demandée.
&lt;ul&gt;
&lt;li&gt;Cela sert à générer le nom du fichier, afin d'afficher le nom de la
commande dans la tab.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

 man_asked=/tmp/&amp;quot;$(head -1 $pageman | sed 's/\(^[^\ \(]\+\).*/\1/')&amp;quot;.man

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Et le gros morceau: le lancement de Vim.
&lt;ul&gt;
&lt;li&gt;passer en &lt;q&gt;read-only&lt;/q&gt; : &lt;code&gt;-R&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;indiquer que le type de fichier est une page man, pour la coloration
syntaxique: &lt;code&gt;set ft=man&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;diverses commandes pour désactiver les préférences du .vimrc :
&lt;code&gt;nomod nolist nonumber&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;supprimer la toolbar et le menu pour gagner de la place:
&lt;code&gt;guioptions=&amp;quot;-T -m&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;changer la fonte par défaut: &lt;code&gt;font &amp;quot;Terminus (TTF) 12&amp;quot;&lt;/code&gt;. Cette
fonte est disponible dans les paquets Arch.&lt;/li&gt;
&lt;li&gt;permettre de quitter la page avec un simple appui sur la touche
&lt;strong&gt;q&lt;/strong&gt; : &lt;code&gt;map q :q!&amp;lt;CR&amp;gt;&lt;/code&gt;. Et si vous
modifiâtes par erreur le buffer, vous sortirez sans confirmation.&lt;/li&gt;
&lt;li&gt;Et enfin, ouvrir la page man dans l'instance &lt;em&gt;finiderire&lt;/em&gt;, dans une
&lt;em&gt;tab&lt;/em&gt; portant le nom de la commande demandée.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;N'oubliez pas d'ajouter dans votre &lt;code&gt;.bashrc&lt;/code&gt; (pour les
utilisateurs de bash, bien sûr)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;export MANPAGER=/path/vers/votre/script&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Améliorations possibles&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Dans ce script, j'utilise &lt;em&gt;gvim&lt;/em&gt;, qui est la version X de Vim.
&lt;ul&gt;
&lt;li&gt;Vim peut également être lancé avec ou sans l'option &lt;q&gt;-g&lt;/q&gt;, selon que
vous désirez ou non la version X.&lt;/li&gt;
&lt;li&gt;En d'autres termes, &lt;code&gt;gvim&lt;/code&gt; est un alias pour &lt;code&gt;vim
-g&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Vous pourrez donc modifier le script pour lancer en mode console vim, et
passer en mode gvim si l'environnement graphique est détecté.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une autre amélioration possible serait de nommer les tabs sans l'astuce du
&lt;code&gt;mv&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Vous pouvez initialiser Vim en précisant le nom du tab : &lt;code&gt;:help
setting-guilabel&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;C'est d'ailleurs la façon la plus propre de procéder. Je n'ai découvert
cette possibilité qu'après avoir écrit le script, à la relecture de ce
billet.&lt;/li&gt;
&lt;li&gt;Cette modification est donc laissée à titre d'exercice au lecteur.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une modification sympathique serait d'intercepter le double clic de la
souris, qui surligne un mot sous Vim, afin de lancer la page man
correspondante.
&lt;ul&gt;
&lt;li&gt;Vous pouvez bien sûr d'ores et déja faire &lt;code&gt;:!man foo&lt;/code&gt; depuis Vim
pour ouvrir la manpage &lt;em&gt;foo&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Il serait cependant plus agréable de le faire d'un simple (double)
clic.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;RTFM, RTFB&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Si d'aventure vous goûtez au &lt;strong&gt;RTFM!&lt;/strong&gt; sur un forum,
consolez-vous en pensant que ça arrive même aux meilleurs.
&lt;ul&gt;
&lt;li&gt;Et si vraiment vous êtes vexé, consolez-vous en pensant que vous avez
désormais le plus beau pager de la galaxie pour lire les pages man.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voilà.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et n'oubliez pas, RTFB !
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Read The Finest Blog&lt;/em&gt;, bien entendu.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2011/03/14/RTFM#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2011/03/14/RTFM#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/594352</wfw:commentRss>
      </item>
    
  <item>
    <title>Unison : o c mal</title>
    <link>http://www.finiderire.com/post/2010/10/21/Unison-%3A-o-c-mal</link>
    <guid isPermaLink="false">urn:md5:d30a0a54e41e2d72f9af6aebad625b51</guid>
    <pubDate>Wed, 08 Dec 2010 22:43:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Arch</category><category>Gentoo</category><category>Linux</category><category>tools</category>    
    <description>&lt;p&gt;&lt;em&gt;Les habitués de mon blog et de ma rigueur langagière doivent déja frémir
en voyant ce titre !&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Est-il devenu fou ? Le blog a t-il été piraté ? Cède t-il aux
sirènes du jeunisme triomphant ?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Nenni ma foi, et je ne puis que vous encourager à
poursuivre.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Justifications&lt;/h3&gt;
&lt;h5&gt;De l'origine d'Unison&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Unison est écrit en OCaml, langage fort respectable à mi chemin entre le
procédural et le fonctionnel.&lt;/li&gt;
&lt;li&gt;La communauté OCamlienne est pour l'essentiel française. Elle se situe pour
la plupart dans les locaux de l'INRIA. Elle communique en anglais via le
channel IRC éponyme sur Freenode.&lt;/li&gt;
&lt;li&gt;OCaml est pour le moment en phase de transition majeure. Le temps que les
platres soient essuyés, méfiez-vous de la version 3.12 .&lt;/li&gt;
&lt;li&gt;Par ricochet, Unison recontre quelques problèmes (distribution Arch Linux)
avec OCaml. D'où le titre.
&lt;ul&gt;
&lt;li&gt;A noter que ce problème ne touche pas Gentoo. Utilisateurs de Arch,
continuez à lire. Utilisateurs de Gentoo, continuez à compiler.&lt;/li&gt;
&lt;li&gt;En fait, ça fonctionne sous Gentoo car OCaml 3.12 n'est pas encore en
stable dans portage, donc les problèmes ne sont pas encore apparus.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Description des symptomes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Unison existe en trois versions, du moins sous Linux:
&lt;ul&gt;
&lt;li&gt;texte (pratique pour tester, mais peu agréable à l'usage).&lt;/li&gt;
&lt;li&gt;gtk (moche).&lt;/li&gt;
&lt;li&gt;gtk2 (la version par défaut).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La version texte fonctionne toujours, c'est celle à privilégier pour
vérifier le bon fonctionnement d'une connexion distante.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le sujet a déja été abordé dans ce fabuleux blog, rappelons simplement que
la communication peut se faire en clair ou avec SSH.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le script qui esquive le problème&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Unison va devoir être lancé via un script&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Contenu du script:&lt;/h5&gt;
&lt;pre&gt;

~$ cat ./unison2.32
mon_host=desktop_jseb_arch
unison_local=unison-gtk2
#unison_local=unison-gtk

echo &amp;quot;lancement de Unison avec ces paramètres :&amp;quot;
echo &amp;quot;UNISONLOCALHOSTNAME=$mon_host $unison_version&amp;quot;
UNISONLOCALHOSTNAME=$mon_host ltrace -L $unison_local -servercmd=unison-2.32 -contactquietly

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Quelques explications&lt;/h5&gt;
&lt;p&gt;Le &amp;quot;contactquietly&amp;quot; permet d'avoir le focus sur le terminal, plutot que sur
une inutile boite de dialogue.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le patch de Jérome Vouillon&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;https://bugs.archlinux.org/task/20877?getfile=5824
&lt;ul&gt;
&lt;li&gt;J'ai eu du mal à le trouver, je le joins en fichier à ce billet par
précaution.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Soyons fou, à l'unison&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Si ça continue, je vais créer un tag Unison.&lt;/li&gt;
&lt;li&gt;Et assurer le SAV également.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
          <enclosure url="http://www.finiderire.com/public/patchs/jvouillon.patch"
      length="788" type="text/plain" />
    
    
          <comments>http://www.finiderire.com/post/2010/10/21/Unison-%3A-o-c-mal#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/10/21/Unison-%3A-o-c-mal#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/556183</wfw:commentRss>
      </item>
    
  <item>
    <title>Chauds les marrons! La duplication sans chataignes</title>
    <link>http://www.finiderire.com/post/2010/11/16/Chauds-les-marrons%21-La-duplication-sans-chataignes</link>
    <guid isPermaLink="false">urn:md5:09aebc437862e8e2aad9823ffda976ba</guid>
    <pubDate>Wed, 24 Nov 2010 19:48:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Linux</category>    
    <description>&lt;p&gt;&lt;em&gt;Vous avez installé Linux sur un disque, tout est bien configuré, et
parfait dans le meilleur des mondes.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Seulement voila: vous avez décidé de répliquer votre installation sur un
plus gros disque. Ou pourquoi pas, un plus petit (SSD).&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Contrainte supplémentaire: vous voulez le faire à chaud, pour bénéficier de
votre environnement (et continuer à surfer pendant l'opération).&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La grande réplication&lt;/h3&gt;
&lt;h5&gt;Ce que nous avons&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Un disque dur &lt;strong&gt;/dev/sda&lt;/strong&gt; avec deux partitions ext4, et une
partition swap.
&lt;ul&gt;
&lt;li&gt;Les partitions ext4 contiennent respectivement &lt;strong&gt;/&lt;/strong&gt; et le
contenu de &lt;strong&gt;/home&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;La partition swap est utilisée pour l'hibernation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Ce que nous voudrions que cela devienne&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous venons de monter un second disque dur, reconnu comme
&lt;strong&gt;/dev/sdb&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Ce disque va servir à répliquer le premier disque dur.&lt;/li&gt;
&lt;li&gt;Il est partitionné avec deux partitions ext4, et une partition de
swap.&lt;/li&gt;
&lt;li&gt;Ses partitions n'ont bien sûr pas la même taille que le premier (le but
n'est pas de faire une réplication à l'identique, mais bien de gagner de la
place!).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;En résumé&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous voulons copier &lt;strong&gt;sda&lt;/strong&gt; vers &lt;strong&gt;sdb&lt;/strong&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sda1 = /&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sda2 = /home&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Procédons !&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Nous venons de booter sur le disque servant de base à la réplication
(&lt;em&gt;sda&lt;/em&gt;).
&lt;ul&gt;
&lt;li&gt;Pour l'instant, sdb ne contient rien (je pars toutefois du principe que
fdisk est déja passé par là).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Formatage des partitions sur sdb&lt;/h5&gt;
&lt;pre&gt;

mkfs.ext4 /dev/sdb1 -L arch_root
mkfs.ext4 /dev/sdb2 -L arch_home

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Il est important de nommer les partitions (argument &lt;strong&gt;-L&lt;/strong&gt;),
car cela permet ensuite de se passer des noms de devices.
&lt;ul&gt;
&lt;li&gt;fstab utilisera les noms de partitions pour le mount.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Montage des partitions de destination&lt;/h5&gt;
&lt;pre&gt;

mount /dev/sdb1 /media/hd
mkdir /media/hd/home
mount /dev/sdb2 /media/hd/home

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;A adapter selon vos goûts (et votre schéma de partitionnement) bien
entendu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Re-montage de la partition système en cours d'utilisation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pourquoi re-monter une partition forcément déja montée, puisqu'en cours
d'utilisation ?
&lt;ul&gt;
&lt;li&gt;Parce qu'on ne peut pas faire un &lt;code&gt;cp -a / /media/hd&lt;/code&gt;
directement.&lt;/li&gt;
&lt;li&gt;En effet, il y aurait copie récursive lorsque &lt;q&gt;cp&lt;/q&gt; arriverait sur
&lt;em&gt;/media/hd&lt;/em&gt; du premier disque.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il faut donc remounter &lt;strong&gt;/&lt;/strong&gt; avec:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

mount -o bind / /mnt/root

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;le but du &lt;q&gt;mount -o bind&lt;/q&gt; est de donner accès a la partition root
brute (sans aucun mount, ni /proc monté).&lt;/li&gt;
&lt;li&gt;Elle reste bien sûr montée sur / par ailleurs (fort heureusement).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;La copie peut débuter&lt;/h5&gt;
&lt;pre&gt;

cp -a /mnt/root/* /media/hd/

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Comme dit précédemment, ça ne copie pas &lt;em&gt;/home&lt;/em&gt;. Il est toujours
monté à son emplacement d'origine.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons donc le copier à son tour.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

cp -a /home/* /media/hd/home/
(puis, eventuellement:)
chown jseb.jseb /media/hd/home/jseb

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Cooooopie, c'est fiiiiini ...&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Avant de démonter, nous créons un fichier à la racine du nouveau disque
pour le repérer plus facilement dans grub.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

touch /media/hd/nouveau_disque

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Cette astuce va nous permettre de ne pas commettre d'impair avec grub.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On peut ensuite démonter les partitions.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

umount /media/hd/home
umount /media/hd

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Fignolagisation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cet horrible néologisme qui raye l'émail n'avait que pour but de réveiller
les lecteurs assoupis pendant la copie.
&lt;ul&gt;
&lt;li&gt;En effet, tout n'est pas fini: nous voulons que ce disque soit bootable, et
que l'hibernation soit toujours fonctionnelle.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Avez-vous vérifié que la partition destination système avait le flag
&lt;q&gt;bootable&lt;/q&gt;, au fait ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;fstab&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Tout d'abord, occupons nous du fstab présent sur le disque de
destination.&lt;/li&gt;
&lt;li&gt;Si vous n'avez pas changé les noms et les emplacements de vos points de
montage, vous pouvez laisser telles les entrée concernées.&lt;/li&gt;
&lt;li&gt;Il vous faudra cependant au moins modifier l'entrée pour la swap, dont l'id
va changer.&lt;/li&gt;
&lt;li&gt;Vous devriez avoir quelque chose dans ce genre (j'ai isolé ce qui nous
intéresse, le vrai fstab est plus long):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

LABEL=arch_root / ext4 defaults 0 1
LABEL=arch_home /home ext4 defaults 0 1
#pour monter automatiquement le swap d'après son UUID (et non plus le premier trouvé dans l'ordre d'énumération des devices)
UUID=5e6d9679-16dc-48f7-889b-2c7181c01e15 swap  swap defaults          0      0

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Quelques explications à propos du swap et son identification par l'UUID.
&lt;ul&gt;
&lt;li&gt;Si on reboote avec l'ancien disque branché, et que le swap n'a pas été
précisé dans la config, le premier trouvé (quel que soit le device) sera
utilisé.&lt;/li&gt;
&lt;li&gt;On ne peut pas utiliser les lettres de device (sda, sdb ..) pour indiquer
où se trouve le swap, car le nommage est dynamique et ne tombera pas forcément
sur le device précisé dans la config.&lt;/li&gt;
&lt;li&gt;Il faut utiliser l'UUID de la nouvelle partition de swap, obtenu avec
&amp;quot;mkswap&amp;quot;.&lt;/li&gt;
&lt;li&gt;Si vous n'avez pas noté l'UUID du disque au moment de la création du swap,
vous pourrez le retrouver ici: &lt;em&gt;/dev/disk/by-uuid&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Configuration du pingouin gelé&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Les fichiers de configuration de &lt;em&gt;TuxOnIce&lt;/em&gt; se trouvent généralement
ici: &lt;em&gt;/etc/hibernate/&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dans &lt;em&gt;tuxonice.conf&lt;/em&gt;, vous devriez ajouter l'uuid de votre nouveau
swap.
&lt;ul&gt;
&lt;li&gt;Ceci évitera l'utilisation du swap de votre ancien disque, si celui-ci est
trouvé en premier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

SuspendDevice swap:UUID=5e6d9679-16dc-48f7-889b-2c7181c01e15

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ne modifiez pas l'emplacement du swap pour l'hibernation dans la
configuration du kernel, cela ne concerne pas TuxOnIce.
&lt;ul&gt;
&lt;li&gt;Donc pas la peine de recompiler un noyau.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;grub&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Contenu potentiel de &lt;em&gt;menu.lst&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# /boot/grub/menu.lst:

title  2.6.36-ToI JSeb
root   (hd0,0)
#kernel /boot/vmlinuz26 root=/dev/disk/by-label/arch_root ro VGA=ask
kernel /boot/vmlinuz26 root=/dev/disk/by-label/arch_root ro resume=swap:UUID=5e6d9679-16dc-48f7-889b-2c7181c01e15 VGA=ask
initrd /boot/kernel26.img

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;On remarquera que le root pointe sur mon premier disque.&lt;/li&gt;
&lt;li&gt;La copie s'est faite vers sdb (dans l'ordre des énumérations).
&lt;ul&gt;
&lt;li&gt;Ce n'est pas grave: sdb devient tout simplement sda.&lt;/li&gt;
&lt;li&gt;Vu que les devices ne sont pas utilisés dans la suite du boot (repérage par
nom de partition et par UUID pour le swap), tout fonctionne.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensuite, lancez grub en root.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

grub&amp;gt; find /nouveau_disque
 (hd1,0)

grub&amp;gt; root (hd1,0)
 Filesystem type is ext2fs, partition type 0x83

grub&amp;gt; setup (hd1)

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;A noter l'astuce du &lt;em&gt;find&lt;/em&gt;, sur le fichier précédemment créé à la
racine.
&lt;ul&gt;
&lt;li&gt;Ceci permet de repérer à coup sûr le disque.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Voila, grub est installé sur le MBR.
&lt;ul&gt;
&lt;li&gt;pour installer sur sdb1 , ce que certains préfèrent , il aurait fallu
faire:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setup (hd1,0)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;C'est dans la boite&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Que dire de plus ?&lt;/li&gt;
&lt;li&gt;reboot ! Et croisez les doigts, on ne sait jamais.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/11/16/Chauds-les-marrons%21-La-duplication-sans-chataignes#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/11/16/Chauds-les-marrons%21-La-duplication-sans-chataignes#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/562468</wfw:commentRss>
      </item>
    
  <item>
    <title>Arch, le kernel et la marmotte</title>
    <link>http://www.finiderire.com/post/2010/11/09/Arch%2C-le-kernel-et-la-marmotte</link>
    <guid isPermaLink="false">urn:md5:8951e7c237145cbd1375657cb4784128</guid>
    <pubDate>Thu, 11 Nov 2010 19:34:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Arch</category><category>Linux</category>    
    <description>&lt;p&gt;&lt;em&gt;Vous venez de compiler un noyau personnalisé pour votre Arch.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Vous pourriez le copier à la main - et perdre le suivi de version des
paquets Arch.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Que fait la marmotte avec le beau noyau de Arch ?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Elle l'emballe dans le paquet!&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La saison des marmottes&lt;/h3&gt;
&lt;h5&gt;kernel perso&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous voulons donc nous compiler un noyau personnalisé, et l'empaqueter
proprement.&lt;/li&gt;
&lt;li&gt;Afin d'ajouter un peu d'intérêt à la chose, nous allons aborder un cas que
les noyaux génériques de Arch ne couvrent pas.
&lt;ul&gt;
&lt;li&gt;Il s'agit d'ajouter au noyau le patche &lt;em&gt;TuxOnIce&lt;/em&gt;, afin de permettre
l'hibernation.&lt;/li&gt;
&lt;li&gt;Dans AUR, il y a bien un &lt;em&gt;build&lt;/em&gt; s'occupant de cette tâche. Il ne
fonctionne hélas pas du tout. Je vous laisse vous référer aux rapports de bugs
Arch pour plus de précisions (c'est à dire que vous apprendrez qu'il est urgent
d'attendre une nouvelle version du noyau).&lt;/li&gt;
&lt;li&gt;Les impatients devront donc compiler eux-même leur noyau. C'est ce que nous
allons faire, et nous en profiterons au passage pour expérimenter une ou deux
nouvelles pratiques.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous avez tous une carte 3D ? Sous Linux, NVidia est malheureusement
le passage obligé. Nous ajouterons donc la création d'un paquet contenant les
derniers drivers propriétaires.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dans ce billet, je n'aborde que les grandes lignes des manipulations
générales, et je n'entre dans les détails que pour les spécificités Arch.
&lt;ul&gt;
&lt;li&gt;Par exemple, si vous ne savez pas patcher les sources du kernel avec
&lt;em&gt;TuxOnIce&lt;/em&gt;, lisez la documentation du site web du projet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Et la marmotte ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Je viens de voir passer la marmotte, et elle trainait un gros édredon. Il
ne va pas falloir trop compter sur elle.&lt;/li&gt;
&lt;li&gt;En d'autres termes, vous allez devoir faire le paquet vous même.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Préparation&lt;/h3&gt;
&lt;h5&gt;Récupération des sources&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Récupérez le dernier noyau stable sur &lt;em&gt;kernel.org&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;Pour l'instant, il s'agit du &lt;strong&gt;2.6.36&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Les sources sont placées dans /usr/src.
&lt;ul&gt;
&lt;li&gt;Certaines personnes vous diront de les mettre dans votre home. Ignorez
les.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;N'oubliez pas de faire un lien symbolique &lt;strong&gt;/usr/src/linux&lt;/strong&gt;
pointant vers votre répertoire de sources kernel.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ln -s linux-2.6.36 linux&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Récupérez le patch de &lt;em&gt;TuxOnIce&lt;/em&gt;, et placez le dans le répertoire du
kernel à préparer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Configuration du kernel&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Commencez par patcher le kernel avec &lt;em&gt;TuxOnIce&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;patch -p1 &amp;lt; tuxonice.patch&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Supprimez les reliques et scories éventuelles. A faire même si vous venez
de désarchiver les sources.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make mrproper&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ensuite, il s'agit de choisir soigneusement les options du noyau (n'oubliez
pas l'hibernation, ça serait bête)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make menuconfig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Si vous voulez hiberner en utilisant le swap, pas la peine de préciser
l'emplacement de celui-ci dans les options touchant à l'hibernation du kernel
(cela ne concerne pas &lt;em&gt;TuxOnIce&lt;/em&gt;, mais le support interne du noyau pour
l'hibernation. Son utilisation est déconseillée.).&lt;/li&gt;
&lt;li&gt;La configuration part dans les fichier &lt;q&gt;.config&lt;/q&gt;, qui est effacé à
chaque &lt;code&gt;make mrproper&lt;/code&gt;. N'oubliez pas de le sauver sous un autre
nom, on ne sait jamais.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Définition du paquet Arch&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;makepkg&lt;/strong&gt; utilise deux fichiers de configuration, qui seront
nommés ainsi pour l'occasion:
&lt;ul&gt;
&lt;li&gt;PKGBUILD : pour la construction du paquet.&lt;/li&gt;
&lt;li&gt;kernel26.install : pour l'installation du paquet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;J'ai repris les deux fichiers du wiki Arch (mes modifications sont
mineures) :
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wiki.archlinux.org/index.php/Kernel_Compilation_From_Source&quot;&gt;un peu de
lecture qui ne fera pas de mal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;PKGBUILD&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous n'aurez pas grand chose à modifier.
&lt;ul&gt;
&lt;li&gt;En fait, je n'ai modifié que le nom du paquet, et le numéro de version du
kernel.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

pkgname=kernel26-jseb
basekernel=2.6.36
pkgver=2.6.36

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;kernel26.install&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;J'ai simplement changé ces deux lignes:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

KERNEL_VERSION=&amp;quot;2.6.36&amp;quot;
LOCAL_VERSION=&amp;quot;&amp;quot;

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Compilation&lt;/h3&gt;
&lt;h5&gt;Pour les sensibles avec plusieurs coeurs&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Si vous avez un processeur multicoeur, ne lancez pas directement
&lt;strong&gt;makepkg&lt;/strong&gt; .
&lt;ul&gt;
&lt;li&gt;Faites plutôt un &lt;strong&gt;make -j n+1&lt;/strong&gt; , où &lt;strong&gt;n&lt;/strong&gt; est
le nombre de cpu disponibles (qu'il s'agisse de CPU physiques, de cores, ou de
threads).&lt;/li&gt;
&lt;li&gt;Par exemple, pour un quad-core classique: &lt;code&gt;make -j 5&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;pour un Xeon 5520 (quad-core, deux threads par core): &lt;code&gt;make -j
9&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Les insensibles peuvent commencer ici&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Lancez &lt;code&gt;makepkg&lt;/code&gt; qui va créer le paquet.
&lt;ul&gt;
&lt;li&gt;Si vous avez préparé la compilation comme décrit ci dessus, ça sera rapide:
GCC n'aura plus qu'à linker les fichiers objets.&lt;/li&gt;
&lt;li&gt;Dans le cas contraire, il faudra être plus patient. Mais si vous n'avez pas
inclus n'importe quoi dans le noyau, la compilation ne devrait pas dépasser dix
minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Installation du noyau&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pacman -U chemin/du/paquet/kernel-bidule.xz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ajoutez à la config de &lt;strong&gt;grub&lt;/strong&gt; une entrée pour votre nouveau
noyau, puis rebootez.&lt;/li&gt;
&lt;li&gt;Ca boote encore ? Parfait!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Test de l'hibernation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vérifiez que l'hibernation fonctionne depuis la console:
&lt;ul&gt;
&lt;li&gt;n'oubliez pas d'installer le script d'hibernation si ce n'est déja
fait:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pacman -S hibernate-script&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Après vous être assuré que la méthode employée est bien le suspend2disk,
vous pouvez lancer la commande &lt;code&gt;hibernate&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Je ne détaille pas non plus la configuration de TuxOnIce, la doc est fort
bien faite et il n'y a pas grand chose à raconter.&lt;/li&gt;
&lt;li&gt;Assurez-vous toutefois d'activer la compression.&lt;/li&gt;
&lt;li&gt;Si vous utilisez le swap pour le suspend2disk, plus besoin de préciser
l'emplacement en paramètre du noyau, dans grub.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il ne reste plus qu' à installer le driver nvidia pour pouvoir lancer
X.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Haine vidia&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Les drivers proprios nvidia, c'est toujours un grand moment d'émotion.
&lt;ul&gt;
&lt;li&gt;Ne nous plaignons pas, ils fournissent des drivers corrects, eux (suivez
mon regard, je ne vise personne).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Simplifions-nous la vie&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pour éviter d'y passer trop de temps, je me suis contenté de récupérer le
build de &lt;em&gt;nvidia-ice&lt;/em&gt; (situé dans AUR).
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;yaourt -G nvidia-ice&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il n'y a pas grand chose à modifier dans &lt;strong&gt;PKGBUILD&lt;/strong&gt; :
&lt;ul&gt;
&lt;li&gt;la version du kernel.&lt;/li&gt;
&lt;li&gt;les dépendances : j'ai enlevé la dépendance sur le kernel, mais
j'aurais pu tout aussi bien modifier le nom. Votre avis peut varier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#!# pkgname=nvidia-ice
pkgname=nvidia-jseb

#!#_kernver='2.6.35-ice'
_kernver='2.6.36'

 (...)

#!#depends=(&amp;quot;kernel26-ice&amp;quot; &amp;quot;nvidia-utils=${pkgver}&amp;quot;)
depends=(&amp;quot;nvidia-utils=${pkgver}&amp;quot;)

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Même principe pour &lt;strong&gt;nvidia-ice.install&lt;/strong&gt; : modifier la
variable &lt;code&gt;KERNEL_VERSION&lt;/code&gt; si nécessaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je voudrais vous en dire plus, mais j'ai effacé mon répertoire de build
après avoir déplacé le paquet (un réflexe idiot).
&lt;ul&gt;
&lt;li&gt;Je pense toutefois qu'il n'y avait pas grand chose de plus à raconter.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour finir, lancez &lt;code&gt;makepkg&lt;/code&gt; dans le répertoire contenant le
pkgbuild.
&lt;ul&gt;
&lt;li&gt;Si tout s'est bien déroulé, vous avez un magnifique paquet nvidia prêt à
être installé avec:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pacman -U votre_driver_nvidia.xz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Test final (préparez l'oreiller)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vous devriez maintenant être sous X.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une console root, un &lt;code&gt;hibernate&lt;/code&gt; ...&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;C'est terminé. Et ça marche!&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Retirons-nous sur la pointe des pieds, afin de ne pas réveiller la marmotte
qui a commencé son hibernation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/11/09/Arch%2C-le-kernel-et-la-marmotte#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/11/09/Arch%2C-le-kernel-et-la-marmotte#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/560496</wfw:commentRss>
      </item>
    
  <item>
    <title>Back to the basic: un vent d'été de novembre</title>
    <link>http://www.finiderire.com/post/2010/11/05/Back-to-the-basic%3A-un-vent-d-%C3%A9t%C3%A9-de-novembre</link>
    <guid isPermaLink="false">urn:md5:6fe1f0c405d6b7dba3ca4fd8bda5092d</guid>
    <pubDate>Fri, 05 Nov 2010 19:15:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Coding</category>
        <category>détente</category><category>msx</category>    
    <description>&lt;p&gt;&lt;em&gt;En ce moment, il fait chaud, et pourtant nous sommes début
novembre.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Les bizarreries de la météo (blizzard, vous avez dit blizzard
?).&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Celà m'a fait penser qu'il restait un article de cet été non
posté.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Plutôt qu'attendre l'année prochaine, le voici.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Prenez celà comme le dernier soupir d'un bel été qui n'est plus que
souvenir, avant la rentrée dans l'hiver froid, impitoyable, interminable!
MUHAHAHAAAA!&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;MàJ 6 nov. 2010&lt;/strong&gt; : &lt;em&gt;quelques précisions sur le partage
de fichiers avec le système hôte.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Foin des considérations météorologiques&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;La dernière fois, nous parlions du développement sur vieux micro avec un
cross assembler.&lt;/li&gt;
&lt;li&gt;Cette fois-ci, pour nous reposer un peu, nous allons parler basic.&lt;/li&gt;
&lt;li&gt;Mais oui, le &lt;strong&gt;basic&lt;/strong&gt; : beginner awfully silly idiotic
code. Enfin, un truc dans dans ce goût là.&lt;/li&gt;
&lt;li&gt;Il y a vingt ans, les courageux précurseurs n'avaient souvent que ça à se
mettre sous la dent.&lt;/li&gt;
&lt;li&gt;Me croirez-vous si je vous dit que certaines personnes ne s'en sont jamais
remises et continuent à le pratiquer ?&lt;/li&gt;
&lt;li&gt;Afin de vous sensibiliser aux arcanes de ce qui touche désormais à la
psychiatrie, je vous ai concocté une façon plus humaine d'aborder le
problème.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;OpenMSX members only&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Attention, c'est pour OpenMSX, mais ça doit être transposable facilement à
BlueMSX.&lt;/li&gt;
&lt;li&gt;En fait, je suis même persuadé que BlueMSX est capable lui aussi d'écrire
des fichiers dans le système de fichiers de l'ordinateur hôte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le basic MSX&lt;/h3&gt;
&lt;h5&gt;tokens&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le basic du MSX est tokenisé. Quand on sauve un programme basic, les
instructions apparaissent sous la forme d'un code hexa, qui représente une
instruction. C'est ce qu'on appelle un token.&lt;/li&gt;
&lt;li&gt;Cela permet de gagner de la place dans le fichier et en mémoire.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;On peut sauver depuis le basic un fichier au format ascii (c'est à dire
sans les tokens), avec:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;save &amp;quot;foo.bas&amp;quot;,a&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le &lt;code&gt;&amp;quot;,a&amp;quot;&lt;/code&gt; est important, c'est ce qui signale qu'on veut de
l'ascii.
&lt;ul&gt;
&lt;li&gt;Autrement, on n'aurait qu'une bouillie binaire représentant les
tokens.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour le charger, toujours depuis le basic bien sûr:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;load &amp;quot;foo.bas&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Création d'un programme basic en dehors du MSX&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;On peut donc charger des fichiers ascii contenant des instructions basic.
&lt;ul&gt;
&lt;li&gt;Attention à ne pas oublier les numéros de ligne quand on tape le programme
dans un éditeur externe!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il faut que les lignes se terminent par le CR/LF propre à MS-Dos.
&lt;ul&gt;
&lt;li&gt;Le jeu de caractère ne doit pas être trop évolué (pas d'UTF-8).
&lt;em&gt;Latin1&lt;/em&gt; fait l'affaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Si vous tapez vos sources depuis MS-Windows, pas de problèmes de ce côté
là, cet OS fait partie de la famille des CR/LF. En digne héritier de
MS-Dos.&lt;/li&gt;
&lt;li&gt;Si vous utilisez un OS de conception plus moderne (Unix sous toutes ses
saveur par exemple) il faudra convertir vos LF en CR/LF.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voici l'automatisation de la manoeuvre pour Vim, l'éditeur des gens qui
font pas semblant. Ajoutez ceci dans le &lt;strong&gt;.vimrc&lt;/strong&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

autocmd BufNewFile,BufRead *.[Bb][Aa][Ss] set ff=dos fileencoding=latin1

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ceci fonctionnera avec les fichiers qui ont une extension &amp;quot;.bas&amp;quot; (peu
importe la casse, il y a la regexp pour ça).&lt;/li&gt;
&lt;li&gt;Les fichiers seront automatiquement sauvés avec le format de fin de ligne
MS-Dos, et dans un charset que le MSX comprend.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Communication simplifiée avec le système hôte&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Les utilisateurs d'émulateurs se compliquent souvent la vie avec tout un
système d'émulation de disquettes ou de disque dur.&lt;/li&gt;
&lt;li&gt;Le plus simple (quand la machine et l'émulateur le permettent, ce qui est
le cas ici) est de partager ses fichiers avec le système hôte.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Par exemple, pour partager &lt;em&gt;/home/jseb/msx/coding&lt;/em&gt; avec le msx
émulé :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

openmsx -machine nms8245 -diska /home/jseb/msx/coding

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;La commande &lt;em&gt;files&lt;/em&gt; depuis l'écran de saisie basic du MSX permet de
lister les fichiers partagés entre le système hôte et le MSX émulé.
&lt;ul&gt;
&lt;li&gt;Toutes les manipulations de fichier habituelles sont bien sûr possibles
depuis le msx (&lt;em&gt;load&lt;/em&gt;, &lt;em&gt;save&lt;/em&gt; , &lt;em&gt;bload&lt;/em&gt; ...)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le paramètre &lt;em&gt;machine nms8245&lt;/em&gt; est là car je n'utilise pas tout le
temps la même machine, et qu'il n'y en a pas de configuré par défaut.
&lt;ul&gt;
&lt;li&gt;Selon votre configuration, vous pouvez vous en passer (si le &lt;em&gt;cbios&lt;/em&gt;
démarre par défaut, vous n'avez pas de machine de configurée).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;L'utilitaire &lt;strong&gt;diskmanipulator&lt;/strong&gt; de OpenMSX est à réserver aux
manipulations d'iso de disquettes.
&lt;ul&gt;
&lt;li&gt;Il est idéal pour transférer les fichiers vers un vrai msx, et s'utilise
depuis la console d'OpenMSX.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Les numéros de lignes&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Reste le problème des numéros de lignes pour le basic.&lt;/li&gt;
&lt;li&gt;Ces vieux basic imposent une référence permanente aux séquences
d'instructions. Cette référence est symbolisée par des numéros de lignes, sans
autre rêgle qu'une progression constante et croissante.&lt;/li&gt;
&lt;li&gt;Taper du code en commençant chaque ligne par un numéro croissant, c'est
pénible.
&lt;ul&gt;
&lt;li&gt;Sans parler des erreurs de renumérotations!&lt;/li&gt;
&lt;li&gt;Et que faire quand on n'a plus de numéros de lignes disponibles, et qu'on
voudrait encore insérer une ligne dans cet ensemble ?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le script magique&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Voici un script qui permet de numéroter un programme basic de 10 en
10.&lt;/li&gt;
&lt;li&gt;Les lignes commençant avec un numéro de ligne sont renumérotées, et quand
il n'y n'y a pas de numéro de ligne, il est ajouté. En prime, les espaces et
tabulations inutiles de début de ligne sont supprimées.&lt;/li&gt;
&lt;li&gt;Les lignes vides sont ignorées.&lt;/li&gt;
&lt;li&gt;Les références à des lignes existantes sont bien sûr traitées, sous réserve
que les lignes référencées soient déja numérotées.
&lt;ul&gt;
&lt;li&gt;On peut donc se contenter de numéroter ces lignes uniquement lors de la
saisie.&lt;/li&gt;
&lt;li&gt;Le cas de &amp;quot;on k goto&amp;quot; suivi de plusieurs numéros de lignes est traité.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Les cas de lignes contenant des sauts multiples est traité.
&lt;ul&gt;
&lt;li&gt;On peut en effet rencontrer des constructions barbares de ce type:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gosub 20 : goto 10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Beurk certes, mais le cas est géré.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Attention, si vous utilisez MS-Windows: vérifiez vos terminaisons de lignes
pour éventuellement adapter le script si vos outils écrivent un 0xD 0xA comme
terminateur. Ceci dépendra des choix par défaut de votre environnement
d'origine: depuis un shell émulant Unix, ou depuis un programme utilisant
directement l'api MS-Windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#!/bin/bash
# ce script vient de www.finiderire.com
# le blog pour les gens qui en ont dans le chausson.

if [ x&amp;quot;$1&amp;quot; == x&amp;quot;&amp;quot; ]; then
   echo $0 &amp;quot;[fichier à renuméroter]&amp;quot;
   exit 1;
fi

#simple précaution, un accident est très vite arrivé
cp &amp;quot;$1&amp;quot; &amp;quot;$1&amp;quot;.bak 

#conversion au format Unix \n (Dos \r\n pose problème à awk)
#également, espacement des nombres séparés par virgule (cas de &amp;quot;on goto&amp;quot;)
sed 's/\r$//;s/\([0-9]\)\ *,\ *\([0-9]\)/\1 , \2/g' &amp;lt; &amp;quot;$1&amp;quot; &amp;gt; &amp;quot;$1&amp;quot;.tmp
mv &amp;quot;$1&amp;quot;.tmp $1

#pour l'astuce de la relecture du fichier, voir awk/multipass.awk
awk 'NR!=FNR &amp;amp;&amp;amp; !reset { l=0; reset=1; } #renumérote de zéro (2nde passe)

     #enlever espaces et tabs de début de ligne, si pas de numérotation
     NR!=FNR { sub (/^[\t\ ]+/,&amp;quot;&amp;quot;,$0) }

     #renumérotation des goto/gosub (la seconde passe sert à ça)
     NR!=FNR &amp;amp;&amp;amp; tolower($0) ~ /.*go(to|sub).*/ {
        for (i=1; i&amp;lt;=NF; i++) {
           #si pattern go(to|sub) détecté, prochaine colonne est un nbr
           if ($i ~ /.*go(to|sub).*/) { next_is_nbr=1 }
           # si on avait un goto/gosub juste avant ...
           if ($i ~ /[0-9]+/ &amp;amp;&amp;amp; next_is_nbr) {
              $i = t[$i] #récupère index sur nouveau label
              if ( $i == &amp;quot;&amp;quot; ) $i=&amp;quot;NaN&amp;quot; #si problème
              if ( $(i+1) != &amp;quot;,&amp;quot; ) next_is_nbr=0; #cas de &amp;quot;on k goto ...&amp;quot;
           }
        }
     }

     #passe 1 et 2, on doit numéroter à chaque fois.
     /^[0-9]+/ { #un numéro de ligne est présent
     if (l || l==0) {l+=10} else {l=$1};
        l=l-(l%10);
        c=l;

      #par contre, on ne printe que lors de la passe 2
        if (NR!=FNR) {
           for (i=2; i&amp;lt;=NF; i++) { c=c &amp;quot; &amp;quot; $i; }
           print c
        } else {
        t[$1]=l; if ($1&amp;gt;max) max=$1
     }
    }
    

     /^[^0-9]/ &amp;amp;&amp;amp; !/^\n?$/ { #pas de numéro de ligne, ni de ligne vide
        l+=10; l=l-(l%10);
        #on ne printe que lors de la passe 2
        if (NR!=FNR) {
          print l &amp;quot; &amp;quot; $0;
        }
       }


#    END { print &amp;quot;énumération&amp;quot;; for (i=0; i&amp;lt;=max; i++) print i &amp;quot; &amp;quot;t[i] }
    ' &amp;quot;$1&amp;quot; &amp;quot;$1&amp;quot; &amp;gt; &amp;quot;$1&amp;quot;.tmp

#et on reconverti en \r\n, tout en supprimant les espaces désormais inutiles
sed 's/$/\r/;s/\([0-9]\) , \([0-9]\)/\1,\2/g' &amp;lt; &amp;quot;$1&amp;quot;.tmp &amp;gt; &amp;quot;$1&amp;quot;
rm &amp;quot;$1&amp;quot;.tmp

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;La compréhension du script est laissée à la sagacité du lecteur.
&lt;ul&gt;
&lt;li&gt;Pour les lecteurs dont la sagacité s'agace, il y a les commentaires
judicieusement placés devant ce qui mérite d'être commenté.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;C'est la fin de l'été, mais pour le reste ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Si vous en voulez encore, appuyez sur &amp;quot;commentaire&amp;quot; (1€ par appel).&lt;/li&gt;
&lt;li&gt;Mais même si vous en voulez encore, je vous préviens qu'il vous faudra être
fort.
&lt;ul&gt;
&lt;li&gt;Le manque de temps fait que je risque de me concentrer sur des billets plus
utiles pour les gens qui vivent dans la modernité.&lt;/li&gt;
&lt;li&gt;Et oui... finiderire pour les vieux trucs. Rendez-vous aux prochaines
vacances !&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Si vous avez simplement quelque chose à ajouter, ne vous privez pas. Et
fermez la porte en partant, le temps commence à fraichir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/11/05/Back-to-the-basic%3A-un-vent-d-%C3%A9t%C3%A9-de-novembre#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/11/05/Back-to-the-basic%3A-un-vent-d-%C3%A9t%C3%A9-de-novembre#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/559606</wfw:commentRss>
      </item>
    
  <item>
    <title>Git tari ? Oh!</title>
    <link>http://www.finiderire.com/post/2009/08/19/Git-tari-Oh%21</link>
    <guid isPermaLink="false">urn:md5:aca3fec6deacb3860d4353860308d221</guid>
    <pubDate>Sun, 03 Oct 2010 21:46:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Coding</category>
        <category>coding</category><category>Git</category><category>Linux</category><category>MS-Windows</category><category>tools</category>    
    <description>&lt;p&gt;&lt;em&gt;Un nouveau billet sur l'intarissable Git&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Et en avant la musique!&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt; : cet article a été écrit en collaboration avec
Frédéric Jolliton&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Résumé de l'épisode précédent&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;La configuration et les commandes de bases de Git ont déjà été abordées.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.finiderire.com/post/2008/04/22/Git-est-couvert&quot;&gt;C'est ici que ça se
passe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Cette fois, nous nous penchons sur l' utilisation de Git au quotidien.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;repo&lt;/strong&gt; sera l'abréviation de &lt;em&gt;repository&lt;/em&gt; dans la
suite du texte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Déterrons le SSH de guerre&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vous voulez héberger un repo Git.&lt;/li&gt;
&lt;li&gt;Si possible, vous souhaiteriez le repo Git hébergé ne nécessite pas un
énième binaire troué et des heures de configuration ?
&lt;ul&gt;
&lt;li&gt;Utilisez ssh, au moins il n 'y aura que ça à mettre à jour.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Vous ne le ferez qu'une fois&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Créez un groupe &lt;strong&gt;git&lt;/strong&gt; qui servira pour les droits d'accès de
vos utilisateurs.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;groupadd git&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Créez un home pour le/les repo(s) à héberger.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkdir /home/git&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Modifiez les droits et les propriétaires.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

boss # chown votrelogin.git /home/git
boss # chmod 770 /home/git

boss # ls /home/git -lhd
drwxrwx--- 3 jseb git 4,0K aoû 19 17:50 /home/git

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Vous êtes le propriétaire de /home/git, et les utilisateurs abilités seront
dans le groupe git.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Éditez le fichier &lt;strong&gt;/etc/shells&lt;/strong&gt; et ajoutez une entrée avec
l'emplacement de &lt;em&gt;git-shell&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;Ce fichier donne la liste des shells autorisés par le système.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;git-shell&lt;/em&gt; est un shell restreint qui permet uniquement
l'utilisation de git.&lt;/li&gt;
&lt;li&gt;Les utilisateurs que vous créerez utiliseront ce shell.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;A faire pour chaque utilisateur&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Notre utilisateur sera le fameux toto.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

useradd -d /home/git/ -G git -m -s /usr/bin/git-shell toto

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-d /home/git&lt;/strong&gt; : home de l'utilisateur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-G git&lt;/strong&gt; : il fait partie du groupe git.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-m&lt;/strong&gt; : créer le home si il n'existe pas déja (et y
copie /etc/skels/)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-s /usr/bin/git-shell&lt;/strong&gt; : shell restreint de
l'utilisateur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eventuellement, permettez à l'utilisateur d'utiliser ssh.
&lt;ul&gt;
&lt;li&gt;Ce n'est pas obligatoire, et dépend de votre config sshd.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sshd_config&lt;/strong&gt; : &lt;code&gt;AllowUsers toto&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si vous utilisez l'authentification interactive, n'oubliez pas de donner un
mot de passe à votre utilisateur.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Faire un test de login.
&lt;ul&gt;
&lt;li&gt;ssh doit vous envoyer paître.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ ssh toto@192.168.1.1
Password:
Last login: Thu Aug 20 19:23:37 CEST 2009 from 192.168.1.42 on ssh
fatal: What do you think I am? A shell?
Connection to 192.168.1.1 closed.

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;C'est normal, git-shell ne permets pas ce genre de choses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Création d'une repo bare&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Une repo &lt;em&gt;bare&lt;/em&gt;, c'est une repo dont vous ne verrez jamais le
contenu directement.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Elle sert juste à distribuer des fichiers entre les utilisateurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Par exemple, les commandes &lt;em&gt;checkout&lt;/em&gt; ne fonctionneront pas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Côté serveur ssh&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;mkdir repo&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;cd repo&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;git init --bare&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ git init --bare
Initialized empty Git repository in /home/gitfoogit/

$ ls
config  description  HEAD  hooks  info  objects  refs

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;ls&lt;/em&gt; liste des fichiers qui sont normalement dans &lt;em&gt;.git&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Pas la peine de faire un &lt;code&gt;git branch -a&lt;/code&gt;, il n'y a pas de
branches.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Côté client&lt;/h5&gt;
&lt;pre&gt;

$ git remote add repo_remote ssh://jseb@192.168.1.1/home/git/repo

$ git push repo_remote mmap

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;On ajoute le serveur à la liste des repositories.
&lt;ul&gt;
&lt;li&gt;Par la suite, on y fera référence sous le nom de &lt;q&gt;repo_remote&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;repo_remote&lt;/em&gt; est donc le nom du serveur (voir
&lt;em&gt;.git/config&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une fois le serveur ajouté, on &lt;q&gt;pushe&lt;/q&gt; les modifications.
&lt;ul&gt;
&lt;li&gt;&lt;q&gt;mmap&lt;/q&gt; est le nom de la branche que j'ai poussé sur le serveur.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Clonage par un utilisateur&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant que les sources ont été pushées dans le repo, n'importe quel
utilisateur peut y accéder.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ git clone ssh://toto@192.168.1.1/home/git/repo
Initialized empty Git repository in /tmp/votre_repo/.git/
Password:
remote: Counting objects: 21, done.
remote: Compressing remote: objects: 100% (13/13), done.
remote: Total 21 (delta 7), reused 21 (delta 7)
Receiving objects: 100% (21/21), 432.15 KiB, done.
Resolving deltas: 100% (7/7), done.
Warning: Remote HEAD refers to nonexistent ref, unable to checkout.

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Le repo est &lt;strong&gt;presque&lt;/strong&gt; disponible pour toto.
&lt;ul&gt;
&lt;li&gt;La dernière ligne indique qu'aucune branche n'est disponible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons merger ce qui a été récupéré.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ git branch -a
  origin/mmap

$ git merge origin/mmap

$ git branch -a
* master
  origin/mmap

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;La première commande récupère le nom de la branche qui a été clonée.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;origin&lt;/em&gt; est le nom par défaut du repo distant (voir
&lt;em&gt;.git/config&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La seconde effectue le &lt;em&gt;merge&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La troisième vérifie qu'une branche est maintenant disponible.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Éventuellement, on peut renommer la branche &lt;em&gt;master&lt;/em&gt; en
&lt;em&gt;mmap&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git branch -m master mmap&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le repo du guerrier&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;N'hésitez pas à poster vos méthodes et remarques, ainsi que tout ce qui
concerne votre utilisation de Git au quotidien.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il y aura surement d'autres billets sur Git, d'ailleurs je crée derechef le
tag.
&lt;ul&gt;
&lt;li&gt;Hop!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2009/08/19/Git-tari-Oh%21#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2009/08/19/Git-tari-Oh%21#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/427954</wfw:commentRss>
      </item>
    
  <item>
    <title>Vos plus belles recherches</title>
    <link>http://www.finiderire.com/post/2010/02/25/Vos-plus-belles-recherches</link>
    <guid isPermaLink="false">urn:md5:85c7b8dfcd0c46eeac813181427022a1</guid>
    <pubDate>Fri, 01 Oct 2010 20:48:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Et je tenais à vous dire (blablabla)</category>
            
    <description>&lt;p&gt;&lt;em&gt;Aujourd'hui, pour le bla-bla annuel, nous allons parler de
vous.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Cela fait déja deux ans que le billet annuel m'est consacré, il est temps
de changer.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Autrement, les mauvaises langues vont soutenir que ce blog ne parle que de
moi.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Merci Google.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mais comment parler de vous, mes chers visiteurs, alors que je ne vous
connais que par les quelques commentaires récoltés sur mes billets ?&lt;/li&gt;
&lt;li&gt;C'est bien simple, je vais m'inspirer des stats, et publier vos plus belles
recherches Google.&lt;/li&gt;
&lt;li&gt;Qui dit &lt;q&gt;plus belles&lt;/q&gt; doit comprendre &lt;q&gt;plus drôles&lt;/q&gt;. La majorité
des recherches sont assez sérieuses, et bien dans l'esprit de rigueur de ce
blog.&lt;/li&gt;
&lt;li&gt;Mais il reste les perles, les OVNIs, les erreurs !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Nos grands gagnants par catégorie&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le puni.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;enlever cette version de Windows n'est
pas authentique&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Nous avons affaire à un apprenti pirate qui s'est complètement trompé de
site. Ici, Monsieur, nous ne piratons pas Windows. Nous apprenons à nous en
passer.&lt;/li&gt;
&lt;li&gt;A noter que la requête émanait de &lt;em&gt;Bing&lt;/em&gt;, le moteur de recherche
Microsoft. Peut être l'apprenti pirate a t-il été transféré ici en guise de
punition ?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le technicien de surfaces.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;recette du vim&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Pour le coup, j'ai appris quelque chose. Vim n'est pas seulement le
Meilleur Editeur du monde, mais également un produit nettoyant.&lt;/li&gt;
&lt;li&gt;La parité est loin d'être respectée sur Internet. Notre éditeur préféré a
un net avantage dans les moteurs de recherche, et il faut surement être patient
pour trouver la composition du produit de nettoyage.&lt;/li&gt;
&lt;li&gt;J'ai eu une typo dans une recherche, qui du coup devient amusante:
&lt;q&gt;ouvrir les fichier a la suie vim&lt;/q&gt;.&lt;/li&gt;
&lt;li&gt;Pour celui-ci, je peux répondre: &lt;code&gt;vim toto.{c,h}&lt;/code&gt; puis
&lt;code&gt;:ball&lt;/code&gt; dans Vim pour ouvrir tous les buffers. Enfin, je suppose que
c'est ce que voulait ce visiteur.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le paranoïaque.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requete&lt;/strong&gt; : &lt;q&gt;test qui est ton ami&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Ce blog est ouvert à tout le monde, sans distinction de sexe, race,
religion ou famille politique.&lt;/li&gt;
&lt;li&gt;J'espère que ce visiteur à l'âme meurtrie aura trouvé réconfort et pardon
en ces pages.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le Jules.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;Je suis né pendant les ides de
mars&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Probablement une grosse déception pour le requêteur, qui est tombé sur mon
billet à propos des IDEs (écrit en mars, d'où le titre complet).&lt;/li&gt;
&lt;li&gt;Il voudra bien pardonner mon humour un peu particulier, qui contribue à
noyer le poisson de cette nouvelle Babel qu'est Internet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;L'enthousiaste.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;le disc wouah&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Avec une faute d'orthographe en prime, mais nous pardonnerons volontiers un
enthousiasme (presque) communicatif.&lt;/li&gt;
&lt;li&gt;Celà dit, je n'ai aucune idée de ce que pouvait bien chercher ce visiteur.
Ni de ce qu'il a trouvé, d'ailleurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le paradoxe.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;aucun texte ne s'affiche dans
l'interface graphique&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Encore un qui veut le beurre, l'argent du beurre, et la main de la
cremière.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le bricoleur.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;plomberie facile&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;J'ai régulièrement cette requête, qui amène vers un texte sur le traitement
des fuites mémoires avec mtrace.&lt;/li&gt;
&lt;li&gt;Ces visiteurs ne reviennent jamais, sans doute morts noyés avant d'avoir eu
le temps de faire une seconde recherche.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;La valeur sûre.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;problème accents doxygen&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Cette requête revient depuis bientôt trois ans. Elle fait partie des
meubles, pour ainsi dire.&lt;/li&gt;
&lt;li&gt;Réjouissez vous, la réponse est dans ce blog. Je vous laisse admirer les
lieux, prenez votre temps, et revenez me voir.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La récursivité en action&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pour conclure, j'espère que vous n'êtes pas arrivé sur cette page en
faisant une des recherches citée dans ce billet.&lt;/li&gt;
&lt;li&gt;Merci de votre visite, et à l'année prochaine pour un nouveau bla-bla.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/02/25/Vos-plus-belles-recherches#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/02/25/Vos-plus-belles-recherches#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/489766</wfw:commentRss>
      </item>
    
  <item>
    <title>Installation en milieu hostile</title>
    <link>http://www.finiderire.com/post/2010/09/23/Installation-en-milieu-hostile</link>
    <guid isPermaLink="false">urn:md5:925ca0dd59a3cb1109b1c676fb932b54</guid>
    <pubDate>Thu, 23 Sep 2010 21:24:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Arch</category><category>Linux</category>    
    <description>&lt;p&gt;&lt;em&gt;Certaines installations d'OS se font en milieu hostile.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Les réseaux au trafic douteux et à la sécurité incertaine ne sont pas
qu'une légende pour vendre des abonnements à MISC.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Pourtant, les distributions Linux ont beaucoup de mal à s'installer sans
connexion réseau.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;AARRRHHH. Mais comment faire alors ?&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;MàJ 24/09/2010&lt;/strong&gt; : &lt;em&gt;ajout astuce ip link&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Pour qui ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ces notes ont été réalisées à partir d'une installation de Arch.&lt;/li&gt;
&lt;li&gt;Linux proposant peu ou prou les mêmes outils de base dans ses différentes
saveurs, vous devriez pouvoir adapter sans difficulté à une autre
distribution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Principe&lt;/h3&gt;
&lt;h5&gt;Définir un réseau séparé&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous placer sur un réseau séparé, c'est simple comme un
&lt;em&gt;ifconfig&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Là où tout cela se complique, c'est quand vous voudrez accéder à votre
passerelle depuis le réseau séparé.&lt;/li&gt;
&lt;li&gt;D'autre part, on voudrait quand même bien accéder à la machine en cours
d'installation avec ssh.&lt;/li&gt;
&lt;li&gt;Ces points légitimes étant soulevés, passons à la configuration du réseau
alternatif.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Topographie&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous avons une machine que nous souhaitons installer.&lt;/li&gt;
&lt;li&gt;Nous avons une autre machine, déja installée et configurée, et avec une
adresse réseau de prod. Cette machine se connectera en ssh vers la machine à
installer. Elle servira également de passerelle internet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;h5&gt;Mais où est eth0 ?!&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Une petite astuce pour commencer : vous pouvez avoir pas mal de cartes
réseau sur votre machine (4 pour ma part), et trouver celle qui a un cable
branché peut devenir un casse-tête.&lt;/li&gt;
&lt;li&gt;Un casse-tête, mais uniquement quand on ne connait pas la commande
&lt;strong&gt;ip link&lt;/strong&gt; . Haha! On fait moins le malin maintenant!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;On commence doucement&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le principe est donc de créer un réseau séparé du réseau habituel, le temps
de l'installation.
&lt;ul&gt;
&lt;li&gt;Nous allons donc nous placer sur le réseau 192.168.42.0. La machine à
installer aura l'adresse hote 42 :&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip addr add 192.168.42.42/24 dev eth0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ensuite, il faut intégrer la machine qui fera tourner le client ssh sur le
même réseau.
&lt;ul&gt;
&lt;li&gt;Cette machine va hériter de l'ip: 192.168.42.66&lt;/li&gt;
&lt;li&gt;Par ailleurs, elle est déjà présente sur le réseau &lt;q&gt;habituel&lt;/q&gt;
192.168.1.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip addr add 192.168.42.66/24 dev eth0&lt;/code&gt; : l'interface
réseau a maintenant &lt;strong&gt;deux&lt;/strong&gt; adresses IP.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tentez un ping d'une machine vers l'autre.&lt;/li&gt;
&lt;li&gt;Ca fonctionne ? Bravo. Sinon, lisez la suite (de toutes façons, lisez
la suite).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Ca se complique (très légèrement)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;en cas de non réponse: vérifiez les paramètres de votre firewall (avec
tcpdump).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Éventuellement, ajouter dans les rêgles du firewall de la passerelle:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

 ## Pour la communication entre reseaux 192.168.42.0 et 192.168.1.0
  iptables -I FORWARD -s 192.168.1.0/24 -d 192.168.42.0/24 -j ACCEPT
  iptables -I FORWARD -d 192.168.1.0/24 -s 192.168.42.0/24 -j ACCEPT

 ## Pour rentrer sur la passerelle et acceder a ses services depuis le reseau 192.168.42.0
    iptables -A INPUT -i $INTERNAL_INTERFACE -s 192.168.42.0/24 -j ACCEPT

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Connexion par ssh&lt;/h3&gt;
&lt;h5&gt;Important&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Sur la machine à installer (bien entendu) , changez le mot de passe
root.&lt;/li&gt;
&lt;li&gt;En cas de problèmes, n'oubliez pas de lire les logs, en particulier
&amp;quot;auth.log&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;configuration sur la machine à installer&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Permettez le login root dans sshd_config , et l'authentification avec un
password tunnelé:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PermitRootLogin yes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PasswordAuthentication yes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ajoutez &lt;code&gt;sshd:192.168.42.0/255.255.255.0&lt;/code&gt; dans
/etc/hosts.allow.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Lancez le daemon sshd.
&lt;ul&gt;
&lt;li&gt;Sous Arch, on le lance comme ça:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/rc.d/sshd start&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Connectez-vous avec ssh depuis la passerelle.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Passerelle et resolv.conf&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant que la connexion ssh est prête, il n'y a plus qu'à ajouter
l'accès internet.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si la passerelle internet tourne sur la machine 42.66, c'est facile:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ip r a via 192.168.42.66 dev eth0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ajoutez également dans &lt;em&gt;/etc/resolv.conf&lt;/em&gt; le(s) adresse(s) DNS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Poursuivez l'installation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant, il ne vous reste qu'à continuer de manière classique
l'installation.&lt;/li&gt;
&lt;li&gt;La tâche de ce billet s'achève donc ici, tandis que la votre commence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/09/23/Installation-en-milieu-hostile#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/09/23/Installation-en-milieu-hostile#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/548273</wfw:commentRss>
      </item>
    
  <item>
    <title>Ce sont les vacances: en avant toute vers le retro !</title>
    <link>http://www.finiderire.com/post/2010/08/16/Ce-sont-les-vacances%3A-en-avant-toute-vers-le-retro-%21</link>
    <guid isPermaLink="false">urn:md5:454d767a058e43207de8cab0b3bd3602</guid>
    <pubDate>Tue, 24 Aug 2010 01:03:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Coding</category>
        <category>détente</category><category>msx</category>    
    <description>&lt;p&gt;&lt;em&gt;Eh oui, ce sont les vacances... enfin, il parait.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Et vu qu'il pleut, vous lisez ce blog au lieu d'aller à la
plage.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Pire encore, vous lisez ce blog au bureau en pensant à vos collègues partis
à la plage.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Réjouissez-vous, je vous ai mitonné quelques loisirs récréatifs afin de
bronzer avec les radiations de votre moniteur.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Voici le premier épisode d'une petite série détente.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Retro-computing et MSX&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le retro computing ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ne me dites pas que vous n'avez jamais entendu parler du retro-computing!
&lt;ul&gt;
&lt;li&gt;Il s'agit de la madeleine de Proust pour les gens qui ont passé leur belle
jeunesse sur des micro-ordinateurs tels que MSX, Commodore, Atari,
Amstrad...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il y a des tas de moyen de s'amuser avec ces vieilleries, notamment par le
biais des émulateurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ces micros font certe pâle figure de nos jours, mais ils sont relativement
faciles à programmer, grâce à la doc abondante que l'on trouve sur internet.
&lt;ul&gt;
&lt;li&gt;Ils peuvent donc faire office de récréation mentale bien plus stimulante
qu'un bête sudoku, entre deux développements fatigants.&lt;/li&gt;
&lt;li&gt;On peut également pratiquer cette discipline simplement pour s'amuser. Mais
faire les choses pour s'amuser est assez mal vu de nos jours. Je vous laisserai
donc le choix de chercher d'autres justifications rationnelles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le MSX&lt;/h3&gt;
&lt;h5&gt;Pourquoi le MSX ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pourquoi programmer un MSX plutôt qu'un micro 32 bits de l'époque ?
&lt;ul&gt;
&lt;li&gt;Tout simplement parce que le MSX est relativement simple avec son Z80 (8
bits). Avec un peu d'expérience de la programmation et des architectures, vous
pouvez espérer avoir des résultats intéressants en moins d'une semaine. Si vos
vacances sont plus longues, vous vous amuserez donc encore plus.&lt;/li&gt;
&lt;li&gt;Les micros 32 bits (68000 par exemple) sont plus puissants, mais
nécessitent plus de connaissances et sortent un peu du cadre fixé par ce billet
(s'amuser avec des choses simples).&lt;/li&gt;
&lt;li&gt;D'autre part, le challenge est très présent. Avec un Z80 à 3,58Mhz, chaque
cycle compte!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Très bref historique du MSX&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Je vais vous présenter succintement le MSX.
&lt;ul&gt;
&lt;li&gt;Vous trouverez tout un tas d'articles sur le net, ainsi que des forums
spécialisés, y compris en français.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En deux mots, le MSX a été une tentative de standardisation de la
micro-informatique par les japonais (société Ascii Corporation), associés pour
l'occasion avec Microsoft (pour le basic).&lt;/li&gt;
&lt;li&gt;La norme MSX fut déclinée en plusieurs vagues:
&lt;ul&gt;
&lt;li&gt;le MSX (appellé plus tard MSX 1)&lt;/li&gt;
&lt;li&gt;le MSX 2.&lt;/li&gt;
&lt;li&gt;En France, ça s'arrête là avec l'abandon de la commercialisation des
modèles. Mais il y eu encore le MSX 2+, puis le MSX TurboR.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tous les MSX furent basés sur un socle technique commun (pour la
standardisation).&lt;/li&gt;
&lt;li&gt;Ils furent vendus par d'innombrables marques (Sanyo, Philips, Sony, Canon,
pour ne citer que les plus connues). Le microprocesseur était un Z80 pour toute
la gamme. Seuls les MSX Turbo-R embarquaient un Z80 et un R800 (le R800 était
un Z80 amélioré 16 bits, fonctionnant à 7 Mhz).&lt;/li&gt;
&lt;li&gt;Au sein de la norme, il y eu quelques évolutions, notamment musicales:
certaines cartouches de jeux étaient proposées avec un circuit sonore monté sur
la cartouche (le SCC). Le SCC étendait les capacités sonores du MSX à 8 voies.
D'autres extensions proposaient de la synthèse FM à un prix plutot
concurrentiel pour l'époque (cartouche FM PAC).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le MSX a péri face aux Amiga et autres Atari ST, supérieurs
techniquement.&lt;/li&gt;
&lt;li&gt;De cette période faste, il nous reste de beaux souvenirs, et la possibilité
de retrouver les programmes de l'époque grâce aux émulateurs.&lt;/li&gt;
&lt;li&gt;Il reste également quelques juteuses franchises, telles que &lt;em&gt;Metal
Gear&lt;/em&gt; ou &lt;em&gt;Castlevania&lt;/em&gt;, qui ont débuté sur MSX.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Au fait, que signifie MSX ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft SuXx ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Pour en savoir plus&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://fr.wikipedia.org/wiki/MSX&quot;&gt;Topo Wikipedia court et
clair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wiki traduit à la hache du japonais, mais c'est une mine: &lt;a href=&quot;http://data.lullar.com/MSX&quot;&gt;Data Lullar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Mise en place des outils de développement&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La base&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons utiliser les outils modernes mis à notre disposition, avec
Linux en tant qu' OS hôte.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Les principes et scripts sont transposables assez facilement à MS-Windows.
&lt;ul&gt;
&lt;li&gt;Pour ce dernier, je vous conseille d'installer au plus vite un
environnement Posix.&lt;/li&gt;
&lt;li&gt;Vous avez le choix entre Cygwin et MSYS/Mingw (j'ai une petite préférence
pour ce dernier couple).&lt;/li&gt;
&lt;li&gt;Je signalerai par une note les adaptations à faire sous MS-Windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Choix de l'émulateur&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sous Unix, le choix est rapide: hors OpenMSX, point de salut.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.finiderire.com/post/2010/08/16/#&quot;&gt;http://openmsx.sourceforge.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sous MS-Windows, vous pouvez utiliser MSX Blue qui a très bonne réputation
(mais n'est pas multiplateformes).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je supposerai que OpenMSX est correctement installé, et qu'il tourne avec
un vrai bios MSX.
&lt;ul&gt;
&lt;li&gt;En effet, par défaut il tourne avec C-Bios, qui émule les fonctions Bios,
mais ne donne pas accès au basic.&lt;/li&gt;
&lt;li&gt;Ceci étant génant (le basic nous servira toujours un peu), mieux vaut un
vrai bios d'origine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La doc est ici: &lt;a href=&quot;http://openmsx.sourceforge.net/docs.php&quot;&gt;http://openmsx.sourceforge.net/docs.ph&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Choix de l'éditeur texte&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vim. Des questions ?
&lt;ul&gt;
&lt;li&gt;En fait, vous pouvez utiliser ce que vous voulez, même Emacs.&lt;/li&gt;
&lt;li&gt;Il faut juste que l'éditeur soit capable de traiter les fichier avec le
format de ligne &lt;q&gt;msdos&lt;/q&gt; (0xd 0xa).&lt;/li&gt;
&lt;li&gt;Vim et Emacs ont été porté sur les plateformes les plus exotiques. C'est
donc un investissement dont vous toucherez les intêrets pendant de longues
années.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Et le cross-assembler ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Le principe est d'utiliser un cross-compilateur sur votre système hôte, et
de fournir les fichiers compilés à l'émulateur.&lt;/li&gt;
&lt;li&gt;Ceci permet d'automatiser au maximum toutes les manipulations :
&lt;ul&gt;
&lt;li&gt;Le cycle édition / compilation / test / debuggage doit se faire
naturellement, et ne pas être soumis à des manipulations continuelles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons commencer par choisir un cross-assembler, l'automatisation du
cycle de production sera abordée par la suite.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;L'utilisateur MS-Windows utilise généralement tniASM.
&lt;ul&gt;
&lt;li&gt;Tout le monde aime ce cross-assembler, et son mainteneur est encore vivant
et présent sur IRC.&lt;/li&gt;
&lt;li&gt;Malheureusement, ce n'est pas porté sous Linux.&lt;/li&gt;
&lt;li&gt;On le trouve ici &lt;a href=&quot;http://tniasm.tni.nl&quot;&gt;http://tniasm.tni.nl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Par contre , pour Linux... aie aie aie!
&lt;ul&gt;
&lt;li&gt;Je ne pensais pas avoir autant de mal avec les cross-assemblers Z80 sous
Linux.&lt;/li&gt;
&lt;li&gt;Sans plus attendre, passons au gros morceau.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Choix du cross-assembler Z80 pour Linux&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Voici les résultat de plusieurs jours d'expérimentations.
&lt;ul&gt;
&lt;li&gt;J'ai volontairement omis les cross-assemblers qui me paraissaient vraiment
morts (ex: ZASM).&lt;/li&gt;
&lt;li&gt;Si j'en ai oublié des moins morts, merci de le signaler.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;ASmsx&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Je commence par celui dont je n'ai pas trouvé le site officiel.&lt;/li&gt;
&lt;li&gt;Les sources ne semblent pas disponibles, du moins dans les archives que
j'ai récupéré.&lt;/li&gt;
&lt;li&gt;Il semble même ne pas y avoir de version autre que MS-Windows.&lt;/li&gt;
&lt;li&gt;Il permet de réaliser facilement des ROMs avec les différents mappers
MSX.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Pasmo&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pasmo semble déconseillé.&lt;/li&gt;
&lt;li&gt;Il comporte quelques bizarreries, notamment la nécessité de commencer le
code par la directive &lt;q&gt;org&lt;/q&gt;. Ce qui donne &lt;q&gt;org $C000-7&lt;/q&gt; pour sauter
le stub qui vient ensuite.&lt;/li&gt;
&lt;li&gt;Mais certains projets l'utilisent, comme le C-BIOS.
&lt;ul&gt;
&lt;li&gt;J'ai discuté avec quelques personnes gravitant autour du projet C-BIOS, ça
n'a pas l'air d'être le fol enthousiasme. Plutôt un choix par défaut.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je n'ai donc pas évalué Pasmo, certain de trouver mieux ailleurs.
&lt;ul&gt;
&lt;li&gt;La suite de mes recherches me laisse à penser que je l'ai peut être éliminé
un peu vite.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Sjasm&lt;/h3&gt;
&lt;h5&gt;Grandeur et décadence de Sjasm&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Sjasm semble jouir d'un crédit assez étonnant dans la communauté msx.&lt;/li&gt;
&lt;li&gt;En fait, les anciennes versions étaient fonctionnelles, mais les plus
récentes sont une vraie catastrophe.&lt;/li&gt;
&lt;li&gt;Je vais développer, pour ne pas être accusé de taper sans raison sur un bon
produit, ou de ne rien comprendre à la programmation.&lt;/li&gt;
&lt;li&gt;Sjasm peut s'utiliser à partir d'un binaire (qui semble fonctionner), ou a
partir des sources.&lt;/li&gt;
&lt;li&gt;Je préfère compiler quand les sources sont disponibles, cela donne souvent
de meilleurs résultats.
&lt;ul&gt;
&lt;li&gt;Il s'agit ici de la version 0.42b8&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Compilation de Sjasm 0.42b8&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;make donne des erreurs (je passe charitablement sur les warnings),
notamment:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;datastructures.h:50: erreur: ‘memcpy’ was not declared in this
scope&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;(erreur répétée plusieurs fois dans ce même entête)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Explication: &lt;q&gt;memcpy&lt;/q&gt; est considéré comme une fonction membre de
&lt;q&gt;Data&lt;/q&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Data(byte *n_data,int n_size) : _data(0), _size(n_size),
_maxsize(n_size) { _resize(n_size); memcpy(_data,n_data,n_size); }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ce n'est bien sûr pas le cas. Habituellement, &lt;q&gt;memcpy&lt;/q&gt; est déclaré
dans &lt;q&gt;string.h&lt;/q&gt;.&lt;/li&gt;
&lt;li&gt;Faut-il faire un include de ce fichier au début de l'entête
fautif ?&lt;/li&gt;
&lt;li&gt;memcpy n'est utilisé que dans &lt;q&gt;datastructures.h&lt;/q&gt;, ainsi qu'un appel
dans &lt;q&gt;datastructures.cpp&lt;/q&gt;.&lt;/li&gt;
&lt;li&gt;voici son prototype: &lt;code&gt;void *memcpy (void *dest, const void *src,
size_t n);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;la véritable fonction &lt;q&gt;memcpy&lt;/q&gt; renvoie un pointeur sur
&lt;code&gt;*dest&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;J'ai ajouté memcpy dans la classe &lt;q&gt;Data&lt;/q&gt; (au début avant même le
constructeur, dans les membres &lt;q&gt;public&lt;/q&gt; bien sûr) :
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;void *memcpy (byte *dest, byte *src, size_t n);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;et je l'ai défini ainsi dans datastructures.cpp:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

void * Data::memcpy (byte *dest, byte *src, size_t n)
{
  for (int i=0; i&amp;lt;n; i++) dest[i]=src[i];
  return dest;
}

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Toujours dans datastructures.c, on a ensuite une référence inconnue à
memset (également déclaré dans &lt;q&gt;string.h&lt;/q&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;void *memset (void *s, int c, size_t n);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;comprendre: rempli *s 'n' fois avec c&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;* C'était la seule référence. J'ai remplacé par une simple boucle.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

//memset(_data+_size,0,nsize-_size);
 for (int i=0; i&amp;lt;nsize-_size; i++) _data[_size+i]=0;

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Erreur suivante:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;errors.cpp:58: erreur: ‘exit’ was not declared in this
scope&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;toujours un include à ajouter:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/code&gt; (et non pas &lt;q&gt;stdlib.h&lt;/q&gt;) dans
&lt;q&gt;errors.cpp&lt;/q&gt; (après le include &lt;code&gt;&amp;quot;sjasm.h&amp;quot;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et maintenant, il manque &lt;q&gt;stdio&lt;/q&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fileio.cpp:37: erreur: ‘fopen’ was not declared in this
scope&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;(puis ensuite fclose, fseek, ftell, fwrite. En gros, tout la bande des I/O
de stdio.h). On se demande à quoi sert de faire du C++ si c'est pour reprendre
toute la librairie standard du C.&lt;/li&gt;
&lt;li&gt;On inclut &lt;q&gt;#include &amp;lt;cstdio&amp;gt;&lt;/q&gt; (et non pas &lt;q&gt;stdio.h&lt;/q&gt;) juste
après le include &lt;q&gt;sjasm.h&lt;/q&gt; au début de fileio.cpp.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Erreur suivante: valeur absolue
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rawsource.cpp:449: erreur: ‘abs’ was not declared in this
scope&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;prototype dans &lt;q&gt;stdlib.h&lt;/q&gt; : &lt;code&gt;int abs (int j);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ca calcule une valeur absolue. Bon, on va le faire nous même.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

  int absolute=_offset%al;
  if (absolute&amp;lt;0) absolute=-absolute;
  if (_offset%al) _offset+=al-absolute; //abs(_offset%al);

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Celui là, il est joli: &lt;code&gt;reader.cpp:73: erreur: ‘malloc’ was not
declared in this scope&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;effectivement, il y a bien un malloc t: &lt;code&gt;if (b.length()+1&amp;gt;64)
bp=p=(char*)malloc(b.length()+1);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Bon un &lt;q&gt;free&lt;/q&gt; doit trainer quelque part, au milieu des
&lt;q&gt;delete&lt;/q&gt;.&lt;/li&gt;
&lt;li&gt;Vérifions tout de suite (&lt;code&gt;grep free *&lt;/code&gt;). Ah tiens... non. memory
leak en perspective ?&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/code&gt; , après le &lt;code&gt;#include
&amp;quot;sjasm.h&amp;quot;&lt;/code&gt; (la routine quoi)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Allez , c'est le dernier:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

sjasm.cpp:134: erreur: ‘exit’ was not declared in this scope
sjasm.cpp:145: erreur: ‘exit’ was not declared in this scope

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Allez, include cstdlib again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Et voila. L'exécutable &lt;strong&gt;sjasm&lt;/strong&gt; est construit.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il compile bien au moins ? Petit test...&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ca a l'air de fonctionner.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Patch pour Sjasm 0.42b8&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;J'ai donc écrit un patch que vous pourrez appliquer directement sur les
sources du 0.42b8 si le coeur vous en dit.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;diff -urNb sjasmsrc42b8 sjasmsrc42b8.jseb &amp;gt;sjasm42b8.patch&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Le résultat est un peu long pour être publié ici, je l'ai inclus sous forme
de fichier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour appliquer le patch:
&lt;ul&gt;
&lt;li&gt;Placez-vous dans le répertoire des sources de Sjasm, et copiez-y le
patch&lt;/li&gt;
&lt;li&gt;Lancez la commande &lt;em&gt;patch&lt;/em&gt; : &lt;code&gt;patch -p1 &amp;lt;
sjasm42b8.patch&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une fois les fichiers patchés, vous pouvez lancer make (ne faites pas
attention aux warnings, je n'ai pas corrigé cette partie).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Sjasmplus&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Voyons voir Sjasmplus, qui est un fork d'une ancienne version de
Sjasm.&lt;/li&gt;
&lt;li&gt;Houlala, sur le site officiel, il y a un lien pour les &lt;q&gt;recommended text
editors&lt;/q&gt;.
&lt;ul&gt;
&lt;li&gt;Ok, ni Vim, ni Emacs, ni même Ultraedit. Ca commence bien. Je n'ai même pas
envie de reprendre les sources pour tout dire.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Allez, courage.
&lt;ul&gt;
&lt;li&gt;Bon alors, il y a une stable, et une version de dev. La version de dev
n'inclue pas le scripting avec Lua.&lt;/li&gt;
&lt;li&gt;Je reprends la stable, on verra la version de dev plus tard,
éventuellement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La version stable est la 1.06 (3 aout 2006)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je lance la compilation.
&lt;ul&gt;
&lt;li&gt;A première vue, autant de warnings que chez son petit frère Sjasm.&lt;/li&gt;
&lt;li&gt;Ah, et voici les premières erreurs:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

Sjasm.cpp:167: erreur: ‘MAXPATHLEN’ was not declared in this scope
Sjasm.cpp:199: erreur: ‘zoekpad’ was not declared in this scope

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Là j'avoue, je n'ai pas trop cherché.
&lt;ul&gt;
&lt;li&gt;car c'est alors que je suis tombé sur &lt;strong&gt;ça&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#ifdef WIN32
int main(int argc, char *argv[]) {
#else
int main(int argc, char **argv) {

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Il se faisait tard, j'ai laissé tomber.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je me demande à quoi pensait le type qui a écrit ça.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;z80-asm&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;z80-asm, avec un tiret dans le titre
&lt;ul&gt;
&lt;li&gt;Je précise pour le tiret, car il a un homonyme sans tiret (qui est le
prochain abordé).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;z80-asm semble complet : il inclut même un moniteur/debugger
&lt;q&gt;interactif&lt;/q&gt; à l'ancienne (dans un terminal avec interface façon ncurses).
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://wwwhomes.uni-bielefeld.de/achim/z80-asm.html&quot;&gt;http://wwwhomes.uni-bielefeld.de/achim/z80-asm.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le problème est sa rigidité syntaxique.
&lt;ul&gt;
&lt;li&gt;Il ne veut pas des instructions &lt;q&gt;db&lt;/q&gt; de mon programme de test.&lt;/li&gt;
&lt;li&gt;Il faut remplacer les &lt;q&gt;db&lt;/q&gt; par des &lt;q&gt;defb&lt;/q&gt;, les &lt;q&gt;dw&lt;/q&gt; par des
&lt;q&gt;defw&lt;/q&gt;, etc...&lt;/li&gt;
&lt;li&gt;Les strings ne sont admises qu'avec une déclaration defm (defb ne passera
pas).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour illustrer ce problème, cette déclaration sera refusée:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

LABEL: defb &amp;quot;Hello&amp;quot;,13,10,0

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Et il faudra l'écrire comme ceci:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

LABEL: defm 'Hello chput'
       defb 13,10,0 

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Attention, pour avoir l'aide, c'est &lt;q&gt;-h&lt;/q&gt;. Et non pas &lt;q&gt;--help&lt;/q&gt; ou
&lt;q&gt;-help&lt;/q&gt;.&lt;/li&gt;
&lt;li&gt;Si vous ne précisez pas de fichier de sortie, la syntaxe du programme sera
vérifiée, mais vous aurez le message: &lt;q&gt;No code generated&lt;/q&gt; même si vous
n'avez pas d'erreur.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Par défaut, z80-asm rajoute un header qui empêche toute exécution par le
msx, et il prend au pied de la lettre la directive &lt;q&gt;org $c000&lt;/q&gt; en générant
un binaire de 48 Ko!&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

jseb ~/msx $ hexdump -C test-z80-asm.bin
00000000  5a 38 30 41 53 4d 1a 0a  00 00 fe 00 c0 1b c0 00  |Z80ASM..........|
00000010  c0 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0000c000  00 00 00 00 00 00 00 00  00 00 21 0d c0 7e 23 a7  |..........!..~#.|
0000c010  c8 cd a2 00 18 f7 c9 48  65 6c 6c 6f 20 63 68 70  |.......Hello chp|
0000c020  75 74 0d 0a 00                                    |ut...|
0000c025

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Pour les informations sur le header, voir dans la doc: z80-file.5 (ou
&lt;q&gt;man z80-file&lt;/q&gt; si vous avez installé les pages man).
&lt;ul&gt;
&lt;li&gt;En gros, il faut enlever les 10 premiers octets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour comparaison, le même programme généré avec Sjasm.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

jseb ~/msx $ hexdump -C sjasm.bin
00000000  fe 00 c0 1b c0 00 c0 21  0d c0 7e 23 a7 c8 cd a2  |.......!..~#....|
00000010  00 18 f7 c9 48 65 6c 6c  6f 20 63 68 70 75 74 0d  |....Hello chput.|
00000020  0a 00                                             |..|
00000022

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Je n'ai pas trouvé la façon d'enlever l'entête dans le manuel de z80asm.
&lt;ul&gt;
&lt;li&gt;Du coup, je l'ai fait moi même avec un coup de dd.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dd if=test2.bin of=raw.bin ibs=1 skip=10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mais ne vous fatiguez même pas à essayer. Le code ne s'exécutera bien sûr
pas dans l'émulateur.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dommage, cet assembleur semblait un bon candidat, abstraction faite de sa
syntaxe rigide.
&lt;ul&gt;
&lt;li&gt;Le package possède également un moniteur, déja évoqué ci-dessus.&lt;/li&gt;
&lt;li&gt;Cela dit, rien ne vous empêche d'utiliser le moniteur et de compiler avec
un autre cross-assembler.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;z80asm&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Un bon petit cross-assembler, un peu limité mais à l'approche facile.&lt;/li&gt;
&lt;li&gt;Le nom ressemble fortement au précédent, et se différencie par l'absence de
tiret (ça devient subtil).
&lt;ul&gt;
&lt;li&gt;Mais cette fois, nous avons affaire à un produit plus utilisable&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il a été développé par un possesseur de msx: Bas Wijnen (son pseudo est
Sheveks)
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://savannah.nongnu.org/projects/z80asm&quot;&gt;http://savannah.nongnu.org/projects/z80asm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Bonne surprise, le code source compile sans erreurs ni warnings.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Certaines fonctionnalités sont absentes:
&lt;ul&gt;
&lt;li&gt;Exemple tiré du manuel: &lt;q&gt;rlc r,(ix+nn) and friends don't work&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;Cela ne me parait pas bien grave, et il y a toujours possibilité de faire
une macro pour assembler directement l'instruction en écrivant les octets des
instructions avec une séquence db.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Côté directives, c'est le minimum syndical: defb/db, defwdw, ds/defs ,
include, if/else/endif.
&lt;ul&gt;
&lt;li&gt;Pas de macros ni de &lt;q&gt;incbin&lt;/q&gt; pour ajouter directement des fichiers
binaires.&lt;/li&gt;
&lt;li&gt;Pour &lt;q&gt;incbin&lt;/q&gt;, ce n'est pas bien grave. On peut transformer des
données binaires en db/dw, et les inclure avec la directive
&lt;q&gt;include&lt;/q&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La doc est ici: &lt;a href=&quot;http://www.nongnu.org/z80asm/&quot;&gt;http://www.nongnu.org/z80asm/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Mon programme de test a été assemblé sans problèmes, sans adaptations
syntaxiques, et a parfaitement fonctionné sous OpenMSX.&lt;/li&gt;
&lt;li&gt;Bien que limité, z80asm semble être un bon choix pour le programmeur pressé
de faire ses premiers programmes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;WLA DX : le meilleur pour la fin&lt;/h3&gt;
&lt;h5&gt;Des caractéristiques alléchantes&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;C'est un projet vivant avec des patches récents (aout 2010).&lt;/li&gt;
&lt;li&gt;Ce cross-assembler supporte d'autres processeurs que le Z80 (6502, 6510
...)
&lt;ul&gt;
&lt;li&gt;Pour ne rien vous cacher, la désignation complète est &lt;q&gt;Yet Another
GB-Z80/Z80/6502/65C02/6510/65816/HUC6280/SPC-700 Multi Platform Cross Assembler
Package&lt;/q&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;A noter que la compilation et le link sont séparés, ce qui permet de linker
des objets entre eux, ou des libs.
&lt;ul&gt;
&lt;li&gt;Cette séparation des commandes parait aller de soi, mais elle est absente
des cross-assemblers que j'ai testé jusqu'à présent.&lt;/li&gt;
&lt;li&gt;Pour plus de détails, référez-vous aux sections &lt;q&gt;compiling&lt;/q&gt; et
&lt;q&gt;linking&lt;/q&gt; dans le README (section 9 et 10).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Les possibilités offertes par les directives disponibles sont
impressionantes.
&lt;ul&gt;
&lt;li&gt;Attention, il y a quelques pièges que je détaillerai plus loin.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La doc n'est pas toujours très claire, mais elle est complète.
&lt;ul&gt;
&lt;li&gt;Il ne faudra pas hésiter à faire quelques allers-retours dans la doc. Les
informations sont parfois un peu éparpillées.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Compilation de WLA DX&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Compilateur et linkers étant séparés, il va falloir procéder en deux
temps.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La dernière version sur le site de Ville Helin (son auteur) est la 9.5
(aout 2008).
&lt;ul&gt;
&lt;li&gt;Les anciennes versions sont sur le site de l'auteur:&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.villehelin.com/wla.html&quot;&gt;http://www.villehelin.com/wla.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Depuis, il est hébergé sur sourceforge.
&lt;ul&gt;
&lt;li&gt;Le mieux est de récupérer les derniers commits avec subversion depuis le
repository:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;svn co https://wladx.svn.sourceforge.net/svnroot/wladx
wladx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il faut ensuite aller dans le répertoire &lt;q&gt;makefiles&lt;/q&gt;, et choisir celui
qui nous intéresse.
&lt;ul&gt;
&lt;li&gt;Dans notre cas, il s'agit bien sûr de &lt;q&gt;makefile.unix.z80&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Copier ce makefile dans le répertoire des sources du compilateur
(répertoire racine \&amp;quot;wladx\&amp;quot;).
&lt;ul&gt;
&lt;li&gt;Modifiez le pour virer le flag &lt;q&gt;-O3&lt;/q&gt; et mettre un &lt;q&gt;-O2&lt;/q&gt; à la
place.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make clean &amp;amp;&amp;amp; make -f makefile.unix.z80&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Le &lt;code&gt;make clean&lt;/code&gt; est là au cas où une autre architecture aurait
été compilée auparavant.&lt;/li&gt;
&lt;li&gt;Ainsi, le define &lt;q&gt;-DZ80&lt;/q&gt; sera bien pris en compte.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pas de warnings inquiétants à signaler (n'oublions pas que les flags sont
assez durs: &lt;q&gt;-ansi -pedantic -Wall&lt;/q&gt; ! )
&lt;ul&gt;
&lt;li&gt;Lancez l'exécutable obtenu (wla-z80).&lt;/li&gt;
&lt;li&gt;La première ligne doit indiquer qu'il s'agit de la version Z80 :&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

/tmp/wladx$ ./wla-z80 

WLA Z80 Macro Assembler v9.5

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Si vous obtenez la ligne ci-dessus, le compilateur est prêt.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il reste à s'occuper du linker, qui lui est commun à tous les compilateurs
supportés par WLA.
&lt;ul&gt;
&lt;li&gt;Le linker se trouve dans le sous-répertoire &lt;q&gt;wlalink&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il faut modifier &lt;q&gt;wlalink/makefile.unix&lt;/q&gt; sur deux points:
&lt;ul&gt;
&lt;li&gt;Remplacer &lt;code&gt;-O3&lt;/code&gt; par &lt;code&gt;-O2&lt;/code&gt; (comme pour le
compilateur).&lt;/li&gt;
&lt;li&gt;Remplacer &lt;code&gt;$(LD)&lt;/code&gt; par &lt;code&gt;$(CC)&lt;/code&gt; (sinon la compilation
plante lors du link sur la libc).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez maintenant faire un:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make clean &amp;amp;&amp;amp; make -f makefile.unix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;L'exécutable obtenu se nomme &lt;q&gt;wlalink&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

/tmp/wladx/wlalink$ ./wlalink                                                  e

WLALINK GB-Z80/Z80/6502/65C02/6510/65816/HUC6280/SPC-700 WLA Macro Assembler Linker v5.7

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Et voila, le linker est prêt également.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Test de WLA DX&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;WLA DX a une approche assez originale qui peut dérouter au premier
abord.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Avant toutes choses, lecture (même rapide) obligatoire du README (91ko!)
qui fait office de documentation principale.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voici un programme de démonstration adapté à WLA DX, avec quelques
explications.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
; test.asm - for testing WLA cross compiler.
; jseb @ finiderire . com

.MEMORYMAP
SLOTSIZE $FFFF
DEFAULTSLOT 0
SLOT 0 $0
.ENDME

.ROMBANKMAP
BANKSTOTAL 1
BANKSIZE $FFFF
BANKS 1
.ENDRO

.section &amp;quot;BANKHEADER&amp;quot;
  .db $fe
  .dw start,end,start; 
.ends

.BANK 0 SLOT 0
.ORG $C000 

start:
     LD HL,label
aff: LD A,(HL)
     INC HL
     AND A
     RET Z
     CALL $A2 ; CHPUT
     JR aff
     RET

label: .DB &amp;quot;Hello, World&amp;quot;,13,10,0
end: .equ $-1


&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Au début du programme, vous remarquez quelques directives:
&lt;ul&gt;
&lt;li&gt;.MEMORYMAP et .ROMBANKMAP&lt;/li&gt;
&lt;li&gt;Elles servent à définir la structure des roms. Ici, j'ai fait au plus
simple (un seul slot, une seule banque, la totalité de l'espace adressable par
un Z80 assigné sur le même slot).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;BANKHEADER est plus intéressant, et nécessaire pour écrire le stub de notre
programme.
&lt;ul&gt;
&lt;li&gt;les octets contenus dans BANKHEADER seront simplement ajoutés au début de
l'objet, et ne provoqueront pas de décalage dans le calcul d'adressage à la
compilation. Dans la doc, il est même précisé que c'est une option très utile
pour le MSX (tu m'étonnes).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le &lt;q&gt;.BANK 0 SLOT 0&lt;/q&gt; ne semble pas obligatoire, car notre cas est très
simple. Mais dans d'autre cas, il peut être utile de spécifier la BANK ou le
SLOT. J'ai donc laissé cette directive pour attirer votre attention sur son
existence.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;A propos de BANK et de SLOT, la terminologie employée ici n'ait aucun
rapport avec le memory mapping du MSX , même si les mots sont identiques.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Avant de nous lancer dans la compilation et le link, un gris piège est à
signaler:
&lt;ul&gt;
&lt;li&gt;&lt;q&gt;.equ&lt;/q&gt; est un alias pour &lt;q&gt;.define&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;c'est à dire: &lt;q&gt;.define : Assigns a number or a string to a
definition label.&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;Dans l'exemple en dessous, on met donc start à zéro! Ce n'est pas le
comportement habituel qui serait d'assigner la valeur de start à exec.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exec: .equ start ;en réalité, met start à zéro !!&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Il semble qu'on ne puisse pas assigner de valeur à une étiquette en
utilisant la valeur d'une autre étiquette. Par contre, on peut faire ça:
&lt;code&gt;exec: .equ $C000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ce qui n'a pas un grand interet (voire même peut être dangereux si on
change la valeur de .ORG )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour la compilation :
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wla-z80 -o test.asm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;le flag &lt;q&gt;-o&lt;/q&gt; sert à demander la génération d'un fichier objet.&lt;/li&gt;
&lt;li&gt;le nom du fichier objet est par défaut celui du fichier source avec
l'extension &lt;q&gt;.o&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour le link :
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wlalink -b test.group test.bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;le flag &lt;q&gt;-b&lt;/q&gt; est important, car par défaut, c'est &lt;q&gt;-r&lt;/q&gt; qui est
utilisé. Et le flag &lt;q&gt;-r&lt;/q&gt; sert à créer une rom.&lt;/li&gt;
&lt;li&gt;Le fichier &lt;q&gt;test.group&lt;/q&gt; contient différents paramètres, dont le nom
des fichiers objets à utiliser pour le link (voir la doc).&lt;/li&gt;
&lt;li&gt;Ici, le fichier &lt;q&gt;test.group&lt;/q&gt; contient ceci:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

[objects]
test.o

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Il est réduit ici à sa plus simple expression.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voilà un tour rapide de WLA. Vous en savez assez pour lire la doc et
pouvoir m'expliquer comment générer une ROM avec ce compilateur!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le cas des macro cross-assemblers&lt;/h3&gt;
&lt;h5&gt;macro quoi ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;q&gt;macro cross assembler&lt;/q&gt; est un cross compilateur classique, mais
qui fonctionne avec un système de macros.&lt;/li&gt;
&lt;li&gt;Les macros sont des regroupements d' instructions (ici, les mnémoniques),
sous une seule instruction afin de faciliter la lecture.&lt;/li&gt;
&lt;li&gt;Une macro sert à automatiser l'insertion d'un bloc d'instruction.&lt;/li&gt;
&lt;li&gt;Le support par le compilateur des macros peut être plus ou moins étendu:
&lt;ul&gt;
&lt;li&gt;Cela peut aller du simple remplacement de texte (comme une fonction inline)
à l'intégration de la gestion des opérateurs arithmétiques et logiques.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Notez qu'il existe bien sûr des macro assemblers dédiés à la plateforme
hôte. Ils ne sont donc pas cross-compilers.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Les macro-assemblers permettent d'introduire un peu de haut niveau dans le
monde aride de l'assembleur.
&lt;ul&gt;
&lt;li&gt;Le revers de la médaille peut être une génération de code bien foireuse,
surtout pour des projets amateurs peu suivis.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le macro cross-assembler AS&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;AS rentre dans le club très fermé décrit ci-dessus.&lt;/li&gt;
&lt;li&gt;Son support des macros est suffisament étendu pour justifier un traitement
à part.&lt;/li&gt;
&lt;li&gt;Vous le trouverez ici:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://john.ccac.rwth-aachen.de:8000/as/&quot;&gt;http://john.ccac.rwth-aachen.de:8000/as/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voici un exemple de sa syntaxe&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

dbstr   macro   arg
        if      strlen(arg) &amp;gt; 1
         db     substr(arg, 0, strlen(arg) - 1)
        endif
        if      strlen(arg) &amp;gt; 0
         db     charfromstr(arg, strlen(arg) - 1) | 80h
        endif
        endm 

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Il m'a l'air ma foi fort intéressant...
&lt;ul&gt;
&lt;li&gt;mais j'avoue que je commence à me lasser de tous ces tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Mes choix de cross-assemblers&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Il faut bien choisir, alors voici mes préférés.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;WLA DX, le meilleur et le plus exigeant&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;WLA DX est de loin le meilleur cross compiler que j'ai pu tester. Il y a un
monde entre lui, et Sjasm par exemple.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ses avantages:
&lt;ul&gt;
&lt;li&gt;Le compilateur et le linker sont séparés, ce qui est une très bonne
chose.&lt;/li&gt;
&lt;li&gt;Il compile sans warning inquiétants, ni erreurs, avec des flags qui ne
pardonnent pourtant pas.&lt;/li&gt;
&lt;li&gt;La doc est bien fournie.&lt;/li&gt;
&lt;li&gt;Il est maintenu et réellement multi-plateformes, signe d'une bonne
conception.&lt;/li&gt;
&lt;li&gt;Le code est en C, preuve de bon goût (mieux vaut écrire du C rustique et
fonctionnel que du C++ qui compile à peine).&lt;/li&gt;
&lt;li&gt;Seule une relative complexité pourrait vous conduire à lui préférer z80asm
(celui de Sheveks).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ses inconvénients:
&lt;ul&gt;
&lt;li&gt;Une façon de faire aux antipodes de la simplicité.&lt;/li&gt;
&lt;li&gt;Une doc pas toujours très claire.&lt;/li&gt;
&lt;li&gt;Nécessite surement un peu d'expérience en programmation pour être
apprécié.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;z80asm, rustique mais efficace&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Celui-ci est simple, mais n'a posé de problèmes ni à la compilation, ni à
l'utilisation.&lt;/li&gt;
&lt;li&gt;D'autres part, il a été développé spécifiquement pour être utilisé avec un
MSX.
&lt;ul&gt;
&lt;li&gt;Cependant, contrairement à ASmsx, il ne permet pas de créer facilement des
ROMs.&lt;/li&gt;
&lt;li&gt;Seuls quelques fichiers d'équivalences spécifiques aux MSX sont
fournis.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sa rusticité (peu de directives disponibles) ne doit pas faire oublier sa
facilité d'emploi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Sjasm 0.42b8, le pari&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Avec Sjasm, vous avez un cross-assembler relativement séduisant sur le
papier.&lt;/li&gt;
&lt;li&gt;Ses sources font cependant assez peur, et le patch que je vous propose pour
le compiler ne corrige que les erreurs bloquants la compilation.&lt;/li&gt;
&lt;li&gt;Une fois que j'ai réussi à le compiler, mes programmes de tests sont passés
sans problèmes.&lt;/li&gt;
&lt;li&gt;A tester donc, pour les plus joueurs d'entre-vous.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Et pour les Windoziens, c'est tniASM&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;tniASM semble pas mal... pour MS-Windows.
&lt;ul&gt;
&lt;li&gt;je continue à tanner son auteur sur IRC pour une version OpenSource.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Fini pour aujourd'hui&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le prochain sujet abordé sera l'échange de données avec l'émulateur, et
l'édition facile d'un programme basic.&lt;/li&gt;
&lt;li&gt;D'ici là, vous avez le temps de digérer ce billet un peu long.
&lt;ul&gt;
&lt;li&gt;Vous pouvez même retourner sur la plage, le temps que j'écrive tout ça, les
nuages sont partis.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Votre propre expérience des cross-assemblers m'intéresse! N'hésitez pas à
poster vos remarques et ajouts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
          <enclosure url="http://www.finiderire.com/public/patchs/sjasm42b8_patch.zip"
      length="2037" type="application/zip" />
    
    
          <comments>http://www.finiderire.com/post/2010/08/16/Ce-sont-les-vacances%3A-en-avant-toute-vers-le-retro-%21#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/08/16/Ce-sont-les-vacances%3A-en-avant-toute-vers-le-retro-%21#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/539917</wfw:commentRss>
      </item>
    
  <item>
    <title>Oukiléleclavier ? Oukellélasouris ? (ou: la bonne blague de Xorg)</title>
    <link>http://www.finiderire.com/post/2010/05/01/Oukil%C3%A9leclavier-Oukell%C3%A9lasouris-%28ou%3A-la-bonne-blague-de-XOrg%29</link>
    <guid isPermaLink="false">urn:md5:afb6042d2ed71447df41c784b28c528d</guid>
    <pubDate>Wed, 05 May 2010 18:47:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Gentoo</category><category>Linux</category><category>pénible</category>    
    <description>&lt;p&gt;&lt;em&gt;Je me suis aperçu qu'il manquait un tag à mes billets.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Comment caractériser toutes ces nuisances qui gachent la vie de l'honnête
administrateur système ?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;J'inaugure dès à présent le tag &lt;q&gt;pénible&lt;/q&gt; avec Xorg&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Situation de départ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Le but était de faire 'une mise à jour de Xorg sous Gentoo.
&lt;ul&gt;
&lt;li&gt;Pour ma part, il s'agissait de passer le serveur Xorg de la version 1.3 à
la version 1.6.5.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Avis aux mécréants utilisateurs d'autres unixeries que Gentoo :
continuez à lire, ceci concerne au moins également FreeBSD et Arch-Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Echauffement&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Installer Xorg implique souvent la mise à jour d'autres paquets.&lt;/li&gt;
&lt;li&gt;Avant même le passage au paquet &lt;em&gt;xorg-server&lt;/em&gt;, nous rencontrons une
erreur.&lt;/li&gt;
&lt;li&gt;La &lt;em&gt;libpciaccess&lt;/em&gt; (en update) essaie d'installer un exécutable
(&lt;em&gt;scanpci&lt;/em&gt;) mais refuse de remplacer la version précédente.
&lt;ul&gt;
&lt;li&gt;Cet exécutable provoque un conflit, car c'est un autre ebuild qui a
construit la version précédente.&lt;/li&gt;
&lt;li&gt;On ne peut donc pas le supprimer sans réfléchir, car cela risquerait de
casser l'autre ebuild.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Laissez tomber la méthode de résolution suggérée dans les messages, et
faites plutôt:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;equery b scanpci&lt;/code&gt; : vous obtenez le nom du paquet qui
contient l'ancienne version à remplacer.&lt;/li&gt;
&lt;li&gt;Il s'agissait du Xorg que vous tentez d'updater. Ma méthode (votre avis
peut varier) : &lt;code&gt;emerge -C xorg-server&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une fois ceci rêglé, vous pouvez relancer la mise à jour de
&lt;em&gt;xorg-server&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Plus de clavier, plus de souris&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pour le reste, la compilation, se passe plutôt bien.&lt;/li&gt;
&lt;li&gt;Un &lt;code&gt;emerge -va nvidia-drivers&lt;/code&gt; plus tard, Xorg démarre
enfin.&lt;/li&gt;
&lt;li&gt;Et là, plus de souris (huho) ni de clavier (haha).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Rendez moi mon clavier! (et ma souris aussi!)&lt;/h3&gt;
&lt;h5&gt;Sortie de Xorg&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Alors là, attention, c'est technique.
&lt;ul&gt;
&lt;li&gt;Appuyez pendant 5 secondes sur le bouton marche/arrêt du PC.&lt;/li&gt;
&lt;li&gt;Si vous avez ACPI dans le noyau avec un script sur le bouton marche/arrêt,
vous êtes sauvé et la solution déplorable de la ligne du dessus ne sera pas
nécessaire.&lt;/li&gt;
&lt;li&gt;Les heureux utilisateurs d'un réseau local pourront également faire un
&lt;em&gt;ssh&lt;/em&gt; sur la machine coincée. Beaucoup plus propre, mais nécessite un
cable réseau et un autre PC (et un daemon sshd sur la machine bloquée).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Divination avec les logs&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Après le reboot, et en supposant que vous n'avez pas eu de problème de
journalisation, vous vous retrouvez à nouveau devant la console.
&lt;ul&gt;
&lt;li&gt;Si vous n'avez pas de chance, X est relancé aussi sec. Dans ce cas, il va
falloir changer le niveau de démarrage de votre Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dans le log de Xorg, nous trouvons la source du problème (je ne vous montre
que la partie concernant le clavier, la même chose est observable pour la
souris):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$~  less /var/log/Xorg.0.log
(II) LoadModule: &amp;quot;kbd&amp;quot;
(II) Loading /usr/lib/xorg/modules/input//kbd_drv.so
(II) Module kbd: vendor=&amp;quot;X.Org Foundation&amp;quot;
        compiled for 1.3.0, module version = 1.1.0
        Module class: X.Org XInput Driver
        ABI class: X.Org XInput driver, version 0.7
(EE) module ABI major version (0) doesn't match the server's version (4)
(II) UnloadModule: &amp;quot;kbd&amp;quot;
(II) Unloading /usr/lib/xorg/modules/input//kbd_drv.so
(EE) Failed to load module &amp;quot;kbd&amp;quot; (module requirement mismatch, 0)

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Parenthèse pour les paresseux&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Si vous n'avez pas fait de mise à jour de Xorg depuis &lt;em&gt;vraiment&lt;/em&gt;
très longtemps, il se peut que vous ayez un autre problème.&lt;/li&gt;
&lt;li&gt;En effet, dans la config de Xorg, les devices ont changé de nom à un moment
donné.&lt;/li&gt;
&lt;li&gt;Vérifiez donc que votre clavier et votre souris ont bien le driver
convenable.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

Section &amp;quot;InputDevice&amp;quot;

    Identifier  &amp;quot;Keyboard1&amp;quot;
    Driver      &amp;quot;kbd&amp;quot;

(snip)
    Identifier  &amp;quot;Mouse1&amp;quot;
    Driver      &amp;quot;mouse&amp;quot;

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Je ne saurais en dire plus à ce sujet, car je n'ai que de vagues souvenirs
de ce problème.
&lt;ul&gt;
&lt;li&gt;De toutes façons, le problème a dû disparaitre de lui-même, depuis le
temps. (l'optimisme est rare de nos jours, sachons le cultiver.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Revenons à nos moutons&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il vous manque simplement deux mises à jour, oubliées par
&lt;em&gt;emerge&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;emerge -va xf86-input-keyboard&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;emerge -va xf86-input-mouse&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;A noter que le problème se posera probablement également avec votre
joystick, votre tablette graphique, et autres périphériques d'entrée.
&lt;ul&gt;
&lt;li&gt;Un simple &lt;code&gt;eix xf86-input&lt;/code&gt; vous en convaincra aisément.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Keyboard not found. Press F1 to continue.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;J'ai profité de mon clavier retrouvé pour écrire ce billet.&lt;/li&gt;
&lt;li&gt;Comme je ne vais pas non plus tout faire, je vous laisse écrire les
commentaires.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/05/01/Oukil%C3%A9leclavier-Oukell%C3%A9lasouris-%28ou%3A-la-bonne-blague-de-XOrg%29#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/05/01/Oukil%C3%A9leclavier-Oukell%C3%A9lasouris-%28ou%3A-la-bonne-blague-de-XOrg%29#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/513081</wfw:commentRss>
      </item>
    
  <item>
    <title>MPD : le stream était presque parfait</title>
    <link>http://www.finiderire.com/post/2010/04/27/MPD-%3A-le-stream-%C3%A9tait-presque-parfait</link>
    <guid isPermaLink="false">urn:md5:68cc9eb57ffae22afedbc3ec6cde04fa</guid>
    <pubDate>Wed, 28 Apr 2010 00:11:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Gentoo</category><category>Linux</category><category>tools</category>    
    <description>&lt;p&gt;&lt;em&gt;Aujourd'hui, ce sont mes aventures pour streamer de la musique avec
mpd.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Car mpd est beau, mpd est grand, mpd streame!&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Merci à Frédéric Jolliton pour le coup de main lors de la mise au point.
(et il a relu et clarifié, en plus)&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;MàJ 13 mai 2010&lt;/strong&gt; : gagner trois ko de bande passante
avec shh&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Résumé des épisodes précédents&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ce n'était pas forcément le plus intéressant, mais le premier billet est
ici:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.finiderire.com/post/2008/07/09/MPD-%3A-Musique-Par-le-Daemon&quot;&gt;MPD - musique par
le daemon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le streaming n'était pas le sujet de ce billet. Dans ma grande bonté, j'en
refais donc un complet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Comprenons-nous bien&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ce titre légèrement menaçant fait un peu vendeur de &lt;em&gt;savonnettes
dé-régulées&lt;/em&gt; cherchant à forcer l'entrée de votre habitation. Cette fois,
il ne s'agit que d' une nécessaire introduction à ce qu'est réellement
mpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;De l'avantage du stream&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pourquoi écouter un stream , et ne pas décoder en local ?
&lt;ul&gt;
&lt;li&gt;Vous ne compilerez qu'une fois le player.&lt;/li&gt;
&lt;li&gt;Vous ne dupliquez pas vos fichiers, vous n'avez pas besoin de les promener
sur une clé usb ou un disque externe.&lt;/li&gt;
&lt;li&gt;Vous allez faire l'envie de vos voisins (en général, cet argument suffit à
emporter la décision).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;mpd n'est pas forcément ce que l'on croit&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;mpd est un player dont la sortie sonore se fait en &lt;strong&gt;local&lt;/strong&gt;
par défaut (c'est à dire, sur la machine où mpd est lancé).
&lt;ul&gt;
&lt;li&gt;Les clients de mpd, tels que &lt;strong&gt;ncmpc&lt;/strong&gt; ou
&lt;strong&gt;gmpc&lt;/strong&gt; (client Gnome) ne sont rien d'autre que des télécommandes
pour mpd.&lt;/li&gt;
&lt;li&gt;Aucun d'entre eux ne permet d'écouter un stream.&lt;/li&gt;
&lt;li&gt;Ils ne savent qu'envoyer des commandes au daemon mpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;em&gt;client mpd&lt;/em&gt; est une télécommande ... donc cela signifie que seul
le PC faisant tourner le serveur est en mesure de sortir du son, et que tous
les clients associés à mpd ne servent qu'à contrôler celui-ci à distance ?
&lt;ul&gt;
&lt;li&gt;Exactement ! Je n'aurais su mieux le dire !&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;mais mpd peut streamer&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Néanmoins, si les clients spécifiques à mpd ne peuvent que le contrôler,
mpd est capable de différents rendus.
&lt;ul&gt;
&lt;li&gt;Les sorties locales, avec la configuration OSS , Alsa ou ... &lt;q&gt;null&lt;/q&gt;
(qui est bien un rendu local)&lt;/li&gt;
&lt;li&gt;Des sorties streamées, avec entre autres un serveur shoutcast, ou son
serveur interne httpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons utiliser le serveur intégré à mpd, qui streame sans fioritures,
tel une web-radio.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dès à présent, il est utile de préciser que nous allons utiliser deux
ports.
&lt;ul&gt;
&lt;li&gt;Le port de commande de mpd, sur lequel nous pouvons connecter un client, ou
lancer un &lt;code&gt;telnet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Le port utilisé par mpd pour servir le stream. Celui-ci n'est actif que
quand de la musique est jouée. Il est fermé dès que la musique est
stoppée.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Préparation et configuration de mpd&lt;/h3&gt;
&lt;h5&gt;Flags de compilation Gentoo&lt;/h5&gt;
&lt;pre&gt;

media-sound/mpd -alsa -ffmpeg mikmod musepack ogg vorbis lame

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Votre avis concernant ffmpeg pourra varier, mais j'ai préféré limiter les
temps de compilation sur une machine un peu limitée.&lt;/li&gt;
&lt;li&gt;J'ai bien sûr retiré toute référence à Alsa (OSS étant inactif par défaut),
vu que la machine hébergeant le serveur n'a même pas de carte son.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Création des répertoires nécessaires&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;mpd peut être lancé par un utilisateur lambda.
&lt;ul&gt;
&lt;li&gt;Vous devriez mettre sa configuration dans le &lt;em&gt;home&lt;/em&gt; de celui-ci, et
ajuster le paramètre &lt;em&gt;user&lt;/em&gt; dans le fichier de configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Fichier de configuration&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Voici mon fichier de configuration.
&lt;ul&gt;
&lt;li&gt;Je n'ai pas inclu tout ce qui ne sert pas, reportez vous au fichier
&lt;q&gt;/etc/mpd.conf&lt;/q&gt; pour plus de précisions.&lt;/li&gt;
&lt;li&gt;Pour vos essais, vous pouvez simplifier la situation en ne mettant pas de
mot de passe, par exemple.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

music_directory  &amp;quot;/home/toto/music&amp;quot;
playlist_directory  &amp;quot;/home/toto/mpd/playlists&amp;quot;
db_file  &amp;quot;/home/toto/mpd/database&amp;quot;
log_file  &amp;quot;/home/toto/mpd/mpd.log&amp;quot;
pid_file  &amp;quot;/home/toto/mpd/mpd.pid&amp;quot;
state_file  &amp;quot;/home/toto/mpd/state&amp;quot;
user  &amp;quot;toto&amp;quot;
bind_to_address  &amp;quot;0.0.0.0&amp;quot;
port  &amp;quot;1234&amp;quot;
password  &amp;quot;password@read,add,control,admin&amp;quot;
default_permissions  &amp;quot;&amp;quot; #pas de bras, pas de chocolat.

input {
        plugin &amp;quot;curl&amp;quot;
}

audio_output {
        type  &amp;quot;httpd&amp;quot;
       name  &amp;quot;My HTTP Stream&amp;quot;
        encoder  &amp;quot;lame&amp;quot;  # optional, vorbis or lame
        port  &amp;quot;5678&amp;quot;
        bitrate  &amp;quot;128&amp;quot;  # do not define if quality is defined
        format  &amp;quot;44100:16:1&amp;quot;
}
filesystem_charset &amp;quot;UTF-8&amp;quot;

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;bind_to_address&lt;/strong&gt; : ne mettez &lt;strong&gt;surtout
pas&lt;/strong&gt; &lt;em&gt;localhost&lt;/em&gt; ou &lt;em&gt;127.0.0.1&lt;/em&gt; :
&lt;ul&gt;
&lt;li&gt;Cela provoquerait un bind de mpd sur l'interface loopback. Toute connexion
externe serait alors impossible.&lt;/li&gt;
&lt;li&gt;A la place de 0.0.0.0 on peut mettre l'IP d'une carte réseau. Par exemple
pour une machine directement sur le net (avec une IP publique) on veut pas
forcément rendre mpd accessible. Alors qu'en mettant l'IP de la machine sur le
LAN (disons 192.168.1.1) ça ne sera accessible que sur le réseau local.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;default_permissions&lt;/strong&gt; : pour vos essais en connexion
anonyme (sans mot de passe), vous pouvez mettre les permissions à fond avec
&lt;q&gt;read,add,control,admin&lt;/q&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Premier lancement&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Placez quelques fichiers musicaux dans le répertoire définit comme
&lt;em&gt;music_directory&lt;/em&gt; dans le fichier de configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le premier lancement se fera en local, avec l'utilisateur configuré dans
mpd.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Au passage, nous allons créer la base de données.
&lt;ul&gt;
&lt;li&gt;Par la suite, la commande &lt;q&gt;update&lt;/q&gt; sera envoyée par un client
mpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

toto@serveur ~$ mpd --create-db

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;En cas d'erreur, ou de modification de la base, vous pouvez tuer le serveur
avec :
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kill $(pidof mpd)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Par la suite, vous pourrez utiliser les scripts Gentoo (ou de votre
distrib) pour demander le démarrage de mpd au boot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Test rapide avec telnet&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Plus qu'à tenter un telnet sur le port de votre serveur&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez trouver toutes les commandes comprises par mpd ici:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://mpd.wikia.com/wiki/MusicPlayerDaemonCommands&quot;&gt;commandes
mpd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

toto@serveur ~/.ncmpc $ telnet localhost 1234
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
OK MPD 0.15.0
status
volume: -1
repeat: 0
random: 0
single: 0
consume: 0
playlist: 3
playlistlength: 0
xfade: 0
state: stop
OK
close
Connection closed by foreign host.

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;status&lt;/em&gt; vous permettra d'obtenir rapidement confirmation du
fonctionnement de mpd.
&lt;ul&gt;
&lt;li&gt;Même si la simple réussite de la connexion telnet devrait suffire.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour fermer proprement la session, utilisez &lt;em&gt;close&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;mpc dépanne certes bien...&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant que le daemon mpd fonctionne, il est temps de tester avec un
logiciel un peu plus évolué, et à distance.
&lt;ul&gt;
&lt;li&gt;Je vous conseille de rester sur le réseau local de mpd, ceci limitera les
ports à ouvrir dans le firewall, et vous pourrez toujours vous passer
d'authentification.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;L'informatique aime les acronymes, et les doublons aussi.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mpc&lt;/strong&gt; = music player &lt;strong&gt;client&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;ne confondez pas avec les vieux fichiers &lt;em&gt;musepack&lt;/em&gt; (extension
&lt;em&gt;mpc&lt;/em&gt;) que l'on peut jouer avec mpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;mpc&lt;/em&gt; est un utilitaire indispensable pour vous éviter des
&lt;code&gt;telnet&lt;/code&gt; rapidement saoulants sur le port du daemon mpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je vous laisse faire &lt;code&gt;man mpc&lt;/code&gt; , le fonctionnement est
trivial.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;...mais ncmpc est toujours le plus beau&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant que tout semble bien tourner, il est temps de passer au client
qui ne nous quittera plus.&lt;/li&gt;
&lt;li&gt;Avec un nom à coucher dehors, &lt;strong&gt;ncmpc&lt;/strong&gt; est néanmoins le plus
agréable des clients mpd.&lt;/li&gt;
&lt;li&gt;Interprétation personnelle du nom:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;nc&lt;/strong&gt; = &lt;em&gt;ncurses&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mpc&lt;/strong&gt; = &lt;em&gt;music player client&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Version dans Portage (avril 2010)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;0.14
&lt;ul&gt;
&lt;li&gt;un peu vieille, mais que voulez-vous ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Flags Gentoo&lt;/h5&gt;
&lt;pre&gt;

media-sound/ncmpc artist-screen colors help-screen key-screen lyrics-screen search-screen song-screen

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Beaucoup de possibilités dans les versions récentes de &lt;em&gt;ncmpc&lt;/em&gt; , y
compris la possibilité d'afficher les paroles des chansons.
&lt;ul&gt;
&lt;li&gt;J'ai activé toutes les options, ça ne mange pas de pain (ni de
ressources).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Erreur possible à la compilation de ncmpc&lt;/h5&gt;
&lt;pre&gt;

match.c:43: attention : implicit declaration of function ‘g_regex_match_simple’
match.c:45: erreur: ‘G_REGEX_CASELESS’ undeclared (first use in this function)

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Dans ce cas, il faut mettre à jour votre glib (pas la glibc , je parle bien
de la glib tout court) et recommencer l'emerge de ncmpc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Fichier de configuration de ncmpc&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il se trouve dans ~/ncmpc/config&lt;/li&gt;
&lt;li&gt;Celui-ci est donné juste pour information. Je n'ai pas encore pris le temps
de fignoler.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

port = 1234
password = &amp;quot;password&amp;quot;
scroll = yes
scroll-sep = &amp;quot; ***** &amp;quot;
enable-colors = yes
color background = black
color list = brightwhite

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Diagnostics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Lancez la lecture d'un fichier avec mpc, ncmpc, telnet, ou ce que vous
voudrez.
&lt;ul&gt;
&lt;li&gt;Ceci doit produire l'envoi du stream sur le port défini pour &lt;em&gt;httpd&lt;/em&gt;
dans la configuration de mpd.&lt;/li&gt;
&lt;li&gt;Le port &lt;em&gt;stream&lt;/em&gt; ne sera ouvert que pendant la génération d'un
stream.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

toto@serveur ~$ netstat -pln | grep mpd
tcp        0      0 0.0.0.0:1234            0.0.0.0:*               LISTEN      3694/mpd
tcp        0      0 0.0.0.0:5678            0.0.0.0:*               LISTEN      3694/mpd

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Les ports utilisés sont ceux définis dans &lt;em&gt;mpd.conf&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;Le port de commande de mpd est 1234.&lt;/li&gt;
&lt;li&gt;Le stream est joué sur 5678.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La config du pauvre, mais qui marche tellement bien&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Et encore j'avais un titre plus long pour cette partie, mais il faut savoir
rester raisonnable.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons utiliser un tunnel ssh dans lequel nous ferons passer le flux.
&lt;ul&gt;
&lt;li&gt;Ceci nous évitera de partager nos disques avec la terre entière, ce qui
serait non seulement illégal, mais très consommateur en bande passante.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Tunnel ssh&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Ce n'est pas le sujet de ce billet, je vous donne donc la commande pour
créer un tunnel ssh.
&lt;ul&gt;
&lt;li&gt;Il y a pas mal d'explications à ce sujet un peu partout, les curieux
devraient trouver leur compte facilement.&lt;/li&gt;
&lt;li&gt;Sous MS-Windows, vous pouvez créer facilement des tunnels avec
&lt;em&gt;Putty&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;pour créer un tunnel ssh entre votre machine et le serveur mpd&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

ssh -C -L 5678:localhost:5678 a.b.c.d

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;5678&lt;/em&gt; : port configuré sur mpd pour exporter le stream httpd
(ce n'est &lt;strong&gt;pas&lt;/strong&gt; le port de commande de mpd)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;localhost&lt;/em&gt; : car vous allez vous connecter sur votre machine
pour la redirection de port.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;a.b.c.d&lt;/em&gt; : ip de la machine distante faisant tourner mpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En prime, vous récupérez un shell où vous pourrez lancer &lt;em&gt;ncmpc&lt;/em&gt;
pour controler &lt;em&gt;mpd&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;mpd&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Exporte le flux httpd.&lt;/li&gt;
&lt;li&gt;Les façons de le lancer ont été vues plus haut:
&lt;ul&gt;
&lt;li&gt;en user : &lt;code&gt;mpd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;au démarrage : voir la doc de votre distrib. Avec Gentoo, vous pourrez
utiliser &lt;code&gt;/etc/init.d/mpd start&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;ncmpc&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;à installer sur le serveur pour controler mpd
&lt;ul&gt;
&lt;li&gt;on peut également l'installer sur le client (dans ce cas, pensez à définir
un login/password et à ouvrir le port de commande mpd dans le firewall).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;mplayer&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Reçoit le stream et assure son rendu.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mplayer http://192.168.1.1:5678&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;192.168.1.1&lt;/em&gt; est l'ip de la machine faisant tourner
&lt;em&gt;mpd&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;5678&lt;/em&gt; est le numéro de port utilisé pour envoyer le stream.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Inconvénients de la config du pauvre (mais qui marche tellement bien)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Je ne vous le cache pas, il y a quelques inconvénients.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Overhead du tunnel&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Si vous êtes vraiment court côté débit, sachez qu'un flux à 128kbs (minimum
pour une qualité acceptable) vous pompe 16ko/s de bande passante.
&lt;ul&gt;
&lt;li&gt;Avec le tunneling, vous allez passer à environ 22ko/s de moyenne.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Je n'ai pas testé avec quelque chose de plus compliqué, à base de OpenVPN
par exemple.
&lt;ul&gt;
&lt;li&gt;Si quelqu'un l'a fait, qu'il n'hésite pas à partager son expérience.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour gagner un peu de bande passante sur la session SSH, vous pouvez passer
l'option &lt;strong&gt;-N&lt;/strong&gt; à la connexion.
&lt;ul&gt;
&lt;li&gt;Cette option désactive le shell interactif et ne fait qu'établir le
tunnel.&lt;/li&gt;
&lt;li&gt;Vous ne pourrez donc plus controler la playlist directement, mais pour un
streaming tout simple, cela suffit. Vous gagnez environ trois Ko/s.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Latence&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;C'est inhérent au streaming. Pour assurer une liaison sans saccades, tout
est bufferisé.
&lt;ul&gt;
&lt;li&gt;Les modifications côté serveurs (changement de chanson, ou arrêt pur et
simple) mettront quelques secondes avant d'être répercutées à votre
client.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Quand à l'avance/retour rapide dans un morceau, mieux vaut oublier tout de
suite.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une idée pourrait être de réduire la taille du buffer , sur une liaison de
bonne qualité bien entendu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Allez, c'est pas si mal finalement&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;De toutes façons, vous n'auriez guère mieux avec un serveur shoutcast,
alors pourquoi se compliquer la vie ?&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Allez hop. Et profitez-en pour mettre Audacious à la poubelle avant de
sortir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/04/27/MPD-%3A-le-stream-%C3%A9tait-presque-parfait#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/04/27/MPD-%3A-le-stream-%C3%A9tait-presque-parfait#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/511820</wfw:commentRss>
      </item>
    
  <item>
    <title>La plomberie facile avec mtrace</title>
    <link>http://www.finiderire.com/post/2010/01/10/La-plomberie-facile-avec-mtrace</link>
    <guid isPermaLink="false">urn:md5:6d752c4492850d78a80cd8feced4d22c</guid>
    <pubDate>Mon, 22 Feb 2010 21:37:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Coding</category>
        <category>C</category><category>coding</category><category>debugging</category><category>GCC</category><category>Linux</category>    
    <description>&lt;p&gt;&lt;em&gt;Le C et les fuites mémoires, c'est comme une vieille complainte
sentimentale.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Avec &lt;strong&gt;mtrace&lt;/strong&gt;, et sa couche maxi-absorbante, finissez-en
avec l'incontinence de vos programmes.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;mtrace&lt;/strong&gt; n'est pas disponible en pharmacie, uniquement dans
les bonnes libc.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Ma mémoire prend la fuite!&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Je ne vous fait pas une tartine sur les problèmes de gestion mémoire en C.
&lt;ul&gt;
&lt;li&gt;Si vous avez approché un compilateur C un jour de votre vie, vous savez de
quoi je parle.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour prévenir les problèmes de fuite mémoire, il existe plusieurs
méthodes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Je ne fais rien&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Ne rigolez pas, un OS bien conçu est censé vous rendre la mémoire à la
sortie de votre programme.&lt;/li&gt;
&lt;li&gt;Bon alors, on fait comme ça ?
&lt;ul&gt;
&lt;li&gt;Non, on ne fait pas comme ça. On passe toujours un coup de balai avant de
quitter un programme, question de savoir-vivre et d'éducation.&lt;/li&gt;
&lt;li&gt;Il y a également le fait qu'on ne sait jamais vraiment où le programme
finira par tourner, ni si l'OS réussira réellement à récuperer
&lt;strong&gt;toute&lt;/strong&gt; la mémoire.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;J'écris mon gestionnaire mémoire&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Allez, on l'a tous fait un jour ou l'autre.
&lt;ul&gt;
&lt;li&gt;Ou comment finir avec un wrapper de malloc/free plus ou moins élaboré, qui
génère de jolies listes d'alllocations/libérations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ce n'est pas forcément une mauvaise idée. C'est surtout délicat à gérer
pour toutes sortes de raisons (je ne développe pas, si vous ne comprenez pas,
essayez de faire le votre).&lt;/li&gt;
&lt;li&gt;L'insensé tenant vraiment à explorer la Voie de l'Insomnie pourra toujours
commencer par : &lt;code&gt;man malloc_hook&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;J'utilise mtrace&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Et c'est la prise de conscience sur un titre judicieusement choisi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;mtrace, principe et utilisation&lt;/h3&gt;
&lt;h5&gt;Prérequis&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Une libc GNU.&lt;/li&gt;
&lt;li&gt;Un compilateur GNU.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Principe&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le principe consiste à intercepter les appels à &lt;em&gt;malloc&lt;/em&gt; et à
&lt;em&gt;free&lt;/em&gt;, et à tenir registre des allocations/libérations de mémoire.&lt;/li&gt;
&lt;li&gt;Pour cela, vous initialiserez le wrapper de la libc avec
&lt;code&gt;mtrace()&lt;/code&gt; , et vous appellerez en sortie
&lt;code&gt;muntrace()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Utilisation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il suffit d'inclure &lt;code&gt;mcheck.h&lt;/code&gt; et vous pourrez utiliser les deux
fonctions requises.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mtrace&lt;/code&gt; : avant tout &lt;em&gt;malloc()&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;muntrace&lt;/code&gt; : après le dernier &lt;em&gt;free()&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous aurez également besoin d'une variable shell, pour indiquer où écrire
le fichier de log.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;export MALLOC_TRACE = /path/to/log.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une autre variable shell peut être utilisée: &lt;code&gt;MALLOC_CHECK&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Normalement, son usage est d'indiquer le niveau de log.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;export MALLOC_CHECK = 2&lt;/code&gt; : fait planter le programme si
erreur malloc (je tenais à vous faire partager cette découverte).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un script Perl (&lt;em&gt;mtrace&lt;/em&gt;) pour mettre en forme le fichier de
log.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;L'exemple tant attendu&lt;/h3&gt;
&lt;h5&gt;Source pour nos essais&lt;/h5&gt;
&lt;pre&gt;
/* mtrace.c */

#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;mcheck.h&amp;gt;

int main(void)
{
  mtrace();

  char *freed = malloc(1024);
  char *leaked = malloc(1024);

  if (freed) free(freed);

  muntrace();
  return 0;
}

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Pour compiler ce source, rien de spécial.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gcc -g -Wall mtrace.c -o mtrace&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;N'oubliez pas &lt;strong&gt;-g&lt;/strong&gt; pour avoir les symboles dans la sortie de
&lt;em&gt;mtrace&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et pour le lancer:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MALLOC_TRACE=&lt;q&gt;/tmp/mtrace.log&lt;/q&gt; ./mtrace&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Le prompt revient, pas de plantages, donc, pas de problèmes.&lt;/li&gt;
&lt;li&gt;Vraiment ?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Utilisation du script Perl &lt;strong&gt;mtrace&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Tout d'abord, voyons à quoi ressemble le fichier log.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~test$ cat /tmp/mtrace.log 
= Start
@ ./mtrace:[0x40060f] + 0x1ea7460 0x400
@ ./mtrace:[0x40061d] + 0x1ea7870 0x400
@ ./mtrace:[0x400631] - 0x1ea7460
= End

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;De ce qui précède, on peut deviner aisément que le bloc mémoire situé à
0x1ea7870 n'a pas été libéré.
&lt;ul&gt;
&lt;li&gt;Nous allons cependant rendre plus parlant ce fichier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le script &lt;strong&gt;mtrace&lt;/strong&gt; s'invoque avec en paramètres l'exécutable
à analyser (pour ses symboles), et le fichier log.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~test$ MALLOC_TRACE=&amp;quot;/tmp/mtrace.log&amp;quot; mtrace ./mtrace /tmp/mtrace.log 

Memory not freed:
-----------------
           Address     Size     Caller
0x0000000001cb6870    0x400  at /home/jseb/test/mtrace.c:12

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Voila qui est plus parlant.
&lt;ul&gt;
&lt;li&gt;La ligne indiquée correspond au &lt;em&gt;malloc()&lt;/em&gt; sans &lt;em&gt;free()&lt;/em&gt;
correspondant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;mtrace n'est cependant pas Dieu le Père Tout Puissant&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;mtrace&lt;/em&gt; ne vous protégera bien sûr pas des écrasements mémoire
durant l'exécution de votre programme.&lt;/li&gt;
&lt;li&gt;De même, les problèmes de gestion mémoire ne seront pas détectés. Il peut
cependant vous signaler des &lt;em&gt;free&lt;/em&gt; multiples.&lt;/li&gt;
&lt;li&gt;Sa facilité d'emploi devrait toutefois inciter tout codeur un tant soit peu
consciencieux à l'utiliser.&lt;/li&gt;
&lt;li&gt;Une alternative consiste à laisser tomber &lt;code&gt;malloc&lt;/code&gt; et
&lt;code&gt;free&lt;/code&gt;, mais je laisse ça aux gens qui ont des problèmes de
mémoire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/01/10/La-plomberie-facile-avec-mtrace#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/01/10/La-plomberie-facile-avec-mtrace#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/474248</wfw:commentRss>
      </item>
    
  <item>
    <title>Unison et MSYS sont dans le même bateau</title>
    <link>http://www.finiderire.com/post/2009/12/14/Unison-et-MSYS-sont-dans-le-meme-bateau</link>
    <guid isPermaLink="false">urn:md5:02849899f60798a4ddd94dcec12553ec</guid>
    <pubDate>Mon, 21 Dec 2009 19:07:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Tools</category>
        <category>coding</category><category>MS-Windows</category><category>tools</category>    
    <description>&lt;p&gt;&lt;em&gt;Vous utilisez MS-Windows, comme des millions d'autre victimes (et moi,
et moi, et moi).&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Vous utilisez également MSYS (comme... euh... moi.)&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Mais avec MSYS, Unison (le synchroniseur de fichiers) est rétif.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;MSYS va apprendre que l'ordinateur est fait pour servir l'homme, et non
l'inverse (muhaHAHAHAA!)&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Il y a ce qu'on a ...&lt;/h3&gt;
&lt;h5&gt;Ce qu'on a&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pour le moment, nous pouvons utiliser uniquement Unison sous la forme d'un
serveur lancé avec la commande
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;unison --socket &amp;lt;port en écoute&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le client Unison est le même programme, mais lancé avec des paramètres
différents. Il sera utilisé depuis une autre machine pour se connecter à son
serveur.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ce n'est pas une bonne solution, pour trois raisons:
&lt;ul&gt;
&lt;li&gt;Il faut lancer Unison en écoute le serveur à chaque utilisation, ou pire,
le laisser tourner en permanence en écoute.&lt;/li&gt;
&lt;li&gt;Les communications ne sont pas chiffrées.&lt;/li&gt;
&lt;li&gt;Il n'y a pas d'authentification, et changer de port pour l'écoute du
serveur n'est qu'un pis-aller.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Ce qu'on aimerait que ça devienne&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser le mode &lt;em&gt;commandes ssh&lt;/em&gt; de Unison, qui lance lui même le
serveur, et fait transiter les données dans un canal crypté.
&lt;ul&gt;
&lt;li&gt;Les inconvénients de la situation où Unison est figé en écoute sont
supprimés.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Configuration logicielle&lt;/h3&gt;
&lt;h5&gt;openssh de MSYS&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Ma version de openssh est la 4.7
&lt;ul&gt;
&lt;li&gt;Sans vouloir gâcher un long suspense, nous n'utiliserons pas openssh, mais
&lt;em&gt;plink&lt;/em&gt; de putty.&lt;/li&gt;
&lt;li&gt;Je laisse toutefois mon cheminement avec openssh. Un courageux pourra peut
être compléter dans les commentaires.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;putty 0.59&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Uniquement pour utiliser plink (mais putty est également un excellent
émulateur de terminal).
&lt;ul&gt;
&lt;li&gt;La version 0.60 est disponible sur le &lt;a href=&quot;http://www.chiark.greenend.org.uk/~sgtatham/putty/&quot;&gt;site officiel&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Unison en interface texte&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il s'agit de la version 2.27&lt;/li&gt;
&lt;li&gt;Pour nos tests, nous allons utiliser la version &lt;q&gt;interface texte&lt;/q&gt; de
Unison.
&lt;ul&gt;
&lt;li&gt;Le passage à l'interface graphique de Unison sera abordé à la fin de cet
article.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Profil pour les tests&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le client d'où est lancé la commande est un banal Windows.&lt;/li&gt;
&lt;li&gt;Le serveur est un banal Linux, avec Unison correctement installé. (ip:
192.168.1.1)&lt;/li&gt;
&lt;li&gt;Un fichier &lt;em&gt;profile&lt;/em&gt; se trouvera dans votre home, dans le
sous-répertoire &lt;strong&gt;.unison&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Exemple de fichier &lt;em&gt;profile&lt;/em&gt; valide, situé dans
&lt;strong&gt;~/.unison/default.prf&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# Unison preferences file
root = c:\msys\home\jseb\coding
root = ssh://jseb@192.168.1.1//home/jseb/coding

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vous remarquerez que l'encodage des répertoires côté Windows se fait avec
des antislashes, ce qui est logique quand on réfléchit trente secondes.
&lt;ul&gt;
&lt;li&gt;Je dis ça, car mon premier essai m'a pris exactement vingt neuf
secondes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Premier lancement&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Unison est lancé avec les paramètres suivants:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./&amp;quot;Unison-2.27.57 Text.exe&amp;quot; -debug verbose&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je passe le début du log. La fin est intéressante:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

Contacting server...
[remote] Shell connection: ssh (ssh, -l, jseb, 192.168.1.1, -e, none, unison, -server)
Uncaught exception Unix.Unix_error(20, &amp;quot;create_process&amp;quot;, &amp;quot;ssh&amp;quot;)

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;On dirait un problème avec ssh, pas vrai Holmes ?
&lt;ul&gt;
&lt;li&gt;Watson, vous m'étonnerez toujours.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Utiliser ssh avec Unison&lt;/h3&gt;
&lt;h5&gt;Vérification (sur l'air de &lt;q&gt;ne négligeons aucune possibilité&lt;/q&gt;)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;La commande ssh existe pourtant dans MSYS.&lt;/li&gt;
&lt;li&gt;Première chose, s'assurer de son bon fonctionnement.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ ssh jseb@192.168.1.1 ls
Password: 
(et une jolie liste de fichiers s'affiche)

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Pas de problèmes de ce côté là.&lt;/li&gt;
&lt;li&gt;Les paramètres passés par Unison ne sont probablement pas compris par
ssh.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Voyons voir ces paramètres...&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pour rappel, voici la chaine de paramètres utilisée par Unison (vu dans les
logs plus haut)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh, -l, jseb, 192.168.1.1, -e, none, unison, -server&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons faire un essai à la main&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ ssh jseb@192.168.1.1 unison -server
Password: 
bash: unison: command not found

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ahah! Effectivement, Unison ne s'appelle pas &lt;q&gt;Unison&lt;/q&gt; sur mon serveur,
pour des raisons historiques (aheeeem!).
&lt;ul&gt;
&lt;li&gt;Son vrai petit nom est &lt;code&gt;unison-2.27&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Hola! Stop! Je vous ai vu! Pas de renommage du binaire sur le serveur,
espèce de sauvage!
&lt;ul&gt;
&lt;li&gt;Le fichier &lt;em&gt;profile&lt;/em&gt; peut se configurer afin de préciser la commande
à lancer.&lt;/li&gt;
&lt;li&gt;Il suffit d'ajouter: &lt;code&gt;servercmd = unison-2.27&lt;/code&gt; dans le
profil.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Avec les nouveaux paramètres...&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;On relance Unison, toujours en mode debug&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ ./Unison-2.27.57\ Text.exe -debug verbose
 (...)
[remote] Shell connection: ssh (ssh, -l, jseb, 192.168.1.1, -e, none, unison-2.27, -server)
Uncaught exception Unix.Unix_error(20, &amp;quot;create_process&amp;quot;, &amp;quot;ssh&amp;quot;)

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;C'est un peu mieux, mais ce n'est toujours pas ça.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Passer différemment les paramètres à ssh&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Tout ça sent à plein nez un problème de paramètres passés n'importe comment
à ssh.&lt;/li&gt;
&lt;li&gt;Nous savons comment nous voulons les passer (ligne de commande
ci-dessus).&lt;/li&gt;
&lt;li&gt;Unison est un programme bien fait, il permet de spécifier la commande
ssh.&lt;/li&gt;
&lt;li&gt;Il suffit d'utiliser &lt;strong&gt;sshcmd&lt;/strong&gt; dans le profil.&lt;/li&gt;
&lt;li&gt;Nous ajoutons donc:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sshcmd = c:\msys\home\jseb\.unison\sshcmd.bat&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Bien sûr, il faut un fichier sshcmd qui va contenir la commande ssh
correctement paramétrée.
&lt;ul&gt;
&lt;li&gt;A des fins de test, nous utilisons une commande qui va afficher les
paramètres passés.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;sshcmd.bat&lt;/em&gt; contient donc pour l'instant:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@echo 0=%0 1=%1 2=%2 3=%3 4=%4 5=%5 6=%6 7=%7 8=%8 9=%9&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Notez l'arobase au début de la commande, c'est obligatoire.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Plus qu'à relancer Unison pour voir ce que cela donne.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ ./Unison-2.27.57\ Text.exe 
Contacting server...
Fatal error: Received unexpected header from the server:
 expected &amp;quot;Unison 2.27\n&amp;quot; but received &amp;quot;0=c:\\msys\\home\\jseb\.unison\\sshcmd.bat 1=-l 2=jseb 3=192.168.1.1 4=-e 5=none 6=unison-2.27 7=-server 8= 9=\013\n&amp;quot;, which differs at &amp;quot;0&amp;quot;.

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Les paramètres importants sont donc le second et le troisième (le nom
d'utilisateur et l'ip), ainsi que le sixième et le septième (commande&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous pouvons tout de suite modifier la commande ssh.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;sshcmd.bat&lt;/em&gt; devient donc:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@c:\msys\bin\ssh -l %2 %3 -e none %6 %7&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Et alors ? Rien à tirer de openssh&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Quand on relance Unison, la connexion reste en attente et ssh tourne dans
le vide sur le poste client.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il y a bien du dialogue avec le serveur, une écoute avec tcpdump le
montre.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il s'agit d'un problème d'attente du mot de passe ssh, qui n'est pas
transmis sur le shell msys par ssh.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous pourrions tenter des générer une clé privé et de nous connecter sans
mot de passe, mais je trouve cette solution dangereuse.
&lt;ul&gt;
&lt;li&gt;Vous n'êtes pas obligé d'être d'accord. Vous pourriez stocker votre clé
privé sur une clé USB qui ne vous quitterait pas, résolvant les problèmes de
stockage de la clé sur un ordinateur en accès libre.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour ma part, j'ai une approche différente : utiliser &lt;em&gt;plink&lt;/em&gt;
en lieu et place de &lt;em&gt;openssh&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Attention aux essais avec openssh et unison. Quand ssh reste dans un état
bloqué, un ctrl+c rend la main au shell, mais ssh reste en mémoire. Pensez à le
tuer avec le &lt;em&gt;gestionnaire des tâches&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;plink, mon sauveur&lt;/h3&gt;
&lt;h5&gt;plink ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;plink&lt;/em&gt; est un utilitaire livré avec &lt;em&gt;putty&lt;/em&gt; (un émulateur de
terminal déja évoqué ci-dessus).&lt;/li&gt;
&lt;li&gt;Son fonctionnement est analogue à la fonction ssh, il peut même servir pour
des sessions &lt;q&gt;interactives&lt;/q&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;En avant avec plink&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pour l'utiliser, il suffit de modifier le fichier &lt;em&gt;sshcmd.bat&lt;/em&gt; et
d'adapter les paramètres.
&lt;ul&gt;
&lt;li&gt;Voici le nouveau contenu du fichier:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

REM fichier sshcmd.bat
REM %2 = nom d'utilisateur , %7 = mot de passe ssh
REM %3 = ip serveur, %8 = unison-2.27, %9 = -server

@C:\putty\plink -ssh -l %2 -pw %7 %3 %8 %9

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-pw&lt;/strong&gt; : ce paramètre sert à spécifier un mot de passe
en ligne de commande, et à éviter le lock rencontré avec OpenSSH.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il faut préciser que la commande ssh aura des arguments, on lance donc
Unison avec ces paramètres:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./&amp;quot;Unison-2.27.57 Text.exe&amp;quot; -sshargs &amp;quot;-pw mot_de_passe&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si vous rencontrez des problèmes, vous pouvez relancer la commande
ci-dessus en &lt;em&gt;debug verbose&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./&amp;quot;Unison-2.27.57 Text.exe&amp;quot; -sshargs &amp;quot;-pw mot_de_passe&amp;quot; -debug
verbose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Il s'agira probablement d'un problème d'ordre de paramètres (vérifiez bien
la chaine de connexion ssh).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Bon et cette interface ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;L'interface texte est pratique, mais l'interface GTK est encore plus
pratique.
&lt;ul&gt;
&lt;li&gt;Oui je sais. &lt;em&gt;clic clic clic&lt;/em&gt;. Bon. Personne n'est parfait.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si vous avez la lib GTK installée, passer à l'interface graphique de Unison
ne devrait pas poser trop de problèmes.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il suffit de préciser son path dans le script d'invocation de Unison.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voici un exemple de script, que j'ai appellé &lt;q&gt;unison&lt;/q&gt;, et que j'ai
placé dans le &lt;em&gt;/bin&lt;/em&gt; de msys.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#!/bin/sh
#nom de ce script: /bin/unison

stty -echo
echo -n &amp;quot;entrez votre mot de passe: &amp;quot;
read p
stty echo

#echo $PATH
&amp;quot;$unison_gtk&amp;quot; -sshargs &amp;quot;-pw $p&amp;quot; 

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Vous remarquerez qu'on passe le mot de passe dans une variable, après
l'avoir demandé au lancement.
&lt;ul&gt;
&lt;li&gt;L'écho local du clavier est bloqué pendant la saisie, au cas où un
malfaisant vous regarderait taper.&lt;/li&gt;
&lt;li&gt;Un script plus complet (pour ceux qui comme moi n'ont pas GTK dans le PATH)
est proposé à la fin de cet article.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Synchro : ok&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A ce stade, vous êtes normalement un codeur heureux.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Terminé les fichiers qui se promènent en clair sur le réseau.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et pour ceux qui n'aiment ni lire, ni comprendre, voici le résumé du
résumé.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le profil&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il se trouve dans &lt;strong&gt;~/.unison/votre_profil_unison.prf&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;C'est ici qu'on précise le nom de l'exécutable Unison côté serveur, ainsi
que la commande de remplacement ssh.&lt;/li&gt;
&lt;li&gt;Par défaut, Unison utilise le profil nommé
&lt;strong&gt;default.prf&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# Unison preferences file
servercmd = unison-2.27
sshcmd = c:\msys\home\jseb\.unison\sshcmd.bat@@
root = c:\msys\home\jseb\coding
root = ssh://jseb@192.168.1.1//home/jseb/coding

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;La commande de remplacement ssh&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Ce batch MS-DOS est invoqué par Unison, qui utilise le contenu du paramètre
&lt;strong&gt;sshcmd&lt;/strong&gt;, défini dans le profil.
&lt;ul&gt;
&lt;li&gt;N'oubliez pas l'arobase avant la commande.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

@C:\putty\plink -ssh -l %2 -pw %7 %3 %8 %9

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Script de lancement (avec support GTK)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Placez le dans votre path, ou dans &lt;em&gt;/bin&lt;/em&gt;, il s'y trouvera fort
bien.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#!/bin/sh
#nom de ce script: /bin/unison

stty -echo
echo -n &amp;quot;entrez votre mot de passe: &amp;quot;
read p
stty echo

#attention , pas d'espace autour de '=' dans une affectation!
unison_gtk=&amp;quot;/c/Unison-2.27.57/Unison-2.27.57 Gtk+.exe&amp;quot;
lib_gtk=&amp;quot;/c/Program Files/Fichiers communs/GTK/2.0/bin/&amp;quot;
PATH=&amp;quot;$PATH&amp;quot;:&amp;quot;$lib_gtk&amp;quot;

#les gens qui ont une espace dans leur mot de passe protègeront la variable $p :
# -sshargs &amp;quot;-pw \&amp;quot;$p\&amp;quot;&amp;quot;
# Merci Fred pour la remarque.
&amp;quot;$unison_gtk&amp;quot; -sshargs &amp;quot;-pw $p&amp;quot;

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2009/12/14/Unison-et-MSYS-sont-dans-le-meme-bateau#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2009/12/14/Unison-et-MSYS-sont-dans-le-meme-bateau#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/467872</wfw:commentRss>
      </item>
    
  <item>
    <title>Du neuf sans œufs</title>
    <link>http://www.finiderire.com/post/2009/10/01/Du-neuf-sans-%C5%93ufs</link>
    <guid isPermaLink="false">urn:md5:86613bf77f201c491c73d8622047fcc1</guid>
    <pubDate>Sat, 03 Oct 2009 11:41:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Cuisine</category>
        <category>cuisine</category>    
    <description>&lt;p&gt;&lt;em&gt;Un gâteau ?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Oui, mais celui-ci, il a quelque chose de plus en moins.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le gâteau sans œufs&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Certaines personnes sont allergiques aux œufs, les malheureux.&lt;/li&gt;
&lt;li&gt;Ce n'est pas mon cas, mais je n'en avais plus à portée de main.&lt;/li&gt;
&lt;li&gt;Une recherche internet, et une correction des valeurs saupoudrée de
personnalisation... voici le résultat.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Évoquons les ingrédients.&lt;/h3&gt;
&lt;p&gt;Ingrédients (pour 4 à 6 personnes) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;200 g de farine&lt;/li&gt;
&lt;li&gt;1 pincée de sel&lt;/li&gt;
&lt;li&gt;150 g de sucre en poudre&lt;/li&gt;
&lt;li&gt;150 g de chocolat en morceaux&lt;/li&gt;
&lt;li&gt;120 g de beurre&lt;/li&gt;
&lt;li&gt;20 cl de lait&lt;/li&gt;
&lt;li&gt;1 sachet de levure dite &lt;q&gt;chimique&lt;/q&gt; (en fait, c'est du
bicarbonate)&lt;/li&gt;
&lt;li&gt;1 boite de fruits en conserve&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Saladier, mélanger, und so weiter&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Dans un saladier, verser la farine, le sel, la levure et le sucre.
Mélanger.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Faire fondre le beurre et le chocolat dans une casserole, avec un peu d'eau
au fond (pour éviter que cela n'attache).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ajouter le lait dans la casserole, bien mélanger.
&lt;ul&gt;
&lt;li&gt;Ne vous inquiétez pas, le mélange n'est pas très miscible mais ça ne porte
pas à conséquences.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ajouter le contenu de la casserole en trois fois dans le saladier. Mélanger
à chaque étape.
&lt;ul&gt;
&lt;li&gt;A la dernière étape, vous devez obtenir un mélange lisse et onctueux.&lt;/li&gt;
&lt;li&gt;La spirale tracée par la cuillère dans la pâte doit évoquer le nombre d'or.
Continuez à mélanger si ce n'est pas le cas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Badigeonnez un plat en pyrex avec de l'huile (un filet suffit).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Versez dans le plat en pyrex le contenu du saladier.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Placez les fruits en conserve soigneusement égouttés dans le plat.
&lt;ul&gt;
&lt;li&gt;N'hésitez pas à appuyer un peu sur ceux-ci, pour faciliter l'immersion
(noyé dans une mer de chocolat ! Quel destin à la fois horrible et tentant
!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Bon ça y est ? On peut mettre au four ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mettre dans le four préchauffé à 200°.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Cuisson: 30mn à 200°, puis &lt;em&gt;éventuellement&lt;/em&gt; 5mn à 180°.
&lt;ul&gt;
&lt;li&gt;Vérifiez la cuisson à 30mn!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez vérifier la cuisson en enfoncant la lame d'un couteau au centre
du gâteau.
&lt;ul&gt;
&lt;li&gt;Elle doit ressortir sans emporter de la pate avec elle.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La poule qui a fait l'œuf ou l'œuf qui fit la poule ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Je remercie mes collègues qui ont bien voulu servir de cobayes.
&lt;ul&gt;
&lt;li&gt;Et qui ont aimé ça (c'est pour ça que je les remercie).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2009/10/01/Du-neuf-sans-%C5%93ufs#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2009/10/01/Du-neuf-sans-%C5%93ufs#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/446234</wfw:commentRss>
      </item>
    
  <item>
    <title>OSS4 : Alsa ne répond plus.</title>
    <link>http://www.finiderire.com/post/2009/09/16/OSS4-%3A-Alsa-ne-r%C3%A9pond-plus.</link>
    <guid isPermaLink="false">urn:md5:ed2bdff9d72df375de52c84a08f54f46</guid>
    <pubDate>Thu, 17 Sep 2009 20:17:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>api</category><category>Gentoo</category><category>Linux</category>    
    <description>&lt;p&gt;&lt;em&gt;Plus fort que OSS-117 et Alsa réunis.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Voici ... OSS4 !&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Et dire qu'on l'enterrait déja dans l'indifférence générale.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Alsa prête le flanc à la critique&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OSS4 est le dernier avatar de la lignée presque éteinte OSS. Comme quoi,
tout arrive.&lt;/li&gt;
&lt;li&gt;Alsa rêgne en maître incontesté sur nos cartes sons depuis quelques
années.&lt;/li&gt;
&lt;li&gt;Pourquoi remplacer Alsa par OSS4 ?
&lt;ul&gt;
&lt;li&gt;Alsa n'est pas exempt de bugs.&lt;/li&gt;
&lt;li&gt;Je dirais même plus, mon cher Dupont, de bugs Alsa n'est pas exempt.&lt;/li&gt;
&lt;li&gt;De curieux comportements après une hibernation (plantage de la couche son
pour moi).&lt;/li&gt;
&lt;li&gt;D'autres comportements non moins étranges lors d'un shutdown. (cf
bugs.gentoo.org)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bref, Alsa peut vous laisser comme deux ronds de flan.
&lt;ul&gt;
&lt;li&gt;Il est temps de passer à la concurrence. Cela stimule l'innovation et
l'inventivité, comme disent les adeptes de la concurrence (chez les
autres).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Tout ce qui suit est pour Gentoo.&lt;/li&gt;
&lt;li&gt;Vous aurez peut être besoin d'installer &lt;strong&gt;mercurial&lt;/strong&gt;
(&lt;em&gt;layman&lt;/em&gt; vous le signalera, si c'est le cas)&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Overlay&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il faut passer par un overlay Gentoo.&lt;/li&gt;
&lt;li&gt;La question des overlays a déja été discutée sur ce blog
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.finiderire.com/post/2008/04/11/Developpement-pour-contrees-etrangeres&quot;&gt;J'en
parlais justement ici&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour les décideurs pressés, voici le résumé du résumé:
&lt;ul&gt;
&lt;li&gt;installer: &lt;code&gt;layman -a oss-overlay&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;juste pour voir: &lt;code&gt;ls
/usr/local/portage/layman/oss-overlay/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;package.keywords&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;C'est encore assez expérimental, donc:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;media-sound/oss ~amd64&lt;/code&gt; (ou ~x86 ou ...)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Emerge&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Rien de spécial
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;emerge -va oss&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Kernel&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Enlevez les références à Alsa dans le noyau.
&lt;ul&gt;
&lt;li&gt;Ou au minimum, le support Alsa devra être sous forme de modules.&lt;/li&gt;
&lt;li&gt;J'ai tout viré.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pas la peine d'activer OSS dans le kernel, cela ne sert à rien.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;make.conf&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;ajouter à USE oss et oss4, laisser alsa (on n'est pas des sauvages, et on
ne sait jamais).
&lt;ul&gt;
&lt;li&gt;Voici mon USE:&lt;/li&gt;
&lt;li&gt;USE=&amp;quot;-qt3 -qt4 -gnome -kde -ipv6 gtk unicode opengl jpeg truetype type1 oss
oss4 alsa&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Lancer OSS4&lt;/h3&gt;
&lt;h5&gt;Initialiser&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/init.d/oss start&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;C'est super long. Vous pouvez faire un modprobe à la main également.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;N'oubliez pas de baisser le son, par défaut, ça explose les enceintes.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~$ ossmix vol 15
Value of mixer control vol set to 15.0:15.0
~$ ossmix pcm.main 15
Value of mixer control pcm.main set to 15.0

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Tester&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;osstest&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Vous devez entendre un piano à droite, à gauche, en stéréo.&lt;/li&gt;
&lt;li&gt;Voire ailleurs si vous avez un système 5.1&lt;/li&gt;
&lt;li&gt;Moi, j'en suis resté là en tant que salaud de pauvre.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Utilitaires amusants&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ossxmix
&lt;ul&gt;
&lt;li&gt;Un mixer très complet. Enfin complet. Enfin y'a plein de boutons qui
doivent servir à quelque chose.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Et maintenant ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Haha! Vous croyiez vous en tirer à si bon compte ?
&lt;ul&gt;
&lt;li&gt;Il faut recompiler maintenant!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Soit &lt;code&gt;emerge -DuvaN world&lt;/code&gt; (bon courage)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Soit y aller petit à petit: dosbox, sdl, mplayer, mpd, xine, audacious,
wine ...
&lt;ul&gt;
&lt;li&gt;Il ne faudra pas oublier de modifier les fichiers de configuration des
programmes recompilés pour utiliser OSS si vous compilez avec le support OSS et
Alsa.&lt;/li&gt;
&lt;li&gt;Certains programmes feront automatiquement le bon choix, d'autres auront
besoin d'être un peu aidés.&lt;/li&gt;
&lt;li&gt;Comment savoir ? Lancez le programme, et si il n'y a pas de son, c'est
qu'il a besoin d'être un peu aidé. Muhahhaaahaa!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Bon d'accord, arrêtez les tomates. Je vous aide un peu avec
&lt;strong&gt;mpd&lt;/strong&gt;.
&lt;ul&gt;
&lt;li&gt;Si après compilation avec le double support &lt;em&gt;alsa&lt;/em&gt; et &lt;em&gt;oss&lt;/em&gt;,
vous obtenez cette erreur au lancement:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

jseb # /etc/init.d/mpd start
 * Loading ALSA modules ...
 *   Could not detect custom ALSA settings.  Loading all detected alsa drivers.
 *   Unable to find any ALSA drivers. Have you compiled alsa-drivers correctly?
 *   ERROR: Failed to load necessary drivers                              [ ok ]
 * ALSA failed to load.                                                   [ !! ]
 * ERROR:  cannot start mpd as alsasound could not start

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Dans ce cas, éditez le fichier suivant &lt;strong&gt;/etc/init.d/mpd&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Et enlevez la référence à alsasound à la ligne &lt;strong&gt;need&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Crade ? Of course. N'oubliez pas de remettre la référence si vous
réinstallez Alsa.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;OSS et l'hibernation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;hibernation&lt;/em&gt;, le mot qui fait trembler tout linuxien qui se
respecte.
&lt;ul&gt;
&lt;li&gt;Comme on n'est pas sous Windows, ça ne fait pas partie du cahier des
charges.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pas de bol, OSS a un peu de mal à sortir du caisson cryogénique.
&lt;ul&gt;
&lt;li&gt;Remarquez, Alsa, c'était pas tellement mieux.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La bonne nouvelle, c'est qu'un simple &lt;em&gt;restart&lt;/em&gt; de la couche OSS
suffit.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/init.d/mpd restart&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La mauvaise nouvelle, c'est qu'avant, il faudra tuer tous les programmes
qui dépendent de OSS.
&lt;ul&gt;
&lt;li&gt;Oui, y compris gkrellm et son mixer magique.&lt;/li&gt;
&lt;li&gt;OSS étant sympa, il prévient des applications qui le gênent.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

jseb # /etc/init.d/oss restart
 * Stopping OSS ...
Some applications are still using OSS - cannot unload

3311 gkrellm
5591 /usr/bin/mpd --no-create-db /home/jseb/.mpd/mpd.conf

Please stop these applications and run soundoff again
 * Failed to stop OSS                                                     [ !! ]

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Si vous avez compilé le noyau avec &lt;q&gt;CONFIG_MODULE_FORCE_UNLOAD&lt;/q&gt;, vous
pouvez peut être procéder autrement...
&lt;ul&gt;
&lt;li&gt;... mais je ne vous ai rien dit!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Un peu de lecture pour finir&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mes années de fac m'ont appris de multiples choses, comme par exemple qu'il
ne faut pas mettre les pieds en fac.
&lt;ul&gt;
&lt;li&gt;J'ai également appris qu'une bonne bibliographie, ça vous pose son
homme.&lt;/li&gt;
&lt;li&gt;Normalement, on colle des pages et des pages de bouquins poussiéreux que
personne n'a lu.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Comme nous sommes entre gens de bonne compagnie, voici l'essentiel.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.4front-tech.com/wiki/index.php/Configuring_Applications_for_OSSv4&quot;&gt;la
doc d'OSS4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;N'hésitez pas à repasser, il y aura surement des mises à jour au fur et à
mesure de mes découvertes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2009/09/16/OSS4-%3A-Alsa-ne-r%C3%A9pond-plus.#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2009/09/16/OSS4-%3A-Alsa-ne-r%C3%A9pond-plus.#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/442322</wfw:commentRss>
      </item>
    
  <item>
    <title>Google Analytics, c'est chic</title>
    <link>http://www.finiderire.com/post/2009/07/17/Google-Analytics-c-est-chic</link>
    <guid isPermaLink="false">urn:md5:a0514fd1684c7e10c0e05d42194b953e</guid>
    <pubDate>Mon, 03 Aug 2009 19:38:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Et je tenais à vous dire (blablabla)</category>
        <category>Blabla</category>    
    <description>&lt;p&gt;&lt;em&gt;Voici venu le meilleur moment de l'année.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Je parle bien sûr du renouvellement du domaine
&lt;strong&gt;finiderire.com&lt;/strong&gt;.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Le renouvellement, tout le monde s'en moque. Mais ... il y a le bla-bla
annuel !&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Bilan de l'année passée et enseignements qu'il convient d'en tirer.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Quel magnifique titre à rallonge en guise d' introduction.&lt;/li&gt;
&lt;li&gt;Avouez que vous adorez ça, le bla-bla, le futile, l' inutile, le mec qui se
répand dans son blog.&lt;/li&gt;
&lt;li&gt;Mais ceci n'est pas une tentative pour faire remonter mes stats.
&lt;ul&gt;
&lt;li&gt;Les stats ? Elles étaient ... holala ... au moins à
&lt;strong&gt;ça&lt;/strong&gt; il y a trois mois.&lt;/li&gt;
&lt;li&gt;Crise financière ? Dégoût de Vim ? Sectateurs Emacs au travail de
sape efficace ? Toujours est-il que les stats ont plus que chutées.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Ca bugge, c'est sûr!&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Le module stats du blog Gandi étant à peu près aussi digne de confiance que
les résultats d'une élection dans une république bananière, j'ai commencé par
incriminer celui-ci.&lt;/li&gt;
&lt;li&gt;C'est décidé, je passe à la roll's : &lt;strong&gt;Google
Analytics&lt;/strong&gt; !&lt;/li&gt;
&lt;li&gt;Après installation de la chose, deux constatations:
&lt;ul&gt;
&lt;li&gt;Wahh qu'est-ce que c'est précis !&lt;/li&gt;
&lt;li&gt;Tiens... les chiffres sont pratiquement les mêmes que ceux des stats
pourries de Gandi.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;L'analytique, c'est chic.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Les stats fournies par Google sont d'une précision confondante et
terrifiante.&lt;/li&gt;
&lt;li&gt;Pour tout dire, c'est tout juste si on n'a pas la marque du slip du
visiteur.&lt;/li&gt;
&lt;li&gt;Vous disposez bien sûr d'un droit d'accès et de rectification de vos
données chez Google et muhahahaaa! Pardon excusez-moi, c'est nerveux.&lt;/li&gt;
&lt;li&gt;Toujours est-il que les statistiques sont tellement détaillées que
j'envisage de débarquer à l'improviste chez &lt;strong&gt;mon&lt;/strong&gt; visiteur
fidèle, une bouteille de champagne et quelques biscuits de Reims à la
main.&lt;/li&gt;
&lt;li&gt;Le seul problème, c'est qu'il faut que le javascript soit activé sur le
navigateur du visiteur. Alors soyez sympas, faites pas comme moi, et activez
l'exécution des scripts !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La voila, la triste vérité.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;En vérité mes frères, je vous le dis: Google Analytics est si détaillé que
l' épluchage des statistiques me prend tout mon temps disponible.&lt;/li&gt;
&lt;li&gt;La mise à jour du blog va donc continuer son bonhomme de chemin, au gré de
mes envies, de mes disponibilités, et de mon taux de motivation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Tada et Pan (dans l'ordre, mais sans rapport).&lt;/h3&gt;
&lt;h5&gt;Tada!&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;L'article sur Freeglut et cygwin va être intégré dans la documentation
officielle du projet Freeglut, après traduction bien sûr.
&lt;ul&gt;
&lt;li&gt;Voila des gens au goût raffiné.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://freeglut.sourceforge.net&quot;&gt;Freeglut est ici&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Pan!&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Par ailleurs, je vous en prie: cessez de remplir les commentaires avec des
fécilications si élogieuses qu'elles en deviennent impubliables.
&lt;ul&gt;
&lt;li&gt;Quand de plus, elles se trouvent associées à un site web sans aucun
rapport, vous comprendrez que je tire à vue.&lt;/li&gt;
&lt;li&gt;Les vrais commentaires sont par contre les bienvenus.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2009/07/17/Google-Analytics-c-est-chic#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2009/07/17/Google-Analytics-c-est-chic#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/418919</wfw:commentRss>
      </item>
    
  <item>
    <title>Une Page de Python</title>
    <link>http://www.finiderire.com/post/2009/07/25/Une-Page-de-Python</link>
    <guid isPermaLink="false">urn:md5:0ea8fd31f738d43e91ebe7b1334d3795</guid>
    <pubDate>Sat, 25 Jul 2009 13:13:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Tools</category>
        <category>coding</category><category>Gentoo</category><category>Linux</category><category>MS-Windows</category><category>Python</category><category>tools</category>    
    <description>&lt;p&gt;&lt;em&gt;Pour utiliser nativement des interfaces avec Python, il y a
&lt;strong&gt;Tkinter&lt;/strong&gt;.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Pour ceux qui n'aiment pas coder les GUI à la main, il reste les
générateurs d'interface.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Ici, je parle de la mise en oeuvre de &lt;strong&gt;Page&lt;/strong&gt;.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Revue de détail&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;La revue sera rapide, j'ai testé uniquement &lt;strong&gt;GuiBuilder&lt;/strong&gt; et
&lt;strong&gt;Page&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;GuiBuilder&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Anciennement nommé &lt;strong&gt;SpecTcl&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;+1&lt;/strong&gt; : il permet de générer des interfaces
proportionnelles (le principal intêret de Tk).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-1&lt;/strong&gt; : ne semble plus maintenu, le code généré est
assez horrible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-1&lt;/strong&gt; : les sources ne semblent pas disponibles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Page&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;+1&lt;/strong&gt; : propose pas mal de controles, y compris les ttk
(thêmes pour tk)
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.htm&quot;&gt;Voir la doc
ici&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;+1&lt;/strong&gt; : le code généré est plus propre que celui de
&lt;em&gt;GuiBuilder&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;+/-1&lt;/strong&gt; : d'après la doc, adapté aux projets d'un seul
écran (d'où le nom, je suppose). Mais on peut ruser bien sûr.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://page.sourceforge.net/&quot;&gt;On trouve Page ici&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;IInstallation de Page&lt;/h3&gt;
&lt;h5&gt;Prérequis&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Comme d'habitude, je parle pour les possesseurs de Gentoo.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il faut un &lt;strong&gt;Tk&lt;/strong&gt; récent: au moins la version 8.5
&lt;ul&gt;
&lt;li&gt;Attention, c'est une version test pour l'instant. Je n'ai pas eu de
problèmes en l'installant, cependant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# eix dev-lang/tk
[I] dev-lang/tk
     Available versions:  8.4.15-r1 8.4.18 8.4.18-r1 (~)8.4.19-r1 (~)8.5.7 {debug threads truetype}
     Installed versions:  8.5.7(20:24:53 24.07.2009)(truetype -debug -threads)

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ce qui au passage va vous coller un &lt;strong&gt;Tcl&lt;/strong&gt; d'un niveau de
version à peu près équivalent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si vous n'étiez pas à niveau pour &lt;strong&gt;Tk&lt;/strong&gt;, n'oubliez pas de
recompiler &lt;strong&gt;Python&lt;/strong&gt; avec le flag &lt;strong&gt;tk&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il vous faudra également la lib &lt;strong&gt;pyttk&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Pour l'instant, disponible en version 0.3&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pypi.python.org/pypi/pyttk&quot;&gt;On la trouve ici&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Reprenez l'archive tgz, ça suffira.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Installation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Dépliez l'archive &lt;strong&gt;Page&lt;/strong&gt;, obtenue sur le site officiel (url
donnée plus haut).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dépliez l'archive &lt;strong&gt;pyttk&lt;/strong&gt; dans le répertoire racine
&lt;strong&gt;Page&lt;/strong&gt;.
&lt;ul&gt;
&lt;li&gt;Vous devez obtenir un sous-répertoire &lt;strong&gt;pyttk-0.3&lt;/strong&gt; (selon
votre version de ''pyttk', bien sûr)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Lancez le script &lt;em&gt;configure&lt;/em&gt; de Page, qui va positionner quelques
variables dans le script de lancement de Page.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Editez le script de lancement de Page.
&lt;ul&gt;
&lt;li&gt;Ajoutez le chemin de &lt;em&gt;pyttk&lt;/em&gt;, juste avant le
&lt;strong&gt;exec&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;export PYTHONPATH=&amp;quot;$PYTHONPATH&amp;quot;:&amp;quot;$PAGE_HOME&amp;quot;/pyttk-0.3/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cela permettra de tester le code Python au sein de Page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Test avec code généré&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cela ne devrait pas vous poser de problèmes, il faut juste prendre garde à
&lt;em&gt;pyttk&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Soit utiliser la variable globale python indiquant le chemin des modules:
&lt;ul&gt;
&lt;li&gt;export PYTHONPATH = chemin/vers/pyttk/&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Soit utliser &lt;em&gt;sys.path&lt;/em&gt; dans votre script Python.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;sys.path&lt;/em&gt; donne l'emplacement des modules au script.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#à mettre au début du script Python
import sys
sys.path.insert (0, '/chemin/vers/pyttk/')

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Attention&lt;/strong&gt; : ce n'est pas une bonne idée que de
modifier un fichier qui a été généré.
&lt;ul&gt;
&lt;li&gt;Il faudra donc passer par un fichier &lt;q&gt;main&lt;/q&gt; qui importera à son tour
les fichiers générés.&lt;/li&gt;
&lt;li&gt;De toutes façons, vous devrez en passer par là pour écrire les fonctions de
l'interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;We thrash with all the rest&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;q&gt;Et le reste ?&lt;/q&gt; demanda le jeune padahouane.&lt;/li&gt;
&lt;li&gt;&lt;q&gt;RTFM&lt;/q&gt; répondit Iota en se reprenant un pastis.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2009/07/25/Une-Page-de-Python#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2009/07/25/Une-Page-de-Python#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/420917</wfw:commentRss>
      </item>
    
</channel>
</rss>
