lundi 9 novembre 2009

UTF-8 is magic

Comme expliqué dans le précédent billet je rencontre quelques difficultés pour synchroniser mes données entre Mac OS et Linux en utilisant l'outil Unison.

Le premier problème était lié à l'utilisation de l'UTF-8 sous Mac OS, codage que je fais tout pour éviter sur mon Linux depuis des années car en dehors de problèmes d'affichages ça ne m'apporte rien du tout. Mais étant donné la situation j'ai changé le codage des mes noms de fichiers sous Linux en faveur de l'UTF-8 (oui je suis faible).

Une fois ce premier problème réglé, lancement de la synchro avec Unison, une grosse heure pour synchroniser 40Go. Méfiant, je relance la synchro pour m'assurer que tout est bon, et là petite surprise tous les fichiers accentués sont vu comme nouveau sur le Mac et absent sur le Linux. Bon, pourquoi pas, je le laisse relancer la synchro sur ces fichiers. Après cette nouvelle synchro je vais voir mon arborescence sous Linux pour vérifier ce que vient de faire Unison et petite surprise tout mes fichiers accentués apparaissent en double.
S'en suit alors une journée entière de mise à jour d'Unison, de nouvelles synchros, de parcours de forums sans réels résultats. Je me suis donc posé la question calmement : comment Unison a-t-il réussit à créer des fichiers avec le même nom ? c'est impossible, personne ne l'aurait laissé faire. C'est alors que j'ai commencé à porter mes soupçons sur mon vieil ennemi l'UTF-8, après tout il y a peut-être des versions dérivées avec des codages différent dont une sur Mac OS, ce qui pourrait expliquer la situation.

Je me suis donc mit en quête d'informations sur cette mystérieuse implémentation de l'UTF-8 sur Mac OS pour finalement apprendre que l'UTF-8 permet de coder certains caractères de plusieurs manières, notamment les caractères accentués. Par exemple le "é" peut s'écrire avec un seul caractère unicode (U+00E9, LATIN SMALL LETTER E WITH ACUTE), ou en combinant le e avec l'accent (U+0065, LATIN SMALL LETTER E and U+0301, COMBINING ACUTE ACCENT), magique n'est-ce pas ? En résumé Mac OS utilise bien l'UTF-8 mais dans sa forme "décomposée" (parfois appelée UTF-8-MAC), alors que Windows et Linux préfèrent la forme "précomposée", c'est beau les formats universels non ?

Donc comment réussir à synchroniser ces deux arborescences qui contiennent la même chose (ou presque). Et bien je vous livre les 2 solutions trouvées sur les forums puis ma solution à moi :

Solution basique
Ne pas utiliser de caractères accentués, n'utiliser que des caractères ASCII. Pourquoi pas mais ça serait comme baisser son pantalon devant l'UTF-8.

Solution SSHFS
Monter l'arborescence Linux sur le Mac via sshfs en ajoutant l'option "-o modules=iconv,from_code=UTF-8,to_code=UTF-8-MAC", ainsi j'ai accès sur le Mac à l'arborescence Linux convertie à l'unicode Ensuite il suffit de synchroniser les deux arborescences locales sur le Mac.
Cette solution est fonctionnelle, mais d'une part la synchro est très longue à se faire car tout est vérifié sur la même machine et d'autre part il est nécessaire d'avoir les même uid/gid entre Linux et Mac pour la synchro.

Solution "mais si ça doit marcher"
Modifier le codage des fichiers sur Linux le temps de faire la synchro et restaurer l'ancien codage après la synchro.
Un peu "olé olé" me direz vous, mais voyons comment mettre ça en oeuvre. Seul point dur, le renommage des fichiers, il existe des outils tel que convmv qui renommer une arborescence en changeant le codage, mais le format UTF-8-MAC est complètement inconnue par tout ces outils sous Linux. Je me suis donc lancé dans l'écriture d'un script python pour effectuer ces modifications (voir le code en fin de billet). Ensuite la synchronisation est toute simple, modification du codage, appel à Unison, et restauration du codage et en plus ça marche et c'est rapide ! Pfiou !

Pour conclure je dis vive l'UTF-8, le format universel qui j'en suis sur continuera de poser universellement des problèmes durant de longues années.
Et pour re-conclure, voici le "fameux" script python pour changer le codage d'une arborescence (évidemment c'est copyleft) :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from optparse import OptionParser
from unicodedata import normalize
import os
import os.path
import sys


# ----------------------------------------------------------------------
def composedToDecomposed( string ):
        decomposed = normalize( "NFD", string )
        return decomposed


def decomposedToComposed( string ):
        composed = normalize( "NFC", string )
        return composed


# ----------------------------------------------------------------------
def processTree( path, convert ):
        for file in os.listdir( path ):
                fileWithPath = os.path.join(path,file)
                if os.path.isdir( fileWithPath ):
                        processTree( fileWithPath, convert )
                converted = convert(file)
                if converted != file:
                        os.rename(fileWithPath,os.path.join(path,converted))


parser = OptionParser()
parser.add_option( "-d", "--composed-to-decomposed", dest="c2d"
                 , action="store_true", default=False
                 , help="convert tree from composed to decomposed form")
parser.add_option( "-c", "--decomposed-to-composed", dest="d2c"
                 , action="store_true", default=False
                 , help="convert tree from decomposed to composed form")

(options, args) = parser.parse_args()

if options.c2d == False and options.d2c == False:
        print "- E - You must specifiy a conversion"
        parser.print_help()
        exit(1)

if options.c2d == True and options.d2c == True:
        print "- E - Only one conversion can be processed at a time"
        parser.print_help()
        exit(1)

