<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Rolinh]]></title>
  <link href="http://blog.rolinh.ch/atom.xml" rel="self"/>
  <link href="http://blog.rolinh.ch/"/>
  <updated>2012-04-05T13:07:22+02:00</updated>
  <id>http://blog.rolinh.ch/</id>
  <author>
    <name><![CDATA[Robin Hahling]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Les avantages du libre: une expérience personnelle :)]]></title>
    <link href="http://blog.rolinh.ch/dev/les-avantages-du-libre-une-experience-personnelle/"/>
    <updated>2012-04-04T20:10:00+02:00</updated>
    <id>http://blog.rolinh.ch/dev/les-avantages-du-libre-une-experience-personnelle</id>
    <content type="html"><![CDATA[<p>Je vous ai parlé dans mon dernier article d&#8217;un petit programme que j&#8217;ai écrit
récemment et que j&#8217;ai publié sous licence BSD: <a href="http://projects.gw-computing.net/projects/dfc">dfc</a>.</p>

<p>Si je vous en reparle aujourd&#8217;hui, ce n&#8217;est pas spécialement pour annoncer que
le logiciel a fortement évolué depuis la dernière fois que j&#8217;en ai parlé sur ce
blog (bien que ce soit le cas) mais c&#8217;est surtout que j&#8217;ai envie de parler de
la bonne expérience que je suis en train de vivre grâce au libre.</p>

<p>Voici donc l&#8217;histoire:</p>

<p>Tout a commencé avec un script bash. Ce script, que m&#8217;avait fourni un de mes
professeur à l&#8217;université, affichait les informations de la commande <code>df(1)</code>
et y apportait un graphe montrant le taux d&#8217;utilisation des disques.</p>

<p>J&#8217;ai trouvé l&#8217;idée très sympa mais ai également trouvé le script limité et
j&#8217;ai donc souhaité y ajouter des options. Or, l&#8217;état du code m&#8217;a assez vite effrayé
et j&#8217;ai donc décidé de le ré-implémenter en <code>C</code>, langage que j&#8217;affectionne.</p>

<p>Je suis vite arrivé au résultat souhaité, à savoir afficher les principales
informations fournies par <code>df(1)</code> et y ajouter un graphe. J&#8217;en ai parlé sur
un forum et j&#8217;ai remarqué que les gens étaient plutôt intéressés par le concept.
Puis, prenant particulièrement mon pied dans le développement de cet outil,
j&#8217;ai décidé de lui ajouter des fonctionnalités et un peu d&#8217;agrément visuel par
l&#8217;apport notamment de la couleur.</p>

<p>Après avoir amélioré ce programme, j&#8217;en ai parlé sur le forum anglophone de
la distribution Archlinux.
Les personnes l&#8217;ayant testé ont vite souhaité y voir plus de fonctionnalités,
que je n&#8217;ai pas tardé à implémenter et ont également relevé plusieurs bugs
que je me suis empressé de corriger.</p>

<p>J&#8217;en suis finalement arrivé à une version que je trouvais relativement mature
et je me suis dit que plutôt que de garder cet outil pour moi, j&#8217;allais en
parler un petit peu afin de pouvoir en faire profiter d&#8217;autres. C&#8217;est dans cet
esprit que j&#8217;ai proposé une dépêche sur <a href="http://linuxfr.org">linuxfr</a> dimanche
passé et qui a été <a href="http://linuxfr.org/news/dfc-1-une-alternative-a-df-1-apportant-couleur-et-graphe">publiée</a>
le 1er avril (un lecteur de <em>linuxfr</em> a d&#8217;ailleurs cru à un poisson d&#8217;avril :P).</p>

<p>J&#8217;étais très loin d&#8217;imaginer l&#8217;enthousiasme que lèverait cette dépêche!
Peu après la parution de l&#8217;article, j&#8217;ai été contacté par de nombreuses personnes.
L&#8217;une proposant une amélioration, l&#8217;autre relevant un bug ou encore d&#8217;autres
proposant des patchs (port du code vers FreeBSD notamment).</p>

<p>J&#8217;ai maintenant appris que <code>dfc(1)</code> sera vraisemblablement intégré dans les
dépôts de la future Mageia, se trouve déjà dans les ports FreeBSD et s&#8217;apprête
à rejoindre les dépôts de Frugalware et peut-être même ceux de Fedora!</p>

<p>Sincèrement, j&#8217;étais bien loin de m&#8217;imaginer tout cela lorsque j&#8217;ai commencé à
taper quelques lignes de code il y a une quinzaine de jours sur mon portable&#8230;</p>

<p>Je souhaitais surtout relever à travers cet article le super esprit du libre
qui a permis l&#8217;amélioration de <code>dfc(1)</code> en raisons de nombreuses
contributions d&#8217;utilisateurs sous des formes variées. Et sincèrement, je
souhaite tous les remercier. Bref, pour moi c&#8217;est une expérience
personnelle extrêmement positive concernant les avantages du libre!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[dfc: un utilitaire affichant le taux d'utilisation des disques]]></title>
    <link href="http://blog.rolinh.ch/dev/dfc-un-utilitaire-affichant-le-taux-dutilisation-des-disques/"/>
    <updated>2012-03-22T11:53:00+01:00</updated>
    <id>http://blog.rolinh.ch/dev/dfc-un-utilitaire-affichant-le-taux-dutilisation-des-disques</id>
    <content type="html"><![CDATA[<p>J&#8217;ai écrit récemment, en C, un petit utilitaire qui affiche le taux
d&#8217;utilisation des disques.</p>

<p>Pourquoi? Pour le fun surtout. Enfin, pour situer un peu l&#8217;histoire, il
s&#8217;agit en fait à la base d&#8217;une implémentation en C de ce que fait un script
bash que m&#8217;avait gentiment fourni un de mes professeurs à l&#8217;université.
J&#8217;avais souhaité y apporter quelques changements mais j&#8217;avoue avoir un peu pris
peur face à l&#8217;aspect du script bash.</p>

<p>Au final, j&#8217;y ai ajouté pas mal d&#8217;options et plusieurs autres sont prévues.
Pour voir lesquelles, il suffit de consulter la <a href="http://projects.gw-computing.net/projects/dfc/roadmap">roadmap</a> sur le
<a href="http://projects.gw-computing.net/projects/dfc">site officiel</a>.
Assez écrit, voilà à quoi cela ressemble:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>FILESYSTEM TYPE     USED (*)      FREE (-) %USED       AVAILABLE           TOTAL MOUNTED ON
</span><span class='line'>/dev/sdc1  ext4     [************--------]   57%    12989202432B    29941719040B /
</span><span class='line'>/dev/sda7  ext2     [****----------------]   16%       84393984B       99997696B /boot
</span><span class='line'>/dev/sda3  ext4     [*************-------]   63%   138229665792B   370028589056B /home
</span><span class='line'>/dev/sda5  reiserfs [**************------]   68%     4315811840B    13489512448B /var</span></code></pre></td></tr></table></div></figure>


<p>Et les options disponibles pour la version actuelle (1.1.3):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Usage: dfc [OPTIONS(S)]
</span><span class='line'>Available options:
</span><span class='line'>  -a  print all fs from mtab
</span><span class='line'>  -h  print this message
</span><span class='line'>  -g  size in Gio
</span><span class='line'>  -G  size in Go
</span><span class='line'>  -k  size in Kio
</span><span class='line'>  -K  size in Ko
</span><span class='line'>  -m  size in Mio
</span><span class='line'>  -M  size in Mo
</span><span class='line'>  -n  do not print header
</span><span class='line'>  -s  sum the total usage
</span><span class='line'>  -t  hide filesystem type
</span><span class='line'>  -v  print program version
</span><span class='line'>  -w  use a wider bar</span></code></pre></td></tr></table></div></figure>


<p>Ce qui peut donner, en combinant plusieurs options
(résultat de <code>dfc -wags</code>):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>FILESYSTEM TYPE     USED (*)                                    FREE (-) %USED AVAILABLE   TOTAL MOUNTED ON
</span><span class='line'>rootfs     rootfs   [*****************************---------------------]   57%     12.1G   27.9G /
</span><span class='line'>/dev       devtmpfs [--------------------------------------------------]    0%      3.8G    3.8G /dev
</span><span class='line'>run        tmpfs    [*-------------------------------------------------]    0%      3.8G    3.8G /run
</span><span class='line'>/dev/sdc1  ext4     [*****************************---------------------]   57%     12.1G   27.9G /
</span><span class='line'>shm        tmpfs    [*-------------------------------------------------]    0%      3.8G    3.8G /dev/shm
</span><span class='line'>tmpfs      tmpfs    [*-------------------------------------------------]    0%      6.0G    6.0G /tmp
</span><span class='line'>/dev/sda7  ext2     [********------------------------------------------]   16%      0.1G    0.1G /boot
</span><span class='line'>/dev/sda3  ext4     [********************************------------------]   63%    128.7G  344.6G /home
</span><span class='line'>/dev/sda5  reiserfs [***********************************---------------]   68%      4.0G   12.6G /var
</span><span class='line'>/dev/sdb1  ext4     [*************************************-------------]   73%     81.3G  297.8G /mnt/Videos
</span><span class='line'>SUM:                [*********************************-----------------]   65%    255.7G  728.2G</span></code></pre></td></tr></table></div></figure>


<p>Pour les détails concernant l&#8217;utilisation, il suffit de consulter la manpage <em>dfc(1)</em>.</p>

<p>Pour les archers, j&#8217;ai crée un paquet sur AUR <a href="http://aur.archlinux.org/packages.php?ID=57770">ici</a>.
On retrouve également le paquet sur le dépôt <em>archlinuxfr</em> puisque je fais
maintenant partie des mainteneurs.</p>

<p>Je profite de l&#8217;occasion pour prévenir les quelques personnes utilisant
mon dépôt <em>rolinh</em> qu&#8217;il sera fermé puisque les paquets se trouvant
actuellement dessus vont finir sur le dépôt <em>archlinuxfr</em> où je continuerais
de les maintenir.</p>

<p>Pour ceux n&#8217;étant pas utilisateurs d&#8217;Archlinux mais qui sont quand
même intéressés par <em>dfc</em>, il est toujours possible de l&#8217;installer manuellement.
Pour cela, il suffit de télécharger la dernière archive contenant les sources
(<a href="http://projects.gw-computing.net/projects/dfc/files">ici</a>), de la décompresser, puis, depuis le répertoire obtenu, de lancer les
commandes suivantes via le terminal: <code>make</code> pour le construire et <code>make install</code>
(en root) pour l&#8217;installer (par défaut, il s&#8217;installe dans <code>/usr/local</code>).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Quelques nouvelles]]></title>
    <link href="http://blog.rolinh.ch/divers/quelques-nouvelles/"/>
    <updated>2012-03-13T20:58:00+01:00</updated>
    <id>http://blog.rolinh.ch/divers/quelques-nouvelles</id>
    <content type="html"><![CDATA[<p>Cela fait près de deux mois que je n&#8217;ai pas écrit d&#8217;article.
Néanmoins, ce blog est bien loin d&#8217;être mort.
J&#8217;étais simplement passablement occupé entre mes examens universitaires et
divers autres projets et occupations.</p>

<p>J&#8217;ai récemment apporté un léger changement à ce blog. Certains auront
peut-être remarqué que la bulle au survol du lien vers le flux RSS affiche
maintenant une information en français et que le champ de recherche en haut à
droite comporte la mention &#8220;Rechercher&#8230;&#8221; et non plus
&#8220;Search&#8230;&#8221;. J&#8217;avais omis ces détails lorsque j&#8217;avais déployé et traduit
<a href="http://octopress.org/">Octopress</a> pour ce blog. Cependant, ce ne sont pas ici les seules
modifications apportées.
En effet, la recherche sur le site s&#8217;effectue maintenant par le biais de
<a href="http://duckduckgo.com/">DuckDuckGo</a> et non plus Google.
Pourquoi cela? Et bien par respect pour votre vie privée. Vous n&#8217;êtes sans
doutes pas sans savoir que Google est omniprésent sur le web est arrive à
concentrer une quantité faramineuse de données sur vous et cela notamment via
son moteur de recherche. Bref, je ne tiens pas à alimenter leur base de données
de votre profil au travers de ce blog et c&#8217;est ce qui m&#8217;a poussé à effectuer
ce changement.
J&#8217;avais entendu parler de DuckDuckGo la première fois via <a href="http://linuxfr.org/news/duckduckgo">LinuxFr</a>.
Dans un premier temps, j&#8217;ai simplement été intrigué puis <a href="http://sebsauvage.net/">SebSauvage</a> est
venu <a href="http://sebsauvage.net/rhaa/index.php?2011/04/08/11/39/56-duckduckgo-merite-votre-attention/">en remettre une couche</a> qui a achevé de me convaincre de lui donner
une chance.
Cela fait donc plusieurs mois que je l&#8217;utilise et comme je l&#8217;ai trouvé
convainquant, j&#8217;ai trouvé qu&#8217;il ferait un bon remplaçant à Google pour ce site.</p>

<p>Ceci dit, vous me direz que c&#8217;est aberrant de parler du respect de votre vie
privée et de continuer d&#8217;utiliser Google Analytics. Inutile de vous dire que
lui aussi va disparaitre et ce probablement au profit de <a href="http:///piwik.org/">Piwik</a>.
Seulement voilà, pour l&#8217;instant il ne me donne aucunes statistiques et je n&#8217;ai
pas eu le temps de me pencher sur le problème afin de savoir pourquoi.</p>

<p>Dans un tout autre registre, j&#8217;ai mis en place un <a href="https://www.chiliproject.org/">ChiliProject</a> pour mes
divers projets de programmation. Pour ceux n&#8217;étant pas au courant, ChiliProject
est un fork au développement dynamique de <a href="http://www.redmine.org/">Redmine</a> qui se révèle être
extrêmement simple à déployer (au contraire de ce dernier&#8230;).
Il s&#8217;agit donc d&#8217;une plateforme complète comprenant notamment un visualiseur de
dépôts (git dans mon cas), un wiki, une page de nouvelles, un bug tracker, etc.
Bref, un outil vraiment complet pour gérer des projets que je vous invite à
retrouver <a href="http://projects.gw-computing.net/">ici</a>.</p>

<p>D&#8217;ailleurs, je partage cet outil avec mon ami <a href="http://www.gilliek.ch/">Gilliek</a> qui vient ce soir
même de finir la version 1.0 de son projet de gestion de DVDs en mode web nommé
<a href="http://projects.gw-computing.net/projects/mydvd">MyDVD</a>. Il s&#8217;agit d&#8217;une application Rails permettant de recueillir des
informations à propos des films de sa DVDthèque (bandes-annonces, synopsis,
etc.) et de les visionner dans un navigateur web grâce à HTML5.
L&#8217;idée est donc de stocker ses films sur un ordinateur faisant office de
serveur de films les rendant ainsi accessibles depuis n&#8217;importe quel appareil
disposant d&#8217;un navigateur internet dans sa maison. Je précise maison car je
doute que beaucoup de monde dispose d&#8217;une bande passante suffisante chez lui
pour permettre le streaming sur internet. Néanmoins, ceci est bien
évidemment possible si cette condition est remplie.
Les prochains développement concerneront le support des langues (pour le
moment, seul le français est disponible) et une fonction de recherche
améliorée.</p>

<p>De mon côté, je profite également de ChiliProject pour ma bibliothèque de
widgets pour Awesome (<a href="http://projects.gw-computing.net/projects/precious">Precious</a>), pour le gestionnaire de copies
<a href="http://projects.gw-computing.net/projects/lincopier">LinCopier</a> qui a profité de l&#8217;occasion pour
<a href="http://projects.gw-computing.net/news/1">se débarrasser de SourceForge.Net</a> et enfin pour <a href="http://projects.gw-computing.net/projects/rubyckup">Rubyckup</a>, un outil
de backups pour serveurs écrit en Ruby.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Convertir simplement ses M4A en MP3 via un script]]></title>
    <link href="http://blog.rolinh.ch/dev/convertir-simplement-ses-m4a-en-mp3-via-un-script/"/>
    <updated>2012-01-17T15:38:00+01:00</updated>
    <id>http://blog.rolinh.ch/dev/convertir-simplement-ses-m4a-en-mp3-via-un-script</id>
    <content type="html"><![CDATA[<p>En faisant un tri dans <code>~/Music</code>, je me suis aperçu qu&#8217;un certain nombre de
mes fichiers audio étaient en format <a href="http://fr.wikipedia.org/wiki/M4A">M4A</a>. Cela ne me plaisant pas trop et
afin notamment d&#8217;uniformiser ma médiathèque, j&#8217;ai cherché une solution me
permettant de les convertir en <a href="http://fr.wikipedia.org/wiki/Mp3">MP3</a>.
Seulement, je ne voulais pas perdre les tags <a href="http://fr.wikipedia.org/wiki/ID3">ID3v2</a> associés.</p>

<p>Après avoir un peu parcouru la toile, je suis tombé sur un script de conversion
conservant ces tags et basé sur les outils <a href="http://www.audiocoding.com/">faad</a>, <a href="http://lame.sourceforge.net/">lame</a> et <a href="http://id3v2.sourceforge.net/">id3v2</a>.</p>

<p>Je l&#8217;ai adapté à ma sauce afin notamment de supprimer les fichiers M4A originaux
une fois la conversion effectuée. Lame n&#8217;étant pas optimisé pour les processeurs
multicoeurs, l&#8217;opération de conversion peut prendre un certain temps en fonction
du nombre de fichiers à convertir. Bref, il faut être patient.</p>

<p>Le script cherchant les fichiers M4A dans le dossier courant, il est
préférable de le lancer à partir du dossier contenant votre collection de
fichiers musicaux.</p>

<p>Alors oui, c&#8217;est du bash donc moche et lent mais je l&#8217;ai utilisé pour convertir
pas moins d&#8217;une centaine de morceaux et j&#8217;ai été vraiment content du
résultat. Bref, je partage car ça peut toujours servir.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'><span class="c"># converts m4a files to mp3</span>
</span><span class='line'><span class="c"># song tags should be preserved</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> ! which faad &gt;/dev/null; <span class="k">then</span>
</span><span class='line'><span class="k">  </span><span class="nb">echo</span> <span class="s2">&quot;faad executable not found.&quot;</span> &gt;&amp;2;
</span><span class='line'>  <span class="nb">exit </span>1;
</span><span class='line'><span class="k">fi</span>
</span><span class='line'><span class="k">if</span> ! which lame &gt;/dev/null; <span class="k">then</span>
</span><span class='line'><span class="k">  </span><span class="nb">echo</span> <span class="s2">&quot;lame executable not found.&quot;</span> &gt;&amp;2;
</span><span class='line'>  <span class="nb">exit </span>1;
</span><span class='line'><span class="k">fi</span>
</span><span class='line'><span class="k">if</span> ! which id3v2 &gt;/dev/null; <span class="k">then</span>
</span><span class='line'><span class="k">  </span><span class="nb">echo</span> <span class="s2">&quot;id3v2 executable not found.&quot;</span> &gt;&amp;2;
</span><span class='line'>  <span class="nb">exit </span>1;
</span><span class='line'><span class="k">fi</span>
</span><span class='line'>
</span><span class='line'><span class="nb">echo</span> -n <span class="s2">&quot;Delete m4a file(s) after conversion?(y/n) &quot;</span>
</span><span class='line'><span class="nb">read </span>yn
</span><span class='line'><span class="k">case</span> <span class="nv">$yn</span> in
</span><span class='line'>  y|yes<span class="o">)</span>
</span><span class='line'>      <span class="nb">echo</span> -e <span class="s2">&quot;All right $USER, m4a files will be removed.&quot;</span>
</span><span class='line'>      <span class="nv">del</span><span class="o">=</span>0
</span><span class='line'>      ;;
</span><span class='line'>  *<span class="o">)</span>
</span><span class='line'>      <span class="nb">echo</span> -e <span class="s2">&quot;Ok $USER, m4a files will be preserved.&quot;</span>
</span><span class='line'>      ;;
</span><span class='line'><span class="k">esac</span>
</span><span class='line'>
</span><span class='line'><span class="nb">echo</span> -e <span class="s2">&quot;\nBe patient if you convert lots of file.&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="k">while </span><span class="nb">read </span>m4afile; <span class="k">do</span>
</span><span class='line'>
</span><span class='line'><span class="k">  </span><span class="nv">mp3file</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">&quot;$m4afile&quot;</span> | sed s/<span class="se">\.</span>m4a/.mp3/g<span class="k">)</span>
</span><span class='line'>  <span class="nv">ARTIST</span><span class="o">=</span><span class="k">$(</span>faad -i <span class="s2">&quot;$m4afile&quot;</span> 2&gt;&amp;1 | grep <span class="s1">&#39;^artist: &#39;</span> | sed <span class="s1">&#39;s/^artist: //&#39;</span><span class="k">)</span>
</span><span class='line'>  <span class="nv">TITLE</span><span class="o">=</span><span class="k">$(</span>faad -i <span class="s2">&quot;$m4afile&quot;</span> 2&gt;&amp;1 | grep <span class="s1">&#39;^title: &#39;</span> | sed <span class="s1">&#39;s/^title: //&#39;</span><span class="k">)</span>
</span><span class='line'>  <span class="nv">ALBUM</span><span class="o">=</span><span class="k">$(</span>faad -i <span class="s2">&quot;$m4afile&quot;</span> 2&gt;&amp;1 | grep <span class="s1">&#39;^album: &#39;</span> | sed <span class="s1">&#39;s/^album: //&#39;</span><span class="k">)</span>
</span><span class='line'>  <span class="nv">GENRE</span><span class="o">=</span><span class="k">$(</span>faad -i <span class="s2">&quot;$m4afile&quot;</span> 2&gt;&amp;1 | grep <span class="s1">&#39;^genre: &#39;</span> | sed <span class="s1">&#39;s/^genre: //&#39;</span><span class="k">)</span>
</span><span class='line'>  <span class="nv">TRACKNUMBER</span><span class="o">=</span><span class="k">$(</span>faad -i <span class="s2">&quot;$m4afile&quot;</span> 2&gt;&amp;1 | grep <span class="s1">&#39;^track: &#39;</span> | sed <span class="s1">&#39;s/^track: //&#39;</span><span class="k">)</span>
</span><span class='line'>  <span class="nv">DATE</span><span class="o">=</span><span class="k">$(</span>faad -i <span class="s2">&quot;$m4afile&quot;</span> 2&gt;&amp;1 | grep <span class="s1">&#39;^date: &#39;</span> | sed <span class="s1">&#39;s/^date: //&#39;</span><span class="k">)</span>
</span><span class='line'>  <span class="nv">COMMENT</span><span class="o">=</span><span class="k">$(</span>faad -i <span class="s2">&quot;$m4afile&quot;</span> 2&gt;&amp;1 | grep <span class="s1">&#39;^comment: &#39;</span> | sed <span class="s1">&#39;s/^comment: //&#39;</span><span class="k">)</span>
</span><span class='line'>  <span class="nv">CONGROUP</span><span class="o">=</span><span class="k">$(</span>faad -i <span class="s2">&quot;$m4afile&quot;</span> 2&gt;&amp;1 | grep <span class="s1">&#39;^contentgroup: &#39;</span> | sed <span class="s1">&#39;s/^contentgroup: //&#39;</span><span class="k">)</span>
</span><span class='line'>  <span class="nv">COMPOSER</span><span class="o">=</span><span class="k">$(</span>faad -i <span class="s2">&quot;$m4afile&quot;</span> 2&gt;&amp;1 | grep <span class="s1">&#39;^writer: &#39;</span> | sed <span class="s1">&#39;s/^writer: //&#39;</span><span class="k">)</span>
</span><span class='line'>  <span class="nv">PERFORMER</span><span class="o">=</span><span class="k">$(</span>faad -i <span class="s2">&quot;$m4afile&quot;</span> 2&gt;&amp;1 | grep <span class="s1">&#39;^performer: &#39;</span> | sed <span class="s1">&#39;s/^performer: //&#39;</span><span class="k">)</span>
</span><span class='line'>  <span class="nv">ALBARTIST</span><span class="o">=</span><span class="k">$(</span>faad -i <span class="s2">&quot;$m4afile&quot;</span> 2&gt;&amp;1 | grep <span class="s1">&#39;^album_artist: &#39;</span> | sed <span class="s1">&#39;s/^album_artist: //&#39;</span><span class="k">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="nb">echo</span> -en <span class="s2">&quot;\n$ARTIST / $ALBUM [$DATE] / $TRACKNUMBER - $TITLE&quot;</span>
</span><span class='line'>  <span class="nb">echo</span> -en <span class="s2">&quot;\nConverting *$(basename &quot;</span><span class="nv">$m4afile</span><span class="s2">&quot;)* to *$(basename &quot;</span><span class="nv">$mp3file</span><span class="s2">&quot;)* ...&quot;</span>
</span><span class='line'>  faad -q -o - <span class="s2">&quot;$m4afile&quot;</span> 2&gt;/dev/null | lame -m j -q 0 --vbr-new -V 0 -s 44.1 - <span class="s2">&quot;$mp3file&quot;</span> 2&gt;/dev/null
</span><span class='line'>
</span><span class='line'>  id3v2 -t <span class="s2">&quot;$TITLE&quot;</span> -T <span class="s2">&quot;${TRACKNUMBER:-0}&quot;</span> -a <span class="s2">&quot;$ARTIST&quot;</span> -A <span class="s2">&quot;$ALBUM&quot;</span> -y <span class="s2">&quot;$DATE&quot;</span> -g <span class="s2">&quot;${GENRE:-12}&quot;</span> -c <span class="s2">&quot;$COMMENT&quot;</span> --TORY <span class="s2">&quot;$DATE&quot;</span> --IPLS <span class="s2">&quot;$ALBARTIST&quot;</span> --TCOM <span class="s2">&quot;$COMPOSER&quot;</span> --TIT1 <span class="s2">&quot;$CONGROUP&quot;</span> --TIT2 <span class="s2">&quot;$TITLE&quot;</span> --TOPE <span class="s2">&quot;$PERFORMER&quot;</span> --TPE1 <span class="s2">&quot;$ARTIST&quot;</span> --TPE2 <span class="s2">&quot;$ALBARTIST&quot;</span> --TRCK <span class="s2">&quot;$TRACKNUMBER&quot;</span> <span class="s2">&quot;$mp3file&quot;</span> 2&gt;/dev/null
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="o">[[</span> <span class="k">${</span><span class="nv">del</span><span class="k">}</span> <span class="o">]]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">      </span>rm -v <span class="s2">&quot;$m4afile&quot;</span>
</span><span class='line'>  <span class="k">fi</span>
</span><span class='line'>
</span><span class='line'><span class="k">done</span> &lt; &lt;<span class="o">(</span>find . -iname <span class="s1">&#39;*.m4a&#39;</span> -or -iname <span class="s1">&#39;*.M4A&#39;</span><span class="o">)</span>
</span><span class='line'><span class="nb">echo</span> -e <span class="s2">&quot;\nConversion complete!&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>PS: j&#8217;ai trouvé un <em>workaround</em> pour mes soucis de coloration syntaxique.
C&#8217;est pour l&#8217;instant assez moche mais mieux que rien&#8230; en attendant la résolution
du bug <em>upstream</em>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Thinkpad T420 sous Archlinux: corriger les problèmes de son]]></title>
    <link href="http://blog.rolinh.ch/linux/thinkpad-t420-sous-archlinux-corriger-les-problemes-de-son/"/>
    <updated>2012-01-14T15:37:00+01:00</updated>
    <id>http://blog.rolinh.ch/linux/thinkpad-t420-sous-archlinux-corriger-les-problemes-de-son</id>
    <content type="html"><![CDATA[<p>Je vous ai déjà parlé à plusieurs reprise de mon <a href="http://blog.rolinh.ch/divers/le-portable-ideal/">Lenovo Thinkpad T420</a>.
Et bien je vais revenir dessus encore une fois!</p>

<p>Presque tout le matériel est très bien reconnu par Linux dans l&#8217;ensemble mais
il subsiste quelques détails: le bouton permettant d&#8217;activer/désactiver le
microphone ne fonctionne pas*, le son des haut-parleurs est relativement faible
et ne marche carrément pas du tout via la sortie jack de la <em>docking station</em>.
Enfin, ne marchait pas aurais-je dû dire car pour ces deux derniers points j&#8217;ai
trouvé la solution et elle est extrêmement simple à mettre en place.</p>

<p>Il suffit d&#8217;éditer <code>/etc/modprobe.d/modprobe.conf</code> et d&#8217;y ajouter cette ligne:</p>

<pre><code>options snd-hda-intel model=thinkpad
</code></pre>

<p>Le module est ainsi chargé avec les bons paramètres et permet ainsi au son de
fonctionner via le jack du dock et de gagner légèrement en volume à travers les
haut-parleurs intégrés au portable.
Il est à noter que cette astuce est sûrement valable pour les autres Thinkpad
et adaptable à d&#8217;autres configurations.</p>

<p>* <em>N&#8217;utilisant pas de microphone, je n&#8217;ai même pas cherché s&#8217;il existait
   une solution. De même, je n&#8217;ai jamais testé le lecteur d&#8217;empreintes
   digitales car je ne m&#8217;en servirais de toute façon pas.</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[archlinux: comment créer un paquet 32-bit depuis une installation 64-bit]]></title>
    <link href="http://blog.rolinh.ch/tutos/archlinux-comment-creer-un-paquet-32-bit-depuis-une-installation-64-bit/"/>
    <updated>2012-01-08T00:40:00+01:00</updated>
    <id>http://blog.rolinh.ch/tutos/archlinux-comment-creer-un-paquet-32-bit-depuis-une-installation-64-bit</id>
    <content type="html"><![CDATA[<p>En plus de <a href="http://blog.rolinh.ch/divers/le-portable-ideal/">mon beau Lenovo</a>, je possède un netbook (Asus EeePC 1005HA) sur
lequel est bien évidemment également installé Archlinux.</p>

<p>Seulement voilà: il m&#8217;arrive d&#8217;installer des paquets depuis <a href="http://wiki.archlinux.fr/AUR">AUR</a> et cela
passe souvent par une compilation. Évidemment, l&#8217;ensemble d&#8217;excellents outils
fournis avec Archlinux (<a href="http://wiki.archlinux.fr/Pacman">pacman</a>, <a href="http://wiki.archlinux.fr/Makepkg">makepkg</a>, <a href="http://wiki.archlinux.fr/Pkgbuild">PKGBUILD</a>) facilitent
énormément la tâche de création de paquets mais seulement voilà, compiler
sur un netbook disposant d&#8217;un faible Intel Atom N280 en guise de processeur
est loin d&#8217;être une joie.
Surtout lorsque l&#8217;on possède une belle machine comme la mienne pour compiler!</p>

<p>L&#8217;idée est donc de compiler le paquet sur mon Lenovo et de le rendre disponible
pour le netbook par la suite. Seulement voilà: mon Lenovo possède une Archlinux
64-bit alors que le netbook, processeur 32-bit oblige, une Archlinux 32-bit et
par conséquent les paquets ne sont pas compatibles.</p>

<p>La solution? Créer un paquet 32-bit depuis l&#8217;installation 64-bit. Pour cela, il
faut évidemment passer par un <a href="http://fr.wikipedia.org/wiki/Chroot">chroot</a> 32-bit.</p>

<p>Cela pourrait être un vrai chemin de croix pour certains mais en fait le
travail est facilité par des outils très pratiques.
Voici comment procéder dans le détail.</p>

<p>Il faut commencer par créer le répertoire devant contenir notre chroot. Le
faire dans <em>/opt</em> avec un nom parlant est une bonne idée:</p>

<pre><code>sudo mkdir /opt/arch32
</code></pre>

<p>Les outils dont nous avons besoin sont fournis dans le paquet devtools. Alors
installons le:</p>

<pre><code>sudo pacman -S devtools
</code></pre>

<p>Ceci fait, on va copier notre existant <em>pacman.conf</em> dans notre dossier de
chroot:</p>

<pre><code>sudo cp /etc/pacman.conf /opt/arch32
</code></pre>

<p>On va également avoir besoin du makepkg.conf. Celui-ci possèdant une
configuration spécifique à l&#8217;architecture, on va prendre celui par défaut pour
32-bit fournis avec le paquet <em>devtools</em>:</p>

<pre><code>sudo cp /usr/share/devtools/makepkg-i686.conf /opt/arch32
</code></pre>

<p>Ceci fait, il nous faut éditer <em>/opt/arch32/pacman.conf</em> afin d&#8217;être certain
qu&#8217;il ne contienne pas de référence à du 64-bit.
Il faut changer cette ligne:</p>

<pre><code>Architecture = auto
</code></pre>

<p>Pour celle-là:</p>

<pre><code>Architecture = i686
</code></pre>

<p>Il faut également être sûr que le dépôt <em>multilib</em> n&#8217;est pas activé ainsi que
tout autre dépôt uniquement 64-bit sous peine de faire foirer le chroot.</p>

<p>Et c&#8217;est maintenant que s&#8217;applique la magie des beaux outils. La commande
suivante va configurer le chroot et installer tout ce qu&#8217;il nous faut comme
paquets afin de pouvoir en créer un:</p>

<pre><code>sudo mkarchroot -C /opt/arch32/pacman.conf -M /opt/arch32/makepkg.conf /opt/arch32/root base base-devel sudo
</code></pre>

<p>Cela peut évidemment prendre un peu de temps en fonction de votre connection
internet.</p>

<p>Une fois ceci fait, il faut copier le PKGBUILD du paquet que l&#8217;on veut créer
quelque part dans notre chroot. Mettons que l&#8217;on veuille compiler le paquet
<em>xfwm4-tiling</em>, disponible sur AUR, on va créer le dossier
<em>/opt/arch32/aur/xfwm4-tiling</em> et y mettre les fichiers nécessaires dedans
(PKGBUILD et éventuels autres fichiers nécessaires). Il faut ensuite se rendre
dans le dossier contenant le PKGBUILD (dans notre exemple
<em>/opt/arch32/aur/xfwm4-tiling</em>) et lancer la commande suivante:</p>

<pre><code>sudo makechrootpkg -c -r /opt/arch32
</code></pre>

<p>Et après un petit moment: tadaaa, voilà le paquet 32-bit créé! Et oui, c&#8217;est
aussi simple que ça!</p>

<p>Si vous comptez réutiliser votre chroot plus tard, la commande suivante suffit
afin de s&#8217;assurer que notre chroot est bien à jour:</p>

<pre><code>sudo mkarchroot -u /opt/arch32/root
</code></pre>

<p>Alors, ils ne sont pas beau les outils Archlinux?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Suspension temporaire des commentaires]]></title>
    <link href="http://blog.rolinh.ch/divers/suspension-temporaire-des-commentaires/"/>
    <updated>2012-01-07T10:54:00+01:00</updated>
    <id>http://blog.rolinh.ch/divers/suspension-temporaire-des-commentaires</id>
    <content type="html"><![CDATA[<p>Les commentaires sont temporairement suspendus sur ce site. Je vous l&#8217;accorde,
un blog est beaucoup moins vivant s&#8217;il est dépourvu de commentaires. Cependant,
s&#8217;il n&#8217;est plus possible de commenter en ce moment c&#8217;est pour une raison bien
précise que je vais détailler.</p>

<p>En visitant mon blog hier ou ce matin, vous avez pu constater que les
commentaires étaient gérés par <a href="http://www.disqus.com">disqus</a>. Comme <a href="http://blog.rolinh.ch/divers/le-blog-a-migre-sur-octopress/">je l&#8217;ai expliqué</a>,
ce site est utilise maintenant <a href="http://octopress.org">Octopress</a> et est purement statique. Par
conséquent, il n&#8217;est pas possible d&#8217;interagir de manière dynamique avec le site
autrement qu&#8217;en passant par des scripts.</p>

<p>Seulement voilà: utiliser disqus n&#8217;est pour moi pas une solution. Pourquoi?</p>

<ul>
<li>Je suis dépendant de disqus.com. Si le site ferme ou que le service
devient payant, je suis cuit.</li>
<li>Disqus est lourd: il charge beaucoup de scripts et cela rend les pages
plus lentes à l&#8217;affichage. Ceci est bien dommage alors qu&#8217;un des intérêts
d&#8217;avoir un site statique est justement la rapidité d&#8217;affichage.</li>
<li>Disqus ne respecte pas votre vie privée. Et moi j&#8217;y tiens!
En effet, grâce à la pratique extension de <a href="http://www.mozilla.org/fr/firefox/fx/">Firefox</a> nommée
<a href="https://addons.mozilla.org/fr/firefox/addon/ghostery/">Ghostery</a>, j&#8217;ai fait le constat que disqus chargeait des scripts
externes:

<ul>
<li><a href="http://www.ghostery.com/apps/quantcast">Quantcast</a>: collecte des données anonymes (type de navigateur, url
de référence, etc.) et partage avec des entreprises.</li>
<li><a href="http://www.ghostery.com/apps/scorecard_research_beacon">ScoreCard Research Beacon</a>: collecte des données anonymes (type de
navigateur, OS, etc.) ET des adresses IP partielles. Tout cela est bien
sûr également partagé&#8230;</li>
</ul>
</li>
<li>Il est difficile de récupérer les commentaires de disqus. On peut
les exporter sous un format XML mais il aurait été très difficile pour moi
de les convertir en commentaires pour octopress le jour où j&#8217;aurais voulu
m&#8217;affranchir de ce service.</li>
</ul>


<p>Bref, suffisament de raisons pour ne pas l&#8217;utiliser!</p>

<p>Je tiens fortement à migrer les anciens commentaires et trouver un nouveau
système (probablement concocté par mes soins) afin de les rétablir car je les
apprécie; qu&#8217;ils soient une remarque, un avis, un encouragement ou une
critique: ils sont tous intéressants.</p>

<p>Cependant, cela risque de me prendre un peu de temps: je suis en période
d&#8217;examens universitaires et je n&#8217;ai pas encore une solution en tête. Je vous
prie donc de m&#8217;en excuser.</p>

<p>Si en attendant vous tenez à me faire part d&#8217;un commentaire, d&#8217;une critique,
d&#8217;une question ou autre, il faudra passer par le formulaire de contact (que je
dois encore mettre en place :-P ).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[le blog a migré sur octopress]]></title>
    <link href="http://blog.rolinh.ch/divers/le-blog-a-migre-sur-octopress/"/>
    <updated>2012-01-06T01:50:00+01:00</updated>
    <id>http://blog.rolinh.ch/divers/le-blog-a-migre-sur-octopress</id>
    <content type="html"><![CDATA[<p>Ça y est: je me suis enfin décidé à migrer mon blog de <a href="http://wordpress.org/" title="Wordpress">Wordpress</a> à
<a href="http://octopress.org/" title="Octopress">Octopress</a>.</p>

<p>Première chose à savoir pour ceux qui me suivent via le flux RSS:
<strong>mon flux RSS a changé d&#8217;URL</strong>.
Désormais, il faut pointer sur <a href="http://blog.rolinh.ch/atom.xml" title="Flux RSS">http://blog.rolinh.ch/atom.xml</a> (oui, le
lien se trouve toujours en haut à droite du blog).</p>

<p>Pourquoi avoir migré? C&#8217;est bien simple: Wordpress ne me correspondait pas du
tout. J&#8217;aime bien la philosophie <a href="http://fr.wikipedia.org/wiki/Keep_it_Simple,_Stupid" title="Wikipedia">KISS</a>, fortement suivie par <a href="http://wiki.archlinux.fr/Kiss" title="Archlinux fr">Archlinux</a>
d&#8217;ailleurs, et Wordpress va complètement à l&#8217;encontre de cette idée.
Il intègre beaucoup trop de fonctionnalités dont je me fous comme de l&#8217;an 40 et
est finalement devenu un CMS complet plutôt qu&#8217;un simple moteur de blog.</p>

<p>Octopress est à des années lumières de la philosophie de Wordpress. Le site
que vous avez maintenant sous les yeux n&#8217;est constitué que de pages statiques.
Oui, cela veut dire pas de bases de données ni besoin de faire tourner php
ou autre sur le serveur: le site est purement statique. Cela comporte des
avantages mais également des inconvénients.</p>

<p>Parmi les avantages, le principal est la rapidité: l&#8217;affichage est quasiment
instantané. On pourrait aussi avancer le fait que cela renforce la sécurité
puisque le site n&#8217;est pour ainsi dire pas piratable.</p>

<p>Et pourtant, ce n&#8217;est pas pour ces raisons que j&#8217;ai choisi Octopress:</p>

<ul>
<li>je peux bloguer avec <a href="http://www.vim.org" title="VIM">mon éditeur de texte favori</a>&#8230;</li>
<li>&#8230; en utilisant la syntaxe <a href="http://fr.wikipedia.org/wiki/Markdown" title="Wikipedia">markdown</a></li>
<li>le site se génère et déploie sur le serveur via une collection d&#8217;outils ruby</li>
<li>je gère mon blog dans un dépôt git</li>
<li>la coloration syntaxique du code est bien gérée (quoique je fais face à un bug spécifique à archlinux pour le moment qui m&#8217;empêche d&#8217;en profiter)</li>
<li>le thème de base est très réussi</li>
</ul>


<p>Alors évidemment, cela a aussi ses inconvénients. Le site étant entièrement
statique, je ne dispose même pas d&#8217;un formulaire de contact. De même, le
système de commentaires passe pas un module externe (en l&#8217;occurence <a href="http://www.disqus.com" title="Disqus">disqus</a>)
et cela ne me plait pas trop. Je tâcherais tout de même de trouver une solution
dès que j&#8217;aurais un peu de temps. J&#8217;espère que cela ne vous importune pas trop.</p>

<p>Bref, cette migration m&#8217;a quand même pris un peu de temps et certaines choses
ne sont pas encore en place. Néanmoins, je suis plutôt content du nouvel
aspect du blog. Je suis parti du thème de base et l&#8217;ai modifié à ma guise
afin d&#8217;avoir quelque chose qui me corresponde.
Pour ceux qui consultent le blog depuis un petit écran (téléphone mobile), le
thème s&#8217;occupe de produire un affichage correct donc il n&#8217;y a pas de régression
de ce côté là.
J&#8217;ai également dû le traduire donc si vous voyez des mots qui sont encore en
anglais, merci de me le signaler afin que je corrige.</p>

<p>Il reste encore des liens morts et autres choses dans le genre mais je
vais tâcher de remédier également à ces problèmes au plus vite.</p>

<p>Je suis donc désolé pour les désagréments que ça peut vous causer mais il ne
devrait pas trop y en avoir quand même. Et si ce foutu système de commentaires
se décide à fonctionner, je serais ravi d&#8217;avoir votre avis à propos de ce
changement!</p>

<p>PS: rhâââââ, bloguer avec $EDITOR c&#8217;est un pur bonheur quand même!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ZSH: afficher les infos des VCS (git, mercurial, svn, etc.) dans son prompt]]></title>
    <link href="http://blog.rolinh.ch/linux/zsh-afficher-les-infos-des-vcs-git-mercurial-svn-etc-dans-son-prompt/"/>
    <updated>2012-01-03T12:53:00+01:00</updated>
    <id>http://blog.rolinh.ch/linux/zsh-afficher-les-infos-des-vcs-git-mercurial-svn-etc-dans-son-prompt</id>
    <content type="html"><![CDATA[<p>C&#8217;est quelque chose que je voulais mettre en place depuis un moment mais ne
l&#8217;avais pas fait faute de trouver une solution qui me satisfasse.</p>

<p>En faisant une brève recherche sur internet, on peut trouver une foule de
zshrc configurés pour afficher des informations en fonction du dépôt de
<a href="http://fr.wikipedia.org/wiki/VCS">VCS</a> parcouru. Certaines solutions ne gèrent qu&#8217;un VCS, d&#8217;autres
plusieurs, certaines affichent les informations de manière sobre, d&#8217;autre le
font de manière plus excentrique, certaines nécessitent des scripts (oui, oui,
je suis tombé sur une solution qui nécessitait un script python!). Bref, on
trouve de tout et il est difficile de s&#8217;y retrouver pour faire un prompte à sa
sauce.</p>

<p>J&#8217;ai finalement découvert que zsh possède un module nommé vcs_info permettant
justement de gérer les dépôts de VCS. Il s&#8217;agit d&#8217;une contribution utilisateur
et toute la doc nécessaire afin de configurer cela à votre guise se trouve
<a href="http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#Version-Control-Information">ici</a>. Décidément, zsh ne cessera pas de me surprendre!</p>

<p>Afin d&#8217;aller un peu plus vite, je me suis basé sur ces deux articles très bien
fait: <a href="http://eseth.org/2010/hg-in-zsh.html#post-hg-in-zsh">mercurial info on your zsh prompt</a> et <a href="http://eseth.org/2010/git-in-zsh.html#post-git-in-zsh">git info in your zsh
prompt</a>. Je peaufinerais probablement un peu ma configuration dans un
avenir proche mais néanmoins voici comment j&#8217;ai procédé:</p>

<ul>
<li><p>ajout de ces lignes à mon zshrc afin de ne charger que git et mercurial de vcs_info puisque de toute façon je n&#8217;utilise pas d&#8217;autres VCS dans les projets auxquels je participe:</p>

<p><code>autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git hg</code></p></li>
<li><p>personnalisation de vcs_info avec zstyle (j&#8217;ai pompé et modifié la configuration trouvée <a href="https://github.com/whiteinge/dotfiles/blob/master/.zsh_shouse_prompt">ici</a> afin de ne pas afficher trop d&#8217;informations)</p></li>
<li>ajout de <em>vcs_info</em> dans la fonction <em>precmd</em></li>
<li>affichage des informations dans RPS1 (pour rappel, il s&#8217;agit de la partie du prompt affichée tout à droite)</li>
</ul>


<p>Curieux de savoir à quoi ça peut ressembler?</p>

<p>Dans un dépôt mercurial:</p>

<p><img src="http://blog.rolinh.ch/images/zsh-vcs-hg-default.png" title="zsh-vcs-hg-default" alt="" /></p>

<p><img src="http://blog.rolinh.ch/images/zsh-vcs-hg-custom.png" title="zsh-vcs-hg-custom" alt="" /></p>

<p>Dans un dépôt git:</p>

<p><img src="http://blog.rolinh.ch/images/zsh-vcs-git-default.png" title="zsh-vcs-git-default" alt="" /></p>

<p><img src="http://blog.rolinh.ch/images/zsh-vcs-git-custom-u.png" title="zsh-vcs-git-custom-u" alt="" /></p>

<p><img src="http://blog.rolinh.ch/images/zsh-vcs-git-custom-s.png" title="zsh-vcs-git-custom-s" alt="" /></p>

<p>N&#8217;oubliez pas que vous pouvez trouver mon zshrc dans <a href="http://git.rolinh.ch/index.php?p=dotfiles.git&amp;a=summary">mon dépôt de
configurations</a>. ;)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[comment appliquer une configuration d'écran spécifique automatiquement lorsqu'un écran externe est détecté]]></title>
    <link href="http://blog.rolinh.ch/linux/comment-appliquer-une-configuration-decran-specifique-automatiquement-lorsquun-ecran-externe-est-detecte/"/>
    <updated>2011-12-20T19:57:00+01:00</updated>
    <id>http://blog.rolinh.ch/linux/comment-appliquer-une-configuration-decran-specifique-automatiquement-lorsquun-ecran-externe-est-detecte</id>
    <content type="html"><![CDATA[<p>Un petit article pour une petite astuce.</p>

<p>Le problème est on ne peut plus simple: comment appliquer une certaine
configuration d&#8217;écran de manière automatique lorsqu&#8217;un autre écran est
détecté.</p>

<p>Dans mon cas, j&#8217;utilise un portable et dispose d&#8217;une station d’accueil à
laquelle est relié un moniteur. Lorsque je suis en déplacement,  le seul écran
disponible est celui du portable lui-même (logique&#8230;) mais lorsque je suis
chez moi, je dispose d&#8217;un deuxième moniteur relié en VGA à ma station
d’accueil. Lors du démarrage de ma session Awesome wm, les deux écrans sont
par défaut en configuration clone, ce qui m&#8217;est relativement inutile. Avant
mon astuce, je lançais un petit script utilisant <a href="https://wiki.archlinux.org/index.php/Xrandr">xrandr</a> manuellement afin
que mes deux écrans soient configurés correctement. Voilà une astuce afin
d&#8217;automatiser cela.</p>

<p>La commande <em>xrandr</em>, passée sans argument, permet de connaître les écrans
connecté à la machine. Exemple de sortie:</p>

<pre><code>Screen 0: minimum 320 x 200, current 2880 x 1024, maximum 8192 x 8192
LVDS1 connected 1600x900+0+0 (normal left inverted right x axis y axis) 309mm x 174mm
   1600x900       60.0*+   40.0
   1024x768       60.0
   800x600        60.3     56.2
   640x480        59.9
VGA1 connected 1280x1024+1600+0 (normal left inverted right x axis y axis) 376mm x 301mm
   1280x1024      60.0*+   76.0     75.0
   1152x864       75.0
   1024x768       75.1     70.1     60.0
   832x624        74.6
   800x600        72.2     75.0     60.3
   640x480        72.8     75.0     66.7     60.0
   720x400        70.1
</code></pre>

<p>On voit donc dans mon cas que j&#8217;ai deux écrans connectés: LVDS1, qui
correspond à l&#8217;écran de mon portable, et VGA1 qui correspond à l&#8217;écran externe
branché en VGA. Lorsque ce dernier est connecté à mon portable, je souhaite
configurer mon affichage en conséquence. Rien de plus simple: il suffit
d&#8217;éditer le fichier <em>$HOME/.xinitrc</em> et de lui ajouter ces quelques lignes:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c"># apply dual-screen configuration when VGA is connected</span>
</span><span class='line'>xrandr | grep <span class="s2">&quot;VGA1 connected&quot;</span>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> <span class="nv">$?</span> -eq 0 <span class="o">]</span>; <span class="k">then</span>
</span><span class='line'><span class="k">        </span>xrandr --output LVDS1 --mode 1600x900 --pos 0x0 --rotate normal --output VGA1 --mode 1280x1024 --pos 1600x0 --rotate normal
</span><span class='line'><span class="k">fi</span>
</span></code></pre></td></tr></table></div></figure>


<p>Évidemment, ceci est à adapter en fonction de votre configuration mais une
fois ceci fait, la configuration spécifique lorsque les deux écrans sont
connectés est automatiquement chargée lors du lancement de la session.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[une interface web pour un git public avec nginx]]></title>
    <link href="http://blog.rolinh.ch/divers/une-interface-web-pour-un-git-public-avec-nginx/"/>
    <updated>2011-12-19T13:23:00+01:00</updated>
    <id>http://blog.rolinh.ch/divers/une-interface-web-pour-un-git-public-avec-nginx</id>
    <content type="html"><![CDATA[<p>Vous le savez certainement si vous me suivez depuis un petit moment: j&#8217;utilise
<a href="http://www.nginx.com/">nginx</a> comme serveur web. Celui-ci comporte de nombreux avantages par
rapport au mastodonte qu&#8217;est <a href="http://httpd.apache.org/">Apache</a>, dont notamment la simplicité de la
configuration. Cependant, les ressources le concernant sont moins nombreuses
car le projet est relativement jeune et son utilisation n&#8217;est pas aussi
importante que celle d&#8217;Apache.</p>

<p>Bref, une des difficulté avec nginx se trouve être ce qui concerne les script
CGI. Vous allez vite comprendre pourquoi.</p>

<p>Je voulais rendre public et accessible via une interface web mon dépôt git
contenant mes configurations de programme. Naturellement, j&#8217;ai d&#8217;abord pensé à
utiliser gitweb, qui est installé avec la &#8220;suite&#8221; git. Or, celui-ci étant
écrit en perl ne facilite en rien les choses&#8230; Il aurait fallu utiliser un
wrapper et pas mal bidouillé afin de le faire fonctionner. Ce n&#8217;est donc pas
impossible mais je ne trouvais pas cela très propre. J&#8217;ai donc cherché une
alternative simple à mettre en place et c&#8217;est là que je suis tombé sur
<a href="http://www.xiphux.com/programming/gitphp/">gitphp</a>.</p>

<p>Enfin bon, avant de publier ses dépôts sur un site web, il est intéressant de
les rendre accessible en lecture pour tout le monde. Pour cela, avec git vient
git-daemon. Comme son nom l&#8217;indique, il s&#8217;agit d&#8217;un daemon et il esst
justement prévu pour ça. Au préalable, il ne faut pas oublier d&#8217;ouvrir le port
9418, qui est le port utilisé par défaut et éditer le <em>git-daemon.conf</em>
(<em>/etc/conf.d/git-daemon.conf</em> chez Archlinux) au préalable. Chez moi, il
ressemble à ceci:</p>

<pre><code># path to git repositories served
GIT_REPO="/srv/gitosis/repositories/"
# see `man git-daemon` for all available options
# $GIT_REPO will be present twice in most configs
GIT_DAEMON_ARGS="--detach --verbose --base-path=$GIT_REPO"
</code></pre>

<p>Comme il l&#8217;est écrit au-dessus, un <em>man git-daemon</em> permet dans savoir plus
sur les options. Par la suite, à moins que vous ayez choisit l&#8217;option _
&#8211;export-all_, vous allez devoir rajouter un fichier spécial dans le dépôt.
Celui-ci indique à git-daemon que le dépôt doit être exporté:</p>

<pre><code>cd /chemin/vers/le/depot.git
touch git-daemon-export-ok
</code></pre>

<p>Voilà, normalement, dès à présent, vos dépôts sont clonables en lecture-seule
via un:</p>

<pre><code>git clone git://monserver.org/depot.git
</code></pre>

<p>Reste maintenant à installer gitphp et le configurer. S&#8217;agissant d&#8217;un site en
php, voilà comment simplement créer un hôte virtuel avec nginx:</p>

<pre><code># gitphp
    server {
        listen 80;
        server_name git.rolinh.ch;
        root    /srv/http/rolinh/git;
        index   index.php;  
        location / {
            try_files $uri $uri/ /index.php?q=$uri&amp;$args;
        }  
        location ~ .php$ {
            fastcgi_split_path_info ^(.+.php)(/.+)$;
            include                 fastcgi.conf;
            fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /srv/http/rolinh/git/$fastcgi_script_name;
            fastcgi_cache_valid any 1m;
            fastcgi_intercept_errors on;
        }
    }
</code></pre>

<p>Évidemment, il faut adapter à votre configuration et celle-ci est prévue pour
fonctionner avec php-fpm (voir la <a href="https://wiki.archlinux.org/index.php/Nginx#PHP.2FPython_Integration">doc Archlinux</a> pour informations). Il
est nécessaire que <em>posix.so</em> soit activé dans php donc si ce n&#8217;est pas fait,
il faut éditer le <em>php.ini</em> en conséquence. Ensuite, il faut télécharger et
décompresser gitphp dans le répertoire prévu (il est normalement disponible
<a href="http://www.xiphux.com/programming/gitphp/">ici</a>).</p>

<p>Ceci fait, il faut encore le configurer. Dans le dossier <em>config</em> se trouve le
fichier de configuration de base que l&#8217;on peut modifier à sa guise. Toutes les
options disponibles sont visible dans <em>gitphp.conf.defaults.php</em>. Il vous
faudra au minimum les options suivantes:</p>

<pre><code>/*
 * projectroot
 * Full directory on server where projects are located
 */
$gitphp_conf['projectroot'] = '/srv/gitosis/repositories/';
/*
 * exportedonly
 * When listing all projects in the project root,
 * (not specifying any projects manually or using a project list file)
 * set this to true to only allow repositories with the
 * special file git-daemon-export-ok (see the git-daemon man page)
 */
$gitphp_conf['exportedonly'] = true;
</code></pre>

<p>Si les dépôts ne s&#8217;affichent pas, vérifiez bien que l&#8217;utilisateur web a bien
accès en lecture au dossier contenant les dépôts git.</p>

<p>Pour un exemple de tout ceci en action: <a href="http://git.rolinh.ch/">http://git.rolinh.ch/</a>.</p>

<p>NB: cet article est inspiré partiellement par celui-ci:
<a href="http://blog.hokietux.net/?p=247">http://blog.hokietux.net/?p=247</a> très bien fait qui explique comment
configurer gitphp.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[un dépôt git public de mes configurations]]></title>
    <link href="http://blog.rolinh.ch/divers/un-depot-git-public-de-mes-configurations/"/>
    <updated>2011-12-12T09:49:00+01:00</updated>
    <id>http://blog.rolinh.ch/divers/un-depot-git-public-de-mes-configurations</id>
    <content type="html"><![CDATA[<p>Cela faisait un moment que je voulais le faire mais que je n&#8217;avais pas pris le
temps: mettre en place un dépôt <a href="http://git-scm.com/">git</a> public de mes fichiers de
configuration de programmes qui soit donc librement clonable et accessible via
une interface web. C&#8217;est désormais chose faite: <a href="http://git.rolinh.ch/">http://git.rolinh.ch/</a> est
le sous-domaine qui regroupera tous mes dépôts git que j&#8217;ai envie de rendre
public et il ne comporte pour le moment que le <a href="http://git.rolinh.ch/?p=dotfiles.git&amp;a=tree">dépôt de mes configurations de programmes</a>.</p>

<p>J&#8217;avais déjà un dépôt public du temps où j&#8217;utilisais <a href="http://mercurial.selenic.com/">mercurial</a> et que ce
site était auto-hébergé mais je n&#8217;avais pas encore pris le temps de remettre
tout cela en place. C&#8217;est désormais chose faite. Pour info, l&#8217;interface web
est <a href="http://www.xiphux.com/programming/gitphp/">gitphp</a>. J&#8217;ai décidé de l&#8217;utiliser plutôt que gitweb car c&#8217;était toute
une histoire pour faire fonctionner ce dernier avec <a href="http://nginx.com/">nginx</a>, mon serveur
web (en raison de perl). Au final, l&#8217;interface est très similaire avec
quelques plus (bulles au survol de la souris, etc.) donc je pense que je vais
m&#8217;en contenter.</p>

<p>Je compte également remettre un peu d&#8217;ordre sur ce site et procéder aux
changements suivant:</p>

<ul>
<li>supprimer la rubrique <a href="http://blog.rolinh.ch/apps/">Apps</a> puisque de toute façon je ne l&#8217;ai pas touchée depuis la première version de ce site il y a maintenant un peu plus d&#8217;un an</li>
<li>ajouter une rubrique avec les liens vers mes différents dépôts</li>
</ul>


<p>Si vous vous opposez  à l&#8217;un ou l&#8217;autre de ces changements, merci
d&#8217;argumenter. ;)</p>

<p>Je tâcherais aussi de migrer ce blog sur <a href="http://octopress.org/">Octopress</a> mais je n&#8217;ai guère le
temps de le faire en ce moment puisqu&#8217;il faut encore que je créé un thème,
trouve une solution pour un système de commentaires, etc.</p>

<p>EDIT:</p>

<p>j&#8217;ai oublié de préciser comment cloner le dépôt alors voilà la commande
nécessaire:</p>

<pre><code>git clone git://rolinh.ch/dotfiles.git
</code></pre>

<p>D&#8217;ailleurs, j&#8217;ai également oublié de mentionner le fait que j&#8217;ai écrit <a href="http://git.rolinh.ch/?p=dotfiles.git&amp;a=blob&amp;h=4a26f88882b3d59700b684a21326aba762720fc5&amp;hb=aafc3fa614cfe924c6602e449d02bc02e0b97391&amp;f=linkconfig.sh">un
petit script</a> qui permet de lier les fichiers de configuration sur sa
machine. Le script est assez simple. En fait, il suffit de mettre dans les
tableaux <em>t_config</em> et <em>t_hconfig</em> les fichiers de configuration que l&#8217;on
souhaite utiliser et de lancer le script. Si un fichier de configuration
existe déjà, alors il est demandé si l&#8217;on veut l&#8217;écraser par un lien
symbolique qui pointe vers l&#8217;endroit du fichier de configuration dans le
dépôt. Je trouve cela super pratique car comme ça, mes fichiers de
configuration sont synchronisés automatiquement entre mes différents PC. De
même, si on me créé un compte sur une nouvelle machine linux, je me sens tout
de suite comme chez moi puisqu&#8217;il me suffit de cloner le dépôt et de lancer le
script pour retrouver tous mes programmes favoris configurés comme je les
aime.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[palier au problème de consommation d'énergie des noyaux linux 2.6.38 à 3.2]]></title>
    <link href="http://blog.rolinh.ch/linux/palier-au-probleme-de-consommation-denergie-des-noyaux-linux-2-6-38-a-3-2/"/>
    <updated>2011-11-14T10:40:00+01:00</updated>
    <id>http://blog.rolinh.ch/linux/palier-au-probleme-de-consommation-denergie-des-noyaux-linux-2-6-38-a-3-2</id>
    <content type="html"><![CDATA[<p>Dès la version 2.6.38 du noyau Linux, de nombreux utilisateurs d&#8217;ordinateurs
portables à base Intel ont pu voir une diminution drastique de l&#8217;autonomie de
leur engin. En cause, une régression au niveau de la consommation d&#8217;énergie du
noyau Linux.</p>

<p>Le problème est connu mais ne devrait être corrigé que dans la version 3.3 du
noyau. Une des causes est due à une non-détection automatique du PCI-Express
Active State Power Management (PCI-E ASPM). En attendant le noyau 3.3, on peut
forcer son activation en ajoutant une option à la ligne de boot du noyau dans
GRUB de sorte qu&#8217;elle ressemble à ça (pour grub-legacy):</p>

<pre><code>kernel /vmlinuz-linux root=/dev/sda6 ro pcie_aspm=force
</code></pre>

<p>Mais ce n&#8217;est pas tout! En effet, d&#8217;autres options, qui étaient activées par
défaut auparavant,  se sont vues désactivées. Ces options ne seront utiles que
si vous utilisez le pilote libre Intel. C&#8217;est mon cas avec l&#8217;Intel Core
i7-2620M de mon portable et son HD3000 intégrée. La raison de leur
désactivation serait dues à certains bugs rencontrés parfois au niveau de
l&#8217;affichage. Pour ma part, il n&#8217;en est rien et les performances semblent même
être légèrement meilleures.</p>

<p>Les trois options sont les suivantes:</p>

<ul>
<li>i915.i915_enable_rc6=1 : permet au GPU de rentrer dans une phase de basse consommation énergétique lors d&#8217;inactivité</li>
<li>i915.i915_enable_fbc=1 : compression du framebuffer</li>
<li>i915.lvds_downclock=1 : diminution du taux de rafraîchissement de l&#8217;écran LVDS</li>
</ul>


<p>A vous donc de jouer avec ces options afin de voir si certaines posent
problème. Comme chez moi, tout semble bon, je les ai toutes activées. Ainsi,
ma ligne de boot du noyau ressemble à ceci:</p>

<pre><code>kernel /vmlinuz-linux root=/dev/sda6 ro pcie_aspm=force i915.i915_enable_rc6=1 i915.i915_enable_fbc=1 i915.lvds_downclock=1
</code></pre>

<p>Le résultat chez moi? Une autonomie qui arrive au même niveau que sous
Windows! Je suis donc passé d&#8217;une autonomie d&#8217;environ 4h30 à une autonomie
d&#8217;environ 7h30. C&#8217;est loin, très loin, d&#8217;être négligeable! De plus, mon CPU a
perdu en moyenne 10°C pour se stabiliser aux alentour de 42°C quand il n&#8217;est
pas trop sollicité.</p>

<p>Ceux souhaitant plus de détails peuvent aller consulter l&#8217;<a href="http://www.phoronix.com/scan.php?page=article&amp;item=intel_i915_power&amp;num=1">article de
Phoronix</a> sur lequel je me suis basé.</p>

<p>EDIT: un peu plus de détails est apparemment nécessaire.</p>

<p>Pour grub legacy (grub 1), il faut éditer le fichier <em>/boot/menu.lst</em> et
ajouter les options à la ligne qui correspond à celle que j&#8217;ai donné en
exemple.</p>

<p>Pour grub 2 (la dernière version de grub qui est notamment utilisée dans
Ubuntu depuis la 9.10), les options peuvent s&#8217;ajouter en éditant
<em>/etc/default/grub</em> et ajouter cette ligne à la fin:</p>

<pre><code>GRUB_CMDLINE_LINUX_DEFAULT="pcie_aspm=force"
</code></pre>

<p>Les options supplémentaires peuvent s&#8217;ajouter également. Une fois ce fichier
modifié, il faut mettre à jour la configuration de grub 2 via la commande
<em>update-grub</em> (pour les distributions Debian et dérivées comme Ubuntu et Linux
Mint) ou <em>grub-mkconfig</em> (pour Archlinux),  à lancer en root évidemment. En
revanche, je n&#8217;ai pas pu vérifier car je n&#8217;utilise pas grub 2. A noter qu&#8217;il
existe un logiciel qui permettrait de faire cela graphiquement. Je vous laisse
consulter la documentation d&#8217;Ubuntu-fr à propos de <a href="http://doc.ubuntu-fr.org/grub-customizer">grub-customizer</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[un menu pour awesome permettant d'éteindre, redémarrer, mettre en veille et hiberner]]></title>
    <link href="http://blog.rolinh.ch/dev/linux/un-menu-pour-awesome-permettant-deteindre-redemarrer-mettre-en-veille-et-hiberner/"/>
    <updated>2011-11-10T17:36:00+01:00</updated>
    <id>http://blog.rolinh.ch/dev/linux/un-menu-pour-awesome-permettant-deteindre-redemarrer-mettre-en-veille-et-hiberner</id>
    <content type="html"><![CDATA[<p>Une mini-astuce pour Awesome WM au menu du jour. Mini car vraiment simpliste
mais qui peut néanmoins se révéler utile.</p>

<p>Le but: ajouter ceci au menu d&#8217;Awesome:</p>

<p><img src="http://blog.rolinh.ch/images/awesome-system-menu.png" title="Menu système pour Awesome WM" alt="" /></p>

<p>L&#8217;idée est d&#8217;utiliser <em>consolekit</em> et <em>upower</em>. Il faut donc évidemment que
les paquets correspondant à ces programmes soient installé sur votre système.
De plus, il faut également que l&#8217;utilisateur courant fasse partie du groupe
<em>power</em>. La procédure consiste à créer 4 petits scripts shell qui seront
appelés lors du clic sur le menu. Évidemment, on peut aussi s&#8217;arranger pour
utiliser  une combinaison de touche qui appelle les scripts en complément mais
je ne vais pas le détailler dans cet article.</p>

<p>On va commencer par créer un dossier nommé <em>scripts</em> dans le dossier de
configuration d&#8217;Awesome (normalement <em>~/.config/awesome</em> ):</p>

<pre><code>cd $XDG_CONFIG_HOME/awesome &amp;&amp; mkdir scripts &amp;&amp; cd scripts
</code></pre>

<p>Ceci fait, on va maintenant y ajouter les 4 scripts en question. Celui pour
l&#8217;hibernation:</p>

<pre><code>echo '#!/bin/sh\ndbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Hibernate' &gt; hibernate.sh
</code></pre>

<p>Celui pour le redémarrage:</p>

<pre><code>echo '#!/bin/sh\ndbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart' &gt; reboot.sh
</code></pre>

<p>Celui pour l&#8217;extinction:</p>

<pre><code>echo '#!/bin/sh\ndbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop' &gt; shutdown.sh
</code></pre>

<p>Et enfin celui pour la mise en veille:</p>

<pre><code>echo '#!/bin/sh\ndbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend' &gt; suspend.sh
</code></pre>

<p>Il ne faut pas oublier de rendre nos scripts exécutables:</p>

<pre><code>chmod +x suspend.sh shutdown.sh hibernate.sh reboot.sh
</code></pre>

<p>Ceci fait, il faut éditer le <em>rc.lua</em> afin de le créer ce fameux menu. On va
donc ajouter ceci, dans la section menu:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='lua'><span class='line'><span class="n">mysystemmenu</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">shutdown&quot;</span><span class="p">,</span> <span class="n">awful</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">getdir</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">config&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">/scripts/shutdown.sh&quot;</span> <span class="p">},</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">reboot&quot;</span><span class="p">,</span> <span class="n">awful</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">getdir</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">config&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">/scripts/reboot.sh&quot;</span> <span class="p">},</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">suspend&quot;</span><span class="p">,</span> <span class="n">awful</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">getdir</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">config&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">/scripts/suspend.sh&quot;</span> <span class="p">},</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">hibernate&quot;</span><span class="p">,</span> <span class="n">awful</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">getdir</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">config&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">/scripts/hibernate.sh&quot;</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Et de l&#8217;ajouter dans le menu principal:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='lua'><span class='line'><span class="n">mymainmenu</span> <span class="o">=</span> <span class="n">awful</span><span class="p">.</span><span class="n">menu</span><span class="p">({</span> <span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="p">{</span> <span class="s2">&quot;</span><span class="s">awesome&quot;</span><span class="p">,</span> <span class="n">myawesomemenu</span><span class="p">,</span> <span class="n">beautiful</span><span class="p">.</span><span class="n">awesome_icon</span> <span class="p">},</span>
</span><span class='line'>      <span class="p">{</span> <span class="s2">&quot;</span><span class="s">system&quot;</span><span class="p">,</span> <span class="n">mysystemmenu</span> <span class="p">},</span>
</span><span class='line'>      <span class="p">{</span> <span class="s2">&quot;</span><span class="s">open terminal&quot;</span><span class="p">,</span> <span class="n">terminal</span> <span class="p">},</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>Au final, la section <em>Menu</em> devrait ressembler à quelque chose dans ce genre:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='lua'><span class='line'><span class="c1">-- Create a launcher widget and a main menu</span>
</span><span class='line'><span class="n">myawesomemenu</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">manual&quot;</span><span class="p">,</span> <span class="n">terminal</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s"> -e man -P /usr/bin/vimpager awesome&quot;</span> <span class="p">},</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">edit config&quot;</span><span class="p">,</span> <span class="n">editor_cmd</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s"> &quot;</span> <span class="o">..</span> <span class="n">awful</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">getdir</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">config&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">/rc.lua&quot;</span> <span class="p">},</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">restart&quot;</span><span class="p">,</span> <span class="n">awesome</span><span class="p">.</span><span class="n">restart</span> <span class="p">},</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">quit&quot;</span><span class="p">,</span> <span class="n">awesome</span><span class="p">.</span><span class="n">quit</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="n">mysystemmenu</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">shutdown&quot;</span><span class="p">,</span> <span class="n">awful</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">getdir</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">config&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">/scripts/shutdown.sh&quot;</span> <span class="p">},</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">reboot&quot;</span><span class="p">,</span> <span class="n">awful</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">getdir</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">config&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">/scripts/reboot.sh&quot;</span> <span class="p">},</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">suspend&quot;</span><span class="p">,</span> <span class="n">awful</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">getdir</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">config&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">/scripts/suspend.sh&quot;</span> <span class="p">},</span>
</span><span class='line'>   <span class="p">{</span> <span class="s2">&quot;</span><span class="s">hibernate&quot;</span><span class="p">,</span> <span class="n">awful</span><span class="p">.</span><span class="n">util</span><span class="p">.</span><span class="n">getdir</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">config&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">/scripts/hibernate.sh&quot;</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="n">mymainmenu</span> <span class="o">=</span> <span class="n">awful</span><span class="p">.</span><span class="n">menu</span><span class="p">({</span> <span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="p">{</span> <span class="s2">&quot;</span><span class="s">awesome&quot;</span><span class="p">,</span> <span class="n">myawesomemenu</span><span class="p">,</span> <span class="n">beautiful</span><span class="p">.</span><span class="n">awesome_icon</span> <span class="p">},</span>
</span><span class='line'>      <span class="p">{</span> <span class="s2">&quot;</span><span class="s">system&quot;</span><span class="p">,</span> <span class="n">mysystemmenu</span> <span class="p">},</span>
</span><span class='line'>      <span class="p">{</span> <span class="s2">&quot;</span><span class="s">open terminal&quot;</span><span class="p">,</span> <span class="n">terminal</span> <span class="p">},</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">})</span>
</span><span class='line'><span class="n">mylauncher</span> <span class="o">=</span> <span class="n">awful</span><span class="p">.</span><span class="n">widget</span><span class="p">.</span><span class="n">launcher</span><span class="p">({</span> <span class="n">image</span> <span class="o">=</span> <span class="n">image</span><span class="p">(</span><span class="n">beautiful</span><span class="p">.</span><span class="n">awesome_icon</span><span class="p">),</span>
</span><span class='line'>                                     <span class="n">menu</span> <span class="o">=</span> <span class="n">mymainmenu</span> <span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>C&#8217;est tout. A vous d&#8217;adapter cela comme bon vous semble. ;-)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[sbin, c'est *has been*?]]></title>
    <link href="http://blog.rolinh.ch/linux/sbin-cest-has-been/"/>
    <updated>2011-11-02T23:22:00+01:00</updated>
    <id>http://blog.rolinh.ch/linux/sbin-cest-has-been</id>
    <content type="html"><![CDATA[<p>Oui, je sais, le jeu de mot du titre de l&#8217;article est pourri mais tant pis.
:-P En consultant les articles de mes flux RSS hier soir, je suis tombé sur
quelque chose que j&#8217;ai trouvé particulièrement intéressant. En effet, les
développeurs de la distribution Linux <a href="http://fedoraproject.org/fr/">Fedora</a> songent <a href="https://fedoraproject.org/wiki/Features/UsrMove">à déplacer tous les
binaires</a> dans <em>/usr/bin</em> pour Fedora 17 qui devrait sortir l&#8217;année
prochaine. Si cela vous parait un changement mineur, sachez qu&#8217;il n&#8217;en est
rien puisque l&#8217;on touche à la <a href="http://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard">hiérarchie des systèmes de fichiers</a>. La
proposition a d&#8217;ailleurs engendré une <a href="http://thread.gmane.org/gmane.linux.redhat.fedora.devel/155511/">longue discussion</a> conclue par
<a href="http://en.wikipedia.org/wiki/Lennart_Poettering">Lennart Poettering</a> qui <a href="http://article.gmane.org/gmane.linux.redhat.fedora.devel/155792">résume</a> les points abordés.</p>

<p>Je vais tenter de résumer sans trop d&#8217;erreurs ce qu&#8217;il en est concernant la
hiérarchie des fichiers des <a href="http://fr.wikipedia.org/wiki/Type_Unix">systèmes d&#8217;exploitation de type Unix</a>.</p>

<p>Peu après le milieu des années 90, une première version de la FHS (Filesystem
Hierarchy Standard) a été établie. En premier lieu nommé FSSTND (Filesystem
Standard) et visant uniquement les systèmes d&#8217;exploitation Linux, le standard
s&#8217;est élargit aux systèmes de type Unix lors du changement de nom. Il s&#8217;agit
en fait d&#8217;une formalisation étendue de la hiérarchie traditionnelle trouvée
dans <a href="http://fr.wikipedia.org/wiki/Berkeley_Software_Distribution">BSD</a>. La version actuelle du standard date de 2004 et peut se trouver
<a href="http://proton.pathname.com/fhs/">ici</a>.</p>

<p>Aujourd&#8217;hui, il est relativement bien suivit par les différentes distributions
bien que l&#8217;on peut voir quelques exceptions. Je pense notamment à Debian et
dérivés qui placent le serveur web dans <em>/var/www</em> alors qu&#8217;il devrait se
trouver, comme chez Archlinux par exemple, dans <em>/srv/http</em>. Chez les BSD
aussi on peut constater des différences. La <a href="http://www.freebsd.org/doc/handbook/dirstructure.html">hiérarchie de Freebsd</a> place
par exemple concrètement les home utilisateurs dans <em>/usr/home</em> bien qu&#8217;un
<a href="http://fr.wikipedia.org/wiki/Lien_symbolique">lien symbolique</a> <em>/home </em>existe à la racine. Il existe également des
systèmes Unix-like qui ne respectent absolument pas cette hiérarchie. Je pense
à <a href="http://www.gobolinux.org/index.php?page=at_a_glance">Gobolinux</a> par exemple mais ce genre de cas est plutôt marginal.</p>

<p>Selon FHS, <em>/usr</em> ne devrait pas contenir de binaires ou librairies vitales au
fonctionnement du système et ce dernier devrait donc être capable de démarrer
sans. Or, <a href="http://www.freedesktop.org/wiki/Software/systemd/separate-usr-is-broken">ce n&#8217;est plus le cas</a> avec <a href="http://freedesktop.org/wiki/Software/systemd">systemd</a>, écrit principalement
par Lennart Poettering justement, qui est utilisé par défaut dans Fedora
depuis la version 15 en remplacement de <a href="http://upstart.ubuntu.com/">upstart</a>. Ceci me permet de
revenir au sujet principal de ce billet puisque les développeurs derrière
Fedora veulent déplacer TOUS les fichiers binaires dans <em>/usr</em> et ainsi le
principe évoqué en début de paragraphe ne sera pas respecté. Le but recherché
par cette manœuvre est de pouvoir facilement partager <em>/usr</em>, en lecture seule
notamment, afin de faciliter les &#8220;snapshots&#8221;. Ceci concerne donc
principalement les machines virtuelles et les clusters.</p>

<p>Qu&#8217;en penser? Pour ma part, je ne suis pas contre le fait que les choses
changent et évoluent. En revanche, j&#8217;ai l&#8217;impression que ce changement majeur
s&#8217;opère de façon unilatérale chez Fedora et cela me déplaît passablement. A
quoi cela sert-il d&#8217;essayer d&#8217;établir des standards si au final on en fait sa
propre sauce?</p>

<p>Je vais quand même résumer les principaux points que Lennart Poettering a
relevés afin de clore la discussion des développeurs:</p>

<ul>
<li>Il est très difficile pour les développeurs de faire la distinction entre ce qui doit aller <em>/bin</em> et dans <em>/sbin</em>.</li>
<li>La définition originale de <em>sbin</em> est devenue obsolète (le &#8220;s&#8221; tient pour binaires &#8220;statiques&#8221;).</li>
<li>La séparation entre <em>/bin</em> et <em>/sbin</em> n&#8217;a rien à voir avec une question de sécurité et ne l&#8217;a d&#8217;ailleurs jamais été. Le fait de le faire dans ce but serait suivre le principe de &#8220;sécurité par l&#8217;obscurité&#8221; et cela est plutôt stupide.</li>
<li>La séparation de <em>/bin</em> et <em>/sbin</em> n&#8217;est pertinente que pour <em>$PATH</em> et <em>$PATH</em> ne sert qu&#8217;à faciliter l&#8217;accès aux outils pour les utilisateurs des shells.</li>
<li>Cette séparation est superflue car tous deux sont listés dans <em>$PATH</em> au sein de Fedora.</li>
<li>Cette séparation complique les choses. On ne peut justifier cela que si elle est faite pour une bonne raison or il est préférable de privilégier la simplicité.</li>
<li>Les différentes distributions Linux ne placent pas forcément les binaires aux mêmes endroits chacune et donc le regroupement serait bénéfique de ce point de vue.</li>
<li>L&#8217;idée de séparer <em>/usr</em> et <em>/</em> servait principalement pour le début du lancement du système. Le système minimal se trouvant dans <em>/</em> était juste suffisant pour trouver tout le reste de l&#8217;OS dans <em>/usr</em>. Cela n&#8217;est plus d&#8217;actualité.</li>
<li>C&#8217;est effectivement devenu obsolète en raison d&#8217;initrd.</li>
<li>Tout avoir dans <em>/usr</em> simplifie radicalement les choses dans le but d&#8217;avoir une configuration en lecture seule.</li>
<li>Cela rend les snapshots plus facile. En effet, dans le cas de btrfs, faire 5 snapshots de <em>/lib, /lib64, /bin/sbin </em>et <em>/usr</em> est bien moins efficace que de faire simplement un snapshot de <em>/usr</em>.</li>
<li>Avoir une séparation claire entre les données partageables (<em>/usr</em>) est préférable pour les configurations réseaux notamment.</li>
<li>Cela simplifie les scripts de construction (? -> &#8220;build scripts&#8221;) en amont dès lors que autoconf ne connaît pas la séparation entre <em>/</em> et <em>/usr</em>.</li>
<li>Harald a fait des tests et a constaté que c&#8217;était parfaitement viable.</li>
<li>Quelqu&#8217;un est d&#8217;accord de se charger de cette tâche.</li>
</ul>


<p>Il détaille plus ces points et en conclu qu&#8217;il y est donc très favorable,
surtout en raison du fait que cela rendra beaucoup de choses plus faciles. Il
souligne notamment le fait que cela rendra la tâche plus facile pour les
développeurs mais également pour les packageurs et les administrateurs système
qui pourront bénéficier d&#8217;une atomisation des snapshots de btrfs.</p>

<p>Je vous ai également brièvement évoqué mon point de vue mais ce qui
m&#8217;intéresserais grandement, c&#8217;est d&#8217;avoir votre avis sur le sujet. Alors,
qu&#8217;en pensez-vous?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[HTPC (PC media-center) sous AMD E-350 avec archlinux et XBMC]]></title>
    <link href="http://blog.rolinh.ch/tutos/htpc-pc-media-center-sous-amd-e-350-avec-archlinux-et-xbmc/"/>
    <updated>2011-10-25T21:19:00+02:00</updated>
    <id>http://blog.rolinh.ch/tutos/htpc-pc-media-center-sous-amd-e-350-avec-archlinux-et-xbmc</id>
    <content type="html"><![CDATA[<p>Au début de l&#8217;été dernier, des amis et moi nous sommes mis à plusieurs pour
offrir un téléviseur  Samsung LED de 46&#8221; (<a href="http://www.samsung.com/ch_fr/consumer/tv-audio-video/television/led-tv/UE46D5000PWXZG/index.idx?pagetype=prd_detail&amp;tab=specification">UE46D5000</a>) à ma copine pour son
anniversaire.  Une télévision d&#8217;entrée de gamme donc mais qui possède
néanmoins une magnifique dalle et un superbe rendu des couleurs. Cependant, un
écran pareil, c&#8217;est bien chouette mais c&#8217;est encore mieux avec un HTPC (Home
Theater PC soit un PC dédié au multimédia).</p>

<p>Je me suis donc mis en tête d&#8217;en assembler un. Mes critères principaux étaient
donc un PC silencieux, qui fonctionne bien sous Linux, capable de lire des
vidéos HD et bon marché. Ne suivant que de loin l&#8217;évolution des PC côté
hardware, je me suis donc adressé à <a href="http://horyax.fr/">Horyax</a> en ayant déjà une idée de ce
que je souhaitais. Je vous invite d&#8217;ailleurs à aller lire <a href="http://horyax.fr/pc-media-center.html">son article</a>
très instructif sur les PC media center.</p>

<p>En partant de ses conseils (AMD E-350 et mini-ITX notamment) et en composant
avec ce qui était proposé par mon revendeur habituel, j&#8217;ai abouti à cette
configuration:</p>

<ul>
<li>Carte-mère <a href="http://ch.asus.com/fr/Motherboards/AMD_CPU_on_Board/E35M1I_DELUXE/#specifications">Asus E35M1-I Deluxe</a>. Elle comprend un APU AMD E-350 soit un processeur dual-core basse consommation couplé à un GPU Radeon HD 6310. De plus, elle bénéficie d&#8217;un refroidissement passif qui permet donc d&#8217;éviter les nuisances sonores, une carte son 7.1, du Wifi, de l&#8217;USB 2 et 3 ainsi qu&#8217;un port e-sata, possibilité d’accueillir jusqu&#8217;à 8Gb de RAM en DDR3 à 1066Mhz, SATA 3 et est en format mini-ITX soit un format compact. Bref, une très bonne base pour ce que je voulais en faire.</li>
<li>Disque dur Western Digital Caviar Green de 2To.</li>
<li>2x2 Go de DDR3 1066Mhz Kingston.</li>
<li>Lecteur Bluray Samsung SH-B123L.</li>
<li>Boîtier Inwin Mini-ITX BP655 avec alimentation de 200W intégrée.</li>
</ul>


<p>Alors oui, les 4Go de RAM sont totalement injustifiés. En fait, c&#8217;est
simplement que cela me revenait pratiquement au même prix qu&#8217;un kit de 2Go de
RAM et je m&#8217;étais dis qu&#8217;en cas de problème pour lire les Bluray sous Linux,
j&#8217;allais devoir à contre-coeur y installer Windows.</p>

<p>Si je devais racheter une configuration HTPC, je ne reprendrais pas le même
boîtier. En effet, il se révèle relativement peu compact et plutôt bruyant au
niveau de l&#8217;alimentation. Je l&#8217;avais choisis en raison de son prix réduit, du
fait qu&#8217;il acceptait un disque dur au format 3.5&#8221; qui permettait l&#8217;achat d&#8217;un
disque de plus grande capacité à prix équivalent en 2.5&#8221; et surtout qu&#8217;il est
un des rares que j&#8217;ai trouvé à accepter un lecteur Bluray au format standard.
En effet, la plupart des boîtiers multimédia demandent un lecteur au format
slim, plus compact, mais également beaucoup plus cher et difficile à trouver.</p>

<p>Pour le reste, je suis parfaitement satisfait de mon achat. La déception vient
plutôt du côté des Bluray bourrés de DRM qui se retrouvent quasiment
impossible à lire sous Linux&#8230;</p>

<p>Si on considère ce dernier point et le fait que pour qu&#8217;un media-center soit
intéressant, il nécessite que toute la médiathèque se trouve sur support type
disque dur du HTPC ou partage réseau j&#8217;aurais peut-être porté mon choix sur la
<a href="http://www.blogeee.net/2011/08/test-zotac-zbox-nano-plus-un-nettop-sous-amd-e-350-dans-le-creux-de-la-main/">Zbox Nano</a>. En effet, cette solution est très intéressante car
parfaitement silencieuse, compacte et bénéficie en plus d&#8217;une télécommande!
Bref, réfléchissez bien à l&#8217;utilisation que vous ferez de votre media-center
avant de porter votre choix définitif.</p>

<p>Une fois tout ce beau matériel assemblé, je me suis attelé à  installer un
système qui convienne bien pour une utilisation media-center. J&#8217;ai donc
choisis d&#8217;y mettre <a href="http://www.archlinux.org/">Archlinux</a> associé à <a href="http://xbmc.org/about/">XBMC</a> mais sachez tout de même
que si vous n&#8217;êtes pas vraiment prêt à mettre les mains dans le cambouis, il
existe des distributions media-center toute prête telle que la récente
<a href="http://openelec.tv/">OpenELEC</a> basée sur ce même XBMC (je ne l&#8217;ai en revanche pas testée).</p>

<p>Je ne vous présente plus Archlinux mais par contre je vais m&#8217;attarder un poil
sur XBMC. Il s&#8217;agit d&#8217;un logiciel media-center multiplateforme sous licence
GPL. J&#8217;ai fait le tour de tout ce qui existait sous Linux avant d&#8217;établir mon
choix sur celui-ci. A mon sens, il s&#8217;agit clairement de la meilleure solution
media-center actuelle: gestion multilingue, système de plugins pour en étendre
les capacités, fonctionnement en stand-alone, téléchargement automatisé des
informations relatives aux films et aux albums musicaux, etc.</p>

<p>Ce que je souhaitais du côté de l&#8217;OS, c&#8217;est qu&#8217;il puisse démarrer directement
sur le media-center et que celui-ci soit contrôlable entièrement via une
application smartphone, y compris l&#8217;extinction du système. Évidemment, si je
vous en parle, c&#8217;est parce que j&#8217;y suis parvenu.</p>

<p>Je ne vais pas vous détailler l&#8217;installation d&#8217;Archlinux. Pour cela, le <a href="https://wiki.archlinux.org/index.php/Beginners%27_Guide">guide
du débutant</a> le fait très bien (mais arrêtez-vous après le reboot
c&#8217;est-à-dire avant le chapitre &#8220;post-installation&#8221;). En revanche, je vais
détailler le reste.</p>

<p>Donc, une fois l&#8217;installation d&#8217;Archlinux effectuée, vous avez redémarré et
vous vous retrouvez avec un joli prompt. La première chose à faire après vous
être connecté en tant que root est de configurer votre connexion internet et
de mettre à jour le système (étape surtout valable si vous n&#8217;êtes pas passé
par la netinstall).</p>

<p>Il faut ensuite créer un utilisateur standard. Appelons le Spoke ici pour
références ultérieures. Pour cela, la commande <em>adduser</em> fait bien son boulot.
Il est important à cette étape d&#8217;ajouter le nouvel utilisateur aux groupes
suivants: <em>audio</em>, <em>optical</em>, <em>storage</em>, <em>video</em>, <em>power</em>. Vous pouvez
l&#8217;ajouter à d&#8217;autres groupe, comme <em>wheel</em> par exemple mais cela reste
optionnel. Le reste des options peut être laissé par défaut.</p>

<p>Par la suite, on aimerait installer une interface graphique et donc, il nous
faut Xorg. A cette étape, deux choix s&#8217;offrent à vous en ce qui concerne le
pilote vidéo: utiliser le pilote ATI libre ou le pilote propriétaire Catalyst.
Si vous n&#8217;avez pas besoin de faire passer le son à travers l&#8217;HDMI, alors le
premier choix sera le mieux indiqué. Le pilote libre s&#8217;en sort effectivement
très bien si ce n&#8217;est qu&#8217;au niveau du son, ça ne passe pas encore via l&#8217;HDMI.
Sinon, il faudra installer le pilote propriétaire et c&#8217;est là que les choses
se compliquent.</p>

<p>Dans le premier cas, cela se résume à cette ligne (en root toujours) :</p>

<pre><code>pacman -S xorg-server xorg-xinit xorg-utils xorg-server-utils mesa xf86-video-ati
</code></pre>

<p>Si vous avez besoin du pilote Catalyst, alors armez-vous de courage. Il faut
savoir qu&#8217;il n&#8217;est plus supporté par la distribution et que cela amène son lot
de difficultés et de possibles cassages par la suite. A l&#8217;heure actuelle, le
pilote Catalyst ne fonctionne pas avec Xorg 1.11 qui est la version actuelle.
Il faut donc passer par l&#8217;installation de Xorg 1.10. La bonne nouvelle est
qu&#8217;il existe un dépôt créé pour cette occasion. Il faut donc éditer
<em>/etc/pacman.conf</em> et l&#8217;ajouter:</p>

<pre><code># xorg 1.10
[xorg110]
Server = http://catalyst.apocalypsus.net/repo/xorg110/$arch
</code></pre>

<p>Faites bien attention à l&#8217;ajouter au-dessus de tous les autres (c&#8217;est-à-dire
au dessus de [core]) afin qu&#8217;il prenne précédence. D&#8217;ailleurs, pendant que
l&#8217;on est dans le <em>pacman.conf</em> , il faut également y ajouter le dépôt pour le
pilote Catalyst:</p>

<pre><code># catalyst
[catalyst]
Server = http://catalyst.apocalypsus.net/repo/catalyst/$arch
</code></pre>

<p>Il faut maintenant rafraîchir les dépôts et installer Xorg ainsi que le pilote
Catalyst:</p>

<pre><code>pacman -Syu
pacman -S xorg110/xorg-server xorg110/xorg-server-common xorg110/xorg-server-utils catalyst catalyst-utils catalyst-hook xvba-video
</code></pre>

<p>catalyst-hook est optionnel mais néanmoins recommandé (il sert à reconstruire
les modules lors des mises-à-jour du noyau). J&#8217;espère ne pas avoir oublié un
paquet. S&#8217;il manquait quelque chose, merci de m&#8217;en faire part dans les
commentaires.</p>

<p>Ceci fait, il nous faut ajouter quelques paquets fortement recommandés mais
optionnels: un serveur ssh afin d&#8217;administrer à distance (d&#8217;autant plus utile
si aucun clavier n&#8217;est branché au HTPC), consolekit, udev, udisks et upower
afin de pouvoir notamment éteindre proprement la machine. Vous pouvez aussi
considérer l&#8217;installation de sshfs ou autre samba afin de partager la
médiathèque sur le réseau.</p>

<p>Il faut aussi, évidemment, installer xbmc. Le minimum en une ligne (le reste
au choix):</p>

<pre><code>pacman -S openssh consolekit udev udisks upower xbmc
</code></pre>

<p>Je mets volontairement de côté la configuration de ssh car ce n&#8217;est pas à
propos dans ce billet.</p>

<p>Passons maintenant au login utilisateur. Il existe plusieurs façon de gérer le
login automatique, notamment la méthode via inittab que je n&#8217;ai pas choisie.
La raison est toute simple: je voulais pouvoir permettre, le cas échéant, la
déconnexion de la session media-center afin de passer sur une session desktop
conventionnelle, type Xfce, de manière pratique. En effet, il ne faut pas
oublier que cette machine est un ordinateur à part entière et qu&#8217;en lui
ajoutant clavier et souris, elle est plus qu&#8217;utilisable pour une utilisation
desktop. Ma copine ne possédant qu&#8217;un vieillissant netbook, cela peut se
révéler utile.</p>

<p>Par conséquent, j&#8217;ai choisis d&#8217;utiliser le gestionnaire de connexion
<a href="http://slim.berlios.de/">Slim</a>, qui permet évidemment la connexion automatique. Pour cela, on va
donc l&#8217;installer et le configurer un minimum:</p>

<pre><code>pacman -S slim
</code></pre>

<p>Il faut maintenant éditer le fichier de configuration <em>/etc/slim.conf</em> afin de
changer ces deux lignes (il faut évidemment les décommenter):</p>

<pre><code>default_user    spoke
auto_login      yes
</code></pre>

<p>Le démon slim doit également être ajoutée dans la liste des daemons du
<em>/etc/rc.conf</em> afin qu&#8217;il soit lancé au démarrage. Cependant, ce n&#8217;est pas
finit. Il faut encore se connecter en tant que Spoke et éditer (le créer le
cas échéant)  le fichier <em>~/.xinitrc</em>. afin qu&#8217;il ressemble à ceci:</p>

<pre><code>exec ck-launch-session xbmc-standalone
</code></pre>

<p>Notez que si vous avez opté pour la méthode de connexion automatique via
inittab, le xinitrc devra être identique.</p>

<p>Que serait un media-center sans codecs? On peut remédier à cela en une ligne
(certains sont sûrement inutiles mais on est au moins parés) avec en prime ce
qu&#8217;il faut pour la lecture des DVDs:</p>

<pre><code>pacman -S a52dec faad2 flac libdca libdv libmad libtheora libvorbis libxv wavpack xvidcore gstreamer0.10-plugins libdvdread libdvdcss libdvdnav
</code></pre>

<p>Oui, je n&#8217;ai pas parlé de la lecture des Bluray&#8230; Simplement car, à mon grand
regret, je n&#8217;ai pas encore trouvé de solution viable pour leur lecture.
J&#8217;espère que la situation s&#8217;améliorera rapidement.</p>

<p>J&#8217;avais brièvement évoqué le fait de pouvoir piloter le media-center depuis
son smartphone. En effet, ne possédant pas de télécommande, j&#8217;ai trouvé cette
solution fort pratique. Pour informations, j&#8217;utilise l&#8217;application officielle
et gratuite <a href="http://code.google.com/p/android-xbmcremote/">xmbc-remote</a> pour Android et ma copine en utilise une non-
officielle pour iPhone mais je ne me rappelle plus du nom.</p>

<p>J&#8217;espère n&#8217;avoir rien oublié car j&#8217;ai écrit cet article en fonction de mes
souvenirs de l&#8217;installation. Merci de m&#8217;informer si vous testez ceci chez vous
et que vous constater qu&#8217;il manque quelque chose!</p>

<p>Allez, pour le mot de la fin de ce long billet, j&#8217;aimerais signaler que je
suis vraiment super content de mon installation si l&#8217;on excepte l&#8217;histoire de
la lecture des Bluray. En effet, même en se faisant légèrement entendre au
démarrage, le bruit de l&#8217;alimentation se fait vite oublier une fois qu&#8217;un film
est en route ou que de la musique est jouée. Bref, une installation pareille,
c&#8217;est vraiment le pied. :)</p>

<p>PS: j&#8217;ajouterai des photos de l&#8217;installation par la suite mais je n&#8217;avais pas
d&#8217;appareil photo sous la main et les photos prises depuis mon HTC Desire sont
de bien trop piètres qualités pour être publiées ici. Je retoucherai également
cet article (ou en créerai un complémentaire) afin de le peaufiner et
d&#8217;expliquer le paramétrage de XBMC (réglages permettant de contrôler xbmc
depuis son smartphone, configuration d&#8217;un share samba, etc.).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[une première bougie!]]></title>
    <link href="http://blog.rolinh.ch/divers/une-premiere-bougie/"/>
    <updated>2011-10-19T20:37:00+02:00</updated>
    <id>http://blog.rolinh.ch/divers/une-premiere-bougie</id>
    <content type="html"><![CDATA[<p>Voilà un post (presque) sans intérêt. Mon blog fête aujourd&#8217;hui sa première
bougie. Il avait d&#8217;ailleurs débuté par <a href="http://blog.rolinh.ch/divers/comme-dirait-pascal/">un post sans intérêt</a> aussi.</p>

<p>Pas mal de choses ont changé depuis le début. Je suis passé d&#8217;un blog auto-
hébergé avec une adresse noname à un hébergement sur serveur dédié avec un nom
de domaine qui m&#8217;appartient.</p>

<p>Au niveau du contenu aussi on peut constater une évolution. Je publie moins
qu&#8217;au début mais mes articles sont devenus bien plus personnels. Après tout,
je n&#8217;ai aucun intérêt à relayer de l&#8217;info qui existe déjà partout ailleurs et,
surtout, je n&#8217;ai pas le temps de suivre l&#8217;actualité et on sait tous bien que
de l&#8217;info &#8220;périmée&#8221; ça n&#8217;est pas vraiment utile.</p>

<p>En tout cas, j&#8217;espère que vous avez du plaisir à me lire et, surtout, que mes
posts se révèlent utiles et/ou intéressants.</p>

<p>Et n&#8217;hésitez pas à laisser un petit commentaire de temps en temps, ça fait
toujours plaisir. :-)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[awesome, acpitool et widget pour la batterie]]></title>
    <link href="http://blog.rolinh.ch/dev/awesome-acpitool-et-widget-pour-la-batterie/"/>
    <updated>2011-10-18T20:09:00+02:00</updated>
    <id>http://blog.rolinh.ch/dev/awesome-acpitool-et-widget-pour-la-batterie</id>
    <content type="html"><![CDATA[<p>Je dois être un peu naïf car, pendant longtemps, j&#8217;ai cru que tous les
utilisateurs d&#8217;<a href="http://awesome.naquadah.org/">Awesome WM</a> codaient leurs widgets eux-même et que cela
faisait partie du rituel de personnalisation du rc.lua. Il se trouve que
j&#8217;avais tord. En parcourant les forums d&#8217;Archlinux, on peut remarquer que la
majorité  des archers utilisent les widgets proposés par  <a href="http://git.sysphere.org/vicious/">Vicious</a>.</p>

<p>Toujours est-il que je trouve bien plus fun d&#8217;écrire tout cela soi-même (voir
notamment <a href="http://blog.rolinh.ch/linux/un-widget-controleur-pour-le-lecteur-audio-cmus-pour-awesome-wm/">cet article</a>). Je m&#8217;étais donc écrit un widget pour avoir les
informations pertinentes concernant la batterie de mon portable (pourcentage
de charge, status, temps restant). Or, pour le temps restant, je n&#8217;avais pas
creusé bien loin et m&#8217;appuyais simplement sur <a href="http://sourceforge.net/projects/acpitool/">acpitool</a> au travers d&#8217;un
<code>io.popen(acpitool -b)</code>. Je suis conscient que ce n&#8217;est pas très élégant mais je
trouvais cela simple.</p>

<p>Pourquoi je vous parle de cela? Simplement car depuis une mise-à-jour récente
d&#8217;Archlinux, acpitool n&#8217;est plus fonctionnel. En effet, il s&#8217;appuie sur
<code>/proc/acpi/battery</code> pour la collecte des informations nécessaire. Or, il
s&#8217;avère que <code>/proc/acpi/</code> est déprécié et a été ôté depuis le noyau 3.0.6-1 sur
Archlinux. Au lieu de cela, acpitool devrait chercher les informations dans
<code>/sys/class/power_supply/</code>.</p>

<p>Mon idée première a donc d&#8217;abord été de vouloir proposer un patch auprès du
développeur d&#8217;acpitool étant donné que le problème est upstream. En allant
récupéré les sources, j&#8217;ai constaté que les derniers changements apportés au
code remontent au 13 août 2009. J&#8217;ai de plus rapidement constaté qu&#8217;un patch
ne suffirait pas et que le code doit être revu dans son ensemble. Bref, fort
de ce constat, j&#8217;ai décidé de récupérer cette info désormais manquante pour
mon widget par moi-même.</p>

<p>Voici donc la version réécrite de mon widget de batterie:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
</pre></td><td class='code'><pre><code class='lua'><span class='line'><span class="c1">-- Battery status widget</span>
</span><span class='line'><span class="k">function</span> <span class="nf">activebat</span><span class="p">()</span>
</span><span class='line'>  <span class="kd">local</span> <span class="n">path</span><span class="p">,</span> <span class="n">perct</span><span class="p">,</span> <span class="n">res</span><span class="p">,</span> <span class="n">batime_h</span><span class="p">,</span> <span class="n">batime_m</span><span class="p">,</span> <span class="n">batime</span><span class="p">,</span> <span class="n">f</span>
</span><span class='line'>  <span class="c1">-- files we read from</span>
</span><span class='line'>  <span class="kd">local</span> <span class="n">charge_full</span><span class="p">,</span> <span class="n">charge_now</span><span class="p">,</span> <span class="n">current_now</span><span class="p">,</span> <span class="n">present</span><span class="p">,</span> <span class="n">status</span>
</span><span class='line'>  <span class="n">path</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="s">/sys/class/power_supply/BAT0/&quot;</span>
</span><span class='line'>  <span class="n">f</span> <span class="o">=</span> <span class="nb">io.input</span><span class="p">(</span><span class="n">path</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">present&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">present</span> <span class="o">=</span> <span class="nb">io.read</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">*number&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">f</span><span class="p">:</span><span class="n">close</span><span class="p">()</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">present</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">then</span>
</span><span class='line'>      <span class="k">return</span> <span class="s1">&#39;</span><span class="s">no&#39;</span>
</span><span class='line'>  <span class="n">en</span>
</span><span class='line'>  <span class="n">f</span> <span class="o">=</span> <span class="nb">io.input</span><span class="p">(</span><span class="n">path</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">status&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">status</span> <span class="o">=</span> <span class="nb">io.read</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">*all&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">f</span><span class="p">:</span><span class="n">close</span><span class="p">()</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">status</span> <span class="o">==</span> <span class="s1">&#39;</span><span class="s">Full</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span> <span class="k">then</span>
</span><span class='line'>      <span class="k">return</span> <span class="s1">&#39;</span><span class="s">↯&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">f</span> <span class="o">=</span> <span class="nb">io.input</span><span class="p">(</span><span class="n">path</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">charge_now&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">charge_now</span> <span class="o">=</span> <span class="nb">io.read</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">*number&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">f</span><span class="p">:</span><span class="n">close</span><span class="p">()</span>
</span><span class='line'>  <span class="n">f</span> <span class="o">=</span> <span class="nb">io.input</span><span class="p">(</span><span class="n">path</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">charge_full&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">charge_full</span> <span class="o">=</span> <span class="nb">io.read</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">*number&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">f</span><span class="p">:</span><span class="n">close</span><span class="p">()</span>
</span><span class='line'>  <span class="n">perct</span> <span class="o">=</span> <span class="p">(</span><span class="n">charge_now</span><span class="o">/</span><span class="n">charge_full</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span>
</span><span class='line'>  <span class="n">res</span> <span class="o">=</span> <span class="nb">string.format</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">%.2f&quot;</span><span class="p">,</span> <span class="n">perct</span><span class="p">)</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">perct</span> <span class="o">&lt;</span> <span class="mi">10</span> <span class="k">then</span>
</span><span class='line'>      <span class="n">res</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="s">&#39;</span> <span class="o">..</span> <span class="n">res</span> <span class="o">..</span> <span class="s1">&#39;</span><span class="s">&#39;</span>
</span><span class='line'>  <span class="k">elseif</span>   <span class="n">perct</span> <span class="o">&lt;</span> <span class="mi">20</span> <span class="k">then</span>
</span><span class='line'>      <span class="n">res</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="s">&#39;</span> <span class="o">..</span> <span class="n">res</span> <span class="o">..</span> <span class="s1">&#39;</span><span class="s">&#39;</span>
</span><span class='line'>  <span class="k">elseif</span>  <span class="n">perct</span> <span class="o">&lt;</span> <span class="mi">30</span> <span class="k">then</span>
</span><span class='line'>      <span class="n">res</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="s">&#39;</span> <span class="o">..</span> <span class="n">res</span> <span class="o">..</span> <span class="s1">&#39;</span><span class="s">&#39;</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>      <span class="n">res</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="s">&#39;</span> <span class="o">..</span> <span class="n">res</span> <span class="o">..</span> <span class="s1">&#39;</span><span class="s">&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">status</span> <span class="o">==</span> <span class="s1">&#39;</span><span class="s">Discharging</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span> <span class="k">then</span>
</span><span class='line'>      <span class="n">status</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="s">-&#39;</span>
</span><span class='line'>      <span class="c1">-- get remaining time</span>
</span><span class='line'>      <span class="n">f</span> <span class="o">=</span> <span class="nb">io.input</span><span class="p">(</span><span class="n">path</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">current_now&quot;</span><span class="p">)</span>
</span><span class='line'>      <span class="n">current_now</span> <span class="o">=</span> <span class="nb">io.read</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">*number&quot;</span><span class="p">)</span>
</span><span class='line'>      <span class="n">f</span><span class="p">:</span><span class="n">close</span><span class="p">()</span>
</span><span class='line'>      <span class="n">batime</span> <span class="o">=</span> <span class="nb">math.floor</span><span class="p">((</span><span class="n">charge_now</span> <span class="o">/</span> <span class="n">current_now</span><span class="p">)</span> <span class="o">*</span> <span class="mi">60</span><span class="p">)</span>
</span><span class='line'>      <span class="n">batime_h</span> <span class="o">=</span> <span class="nb">math.floor</span><span class="p">(</span><span class="n">batime</span> <span class="o">/</span> <span class="mi">60</span><span class="p">)</span>
</span><span class='line'>      <span class="n">batime_m</span> <span class="o">=</span> <span class="nb">string.format</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">%02d&quot;</span><span class="p">,</span> <span class="n">batime</span> <span class="o">%</span> <span class="mi">60</span><span class="p">)</span>
</span><span class='line'>      <span class="n">batime</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="s"> (&#39;</span> <span class="o">..</span> <span class="n">batime_h</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s">h&quot;</span> <span class="o">..</span> <span class="n">batime_m</span> <span class="o">..</span> <span class="s1">&#39;</span><span class="s">)&#39;</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>      <span class="n">status</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="s">+&#39;</span>
</span><span class='line'>      <span class="n">batime</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="s">&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">res</span> <span class="o">=</span> <span class="n">res</span> <span class="o">..</span> <span class="s1">&#39;</span><span class="s">% &#39;</span> <span class="o">..</span> <span class="n">status</span> <span class="o">..</span> <span class="n">batime</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">res</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="n">batinfo</span> <span class="o">=</span> <span class="n">widget</span><span class="p">({</span> <span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="s">textbox&quot;</span> <span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="s">batinfo&quot;</span> <span class="p">})</span>
</span><span class='line'><span class="c1">-- Assign a hook to update info</span>
</span><span class='line'><span class="n">activebat_timer</span> <span class="o">=</span> <span class="n">timer</span><span class="p">({</span><span class="n">timeout</span> <span class="o">=</span> <span class="mi">1</span><span class="p">})</span>
</span><span class='line'><span class="n">activebat_timer</span><span class="p">:</span><span class="n">add_signal</span><span class="p">(</span><span class="s2">&quot;</span><span class="s">timeout&quot;</span><span class="p">,</span> <span class="n">function</span><span class="p">()</span> <span class="n">batinfo</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="s">BAT: &quot;</span> <span class="o">..</span> <span class="n">activebat</span><span class="p">()</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="s"> |&quot;</span> <span class="k">end</span><span class="p">)</span>
</span><span class='line'><span class="n">activebat_timer</span><span class="p">:</span><span class="n">start</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Bien entendu, si votre batterie n&#8217;est pas BAT0 mais BAT1 ou autre, il faudra
mettre à jour cette information afin que le widget fonctionne chez vous. Au
final, ça ressemble à ça:</p>

<p><img src="http://blog.rolinh.ch/images/battery-widget.png" title="battery-widget" alt="" /></p>

<p>Il faudrait encore que je prenne le temps de l&#8217;améliorer afin qu&#8217;il prenne en
compte le temps restant jusqu&#8217;à charge complète de la batterie mais je ne me
suis pas encore penché sur le problème. En attendant, cela sera peut-être
utile à l&#8217;un d&#8217;entre vous.  ;-)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ssh: trucs et astuces]]></title>
    <link href="http://blog.rolinh.ch/tutos/ssh-trucs-et-astuces/"/>
    <updated>2011-10-06T22:20:00+02:00</updated>
    <id>http://blog.rolinh.ch/tutos/ssh-trucs-et-astuces</id>
    <content type="html"><![CDATA[<p>Dans une idée de partage, j&#8217;ai aujourd&#8217;hui écrit un simple post à propos
d&#8217;astuces ssh que j&#8217;ai glanées ça et là et qui facilitent la vie en espérant
que, dans le cas où vous ne les connaissiez pas, elles puissent vous aider
aussi.</p>

<p>En effet, j&#8217;ai remarqué que, bien souvent, les gens ne vont pas creuser les
manpages en profondeur et utilisent ssh d&#8217;une manière que j&#8217;ai envie de
qualifier de &#8220;basique&#8221;.</p>

<p>Si vous avez un tant soit peu prêté attention à la configuration de votre
sshd, vous avez sans doute changé le port par défaut (22) pour un autre (si ce
n&#8217;est pas ton cas, honte à toi!). Dès lors, pour vous connecter à votre
serveur, vous vous contentez peut-être de ceci:</p>

<pre><code>ssh -p 12345 moi@monserveur
</code></pre>

<p>Ou peut-être, vous vous pensez malin et vous avez aliasé cette commande dans
votre $SHELLrc. Or, il existe quelque chose de bien plus propre. Il suffit de
créer un fichier &#8220;config&#8221; dans votre $HOME/.ssh et d&#8217;y mettre quelque chose de
similaire à ceci:</p>

<pre><code>Host monserveur
    Hostname monserveur.org
    Port 12345
    User moi
</code></pre>

<p>Maintenant, pour se connecter, cette commande suffit:</p>

<pre><code>ssh monserveur
</code></pre>

<p>Évidemment, cela fonctionne également pour la commande scp. Au lieu de:</p>

<pre><code>scp -P 12345 monfichier moi@monserveur:
</code></pre>

<p>on peut se contenter de ceci (n&#8217;oubliez pas les &#8220;:&#8221;):</p>

<pre><code>scp monfichier monserveur:
</code></pre>

<p>Plutôt pratique non? Et vous me direz peut-être: &#8220;comment fait-on si on veut
se connecter en tant qu&#8217;un autre utilisateur sur le même serveur?&#8221; Et bien
simplement en ajoutant un autre &#8220;Host&#8221;:</p>

<pre><code>Host monserveur-autre
    Hostname monserveur.org
    Port 12345
    User autre
</code></pre>

<p>Et hop:</p>

<pre><code>ssh monserveur-autre
</code></pre>

<p>Bref, si vous avez touché à votre sshd, vous aurez également pris la peine de
désactiver le login root et le login par mot de passe pour utiliser un système
de paire de clés asymétriques (RSA, DSA ou ECDSA).</p>

<p>Pour peu que vous soyez consciencieux, vous aurez pris la peine de générer une
paire de clés avec passphrase. Et là, à chaque tentative de connexion, hop, il
faut rentrer la passphrase. Et bien il existe un moyen de rentrer la
passphrase une fois et de ne plus s&#8217;en occuper ensuite. La plupart des gens
utilisent ssh-agent pour gérer les clés. Cela fonctionne très bien mais le
problème c&#8217;est qu&#8217;en ouvrant un nouveau shell, il faudra à nouveau lancer ssh-
agent et lui fournir les clés et passphrases&#8230; Pas si pratique que cela
finalement.</p>

<p>L&#8217;autre solution consiste à utiliser keychain. Keychain n&#8217;est autre qu&#8217;un
petit soft qui fait office de frontend à ssh-agent et qui propose de faire
tourner ssh-agent par le système au lieu de par login. Ainsi, il suffit de
rentrer la passphrase au premier lancement de son shell et ensuite on n&#8217;en
parle plus.</p>

<p>Pour utiliser keychain, il suffit de l&#8217;installer via votre gestionnaire de
paquet favoris puis de rajouter une simple ligne dans votre $SHELLrc:</p>

<pre><code>eval `keychain -q --eval --agents ssh id_ecdsa`
</code></pre>

<p>De cette manière, la passphrase pour votre clé (dans mon exemple, une ecdsa)
vous sera demandée au premier lancement de votre $SHELL mais plus par la
suite.</p>

<p>La bonne nouvelle pour les zsh users c&#8217;est qu&#8217;ils vont pouvoir utiliser la
complétion sur des commandes comme celle-ci par exemple:</p>

<pre><code>scp truc monserveur:&lt;TAB&gt;
</code></pre>

<p>étant donné qu&#8217;il n&#8217;y a plus de passphrase à rentrer.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Et si PHP était British?]]></title>
    <link href="http://blog.rolinh.ch/divers/et-si-php-etait-british/"/>
    <updated>2011-08-26T22:16:00+02:00</updated>
    <id>http://blog.rolinh.ch/divers/et-si-php-etait-british</id>
    <content type="html"><![CDATA[<p>Un mini&#8211;article aujourd&#8217;hui afin de partager un blog post à l&#8217;humour très
british qui vaut vraiment le détour.</p>

<p>Le billet humoristique (en anglais) commence ainsi:</p>

<p>&#8220;When <a href="http://toys.lerdorf.com/">Rasmus Lerdorf</a> first put <a href="http://www.php.net/">PHP</a> together, he - quite sensibly,
despite his heritage - chose not to write it in Greenlandic or Danish. Good
job too - that would have been rather unpleasant to work with. He opted
instead, being in Canada at the time, for the local tongue. No, not French -
that bastard dialect of the Queen&#8217;s English commonly referred to as &#8220;US
English&#8221;&#8221;</p>

<p>A quoi donc ressemblerait PHP s&#8217;il avait été écrit en British english et non
en US english? Je vous invite à lire l&#8217;article <a href="http://www.addedbytes.com/blog/if-php-were-british/">If PHP Were British</a>.</p>

<p>Par exemple, l&#8217;auteur suggère que ce bloc standard de gestion d&#8217;une exception:</p>

<pre><code>    try {
        // Code here
    } catch (Exception $e) {
        // Handle exception
        die('Message');
    }
</code></pre>

<p>devienne ceci:</p>

<pre><code>    would_you_mind {
        // Code here
    } actually_i_do_mind (Exception £e) {
        // Politely move on
        cheerio('Message');
    }
</code></pre>

<p>et fournit l&#8217;explication qui explique pourquoi.</p>
]]></content>
  </entry>
  
</feed>

