Humus numericus

Aller au contenu | Aller au menu | Aller à la recherche

R, Spip et autres

Linux, Debian, etc.

Fil des billets - Fil des commentaires

lundi 30 août 2010

How to automatically generate timelines that can be split between several pages

I recently wanted to create a PDF timeline that could be automatically split between several A4 pages for later cutting and pasting. After a bit of LaTeX and Ruby I finally came out with a little timeline-generator script :

http://github.com/juba/timeline-generator

The principle is quite simple : you specify several parameters in a config file such as the start and end dates, the number of A4 sheets, the sheets orientation, etc., and the script generates two PDF files : one with your timeline on one big page, and another with the same timeline split between the given number of A4 pages. To make cut-and-pasting easier, the second files includes crop marks and a small overlapping between pages.

To take a look at what the generated files look like :

The title, months names and number formatting are in french, but english is also supported.

Optionally, a calendar scale (days and months of year) and a time of day scale (hours and minutes) can be added at the bottom of the timeline. The idea is to allow some comparisons such as «if the 0 to 2010 timeline was a day, the World War II would have take place between 23h09 and 23h14. If it was a year, it would have happened between December 18th and December 20th».

If you have access to a functional installation of Ruby and PDFLaTeX, the script should be quite easy to use. Everything is explained in the README file on GitHub.

But if you are interested by this type of timeline, don’t hesitate to drop me a mail or a comment with the main parameters (start and end date, number of sheets…), and I’ll generate and send you back the PDF files.

Générer automatiquement des frises chronologiques sur plusieurs pages

Je me suis récemment amusé à essayer de fabriquer des frises chronologiques avec l’idée de les imprimer sur plusieurs pages A4 pouvant être découpées et réassemblées par la suite. Comme je ne voulais pas faire ça à la main et avoir quelque chose de réutilisable, j’ai mélangé un peu de Ruby et de LaTeX, ce qui a donné un script automatique de génération de chronologies :

http://github.com/juba/timeline-generator

Le principe est assez simple : vous indiquez dans un fichier de configuration différents paramètres, dont évidemment la date de départ, la date de fin, le nombre de feuilles A4, leur orientation, etc., etc. (quasiment tous les aspects de mise en page sont configurables), et le script vous génère deux fichiers PDF : l’un avec votre frise chronologique sur une seule grande page, et l’autre découpée en autant de feuilles A4 que désiré. Avec en plus, si c’est pas le bonheur, des marques pour la découpe et un petit recouvrement d’une page sur l’autre pour faciliter l’assemblage.

Pour avoir un aperçu du résultat :

Vous remarquerez au bas de la chronologie une petite originalité : la présence d’un axe représentant les jours et mois de l’année, et d’un autre représentant les heures de la journée. L’idée est de pouvoir effectuer des comparaisons du genre «si la période de 0 à 2010 était une journée, la seconde guerre mondiale aurait lieu entre 23h09 et 23h14. Si c’était une année, elle aurait eu lieu entre le 18 et le 20 décembre». Je ne sais pas encore si c’est une bonne idée ou si c’est plus perturbant qu’autre chose, mais en tous cas on peut supprimer ces “extras” dans le fichier de configuration.

Si vous avez une installation fonctionnelle de Ruby et PDFLaTeX sur votre machine, ça devrait être assez simple à faire tourner, les explications sont données dans le fichier README sur Github (en anglais).

Dans le cas contraire, si vous êtes intéressé par une chronologie de ce type, n’hésitez pas à m’envoyer un mail avec les principaux paramètres (date de départ, date de fin, nombre de pages…) et je vous renverrai le résultat.

Bon, reste plus qu’à trouver un mur pour afficher tout ça, maintenant… :-)

lundi 8 mars 2010

Comment protéger une adresse mail destinée à un enfant ?

L’autre jour ma fille de six ans et demi a eu envie que je lui installe un client mail sur son interface sur notre ordi familial. J’ai trouvé que c’était une bonne idée, mais je ne voulais évidemment pas utiliser une adresse ouverte à tous les vents, avec risque notamment de recevoir des spams inappropriés. La cahier des charges était donc le suivant :

  • que les deux parents reçoivent systématiquement une copie des messages reçus sur la boîte ;
  • que les messages reçus sur la boîte mail ne soient diffusés qu’après validation manuelle de la part d’un des deux parents ;
  • ajouter la possibilité de “whitelister” certaines adresses d’expédition pour ne pas avoir à valider systématiquement les messages qui en proviennent

