~bohwaz/blog/

Avec de vrais morceaux de 2.0 !

PHP IP utils update

PHP IP utils are now available in a new release.

This update brings a real normalize_ipv6 function which follows RFC 5952, as recommended by Stéphane Bortzmeyer. The previous behavior which expanded a short IPv6 address into a full long one is still available as expand_ipv6(), if needed.

I solved the problem of storing IPv6 addresses in mySQL (which doesn't support IPv6, a good reason to migrate to PostgreSQL) by using a VARBINARY field and inet_pton() function, you should do the same. It works for both IPv4 and IPv6 addresses. For SQLite, just use a BLOB field.

There is a new function available, check_ip, which checks wether an IP address matches against patterns given in an array. Patterns can be either IP addresses (eg 10.42.172.15), netmasks (eg 192.168.1.0/32, 2001::/16) or wildcards (eg 10.42.172.*, 2a01::*).

Still available at the same address : http://svn.kd2.org/svn/misc/libs/tools/ip_utils.php

La rustine - atelier associatif de réparation de vélos

Et voilà, mon dernier projet, un peu plus IRL que d'habitude : un atelier d'auto-réparation de vélo, à Dijon. Il a ouvert il y a un peu plus d'un mois.

Mais rassurez-vous, ça implique toujours pas mal de développement ;) J'en reparlerais plus tard, pour le moment je mentionne juste Garradin, un gestionnaire d'association en ligne, à installer sur son propre serveur, qui se veut relativement complet, si des gens sont intéressés pour participer n'hésitez pas. Mais j'en dirais plus dans quelques semaines quand l'outil aura bien évolué.

Fotoo Gallery : nouvelle version, nouveau site, nouveau diaporama

Grosse mise à jour de Fotoo Gallery qui passe du vieillissant SQLite2 à PDO::SQLite3. De manière rapide : Fotoo Gallery se prépare à PHP 5.4. Un avantage c'est que du coup c'est plus rapide.

J'en ai profité pour réécrire la partie diaporama qui change de look. Par défaut ce sont les petites photos qui sont affichées, et non redimensionnées. Il est possible d'avoir les images en haute définition en cliquant sur HD, et de les adapter à la taille de l'écran en cliquant sur le bouton Zoom.

Un exemple de diaporama : Cours d'eau.

Vu que le diaporama sert aussi pour l'embed, voici la même chose en embed :

Une autre nouveauté étant la possibilité d'avoir des adresses réécrites pour toute la galerie, par exemple : http://bohwaz.net/photos/tag/irlande.

C'est aussi l'occasion d'inaugurer le nouveau site de Fotoo Gallery et le passage du développement de SVN à Fossil !

Archiver avec 7-Zip et par2

Parfois, il est nécessaire de sauvegarder et archiver des données, sur un support qui dormira dans une étagère, et dont on ne sait pas trop quand il en ressortira, ni en quel état. Par exemple sur un CD-ROM ou une mémoire Flash, dont la tenue dans la durée n'est pas forcément très prévisible.

Dans ce cas, on veut pouvoir restaurer l'archive même si une partie des données devient corrompues. Voici ma méthode d'archivage très simple à base de 7-zip et de par2.

En premier, nous allons créer une archive avec 7-zip, séparée en volumes d'une taille de 50 Mo (plus facile à reconstituer avec par2 il me semble) :

$ 7z a -v50 backup.7z /home/bohwaz/backup

Cela va créer autant de fichiers du genre backup.7z.0001, backup.7z.0002, etc. que nécessaire en fonction de la taille des données à archiver.

Maintenant nous allons créer des archives de redondance avec par2. Par2 est un utilitaire qui permet de reconstituer des données corrompues en créant des archives de "redondance". Vous trouverez de plus amples explications sur son fonctionnement sur ce post de Linux-Attitude par exemple.

$ par2 c -r25 backup.7z.*

Va ainsi créer de la redondance équivalente à 25% des données archivées. Ce qui signifie que par2 saura réparer les données corrompues, sauf si plus de 25% de ces données sont corrompues.

Et voilà il ne reste plus qu'à copier/graver sur CD !

PHP & SQLite3 : collation

In PHP 5.3 there is no way to define a custom collation method for SQLite3.

But here is another reason to use PHP 5.4: it will provide new methods to have user-defined collation. For SQLite3 object it will be SQLite3::createCollation(name, callback), and there will be also a similar method for PDO::SQLite.

Its use is very easy:

$db = new SQLite3('data.db');
setlocale(LC_COLLATE, 'fr_FR.UTF-8');
$db->createCollation('PHP_COLLATE', 'strcoll');
$db->query('SELECT * FROM table ORDER BY name COLLATE PHP_COLLATE;');

Great, isn't it? Well just wait until PHP 5.4 release ;-)

Gérer ses photos en ligne de commande

gThumb était un jour un outil très utile et simple à utiliser pour importer des photos, il était même possible de l'utiliser sans l'interface de visualisation par gthumb --import-photos. Problème, comme pas mal de logiciel GNOME, au nom de la simplicité il est devenu inutilisable et d'ailleurs depuis récemment il n'est même plus capable de lister les photos de mon appareil !