if options.c2d == True:
        label  ="from composed form to decomposed"
        action = composedToDecomposed
else:
        label  ="from decomposed form to composed"
        action = decomposedToComposed

for tree in args:
        print "- I - Converting %s %s" % (tree,label)
        tree = unicode(tree, sys.stdin.encoding)
        processTree( os.path.abspath(tree), action )


PS: j'ai été faignant, le script ne renomme pas le dossier père de l'arborescence à modifier.

samedi 7 novembre 2009

MacBook Pro, impressions à chaud

Premières impressions sur le MBP reçu hier.

Design
Le design unibody donne une impression assez étrange on a l'impression d'avoir un gros morceau d'aluminium sur le bureau.

Ecran
J'avais longuement hésité entre différentes tailles et entre le modèle brillant et mat. Au final l'écran mat 17" est vraiment excellent et je ne regrette pas d'avoir délaissé le modèle brillant.

Le reste
Pour mes 24 premières heures d'utilisation je ne suis pour le moment pas déçu, j'ai pu scanner et imprimer en me contentant de brancher l'imprimante, rien de plus à faire. Globalement le tout est rapide et fluide même sans avoir switché sur la seconde carte graphique plus performante.
Par contre j'ai fortement peiné pour utiliser NFS entre Linux et le Mac, je pensais que le transfert entre deux machines "unix" serait plus simple. Et au final pour une raison que j'ignore la copie de grosses quantité de données finissait pas s'arrêter toute seul, j'ai donc finit pas opter pour le FTP.
A l'heure actuelle j'essaye de synchroniser mes données entre Linux et Mac avec Unison mais je rencontre encore quelques comportements étranges.

mercredi 4 novembre 2009

Fenêtres, pingouin et pomme

L'informatique est un domaine vaste où chacun peu trouver son compte, il y a en pour tous les goûts, du simplissime à gentoo il n'y a qu'a faire son choix.

Comme beaucoup de gens j'ai débuté avec Windows, et dans mon cas c'était Windows 98.

A l'époque j'étais au top, j'avais plein de supers logiciels pour tout : ADSL autoconnect pour toujours rester en ligne, revelation pour voir les mot de passe cachés, un utilitaire qui change de fond d'écran toutes les 2 minutes, un antivirus et biensûr un indispensable générateur de codes-barres !
Bien évidemment avec tous ces programmes indispensables le PC était mou et je m'émerveillais à chaque réinstallation de Windows de sa rapidité fulgurante qui ne durait hélas jamais plus d'une demi-heure, le temps de réinstaller lesdits outils.
Quoi retenir de cette époque si ce n'est les BSOD intempestifs, les réinstallation mensuelles de Windows et Napster en plein développement.

Trois années après mes débuts en informatique je suis entré en IUT informatique et bien évidemment mon rapport au monde numérique a changé. J'avais déjà entendu parlé de Linux dans le passé, j'avais essayé d'installer une Mandrake 7.0 sans succès sur ma machine. Bref ce système n'était pour moi pas crédible et je me moquais allègrement des gens qui utilisait cet OS à la ligne de commande.
Mais bon, à l'époque j'étais fougueux et rien ne me faisait peur, j'avais donc essayé Mandrake (la 9 si je me rappelle bien) qui avait dû finir par marcher mais bon grosse galère pour faire marcher le modem, la carte graphique et pas mal d'autres choses.

Les mois passant et avec l'aide d'érudits tels que cyberyo qui me prodiguaient conseils et assistance j'ai finit par essayer d'autres distributions telles que la Debian qui m'a longtemps résistée. J'ai dû faire au moins 5 allers-retours entre Debian et Mandrake avant d'être assez aguérit pour installer la Woody sans galérer.
Et ensuite ce fut l'escalade ... testing le passage obligé avant de faire le grand saut vers unstable où chaque apt-get peut péter quelque chose sur votre système. A l'époque j'adorais ça, la bidouille, la recompilation, la recherche de pourquoi ce p*tain de serveur X il veut pas se lancer, pourquoi mon noyau recompilé avec le patch supermount indispensable il boot pas ...


Voila maintenant 8 ans que j'utilise Linux quotidiennement et je commence depuis quelques temps à me lasser de la bidouille.
Il y a 10 ans ça m'amusait de réinstaller un Windows, aujourd'hui je fais tout pour l'éviter.
Il y a 7 ans ça m'amusait de chercher pourquoi tel composant ne voulait pas marcher sous Linux et j'y passais des nuits avec joie et de grands verres de Coca-Cola.
Il y a 2 ans quand mon disque dur a lâché j'ai un peu tout essayé pour récupérer mes données ...


... et ça avait fonctionné.
Aujourd'hui je fais bien sagement des sauvegardes sur un disque dur externe, quand quelque chose ne marche pas je cherche la solution de facilité, exemple : suite à une mise à jour de ma Debian le pilote de l'imprimante ne veut plus marcher, pas grave j'utilise mon VirtualBox et j'imprime avec Windows.

Vous l'avez compris j'aspire à plus de simplicité et après plusieurs semaines d'hésitations je suis sur le point d'effectuer un nouveau virage vers Mac OS qui je l'espère saura m'apporter la tranquilité que j'attends tout en permettant une transition en douceur avec la couche Unix, le serveur X11 et macports (un équivalent à apt-get).

Rendez-vous dans quelques jours pour les premières impressions et sûrement les premières frustration, et oui passer d'un système qu'on maîtrise à un tout nouveau ça se fait pas en deux minutes.

Dernière chose, je trouve assez marrant de voir que je suis passé à Linux à l'époque de Windows XP et que je m'apprette à passer à Mac OS avec l'arrivée de Windows 7.