Oui, bon, je sais, ça fait un peu big brother, mais vu le type de spam qu’on reçoit parfois, y compris sur des adresses a priori totalement privées, je préfère bétonner un maximum pour l’instant.

Je me suis demandé comment faire ça avec Postfix, Procmail ou je ne sais quel assemblage d’applications que j’utilise pour le mail, et puis j’ai finalement trouvé une solution que je trouve pas trop compliquée, et qui passe par la création d’une liste de diffusion, ici avec Mailman.

Donc voici la marche à suivre :

  1. Créer une liste de diffusion nommée prenom@domaine.org (l’adresse mail publique attribuée à l’enfant)
  2. Mettre les mails des parents comme administrateurs de la liste
  3. La configurer pour que tous les envois soient modérés par défaut, avec validation manuelle des administrateurs de la liste
  4. Créer une adresse mail “de transit” du type mail.prenom@domaine.org
  5. Abonner à la liste prenom@domaine.org les deux parents, ainsi que mail.prenom@domaine.org
  6. Configurer le client mail sur l’ordi familial pour aller lire les mails sur la boîte mail.prenom@domaine.org, tout en envoyant les mails avec l’adresse prenom@domaine.org

Et voilou ! À partir de là, chaque message envoyé à prenom@domaine.org passe par une phase de modération, et les deux parents reçoivent un mail avec un lien leur permettant de rejeter ou valider le message, et en plus la possibilité de placer l’expéditeur sur liste blanche (ou liste noire) pour éviter les validations ultérieures. Une fois le message validé, il est ensuite transféré de manière transparente sur la boite mail.prenom@domaine.org (donc à l’enfant) et sur les boîtes des parents.

Voilà, je ne sais pas si c’est très clair, mais ça a le mérite de fonctionner en tous cas :-)

Comment révoquer une clé PGP

Je viens de révoquer une clé PGP avec GnuPG pour une ancienne adresse mail. Voici la marche à suivre.

D’abord il faut noter l’identifiant de la clé publique que l’on souhaite révoquer. Pour cela on fait un :

$ gpg --list-keys

Et on note l’identifiant (8 caractères hexadécimaux du type A1B2C3D4). Ensuite on génère un certificat de révocation qu’on stocke dans un fichier :

$ gpg --gen-revoke A1B2C3D4 > revoke.txt

Puis on importe ce certificat de révocation :

$ gpg --import revoke.txt

On exporte la clé publique désormais révoquée :

$ gpg --export -a A1B2C3D4

On peut alors uploader la sortie de cette dernière commande sur un serveur de clé type pgp.mit.edu et d’ici peu, le monde entier sera informé que votre clé ne doit plus être utilisée.

mercredi 10 février 2010

Don't put a dot in your cronjobs names !

So you just setup a wonderful new cron job on your server that will make your life easier and your family happy. You put it in your /etc/cron.d in a file called wonderfulcronjob.sh but… your job is never launched.

You checked the permissions, the crontab syntax, ran the script manually, evertything is fine. You checked your syslog, but nothing is reported on it, not even the fact that the job is started. What’s the problem ?

The answer is in the run-parts manual page :

If the —lsbsysinit option is not given then the names must consist entirely of upper and lower case letters, digits, underscores, and hyphens.

So if you put a dot in your cron job name, it will not be run at all. Rename it to wonderfulcronjob-sh or just wonderfulcronjob and everything should work fine.

Thanks to birdy for finding this one…

jeudi 3 septembre 2009

Problème d'encodage dans des session SSH

Ça fait un moment que je cherchais la solution à un problème assez banal : je me connectais en SSH à un serveur tournant en iso-8859-1 depuis un autre serveur tournant lui en utf-8. Résultat : l'édition de fichiers comportant des caractères hors-ASCII était tout simplement impossible…

Je viens de trouver une solution grâce à cette page :

La solution est un petit programme qui s'appelle luit, et qui est disponible dans le paquet x11-utils :

# apt-get install x11-utils

Une fois le paquet installé, il suffit d'appeler lui juste avant d'appeler ssh en lui indiquant l'encodage du serveur de destination via le paramètre encoding. Dans le cas cité précdemment (connexion d'un serveur en UTF-8 vers un serveur en iso-8859-1) ça fait donc :

