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.

mercredi 28 octobre 2009

Beneath a Steel Sky Remastered

Ce titre vous est probablement familier si vous êtes amateur de "point and click". En effet Beneath a Steel Sky est parmis les plus connus du genre avec Day of the Tentacle.


Je ne suis pas spécialement amateur de ce genre de jeu car tôt ou tard je finis par être bloqué et je pers assez vite patience, j'avais d'ailleurs essayé ce jeu il y a quelques années via ScummVM et je n'avais pas dû dépasser la première zone.

Mais il se trouve que ce jeu est sorti en version remasterisée sur l'iPhone avec une nouveauté particulièrement intéressante, une aide consultable tout au long du jeu et indiquant petit à petit les prochaines actions à réaliser.
J'ai donc investi et je n'ai pas du tout été déçu le jeu est très sympa, les dialogues excellents et le système d'aide super pratique quand on est bloqué et impatient.



Dernier point la version remasterisée s'est vue octroyée d'un petit bout de fin supplémentaire que j'ai personnellement trouvé sans intérêt voir même qui gâchait un peu le reste en faisant cheveu sur la soupe.

lundi 26 octobre 2009

Pourquoi faire simple

Cela fait à peu près 2 semaines que j'envisage l'abandon du pingouin pour passer à la pomme car j'en ais marre d'avoir des problèmes pour tout et n'importe quoi.

Par exemple mes problèmes de son décrits dans un précédent billet ou encore le passage au noyau 2.6.31.4 qui de temps en temps une fois arrivé sur gnome me prive de clavier, souris et même de mon acpi donc obligé de couper comme un barbare et de se taper un fsck au reboot.

Et ce soir petite blague sympa : retour de week-end avec changement d'heure, je démarre une fois sous Linux et une fois sous Windows pour que chacun se mette à l'heure d'hiver puis je retourne sous Linux qui refuse de démarrer, et oui le système de fichier a été monter dans le future et apparemment c'est une erreur fatale. Et la on a juste envie de lui dire "hé pov con c'est toi qui a changé la date il y a 5 minutes !".
Bref petit fsck, reboot et même erreur sur une autre partition, refsck et enfin ça démarre. Non mais vraiment comment qualifié cela si ce n'est de "user-unfriendly"

PS : ce billet a été rédigé sur une machine Apple.

mercredi 21 octobre 2009

cat file | while read line; do echo $line; done

Voila, comme ça la prochaine fois je ne perdrai pas 5 minutes à essayer de retrouver la syntaxe pour lire un fichier ligne pas ligne dans un script shell.

mercredi 14 octobre 2009

Pulsechiuraudio

Sur les conseil d'un pote j'ai voulut mettre en place pulseaudio sur ma machine pour palier le manque de mixer hardware de ma carte son.
Sur le papier tout est beau, c'est un outil magique qui sait tout faire et super tunable dans tous les sens. Dans la pratique c'est la merde parce que une fois de plus je n'ai pas une utilisation "comme tout le monde" de l'outil. Une fois de plus parce que ça me rappel l'arrivée de compiz (le gestionnaire de fenêtre en 3D), "Essaye compiz tu verras c'est top", "bah non ça gère le bi-écran n'importe comment".

Dans le cas présent le soucis vient de mpd, le serveur de musique que j'utilise. Alors pourquoi mpd ? parce que les développeurs d'amarok se sont dit que la v1.4 était trop bien alors pourquoi ne pas sortir une v2 plus lourde avec moins de fonctionnalités et avec des bugs dans l'interface. Mais je m'égare, revenons à pulseaudio.

Donc, pulseaudio marche très bien quand il est lancé par l'utilisateur, configurable, simple, etc ... mais mpd est lancé avec un autre utilisateur (mpd) et n'a pas accès à mon serveur pulseaudio (grrrr). Or toutes les options pour activer le partage sont grisées dans l'interface de configuration (GRRRrrRRRRRRRr) et si je configure mpd pour utiliser pulse il lance son propre serveur et là le premier sur la carte son l'emporte (GRRRRRRRRRRRR !!!!!!).
Vous l'avez compris c'est DE - LA - MERDE ! c'est ce genre de situation qui me donne envie d'acheter un mac où on n'est pas emmerdé avec toutes ces conneries (et non windows n'est pas une option).

Reste le plan Z après avoir épuisé tous les autres, lancer pulseaudio comme un vrai démon, mais "bouh c'est mal" nous dit la doc, "c'est pas bien", etc ... rien à f*utre j'ai plus rien perdre. Après quelques essais le tout fini par marcher, mais reste tout de même un problème (faut pas déconner non plus) impossible de configurer le nombre de canaux donc pas moyen de profiter du 5.1 car lorsqu'on lance pulseaudio comme "vrai" serveur l'interface de configuration est amputée de la moitié des paramètres par rapport au lancement "par utilisateur".
Qu'à cela ne tienne je suis d'humeur joueuse et je finis par trouver le paramètre à modifier dans le bon fichier de configuration. Mais manque de chance lorsque je lui indique 6 canaux, au lieu de comprendre "5.1" il me met "IEC958" ... après quelques essais je finis par m'avouer vaincu et je reviens à ma configuration initial, très frustré et déçu de ne rien avoir à jeter par la fenêtre ...