Olivier Schwander : bloc-notesEmacs/Org modeurn:uuid:caee971d-9bd2-4c78-945f-57f6363477d62012-10-07T13:26:11+02:00Olivier Schwander
<p>Pour faciliter l'ajout de disques sur le site de métadonnées musicales
<a href="http://musicbrainz.org/">MusicBrainz</a>, il existe un parser
</p>
<pre class="example">1. Trumpet Concerto in E flat : I Allegro con spirito 11:36
2. Trumpet Concerto in E flat : II Andante 5:24
3. Trumpet Concerto in E flat : III Rondo 4:01
[...]
17. Trumpet Concerto in E flat Hob Vlle/1 : III Allegro 4:24
18. Trumpet Concerto in D major : I Maestoso-Grazioso 8:54
[...]
35. Trumpet Concerto in F major : III Allegro 6:39
36. Trumpet Concerto in B flat : I Allegro 3:37
[...]
55. Concerto in C major 'Per la Solennità' RV556 : IV Allegro 4:32
</pre>
<pre class="src src-awk"><span style="color: #00ffff;">BEGIN</span> {
n=1
}
{
<span style="color: #00ffff;">if</span> ($0 == <span style="color: #ffa07a;">""</span>) {
n = 1;
<span style="color: #b0c4de;">print</span>;
}
<span style="color: #00ffff;">else</span> {
$1 = n <span style="color: #ffa07a;">"."</span>;
<span style="color: #b0c4de;">print</span>
n = n + 1;
}
}
<span style="color: #00ffff;">END</span> {
<span style="color: #b0c4de;">print</span> <span style="color: #ffa07a;">"done"</span>
}
</pre>
Renuméroter des lignes avec awk2012-10-07T12:07:00+02:00urn:uuid:7e15923e-65b9-45f9-bb51-af49ea856a02
<p> <span class="timestamp-wrapper"> <span class="timestamp">2012-08-06 lun.</span></span><br/>
</p>
<p>
J'ai enfin trouvé comment faire marcher org-protocol avec un Firefox
récent (sur une machine où org-protocol n'a jamais été utilisé,
ailleurs, étrangement, ça ne pose pas de problème). Aucune des
techniques dont je parlais dans le précédent billet n'avait l'air de
marcher: utiliser gconf n'était de toute façon pas une bonne idée
(mais ça m'a permis de découvrir qu'il était encore installé et de
m'en débarrasser) et les méthodes décrites sur <a href="http://kb.mozillazine.org/Register_protocol">mozillazine</a> n'ont pas
l'air de marcher avec un Firefox récent.
</p>
<p>
J'ai enfin trouvé une solution en adaptant ce qui était proposé dans
un message sur la liste org:
<a href="https://lists.gnu.org/archive/html/emacs-orgmode/2011-05/msg00298.html">https://lists.gnu.org/archive/html/emacs-orgmode/2011-05/msg00298.html</a>.
</p>
<p>
Visiblement, la façon <i>moderne</i> de gérer des associations de fichiers
et des protocoles est d'utiliser un fichier <code>.desktop</code> (ça commence
mal…): voici donc le fichier <code>org-protocol.desktop</code>, à placer dans
<code>~/.data/applications</code> (ou <code>$XDG_DATA_DIRS/applications</code> si vous
utilisez un emplacement personnalisé).
</p>
<pre class="src src-desktop">[Desktop Entry]
Name=org-protocol
Exec=emacsclient %u
Type=Application
Terminal=false
Categories=System;
MimeType=x-scheme-handler/org-protocol;
</pre>
<p>
Il faut ensuite mettre à jour le cache des types MIME, avec
</p>
<pre class="src src-sh">update-desktop-database ~/.data/applications
</pre>
<p>
Je suis content que ça marche mais comme d'habitude avec les outils
Freedesktop, je n'ai rien compris…
</p>Enregistrer le protocole org-protocol2012-08-06T22:59:00+02:00urn:uuid:6c1aaf7e-0bbd-4ecb-af91-ad125cce8efc
<p> <span class="timestamp-wrapper"> <span class="timestamp">2010-10-01 ven. 16:24</span></span><br/>
</p>
<p>
Org-protocol est une interface pour parler à Org-mode depuis l'extérieur
et pour lancer par exemple org-capture depuis l'extérieur.
</p>
<div id="outline-container-1" class="outline-3">
<h3 id="sec-1">Activation</h3>
<div class="outline-text-3" id="text-1">
<p>
Avec Gnome installé :
</p>
<pre class="src src-sh">gconftool-2 -s /desktop/gnome/url-handlers/org-protocol/command <span style="color: #ffa07a;">'/usr/bin/emacsclient %s'</span> --type String
gconftool-2 -s /desktop/gnome/url-handlers/org-protocol/enabled --type Boolean true
</pre>
<p>
Sans, voir ici :
</p>
<p>
<a href="http://kb.mozillazine.org/Register_protocol">http://kb.mozillazine.org/Register_protocol</a>
</p>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2">Exemple d'utilisation</h3>
<div class="outline-text-3" id="text-2">
<p>
Commençons par rajouter le marque-page suivant dans votre navigateur, Il
permettra de lancer le modèle "l" d'org-capture :
</p>
<pre class="example">javascript:location.href='org-protocol://capture://l/'+encodeURIComponent(location.href)+'/'+encodeURIComponent(document.title)+'/'+%20encodeURIComponent(window.getSelection())
</pre>
<p>
Le modèle utilisé d'org-capture ressemble à ça :
</p>
<p>
Les variables utilisées sont les suivantes :
</p><ul>
<li><code>%:description</code> le titre de la page
</li>
<li><code>%u</code> la date
</li>
<li><code>%:link</code> le lien vers la page
</li>
</ul>
<p>
Plus d'informations sur <a href="http://orgmode.org/worg">Worg</a> :
<a href="http://orgmode.org/worg/org-contrib/org-protocol.php">http://orgmode.org/worg/org-contrib/org-protocol.php</a>
</p></div>
</div>
Parler à Org-mode depuis Firefox : org-protocol2010-10-06T18:26:00+02:00urn:uuid:b8ce3024-5cff-4040-925c-b2b1c18417cb
<p> <span class="timestamp-wrapper"> <span class="timestamp">2010-07-23 ven. 14:57</span></span><br/>
Monter un disque externe ou une clé usb est devenue une opération
presque transparente avec les environnements de bureau moderne (enfin,
je crois, on branche et on voit une fenêtre apparaître, c'est ça ?).
Que faire si vous n'utilisez pas d'environnement de bureau, comme
Gnome, KDE ou Xfce, mais juste un gestionnaire de fenêtre, xmonad dans
mon cas, ou même pas d'interface graphique du tout ?
</p>
<p>
Je ne veux pas d'un daemon qui tourne en permanence pour deux
raisons :
</p><ul>
<li>je n'aime pas avoir un programme qui tourne en permanence mais qui
ne sert presque jamais;
</li>
<li>on détruit le coté multi-utilisateur du système linux : celui qui
lance le daemon devient le maître de toutes les clés usb.
</li>
</ul>
<p>
Que reste-t-il ?
</p><ul>
<li><code>mount</code>
</li>
<li><code>pmount</code>
</li>
<li><code>gnome-mount</code>
</li>
<li><code>halmount</code>
</li>
<li><code>devkit-disks</code>
</li>
</ul>
<p>
<code>mount</code> oblige d'une façon ou d'une autre à se logguer en root, avec
sudo, su ou directement. Il faut donc être root sur la machine et il
n'y aucun moyen de limiter les opérations aux seuls disques externes.
</p>
<p>
<code>pmount</code> est ma solution préférée. Il fonctionne pour un utilisateur
normal et seulement pour les disques externes. Par contre, il faut
qu'il soit installé, pas évident si vous n'êtes pas votre
administrateur.
</p>
<p>
<code>gnome-mount</code> ne semble plus être fourni avec les Gnome récents (au
moins sur Fedora 12). C'est dommage, il marchait à peu près bien et
était installé presque partout.
</p>
<p>
<code>halmount</code> est un script que j'avais trouvé <a href="http://www.quadronyx.org/blogs/fallen/2009/02/11/command_line_mounting_hal_dbus">ici</a>. Il parle à Hal à
travers Dbus. La version que j'ai est cassée depuis quelques temps,
sans que je ne sache pourquoi (et que j'aie le temps d'enquêter).
</p>
<p>
<code>devkit-disks</code> est fourni avec DeviceKit (encore une autre saleté
incompréhensible en plus de Hal et Dbus et dont le rôle n'est pas
clair). Il marche bien, mais ne laisse pas la possibilité de choisir
le point de montage.
</p>
<p>
En résumé,
</p><ul>
<li>sur l'une des mes machines, <code>pmount</code>;
</li>
<li>si je ne suis pas root, mais que <code>pmount</code> est installé, <code>pmount</code>;
</li>
<li>dans tous les autres cas (au moment où j'écris), <code>devkit-disks</code>.
</li>
</ul>
Monter un disque en ligne de commande2010-07-23T14:56:00+02:00urn:uuid:6381fd91-a67c-49a7-8e9e-745b0121a202
<p> <span class="timestamp-wrapper"> <span class="timestamp">2009-09-04 Fri. 16:39</span></span><br/>
</p>
<p>
J'ai longtemps cherché une solution simple pour gérer les articles
scientifiques que je lis. En effet, un répertoire rempli de fichiers PDF
en vrac n'est pas l'idéal pour retrouver le papier lu il y a trois mois
et écrit par untel.
</p>
<p>
Je voulais une application pas en java, sans interface graphique, qui ne
dépende pas d'un serveur de base de donnée, qui utilise évidemment
bibtex pour le stockage des données et qui permette d'accéder
directement au PDF de l'article.
</p>
<p>
En fait, il existe une solution toute simple: <a href="http://www.lri.fr/~filliatr/bibtex2html/index.fr.html">bibtex2html</a>. Il permet de
convertir un fichier bibtex en une page web et peut ajouter des liens
vers les PDFs si le champ correspondant a été rempli dans la base
bibtex. À l'origine, c'est prévu pour présenter une liste de publication
sur un site web mais pourquoi ne pas s'en servir juste comme interface
avec son stock de publications ?
</p>
<p>
En bref, voici ce que j'utilise (tout dans un même répertoire) :
</p><ul>
<li>un fichier Bibtex
</li>
<li>un Makefile
</li>
<li>des pdfs nommés de la façon suivante : clé_bibtex.pdf
</li>
</ul>
<p>
Le Bibtex ressemble à ça :
</p>
<pre class="src src-bibtex"><span style="color: #87cefa;">@article</span>{<span style="color: #7fffd4;">bmdg2005</span>,
<span style="color: #eedd82;">title</span> = {{Clustering with Bregman divergences}},
<span style="color: #eedd82;">author</span> = {Banerjee, A. and Merugu, S. and Dhillon, I.S. and Ghosh, J.},
<span style="color: #eedd82;">journal</span> = {The Journal of Machine Learning Research},
<span style="color: #eedd82;">volume</span> = {6},
<span style="color: #eedd82;">pages</span> = {1705--1749},
<span style="color: #eedd82;">year</span> = {2005},
<span style="color: #eedd82;">publisher</span> = {MIT Press Cambridge, MA, USA},
<span style="color: #eedd82;">pdf</span> = {bmdg2005.pdf}
}
</pre>
<p>
Remarquez le champ "pdf" qui contient le chemin (relatif ici, mais vous
mettez ce que vous voulez) vers l'article.
</p>
<p>
Le Makefile est assez trivial :
</p>
<pre class="src src-makefile"><span style="color: #87cefa;">see</span>: html
firefox articles.html
<span style="color: #87cefa;">html</span>: articles.bib
bibtex2html -dl $<span style="color: #7fffd4;"><</span>
</pre>
<p>
C'est suffisant pour obtenir un fichier html et utiliser les fonctions
de recherche du navigateur: exemple
<a href="http://www.lri.fr/~filliatr/liste_publis.fr.html">http://www.lri.fr/~filliatr/liste_publis.fr.html</a>.
</p>Gestion d'articles2009-09-04T16:39:00+02:00urn:uuid:4ed957dc-2e49-44a9-9263-e1e78f1b76c8
<p> <span class="timestamp-wrapper"> <span class="timestamp">2009-03-19 Thu. 18:52</span></span><br/>
</p>
<p>
Xjump est l'un des jeux les plus stupides et les plus abrutissant qui
soit : un petit bonhomme ridicule qui doit sauter de plate-forme en
plate-forme en évitant de tomber. Si vous ne connaissez pas, jetez un
œil à la description du paquet debian
<a href="http://packages.debian.org/fr/sid/xjump">http://packages.debian.org/fr/sid/xjump</a>.
</p>
<p>
C'est déjà rigolo avec un clavier, alors essayons avec une wiimote !
</p>
<p>
Voici un patch contre la version 2.7.5 avec les patch debian appliqués
(voir le lien précedent pour télécharger le sources, ou alors,
<code>apt-get source xjump</code>) :<a href="http://chadok.info/~oschwand/patches/wiixjump.patch">http://chadok.info/~oschwand/patches/wiixjump.patch</a>
</p>
<p>
Après avoir appliqué le patch, il faudra le paquet libcwiid1-dev pour
compiler le xjump modifié. Il suffit ensuite d'agiter la télécommande
pour contrôler le bonhomme.
</p>
<p>
Désolé, je ne fournis pas de vidéo montrant la chose en action :)
</p>Wiixjump ou xjump contrôlé à la wiimote2009-03-19T18:52:00+02:00urn:uuid:0c50e632-804d-40e0-a454-3841148c13ff
<p> <span class="timestamp-wrapper"> <span class="timestamp">2009-01-17 Sat. 16:14</span></span><br/>
</p>
<p>
Voici une petite extension de syntaxe pour Ocaml (donc écrite avec
camlp4) permettant de déclarer explicitement les types des fonctions,
mais avec une syntaxe inspirée de celle de Haskell.
</p>
<p>
En Ocaml, la façon classique de déclarer un type est la suivante :
</p>
<pre class="src src-ocaml"><span style="color: #ffa500; font-weight: bold;">let</span> <span style="color: #87cefa;">f</span><span style="color: #eedd82;"> </span><span style="color: #f0e68c;">(</span><span style="color: #eedd82;">x</span><span style="color: #f0e68c;">:</span> <span style="color: #98fb98;">int</span><span style="color: #f0e68c;">)</span> <span style="color: #f0e68c;">(</span><span style="color: #eedd82;">y</span><span style="color: #f0e68c;">:</span> <span style="color: #98fb98;">int</span><span style="color: #f0e68c;">)</span> <span style="color: #f0e68c;">:</span> <span style="color: #98fb98;">int </span><span style="color: #f0e68c;">=</span> x <span style="color: #f0e68c;">+</span> y
</pre>
<p>
On déclare ainsi une fonction prenant deux arguments de type
<code>int</code> et renvoyant un entier.
</p>
<p>
En Haskell vous feriez ça de la façon suivante:
</p>
<pre class="src src-haskell"><span style="color: #87cefa;">f</span> <span style="color: #eedd82;">::</span> <span style="color: #98fb98;">Int</span> <span style="color: #eedd82;">-></span> <span style="color: #98fb98;">Int</span> <span style="color: #eedd82;">-></span> <span style="color: #98fb98;">Int</span>
<span style="color: #87cefa;">f</span> x y <span style="color: #eedd82;">=</span> x <span style="color: #eedd82;">+</span> y
</pre>
<p>
Les deux approches ont leur avantages et leurs inconvénients, mais
personnellement, je trouve la façon haskellienne plus lisible. Voici
donc ce que permet l'extension de syntaxe pa_declare:
</p>
<pre class="src src-ocaml">declare <span style="color: #eedd82;">f</span> <span style="color: #f0e68c;">:</span> <span style="color: #98fb98;">int </span><span style="color: #f0e68c;">-></span><span style="color: #98fb98;"> int </span><span style="color: #f0e68c;">-></span><span style="color: #98fb98;"> int</span>
<span style="color: #f0e68c;">[...]</span>
<span style="color: #ffa500; font-weight: bold;">let</span> <span style="color: #87cefa;">f</span><span style="color: #eedd82;"> x y </span><span style="color: #f0e68c;">=</span> x <span style="color: #f0e68c;">+</span> y
</pre>
<p>
L'intérêt majeur est de pouvoir séparer la déclaration de type de la
définition. Évidemment, c'est à ça que servent les fichiers d'interface
d'un module (.mli) mais on peut ici déclarer le type de fonctionz qui ne
sont pas exportées. Je ne pense pas que ce soit très utile pour les
rares cas où on a besoin de noter explicitement un type pour éviter des
problèmes lors de l'inférence, non, ça me permet surtout intéressant à
des fins de documentation: un lecteur n'a pas à refaire à la main
l'inférence de type pour connaître le type d'une fonction. Et
contrairement à des commentaires, le typage nous garantit que les
<code>declare</code> seront toujours en phase avec le code.
</p>
<p>
Un dépôt darcs est disponible ici : <a href="http://chadok.info/darcs/pa_declare">http://chadok.info/darcs/pa_declare</a>
</p>Déclarations de type façon Haskell en Ocaml2009-01-17T16:14:00+02:00urn:uuid:0531a20d-ba17-42eb-93d4-3db0849c9562
<p> <span class="timestamp-wrapper"> <span class="timestamp">2008-11-06 Thu. 16:40</span></span><br/>
</p>
<p>
Quelques temps après cet article,
<a href="http://callcc.chadok.info/2008/05/13/gestion-de-paquets-cote-utilisateur-normal">http://callcc.chadok.info/2008/05/13/gestion-de-paquets-cote-utilisateur-normal</a>
de paquets, côté utilisateur normal, voici une première version publique
de Lack, un gestionnaire de paquets qui implémente les idées présentées
dans l'article.
</p>
<p>
Il reste du travail, mais il est déjà possible d'installer simplement
des paquets, juste à l'aide de l'url d'un fichier xml qui décrit le
logiciel et les commandes de compilation. Allez donc voir le <a href="http://chadok.info/lack">site web</a>.
</p>
<p>
Ce qui manque :
</p><ul>
<li>les mises à jour automatisées,
</li>
<li>la gestion de dépendances,
</li>
<li>des utilisateurs.
</li>
</ul>
Lack2008-11-06T16:40:00+02:00urn:uuid:8e1c470f-de96-47cb-a1a9-9e49fc08f2e9
<p> <span class="timestamp-wrapper"> <span class="timestamp">2008-11-01 Sat. 17:38</span></span><br/>
</p>
<p>
Si le seul rapport que vous entretenez avec Gnome consiste en
l'utilisation de son gestionnaire de connexion, gdm, vous avez peut-être
à subir à chaque connexion ssh des fenêtres de ce genre :
</p>
<p>
<img src="documents/gnome-keyring.png" alt="documents/gnome-keyring.png" />
</p>
<p>
Comme la plupart des non-utilisateurs de Gnome (et une bonne partie de
ceux-ci aussi) , vous êtes assez grand pour vous occuper tout seul de
vos clés privées et en avez assez de ces messages importuns ?
</p>
<p>
Le coupable est gnome-keyring (dont gnome dépend) et la lecture de
/usr/share/doc/gnome-keyring/README.Debian nous apprend que ce daemon
est lancé par gdm, lors de la connexion.
</p>
<p>
Ça n'est vraiment pas évident à comprendre en lisant ce fichier, mais on
se rend compte qu'il existe un module PAM, pam_gnome_keyring.so, chargé
de lancer ce truc : c'est à dire qu'il lancé lors de la phase
d'authentification. Le fichier de configuration pour gdm est
/etc/pam.d/gdm, il suffit de supprimer toutes les lignes qui parlent de
pam_gnome_keyring.so pour échapper à cette abomination.
</p>
<p>
C'est tout simple, mais il m'a fallu 3 mois pour comprendre d'où sortait
ce truc.
</p>Gnome-keyring et les bonnes manières2008-11-01T17:38:00+02:00urn:uuid:7353fc31-6195-48b6-96d1-e1b1ccc63b3d
<p> <span class="timestamp-wrapper"> <span class="timestamp">2008-07-08 Tue. 23:39</span></span><br/>
</p>
<p>
Plein de biologistes courent après des bestiaces pour leur coller de
joyeux émetteurs un peu partout. D'autres préfèrent rester chez eux et
étudier la diffusion d'information sur cette terre pas si nette que ça.
Dans un moment de faiblesse, je décidé de contribuer à cette œuvre
tour-de-babelistique (ne pas confondre avec ballistique, ou pas).
</p>
<div id='flashviz'><object width='400' height='400'><param
name='flashVars' value='id=fc490ca45c0265fe0bcc00b3&q=65'><param
name='movie'
value='http://srv2.happyflu.com/viz/fc490ca45c0265fe0bcc00b3.swf'><embed
src='http://srv2.happyflu.com/viz/fc490ca45c0265fe0bcc00b3.swf'
flashVars='id=fc490ca45c0265fe0bcc00b3&q=65' width='400'
height='400'></embed></object><script
type='text/javascript'>(function(){var
callback=function(e){e=e?e:window.event;if(e.stopPropagation)e.stopPropagation();if(e.preventDefault)e.preventDefault();e.cancelBubble=true;e.cancel=true;e.returnValue=false;return
false;};var
e=document.getElementById('flashviz');if(e.addEventListener)e.addEventListener('DOMMouseScroll',callback,false);else
if(e.attachEvent)e.attachEvent('onmousewheel',callback);})();</script></div>
<p>
Pour participer vous aussi, n'hésitez pas à cliquer sur le lien "Spread
It" et à bien suivre les instructions.
</p>
<p>
Sondage : vous aussi, vous trouvez que c'est violet cette chose ?
J'hésite entre taper sur des gens pour avoir une couleur qui va mieux
avec ce site, ou taper sur mon site pour avoir une couleur qui va mieux
avec cette chose.
</p>Les petits lutins du nain ternette2008-07-08T23:39:00+02:00urn:uuid:74b3a908-079c-4f58-b485-1367323999b4
<p> <span class="timestamp-wrapper"> <span class="timestamp">2008-05-13 Tue. 07:54</span></span><br/>
</p>
<p>
Les systèmes de gestion de paquets traditionnels – apt, rpm, emerge ou
autres – ne peuvent être utilisés que par root. Pourtant, il est
courant de ne pas être root sur une machine et d'avoir besoin
d'installer des logiciels. Quels sont alors les solutions envisageables?
</p>
<ul>
<li>avoir un root gentil qui accepte d'installer tous les paquets dont on a besoin, et ce, avec une latence suffisamment faible pour que ce soit confortable. Pas sûr non plus qu'il accepte d'installer xjump sur votre lieu de travail.
</li>
<li>pirater le compte root : en général, vous n'aurez plus aucune chance que root soit gentil après ça.
</li>
<li>donner le sudo qui va bien à tous les utilisateurs : seul des jusqu'ubuntistes fanatiques l'envisageront sérieusement.
</li>
<li>tout faire à coup de ./configure –prefix=/home/toto/local. C'est la solution la plus simple mais elle rend pratiquement impossible la désintallation propre ou des mises à jour automatisées.
</li>
<li>utiliser xstow qui installera chaque logiciel dans un sous répertoire de la forme prefix/stow/bla et gérera les liens symboliques comme il faut pour que ce soit utilisable. Pratique pour désinstaller, mais aucune chance d'avoir des mises à jours automatisées avec ça : il faudra encore surveiller les sites webs et télécharger puis installer à la main les nouvelles versions.
</li>
<li>utiliser le mode rootless de <a href="http://www.gobolinux.org">Gobolinux</a>. Gobolinux est une
distribution linux qui reviste FHS pour faire quelque chose qui
ressemble plus à MacOSX. Elle propose en particulier un mode baptisé
<a href="http://gobo.kundor.org/wiki/Rootless">rootless</a> qui peut s'installer sans être root, comme surcouche à une
distribution existante. Tous les paquets sont installés dans un
chemin du genre <i>home/toto</i>.gobolinux et sont gérés avec les outils
de gestion de paquets normaux de gobolinux. Un script fourni se
charge de mettre à jours les variables d'environnement qui finissent
en PATH. L'installation d'un paquet se fait avec un simple Compile
bla, les mises à jours peuvent se faire d'une seule commande, comme
dans un gobolinux normal. De plus, le format des paquets (en fait,
de simple fichiers textes appelés recettes) est très simple à
comprendre et il est aisé de faire ses propres ajouts. Par contre,
le système de gestion des dépendances vous obligera souvent à
recompiler tout (en commençant par gcc et la libc) avant d'installer
un paquet. Une solution peu élégante consiste à éditer à la main les
recettes pour supprimer les dépendances qui sont déjà présentes sur
le système.
</li>
<li>utiliser <a href="http://nixos.org">Nix</a>. Ce projet se décrit
lui-même comme étant un gestionnaire de paquets purement fonctionnel
au sens où toute modification du système est le résultat (de façon
déterministe) de l'évaluation d'une expression. Il propose de garantir
de façon forte que la description des dépendances est complète (si ça
compile, c'est que les dépendances sont suffisantes). On peut
l'installer dans son home et bénéfécier des outils fournis pour
installer, désinstaller, mettre à jour. L'inconvénient majeur est que
le système de traitement des dépendances oblige vraiment à tout
recompiler, et là, pas question de bidouiller la liste des
dépendances.
</li>
</ul>
<p>
Gobolinux me semble pour le moment le système le plus adapté pour une
gestion de paquets par un utilisateur simple. Cependant, si on a du
temps libre devant soi (beaucoup) et de l'espace disque à profusion, on
peut recompiler un système complet avec Nix.
</p>Gestion de paquets, côté utilisateur normal2008-05-13T07:54:00+02:00urn:uuid:5a9bec0d-07a7-4edb-854c-89a482b2122b
<p> <span class="timestamp-wrapper"> <span class="timestamp">2008-05-06 Tue. 13:15</span></span><br/>
</p>
<p>
Wikipedia appelle ça des <a href="http://fr.wikipedia.org/wiki/Site_d'hébergement_de_fichiers_en_un_clic">Site d'hébergement de fichiers en un clic</a> et le
projet <a href="http://home.gna.org/jyraphe">Jyraphe</a>> veut permettre à n'importe qui de monter ce genre de
site.
</p>
<p>
Que faire si vous n'aimez pas les souris ? Il faudrait des sites
d'hébergement en une seule commade, tapée dans un terminal:
</p>
<p>
Voici un script shell qui se propose de rendre ce service : si vous
disposez d'un serveur web, accessible par ssh, il copiera les fichiers
passés en argument dans un répertoire doté d'un nom aléatoire et visible
à partir du web.
</p>
<pre class="src src-bash">#! /bin/sh
SSH_HOST=
BASE_DIR=
BASE_URL=
HTTPD_GROUP=www-data
source ~/.poubellerc
if [ <span style="color: #ffa07a;">"$1"</span> = <span style="color: #ffa07a;">"-f"</span> ]; then
shift;
source $1;
shift;
fi
rand=$(dd if=/dev/urandom count=64 bs=1 2&gt;/dev/null | sha1sum | cut -c1-40)
dir=$BASE_DIR/$rand
echo $BASE_URL/$rand
ssh $SSH_HOST mkdir -p $dir &amp;&amp;
ssh $SSH_HOST touch $dir/../index.html &amp;&amp;
scp $* $SSH_HOST:$dir &amp;&amp;
ssh $SSH_HOST chgrp $HTTPD_GROUP -R $dir &amp;&amp;
ssh $SSH_HOST chmod g+rX -R $dir
</pre>
<p>
La configuration sera placée dans le fichier .poubellerc ou dans un
fichier dont le chemin sera donné grâce à l'option -f.
</p>
<p>
Par exemple, vous pouvez télécharger ce script à l'adresse suivante :
<a href="http://chadok.info/~oschwand/poubelle/7fb4f3e0be5bcf623b641981c51f742d7b8bf21a/poubelle.sh">http://chadok.info/~oschwand/poubelle/7fb4f3e0be5bcf623b641981c51f742d7b8bf21a/poubelle.sh</a>
</p>
<p>
Vous pouvez envoyer plusieurs fichiers en même temps, qui seront tous
placés dans le même répertoire.
</p>
<p>
L'url du répertoire sera affichée par le script : à vous de diffuser
juste le chemin vers le répertoire, ou une url complète vers un fichier.
Cette façon de faire permet d'avoir juste des pages statiques : pas
besoin de mémoriser la correspondance hash/nom de fichier et ni d'un
script qui fait la traduction au moment du téléchargement.
</p>
<p>
Comme la sécurité repose sur le secret du nom du répertoire, il faudrait
désactiver l'affichage de la liste des fichiers dans le répertoire
parent : ici, on se contente de faire un touch sur index.html pour que
le serveur ne renvoie pas la liste, mais ce n'est pas vraiment sûr.
</p>Site d'hébergement de fichiers en un clic2008-05-06T13:15:00+02:00urn:uuid:4ac9d8f5-db25-45fe-9a54-da763a80e44c
<p> <span class="timestamp-wrapper"> <span class="timestamp">2007-11-09 Fri. 23:46</span></span><br/>
</p>
<p>
Comment trouver des livres en texte intégral, qu'ils soient libres ou que les auteurs aient décidé de les publier sous une licence acceptable ?
</p>
<p>
Voici un liste non-exhaustive :
</p><ul>
<li><a href="http://abu.cnam.fr">http://abu.cnam.fr</a>
</li>
<li><a href="http://www.inlibroveritas.net">http://www.inlibroveritas.net</a>
</li>
<li><a href="http://books.google.fr">http://books.google.fr</a>
</li>
<li><a href="http://gallica.bnf.fr">http://gallica.bnf.fr</a>
</li>
<li><a href="http://www.gutenberg.org">http://www.gutenberg.org</a>
</li>
<li><a href="http://fr.wikisource.org">http://fr.wikisource.org</a>
</li>
</ul>
Livres dans le domaine publique2007-11-09T23:46:00+02:00urn:uuid:d9b9d737-c95b-4362-9b70-82d2552b7bbc
<p> <span class="timestamp-wrapper"> <span class="timestamp">2007-10-18 Thu. 23:24</span></span><br/>
</p>
<p>
Vous êtes à la bourre (comme d'habitude quoi), il vous faut un site
internet pour hier. Évidemment un site où plusieurs personnes vont
contribuer. Vous pensez à un wiki ? Bien, mais lequel choisir ? On peut
déjà réduire pour le cas le plus classique : vous ne contrôlez pas le
serveur, vous n'avez que du php à votre disposition. Mais ça fait encore
plein de choix ça. Si en plus vous n'avez pas envie de vous embêter avec
une base de donnée, dokuwiki est fait pour vous.
</p>
<p>
Tous les articles sont stockés dans de simple fichiers (évidemment, il
faut le droit d'écriture pour le serveur http) donc pas de base de
données, il y a une gestion des ACL (bien mieux faite, ou du moins bien
plus simple à utiliser que celle de mediawiki) ce qui est pratique pour
mélanger site web publique et site pour développeurs.
</p>
<p>
Les plugins sont nombreux, on peut les installer directement par
l'interface web (pratique si on ne veut pas subir encore un fois un
client ftp) : par exemple pour afficher du latex ou du graphviz (même si
il faut un latex sur la machine dans ce cas). Il peut être transformé en
blog grâce au système de templates prodigieusement puissant.
</p>
<p>
Si on veut vraiment être un bourrin et utiliser ça à grande échelle on
peut même utiliser un ldap pour la gestion des comptes utilisateurs.
Toutes les pages sont mises en cache pour éviter de passer des plombes à
les recompiler à chaque fois.
</p>
<p>
Des reproches ? Ça a quand même l'air un peut lent, mais c'est peut-être
la faute free. Et je n'ai toujours pas réussi à lui faire afficher des
images en svg. Mais bon, c'est chouette quand même.
</p>
<p>
Quelques liens ?
</p><ul>
<li><a href="http://wiki.splitbrain.org/wiki:DokuWiki">http://wiki.splitbrain.org/wiki%3ADokuWiki</a> pour la doc
</li>
<li><a href="http://www.splitbrain.org/projects/dokuwiki">http://www.splitbrain.org/projects/dokuwiki</a> pour télécharger
</li>
<li><a href="http://wiki.splitbrain.org/wiki:plugins">http://wiki.splitbrain.org/wiki%3Aplugins</a> pour la liste des plugins
</li>
<li><a href="http://wiki.splitbrain.org/wiki:tpl:templates">http://wiki.splitbrain.org/wiki%3Atpl%3Atemplates</a> pour les templates
</li>
</ul>
<p>
En plus les sources sont gérées sous darcs :)
</p>Dokuwiki : un wiki simple2007-10-18T23:24:00+02:00urn:uuid:1991775a-9be3-4fcf-a493-a3e10cc770e7
<p> <span class="timestamp-wrapper"> <span class="timestamp">2007-07-25 Wed. 16:24</span></span><br/>
</p>
<p>
Il n'y a pas que des langages pourris dans la vie, il y aussi des
langages pourris (mais très pratiques).
</p>
<pre class="src src-bash">function progressmeter_init {
echo -ne <span style="color: #ffa07a;">"33[s"</span>;
}
function progressmeter {
echo -ne <span style="color: #ffa07a;">"33[u"</span>;
echo -ne <span style="color: #ffa07a;">"33[s"</span>;
printf <span style="color: #ffa07a;">"%5.2f%%"</span> $(( 100 * $1 / $2 ));
}
</pre>
<p>
Attention, echo attend des valeurs en octal, donc 027=0o33
</p>La même chose en shell2007-07-25T16:24:00+02:00urn:uuid:bcafb37d-4f09-4b35-94ee-2024d19c3519
<p> <span class="timestamp-wrapper"> <span class="timestamp">2007-07-25 Wed. 12:23</span></span><br/>
</p>
<p>
Si vous n'avez jamais entendu parler de Matlab, vous avez vraiment de la
chance, ça veut dire que vous n'avez jamais eu à faire de calculs
bourrins avec des matrices.
</p>
<p>
J'ai dû pas mal m'en servir ces derniers temps (en fait c'était Octave,
qui est aussi mal mais en mieux parceque libre), et je me suis dis que
ce serait sympa d'avoir un indicateur de progression lors des calculs.
</p>
<p>
Le fichier progressmeter.m :
</p>
<pre class="src src-matlab"><span style="color: #00ffff;">function</span> <span style="color: #87cefa;">progressmeter</span>(<span style="color: #eedd82;">k</span>, <span style="color: #eedd82;">all</span>)
printf("<span style="color: #ff7f24;">%c[u", 027);</span>
printf("<span style="color: #ff7f24;">%c[s", 027);</span>
printf("<span style="color: #ff7f24;">%5.2f%%", 100*k/all);</span>
<span style="color: #00ffff;">end</span>
</pre>
<p>
Et le fichier progressmeter_init.m :
</p>
<pre class="src src-matlab"><span style="color: #00ffff;">function</span> <span style="color: #87cefa;">progressmeter_init</span>()
printf("<span style="color: #ff7f24;">%c[s", 027);</span>
<span style="color: #00ffff;">end</span>
</pre>
<p>
Il faut commencer par appeler progressmeter_init() pour sauvegarder la
position du curseur, puis il suffit à chaque étape d'appeler
progressmeter(i, n) pour afficher le pourcentage d'avancement de l'étape
i sur un nombre n d'étapes au total.
</p>
<p>
Ça utilise les caractères de contrôles 27c[s qui sauvegarde la position
du curseur et 27c[u qui la restaure.
</p>Barre de progression en Matlab/Octave2007-07-25T12:23:00+02:00urn:uuid:8011faab-b3c7-430e-b0ea-2643a9772b87