$ luit -encoding iso-8859-1 ssh user@server
Et voilou…

mardi 16 juin 2009

Modifier le raccourci clavier de rechargement (Mod+q) dans Xmonad

Ça fait maintenant un bon bout de temps que j'utilise xmonad comme window manager (après être passé par Ion3 et dwm), et je crois bien que je vais y rester au moins pour un petit moment, tant la flexibilité et la richesse des extensions est impressionnante une fois qu'on a un peu pris en main la syntaxe du fichier de configuration (écrit en Haskell).

Aujourd'hui j'avais décidé de modifier le raccourci clavier de recompilation et de rechargement dynamique de la configuration, par défaut assigné à Mod+q. Le problème est que j'utilise Mod+s fréquemment pour un afficher un terminal de type scratchpad, et que j'ai tendance à faire des Mod+q à la place de Mod+s. Je souhaitais donc réassigner la commande Mod+q à Ctrl+Mod+q.

Pour cela, il faut aller voir dans le fichier de configuration par défaut à quelle commande est associé Mod+q, d'autant que cela semble avoir changé dans une récente version d'xmonad. La config par défaut se trouve dans le paquet libghc6-xmonad-doc, qu'il faut donc installer :

sudo apt-get install libghc6-xmonad-doc
zless /usr/share/doc/libghc6-xmonad-doc/examples/xmonad.hs.gz

On voit alors que par défaut Mod+q est associée à :

restart "xmonad" True

Il suffit donc de modifier la partie raccourcis clavier de son ~/.xmonad/xonad.hs en ajoutant quelque chose comme :

    , ((modMask .|. controlMask,  xK_q  ), restart "xmonad" True)
, ((modMask, xK_q ), spawn "")

Et voilou !

mercredi 11 mars 2009

How to display your identi.ca timeline on your blog

I recently tried to use identi.ca, a microblogging service similar to Twitter, but with a big difference : it is a free web application based on the free microblogging software Laconica.

One thing I rapidly tried to do is to display my user timeline on this blog, as many Twitter users do. Fortunately I found a great little javascript written by Kent Brewster and called identica-badge, which does 99% of what I wanted. I only tweaked it a little bit in order to display my user timeline (instead of my friends timeline), to add a link to the identi.ca and (optionnaly) twitter user page, etc.

You can see the result on this blog homepage

Since Kent kindly answer to my licence question on this post’s comments, the file can be downloaded and is ditributed under a Creative Commons 3.0 attributions, noncommercial, share-alike licence :

To use it, just edit the javascript file to adapt the configuration settings (in the loadDefaults function), and call it from any HTML-like file with :

<div id="identica_update_list">
<script type="text/javascript" src="/path/to/identica-badge.js"></script>
</div>

mercredi 4 mars 2009

Éditer un blog sous Dotclear directement depuis Emacs

Il est en effet possible de poster des billets ou d'éditer des billets déjà existants directement depuis Emacs, avec quelques limitations : les billets sont rédigés en HTML (pas de syntaxe Wiki), il n'est pas possible d'ajouter des images ou des fichiers joints, et les tags ne sont pas gérés.

Pour cela, nous allons utiliser weblogger.el et décrire les étapes nécessaires à sa configuration.

Première chose, télécharger les fichiers xml-rpc.el et weblogger.el et les placer quelque part dans son load-path.

Ensuite, on modifie son .emacs et on y ajoute :