Du coup, une seule solution simple, c'est d'utiliser des outils en ligne de commande. Inspiré ainsi de ce HOWTO sur OpenPrinting.org voici quelques bases.

Importer les photos

Se placer dans le répertoire de destination et lancer :

$ gphoto2 --get-all-files

Tourner les photos dans le bon sens

Grâce aux infos contenues dans les tags EXIF des images, il est possible de savoir dans quel angle a été prise la photo et de la tourner en accord. Le meilleur outil pour ça semble être jhead, qui fait une rotation sans perte (pas de re-compression JPEG) :

$ jhead *.jpg

Classer, trier et taguer ses photos

Là, pas de secret, jBrout est le meilleur logiciel du genre ;-)

Effacer les photos de l'appareil

Une fois qu'on est sûr d'avoir bien tagué, trié et sauvegardé (important) ses précieux clichés, on peut les effacer de son appareil avec gphoto2 :

$ gphoto2 --delete-all-files --recurse

(Attention, pas de retour en arrière possible !)

Visualiser ses photos

feh est un outil en ligne de commande sans interface permettant de visualiser des photos, de faire des diaporamas, etc. Une utilisation simple pour faire défiler les images d'un répertoire en plein écran :

$ feh -F ~/photos/

Pour faire un diaporama avec changement toutes les 5 secondes :

$ feh -F -D 5 ~/photos/

man feh vous donnera d'autres idées d'utilisation de cet outil.

Imposition PDF avec Linux

La PAO est à mon sens le domaine le plus pauvre sous Linux et en logiciel libre également. Scribus se fait vieux, n'évolue que très peu, et très lentement. C'est également un logiciel poussif et lent à utiliser, qui n'est pas des plus pratiques.

La question qui revient le plus pour moi c'est comment faire de l'imposition simplement. Scribus ne le permet pas. Du tout. Il existe Laidout qui permet de faire ça graphiquement et de s'interfacer avec Scribus mais j'ai vraiment rien pigé à son interface en Motif (ARG !).

OpenLibreOffice Writer a une option sympa dans l'aperçu qui permet ce genre de chose (Options d'impression : aperçu, choisir ensuite le nombre de colonnes et de lignes, puis cliquer sur le bouton "Imprimer l'aperçu"), mais c'est de la bidouille pas pratique quand même.

Sans compter que par exemple si on a un tract A6 et qu'on veut en imprimer une planche sur une feuille A4, il faut recopier 8 fois la même page... Pratique ! Et puis faire de la PAO avec OpenLibreOffice c'est un peu comme vouloir jouer Beethoven au pipeau : c'est minable.

Du coup il ne reste que les outils en ligne de commande. Y'en a des paquets, pas mal en Java qui nécessitent la VM officielle, bof. J'ai essayé PoDoFo qui est incapable d'utiliser les fichiers .plan d'exemple qu'il fournit... Y'a pas mal de possibilités en PostScript aussi.

Mais le seul que j'ai trouvé pas mal c'est PDFJam (paquet pdfjam dans debian). Par exemple pour faire une planche A4 de 8 tracts A6 (2 lignes de 4) quand on a un PDF avec une seule page :

pdfjam --a4paper --landscape --nup 4x2 tract.pdf '1,1,1,1,1,1,1,1' --outfile planche.pdf

La suite de huit "1" au milieu sert à indiquer qu'il faut utiliser 8 fois la page 1 de tract.pdf.

Il existe d'autres options, lisez le man, et d'autres versions raccourcies : pdfjam-pocketmod pour faire un livret de 8 pages à mettre dans la poche à la manière de re:Pocket Mode, etc.

Le vieil homme et la mer

François Bon a travaillé à une nouvelle traduction du vieil homme et la mer d'Hemingway, pensant que l'œuvre originale était dans le domaine public.

Gallimard n'a pas vu les choses du même œil et a décidé de demander le retrait de l'ouvrage ainsi qu'un dédommagement pour les 22 exemplaires du livre électronique vendu en ligne.

Du coup le livre est désormais disponible un peu partout, par exemple ici en EPUB et plein d'autres miroirs sont aussi dispos sur ce blog.

L'histoire complète est dispo sur Tiers Livre.

Dropbear : réparer les locales

Dropbear est un super petit serveur et client SSH, très léger, que j'utilise sur du matériel embarqué ou des vieilles machines, qui n'ont que peu de RAM.

Y'a juste un petit bug : dropbear ne propage pas la locale utilisée par le client SSH, ce qui fait qu'on se retrouve avec des trucs comme ça :

$ locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

Du coup bon forcément l'unicode ça marche moins bien.

Une solution palliative est d'utiliser la locale par défaut au démarrage du shell. Pour cela, créer en root le fichier texte /etc/profile.d/locale.sh contenant :

#!/bin/sh

. /etc/default/locale

export LANG

Maintenant normalement ça devrait vous donner la locale système par défaut (dans mon cas fr_FR.UTF-8) lors de vos sessions SSH.

Si ça ne marche pas, c'est peut-être que /etc/profile ne charge pas /etc/profile.d/*. En ce cas, rajouter ceci à /etc/profile :

for script in /etc/profile.d/*.sh
do
  source $script
done
unset script

Notes rapides... ↓