Olivier Schwander : bloc-notes
Renuméroter des lignes avec awk
Pour faciliter l'ajout de disques sur le site de métadonnées musicales MusicBrainz, il existe un parser
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
BEGIN { n=1 } { if ($0 == "") { n = 1; print; } else { $1 = n "."; print n = n + 1; } } END { print "done" }
Enregistrer le protocole org-protocol
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 mozillazine n'ont pas l'air de marcher avec un Firefox récent.
J'ai enfin trouvé une solution en adaptant ce qui était proposé dans un message sur la liste org: https://lists.gnu.org/archive/html/emacs-orgmode/2011-05/msg00298.html.
Visiblement, la façon moderne de gérer des associations de fichiers
et des protocoles est d'utiliser un fichier .desktop
(ça commence
mal…): voici donc le fichier org-protocol.desktop
, à placer dans
~/.data/applications
(ou $XDG_DATA_DIRS/applications
si vous
utilisez un emplacement personnalisé).
[Desktop Entry] Name=org-protocol Exec=emacsclient %u Type=Application Terminal=false Categories=System; MimeType=x-scheme-handler/org-protocol;
Il faut ensuite mettre à jour le cache des types MIME, avec
update-desktop-database ~/.data/applications
Je suis content que ça marche mais comme d'habitude avec les outils Freedesktop, je n'ai rien compris…
Parler à Org-mode depuis Firefox : org-protocol
Org-protocol est une interface pour parler à Org-mode depuis l'extérieur et pour lancer par exemple org-capture depuis l'extérieur.
Activation
Avec Gnome installé :
gconftool-2 -s /desktop/gnome/url-handlers/org-protocol/command '/usr/bin/emacsclient %s' --type String
gconftool-2 -s /desktop/gnome/url-handlers/org-protocol/enabled --type Boolean true
Sans, voir ici :
Exemple d'utilisation
Commençons par rajouter le marque-page suivant dans votre navigateur, Il permettra de lancer le modèle "l" d'org-capture :
javascript:location.href='org-protocol://capture://l/'+encodeURIComponent(location.href)+'/'+encodeURIComponent(document.title)+'/'+%20encodeURIComponent(window.getSelection())
Le modèle utilisé d'org-capture ressemble à ça :
Les variables utilisées sont les suivantes :
%:description
le titre de la page%u
la date%:link
le lien vers la page
Plus d'informations sur Worg : http://orgmode.org/worg/org-contrib/org-protocol.php
Monter un disque en ligne de commande
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 ?
Je ne veux pas d'un daemon qui tourne en permanence pour deux raisons :
- je n'aime pas avoir un programme qui tourne en permanence mais qui ne sert presque jamais;
- 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.
Que reste-t-il ?
mount
pmount
gnome-mount
halmount
devkit-disks
mount
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.
pmount
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.
gnome-mount
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.
halmount
est un script que j'avais trouvé ici. 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).
devkit-disks
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.
En résumé,
- sur l'une des mes machines,
pmount
; - si je ne suis pas root, mais que
pmount
est installé,pmount
; - dans tous les autres cas (au moment où j'écris),
devkit-disks
.
Gestion d'articles
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.
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.
En fait, il existe une solution toute simple: bibtex2html. 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 ?
En bref, voici ce que j'utilise (tout dans un même répertoire) :
- un fichier Bibtex
- un Makefile
- des pdfs nommés de la façon suivante : clé_bibtex.pdf
Le Bibtex ressemble à ça :
@article{bmdg2005, title = {{Clustering with Bregman divergences}}, author = {Banerjee, A. and Merugu, S. and Dhillon, I.S. and Ghosh, J.}, journal = {The Journal of Machine Learning Research}, volume = {6}, pages = {1705--1749}, year = {2005}, publisher = {MIT Press Cambridge, MA, USA}, pdf = {bmdg2005.pdf} }
Remarquez le champ "pdf" qui contient le chemin (relatif ici, mais vous mettez ce que vous voulez) vers l'article.
Le Makefile est assez trivial :
see: html firefox articles.html html: articles.bib bibtex2html -dl $<
C'est suffisant pour obtenir un fichier html et utiliser les fonctions de recherche du navigateur: exemple http://www.lri.fr/~filliatr/liste_publis.fr.html.
Wiixjump ou xjump contrôlé à la wiimote
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 http://packages.debian.org/fr/sid/xjump.
C'est déjà rigolo avec un clavier, alors essayons avec une wiimote !
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,
apt-get source xjump
) :http://chadok.info/~oschwand/patches/wiixjump.patch
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.
Désolé, je ne fournis pas de vidéo montrant la chose en action :)
Déclarations de type façon Haskell en Ocaml
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.
En Ocaml, la façon classique de déclarer un type est la suivante :
let f (x: int) (y: int) : int = x + y
On déclare ainsi une fonction prenant deux arguments de type
int
et renvoyant un entier.
En Haskell vous feriez ça de la façon suivante:
f :: Int -> Int -> Int f x y = x + y
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:
declare f : int -> int -> int [...] let f x y = x + y
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
declare
seront toujours en phase avec le code.
Un dépôt darcs est disponible ici : http://chadok.info/darcs/pa_declare
Lack
Quelques temps après cet article, http://callcc.chadok.info/2008/05/13/gestion-de-paquets-cote-utilisateur-normal 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.
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 site web.
Ce qui manque :
- les mises à jour automatisées,
- la gestion de dépendances,
- des utilisateurs.
Gnome-keyring et les bonnes manières
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 :
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 ?
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.
Ç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.
C'est tout simple, mais il m'a fallu 3 mois pour comprendre d'où sortait ce truc.
Les petits lutins du nain ternette
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).
Pour participer vous aussi, n'hésitez pas à cliquer sur le lien "Spread It" et à bien suivre les instructions.
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.
Gestion de paquets, côté utilisateur normal
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?
- 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.
- pirater le compte root : en général, vous n'aurez plus aucune chance que root soit gentil après ça.
- donner le sudo qui va bien à tous les utilisateurs : seul des jusqu'ubuntistes fanatiques l'envisageront sérieusement.
- 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.
- 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.
- utiliser le mode rootless de Gobolinux. Gobolinux est une distribution linux qui reviste FHS pour faire quelque chose qui ressemble plus à MacOSX. Elle propose en particulier un mode baptisé rootless qui peut s'installer sans être root, comme surcouche à une distribution existante. Tous les paquets sont installés dans un chemin du genre home/toto.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.
- utiliser Nix. 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.
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.
Site d'hébergement de fichiers en un clic
Wikipedia appelle ça des Site d'hébergement de fichiers en un clic et le projet Jyraphe> veut permettre à n'importe qui de monter ce genre de site.
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:
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.
#! /bin/sh SSH_HOST= BASE_DIR= BASE_URL= HTTPD_GROUP=www-data source ~/.poubellerc if [ "$1" = "-f" ]; then shift; source $1; shift; fi rand=$(dd if=/dev/urandom count=64 bs=1 2>/dev/null | sha1sum | cut -c1-40) dir=$BASE_DIR/$rand echo $BASE_URL/$rand ssh $SSH_HOST mkdir -p $dir && ssh $SSH_HOST touch $dir/../index.html && scp $* $SSH_HOST:$dir && ssh $SSH_HOST chgrp $HTTPD_GROUP -R $dir && ssh $SSH_HOST chmod g+rX -R $dir
La configuration sera placée dans le fichier .poubellerc ou dans un fichier dont le chemin sera donné grâce à l'option -f.
Par exemple, vous pouvez télécharger ce script à l'adresse suivante : http://chadok.info/~oschwand/poubelle/7fb4f3e0be5bcf623b641981c51f742d7b8bf21a/poubelle.sh
Vous pouvez envoyer plusieurs fichiers en même temps, qui seront tous placés dans le même répertoire.
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.
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.
Livres dans le domaine publique
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 ?
Voici un liste non-exhaustive :
Dokuwiki : un wiki simple
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.
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.
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.
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.
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.
Quelques liens ?
- http://wiki.splitbrain.org/wiki%3ADokuWiki pour la doc
- http://www.splitbrain.org/projects/dokuwiki pour télécharger
- http://wiki.splitbrain.org/wiki%3Aplugins pour la liste des plugins
- http://wiki.splitbrain.org/wiki%3Atpl%3Atemplates pour les templates
En plus les sources sont gérées sous darcs :)
La même chose en shell
Il n'y a pas que des langages pourris dans la vie, il y aussi des langages pourris (mais très pratiques).
function progressmeter_init { echo -ne "33[s"; } function progressmeter { echo -ne "33[u"; echo -ne "33[s"; printf "%5.2f%%" $(( 100 * $1 / $2 )); }
Attention, echo attend des valeurs en octal, donc 027=0o33
Barre de progression en Matlab/Octave
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.
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.
Le fichier progressmeter.m :
function progressmeter(k, all) printf("%c[u", 027); printf("%c[s", 027); printf("%5.2f%%", 100*k/all); end
Et le fichier progressmeter_init.m :
function progressmeter_init() printf("%c[s", 027); end
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.
Ça utilise les caractères de contrôles 27c[s qui sauvegarde la position du curseur et 27c[u qui la restaure.