(require 'weblogger)

Si vous souhaitez que weblogger se souvienne de vos mots de passe de connexion, vous pouvez également ajouter :

(setq weblogger-save-password t)

Connectez-vous à votre Dotclear, sélectionnez le blog souhaité et allez sur la page Paramètres du blog. Là, activez l'interface XML-RPC et notez, en bas de page, les indications données sur cette interface, notamment l'URL et le numéro d'identifiant.

Retournez ensuite dans Emacs et faites un M-x weblogger-setup-weblog, et répondez aux questions posées à l'aide des paramètres donnés par Dotclear. À la fin, donnez un nom à cette configuration.

Vous pouvez recommencer les deux étapes précédentes si vous souhaitez éditer plusieurs blogs différents avec weblogger.

À cette étape vous pouvez utiliser weblogger directement en faisant M-x weblogger-start-entry par exemple, et en vous référant aux raccourcis indiqués directement dans le fichier weblogger.el. En gros, utilisez C-x C-s pour enregistrer et publier votre nouveau billet, C-c C-p et C-c C-n pour naviguer parmi les billets déjà existants, etc. Pour attribuer une catégorie à un billet, vous pouvez l'ajouter dans le champ Keywords, mais en utilisant le nom interne de Dotclear (ainsi pour ce billet, j'ai utilisé Linux-debian et non Linux, Debian, etc..

Comme j'édite plusieurs blogs différents, j'ai créé des fonctions me permettant de passer facilement de l'un à l'autre (même si ça a l'air déjà possible avec les fonctions fournies par weblogger.

Par exemple, pour sélectionner le blog Humus numericus, j'ai créé la fonction ad hoc suivante (en remplaçant la chaîne "Humus numericus" par le nom donné à la configuration lors de l'appel à weblogger-setup-weblog) :

(defun jb-hn ()
  "Lance Weblogger sur Humus numericus"
  (interactive)
  (weblogger-select-configuration "Humus numericus")
  (weblogger-fetch-entries)
  (weblogger-start-entry))

Il suffit alors de faire un M-x jb-hn pour basculer directement sur un nouveau billet du blog choisi. On peut de la sorte créer autant de fonctions qu'on a de blogs à éditer...

Mise à jour 2009-06-16 : Depuis peu, j'avais des problèmes avec weblogger et Dotclear, les billets composés en HTML voyaient les balises transformées en entités. J'ai résolu la chose en modifiant le fichier xml-rpc.el, ligne 356, en remplaçant :

`((value nil (string nil ,(url-insert-entities-in-string value))))
Par :
`((value nil (string nil ,value)))

Synchroniser Liferea entre deux systèmes

Jusqu'à présent j'utilisais Netvibes pour suivre mes différents flux RSS, mais j'ai fini par y trouver deux inconvénients majeurs :

  • les problèmes de respect de la vie privée liés au fait de confier à une boîte privée l'ensemble de ses lectures quotidiennes ;
  • la relative lenteur de l'interface en Ajax qui, bien que pas mal foutue du tout, avait tendance à rallonger le temps déjà bien trop long passé quotidiennement à suivre mes flux.

J'ai donc choisi de me porter plutôt vers un vrai lecteur RSS, en l'occurrence liferea, qui me semble avoir le plus de fonctionnalités.

Le problème était alors d'arriver à synchroniser l'état de lecture des différents fils entre les différentes machines sur lesquelles je travaille, problème d'autant plus délicat que la base sqlite utilisée par liferea pour stocker ces informations est plutôt du genre «sensible».

Je suis heureusement tombé sur un script de synchronisation depuis un blog norvégien :

Ce script ne correspond pas à mon cas de figure, car il effectue la synchronisation directement entre les deux machines via SSH, tandis que dans mon cas je passe par un serveur intermédiaire pour stocker les données depuis une machine et les récupérer sur l'autre, ce qui simplifie en partie le travail. J'ai donc utilisé le script comme base de départ pour arriver au résultat suivant :

#!/bin/bash
# Source : http://www.rolfs.no/2008/03/26/sync-lifereash-syncing-script/
# DEBUT CONFIGURATION
DIR=/home/julien/.liferea_1.4
BACKUPDIR=$DIR/backup/`date --rfc-3339=date`
REMOTE="z" # ip of remote machine
REMOTEDIR=$DIR
if [ "xjulien" = "x`whoami`" ]; then
echo "User is julien: OK"
else
echo "Only run as user julien"
exit 1
fi
# FIN CONFIGURATION
test -e /tmp/sync-liferea_has_run && rm /tmp/sync-liferea_has_run
echo "--- Syncing Liferea ---"
pgrep liferea-bin && {
echo "Liferea is running. Stopping it."
pkill liferea-bin
sleep 1
}
test -e $DIR/liferea.db || {
echo "ERROR: $DIR/liferea.db does not exist"
exit 1
}
test -e $DIR/feedlist.opml || {
echo "ERROR: $DIR/feedlist.opml does not exist"
exit 1
}
test -e $DIR/liferea.db-journal && {
echo "ERROR: liferea.db-journal exists in $DIR/"
echo "Unclean shutdown or is liferea still running? Find out/fix, then rerun liferea-sync."
exit 1
}
echo "Creating $BACKUPDIR"
mkdir -p $BACKUPDIR
echo "Making backup to $BACKUPDIR"
cp -v $DIR/feedlist.opml $BACKUPDIR/
cp -v $DIR/liferea.db $BACKUPDIR/
cp -v $DIR/feedlist.opml.backup $BACKUPDIR/
# Using rsync to preserve when file was last changed..
echo ""
echo "--- Syncing IN ---"
echo ""
rsync -vazu -e "ssh"  -f '+ /feedlist.opml' -f '+ /feedlist.opml.backup' -f '+ /liferea.db' -f '- **'  $REMOTE:$REMOTEDIR/ $DIR
echo ""
echo "--- Syncing OUT ---"
echo ""
rsync -vazu -e "ssh" -f '+ /feedlist.opml' -f '+ /feedlist.opml.backup' -f '+ /liferea.db' -f '- **' $DIR/ $REMOTE:$REMOTEDIR
touch /tmp/sync-liferea_has_run && exit 0

L'utilisation du fichier temporaire /tmp/sync-liferea_has_run est parfaitement optionnelle, elle me permet juste de ne lancer liferea automatiquement au démarrage de ma session X que si la synchronisation a bien eu lieu. Pour cela j'ai juste rajouté la ligne suivante dans mon ~/.xsession :

while [ ! -e /tmp/sync-liferea_has_run ]; do sleep 1; done && liferea-bin &

Autologin sans GDM

L'autologin est une fonctionnalité permettant de connecter automatiquement un utilisateur au démarrage de Linux, sans qu'il ait à s'identifier. Cela peut paraître un brin dangereux, mais ça l'est beaucoup moins si on utilise une partition chiffrée qui demande de toutes manières un mot de passe au démarrage.

Jusqu'à présent j'utilisais GDM pour pouvoir profiter simplement de l'autologin, mais on ne peut pas dire que ça soit la solution la plus légère qui soit. Mais grâce à un post sur un forum de Debian, je peux désormais le faire sans aucune dépendance supplémentaire. Pour cela il suffit de modifier /etc/inittab et de commenter la ligne :

#1:2345:respawn:/sbin/getty 38400 tty1

Tout en ajoutant la ligne :

1:2345:respawn:/bin/login -f YOUR_USER_NAME tty1 /dev/tty1 2>&1

Si on souhaite qu'en plus de l'autologin la session X soit démarrée directement sans avoir à taper de startx il suffit de rajouter les lignes suivantes à la fin de son ~/.bash_profile :

if [ -z "$DISPLAY" ] && [ $(tty) = /dev/tty1 ]; then
   while true
   do
        startx --
        sleep 10
   done
fi 

Ceci évite que X soit démarré lorsqu'on se connecte en ssh ou sur une autre console que tty1.

mardi 2 décembre 2008

Astuces Linux du jour

Ajouter un utilisateur à un groupe rapido

Jusqu'ici, quand je voulais m'ajouter à un groupe, je faisais un bête :

# adduser julien group

Problème : dans ces cas-là on est obligé de fermer sa session pour que le changement soit pris en compte. Et bien je viens de découvrir la commande newgrp qui permet de faire ça directement :

$ sudo adduser username group
$ newgrp group

Accélérer les connexions SSH

Si vous avez tendance à vous connecter souvent aux mêmes serveurs, les versions récentes d'openSSH permettent d'accélérer les temps de connexion via du multiplexage de connexion. Pour cela il faut rajouter les lignes suivantes dans ~/.ssh/config (fichiers à mettre en 600) :

Host *
ControlPath ~/.ssh/mux_socket-%r@%h:%p

Puis de lancer un ssh de la manière suivante (par exemple dans votre .xsession :

ssh -fMN nomduserveur

A partir de là les temps d'établissement de connexion vers ce serveur seront beaucoup plus rapides...

Faire de l'ipv6 facilement

J'avais déjà essayé deux ou trois manières de me connecter en ipv6 depuis la maison, mais c'est en général un peu lorudingue : faut s'inscrire chez un tunnel broker, mettre en place des scripts, avoir une IP fixe... Mais je viens de tomber sur un article de Debian administration qui présente le paquet miredo qui permet de faire tout ça de manière hyper-simple. Une commande suffit :

# apt-get install install miredo

Et vous aurez la joie de voir la tortue danser !

- page 1 de 4