lundi 22 décembre 2008

Utiliser un ordinateur portable comme eBook pour lire des documents

Idée générale

Actuellement, mes travaux me demandent de lire beaucoup de documents numériques, principalement sous forme de fichiers PDF et OpenDocument. Je me suis alors posé la question d'une méthode de travail pour éviter les problèmes habituels liés à cette activité : fatigue oculaire, mauvaise position du corps, etc. Je présente ici ma solution actuelle.

L'idée générale est de pouvoir travailler dans mon environnement informatique habituel, d'être capable de basculer très simplement dans une situation de lecture, pour revenir à la situation originale. L'accent a donc été mis sur la simplicité d'utilisation, dans le cadre des configurations existantes.

Cadre technique

Le cadre technique est le suivant :

  • ordinateur : portable Dell Latitude D830
  • système d'exploitation : Ubuntu, version stable actuelle (Intrepid Ibex)
  • lecteur de PDF : evince
  • lecteur d'ODF : OpenOffice.org

La rotation de l'écran est assurée par l'extension RandR de X.org. Le pilotage de la rotation se fait par la commande xrandr.

Mise en place

Au niveau de l'utilisateur, la mise en place de l'environnement de lecture se fait par l'utilisation de scripts ouvrant les documents avec des modalités adaptées. Ainsi, pour un PDF on peut envisager le script suivant qui fait pivoter l'écran, ouvre le document en plein écran, et à la fin remet l'écran en mode horizontal :

#!/bin/bash

xrandr -o left
evince --fullscreen "$1"
xrandr -o normal

Ou encore pour une série d'images dans le dossier courant :

#!/bin/bash

xrandr -o left
gqview --fullscreen "$1"
xrandr -o normal

La situation typique d'utilisation est celle-ci :

  1. je travaille dans l'environnement traditionnel, avec un affichage en mode horizontal
  2. dans un terminal, j'appelle le script de lecture sur le document désiré
  3. l'ordinateur bascule dans l'environnement de lecture, avec un affichage vertical plein écran
  4. je lis
  5. à la fin de la lecture, je ferme le document
  6. l'ordinateur rebascule automatiquement vers l'environnement traditionnel

On peut constater que si pour le système d'exploitation la rotation ne pose aucun problème, l'ouverture du document dans un mode de lecture adapté dépend uniquement du logiciel : plein écran, réglage de barre d'outil, etc. Ici, je m'appuie sur ma configuration habituelle d'evince et spécifie que je souhaite ouvrir le document en mode « plein écran ». La rotation étant déjà effectuée, l'affichage se fait en conséquence. À la fin de la lecture, je n'ai qu'à fermer le document, et donc quitter evince, pour que le script exécute la dernière instruction et rétablisse l'orientation normale.

Exemple de lecture

eBook - portable stableL'ordinateur portable se cale très bien en position assise, légèrement en arrière, en prenant appui sur les cuisses.


eBook - prise en main Prise en main de l'ordinateur. En raison du poids (1,5kg) et de la chaleur, il est préférable d'avoir une position stable.


eBook - contrôle au touchpad et au clavier Le contrôle de la lecture se fait soit par le touchpad, à hauteur médiane, soit par le pavé directionnel, en bas.


eBook - page plein écran Les pages sont affichées une par une, en plein écran. Tout en haut se trouve une barre d'outil indiquant le numéro de page et qui permet la navigation par section.


eBook - contraste élevé Même dans le noir ou en pleine lumière, l'eBook est lisible. Un écran de qualité avec un angle de vue large permet de ne pas être figé dans une position unique durant la lecture.

Améliorations envisagées

Réaliser l'inversion des axes du touchpad pour permettre une utilisation aisée du pointeur en position verticale. Cela permettra d'utiliser la navigation hypermédia dans les documents, et d'envisager la consultation du web.

Mettre en place différents jeux de configuration pour les applications. Ces jeux de configuration, spécifiques à chaque environnement de travail (eBook, 2e écran vertical, portable en déplacement, etc), permettrait de basculer complètement de façon dynamique d'un environnement, pour avoir des réglages adaptés au niveau des applications.

lundi 8 septembre 2008

Manipuler les images disques de MacOS en ligne de commande

Avant-propos

Pour les utilisateurs venant du monde UNIX, il est indispensable de savoir manipuler en ligne de commande les images disques d'Apple. Il en existe de deux sortes : les traditionnelles (avec leur variations : chiffrées, compressées, etc) et les grossissantes.

Les images disques grossissantes sont des images disques ayant une taille maximale définie à la création. Toutefois, uniquement l'espace utilisé est écrit sur le disque, ce qui permet de limiter l'espace occupé.

Concrètement, une telle image se présente sous la forme d'un répertoire IMAGE.sparsebundle contenant une collection de bandes, un index des données et un fichier de métadonnées sur l'image. Il va de soit qu'il est extrêmement déconseillé d'aller trifouiller au petit bonheur la chance à l'intérieur de ces fichiers.

Il est important de se pencher sur la façon dont les volumes et disques sont attachés sous MacOS. Sans entrer dans les détails, on admettra que les disques physiques sont directement (c'est à dire, sans tampon ou couche tierce) accessibles par les nœuds /dev/rdisk*; ils ont leur contrepartie logique sous la forme /dev/disk*.

Une image disque, étant un volume logique, sera attachée sous la forme /dev/diskXsY, comme si elle était un disque dur. X est alors un identifiant du disque, et chaque partition est associée à un identifiant Y. Chaque partition du disque logique peut alors être montée; le point de montage par défaut étant /Volumes/. Il est bien sur possible d'attacher une image disque sans la monter, afin d'utiliser par exemple des outils travaillant sur les blocs.

Également, MacOS associe à chaque image disque une somme de contrôle permettant de tester son intégrité. Par défaut, des tests (parfois longs) sont effectués. À vous de décider si vous voulez les valider ou bien les ignorer.

La syntaxe des exemples suivants est valable pour MacOS Léopard, et peut-être des versions ultérieures (Jaguar, Panthère et Tigre ont connu des évolutions dans la gestion des images disques; sans parler de Puma et Guépard).

Attacher une image disque

Attache le disque en un nœud /dev/disk* et monte le volume dans /Volumes/. Il est possible d'attacher une image disque sans monter son volume en utilisant l'option -nomount. D'autres options comme -nobrowse ou -private marqueront le volume comme n'étant pas utilisable par les applications (ainsi, le Finder ne l'affichera pas) ou ne notifieront pas le système de l'ajout du disque (pas d'indexation SpotLight).

hdiutil attach IMAGE

Démonter une image disque

Démonte un système de fichiers d'une image disque sans libérer ce dernier. Le nœud /dev/disk* est toujours présent mais le système de fichiers n'est plus monté.

hdiutil umount /Volumes/IMAGE

Démonter et détacher une image disque

Démonter le système de fichiers; le nœud du disque logique est supprimé de /dev/disk*,

hdiutil detach /Volumes/IMAGE

Créer une image disque grossissante

Créer une image disque de taille maximale 500 Go, avec un système de fichier en HFS+ journalisé et sensible à la casse :

  • -size 500G : taille maximale de l'image
  • -fs HFSX : système de fichiers HFS+ sensible à la casse
  • -J : utilisation d'un journal pour le système de fichiers
  • -type SPARSEBUNDLE : le type d'image disque
  • -volname "Sauvegardes" : le nom du volume de l'image disque; il sera utilisé comme nom de point de montage par défaut dans /Volumes/
hdiutil create -size 500G -fs HFSX -fsargs -J -type SPARSEBUNDLE -volname "Sauvegardes" Sauvegardes.sparsebundle

Optimiser la taille de l'image disque

Pour une image disque grossissante, il est possible de demander la récupération de l'espace non-utilisé dans les bandes, pour faire ramener sa taille à celle du volume des données qu'elle contient.

hdiutil compact IMAGE

Formater un volume en HFS

Il est tout à fait possible de formater un volume d'une image disque existante. Il suffit d'attacher l'image disque, et de travailler sur les partitions. On peut utiliser les options suivantes :

  • -J : utilisation d'un journal pour le système de fichiers
  • -s : le système de fichier sera sensible à la casse
  • -v Données" : le nom du volume
newfs_hfs -J -s -v "Données" /dev/diskXXXXX

Connaître les opérations possibles sur les images disques

La commande hdiutil ne se limite pas aux simples opérations de montage et démontage de volumes. Elle permet également de convertir, graver, segmenter et d'une façon générale d'effectuer toutes les opérations possibles sur les images disques. La commande en elle-même intègre une documentation extensive, et son manuel contient des exemples concrets.

hdiutil help et plus précisément hdiutil help COMMAND.

Références

mercredi 3 septembre 2008

Problème d'encodage avec Java sous MacOS X Léopard

Sous Léopard, la machine virtuelle java (JVM) d'Apple se lance par défaut avec l'encodage MacRoman. Si choix est compréhensible au vu de l'histoire des technologies d'Apple, il est toutefois de nos jours rendu obsolète avec le passage à l'unicode. Pire, les développeurs et administrateurs systèmes s'attendent désormais à des outils fonctionnant en UTF-8, ce qui pose donc des problèmes d'intégration.

Pour les systèmes GNU/linux, les différentes JVM travaillent avec l'encodage du système qui est désormais l'UTF-8. Mais la JVM d'Apple se comporte différemment, avec un réglage défini en interne.

Faisons quelques essais avec ce jeu de test.

Commençons avec GNU/linux :

$ uname -a
Linux liristpq.Univ-Lyon1.fr 2.6.27-2-generic #1 SMP Thu Aug 28 17:18:43 UTC 2008 x86_64 GNU/linux

$ java GetEncoding 
Random bytes
encoding: UTF8

$ LC_ALL=ASCII java GetEncoding 
Random bytes
encoding: ASCII

Comme on peut le constater, l'utilisation de l'encodage est dynamique, avec par défaut celui du système.

Regardons maintenant ce que cela donne sur Léopard. Nous commençons par lancer la même commande que pour GNU/Linux, et ensuite nous affinerons manuellement l'encodage UTF-8 avec l'option -Dfile.encoding=UTF-8 :

$ uname -a
Darwin arda.local 9.4.0 Darwin Kernel Version 9.4.0: Mon Jun  9 19:30:53 PDT 2008; root:xnu-1228.5.20~1/RELEASE_I386 i386 i386 iMac6,1 Darwin

$ java GetEncoding
Random bytes
encoding: MacRoman

$ java -Dfile.encoding=UTF-8 GetEncoding
Random bytes
encoding: UTF8

$ LC_ALL=ASCII java GetEncoding
Random bytes
encoding: MacRoman

La différence est flagrante. La JVM d'Apple sous Léopard utilise par défaut l'encodage MacRoman et ne supporte pas la sélection par les locales, ce qui pose de réels problèmes d'interopérabilité.

Une solution simple est d'appeler systématiquement la JVM en spécifiant l'encodage UTF-8, mais elle n'est pas idéal.

samedi 12 février 2005

Tutoriel pour update-alternatives

On désire proposer de façon générique un éditeur via la commande éditeur. Cette commande aura pour but de choisir un éditeur parmi une liste définie, et de le lancer. Pour se faire, nous allons utiliser les alternatives. L'intérêt de cette méthode est de rendre transparent la sélection de clones pour un programme et de simplifier leur administration. Par exemple, on pourrait souhaiter de rassembler derrière la commande browser les logiciels mozilla, firefox, galeon, dillo, etc.

L'ensemble des commandes à gérer est rassemblé dans un groupe, que nous appellerons ici éditeur. De plus, on associe une priorité à chaque alternative du groupe. Lorsque le groupe est administré en mode auto, l'alternative employée est celle possédant la plus haute priorité.

Dans notre cas, nous avons les 3 éditeurs suivants que nous souhaiterions gérer derrière notre commande générique /bin/éditeur. Cette commande sera en fait un lien dynamique pointant vers l'un des 3 logiciels suivants :

  • /usr/bin/vi
  • /usr/bin/vim
  • /usr/bin/nvi

La première étape consiste à créer notre groupe éditeur.

$ update-alternatives --install /bin/éditeur éditeur /usr/bin/vim 9
$ update-alternatives --display éditeur 
éditeur - status is auto.
link currently points to /usr/bin/vim
/usr/bin/vim - priority 9
Current `best' version is /usr/bin/vim.

D'ailleurs, il est facile de le vérifier.

$ /bin/éditeur --version
VIM - Vi IMproved 6.3 (2004 June 7, compiled Jan 19 2005 08:10:19)

Continuons, et rajoutons nvi à notre groupe. Nous lui mettrons la priorité 2.

$ update-alternatives --install /bin/éditeur éditeur /usr/bin/nvi 2
$ update-alternatives --display éditeur
éditeur - status is auto.
link currently points to /usr/bin/vim
/usr/bin/vim - priority 9
/usr/bin/nvi - priority 2
Current `best' version is /usr/bin/vim.

Continuons encore, et rajoutons vi à notre groupe. Nous lui mettrons la priorité 1, c'est à dire la plus faible.

$ update-alternatives --install /bin/éditeur éditeur /usr/bin/vi 1
$ update-alternatives --display éditeur
éditeur - status is auto.
link currently points to /usr/bin/vim
/usr/bin/vim - priority 9
/usr/bin/nvi - priority 2
/usr/bin/vi - priority 1
Current `best' version is /usr/bin/vim.

Notre groupe est désormais prêt. La commande éditeur est opérationnelle.

Imaginons maintenant que suite à une mauvaise mise à jour, vim soit inutilisable. Notre commande générique éditeur devient donc inexploitable. Nous allons corriger la chose en la faisant pointer vers un autre clone de vi : nvi.

$ update-alternatives --config éditeur

There are 3 alternatives which provide `éditeur'.

Selection Alternative
-----------------------------------------------
*+    1        /usr/bin/vim
      2        /usr/bin/nvi
      3        /usr/bin/vi

Press enter to keep the default[*], or type selection number:

Rentrons 2 pour choisir nvi.

Using `/usr/bin/nvi' to provide `éditeur'.
$ update-alternatives --display éditeur
éditeur - status is manual.
link currently points to /usr/bin/nvi
/usr/bin/vim - priority 9
/usr/bin/nvi - priority 2
/usr/bin/vi - priority 1
Current `best' version is /usr/bin/vim.

On découvre ici que vim est bien notre logiciel appelé, et que la gestion du groupe est passée en manual. Ce qui veut dire que l'on n'utilise pas nécessairement l'alternative ayant la plus haute priorité (qui reviendrait dans notre cas à utiliser vim, ce que nous refusons de faire car celui-ci étant indisponible).

Pour revenir à vim, on repasse par l'option --config.

$ update-alternatives --config éditeur

There are 3 alternatives which provide `éditeur'.

Selection Alternative
-----------------------------------------------
 +    1        /usr/bin/vim
*     2        /usr/bin/nvi
      3        /usr/bin/vi

Press enter to keep the default[*], or type selection number:

Répondons 1 et constatons :

Using `/usr/bin/vim' to provide `éditeur'.

Il est temps de reconfier au système la gestion automatique des alternatives du groupe et de voir en quoi cela est une Bonne Idée.

$ update-alternatives --auto éditeur

Il est bien sur possible de retirer une redirection si un logiciel vient à être désinstallé. Examinons cette possibilité pour vi.

$ update-alternatives --remove éditeur /usr/bin/vi
$ update-alternatives --display éditeur
éditeur - status is auto.
link currently points to /usr/bin/vim
/usr/bin/vim - priority 9
/usr/bin/nvi - priority 2
Current `best' version is /usr/bin/vim.

Notre commande éditeur fait toujours appel à vim, et vi ne fait plus partie du groupe. De la même façon, si nous retirons l'alternative active, le système prendra automatiquement (d'où l'intérêt du mode auto :) l'alternative restante ayant la plus grande priorité.

$ update-alternatives --remove éditeur /usr/bin/vim
$ update-alternatives --display éditeur
éditeur - status is auto.
link currently points to /usr/bin/nvi
/usr/bin/nvi - priority 2
Current `best' version is /usr/bin/nvi.

Finalement, comme nous sommes des gens très propres, nous allons supprimer le groupe, remettant tout en l'état.

$ update-alternatives --remove-all éditeur
$ update-alternatives --display éditeur
No alternatives for éditeur.

Durant toutes ces manipulations, il est possible de corriger une entrée précédente en l'écrasant par la nouvelle. Pratique pour changer le chemin d'accès d'un fichier déplacé. Bien entendu, si la mauvaise manipulation a été à l'origine de la création d'un nouveau groupe, la solution qui s'impose est de détruire complètement ce groupe.

La seule méthode actuelle permettant de connaître la liste des alternatives mises en place est de lister le répertoire les contenant. Notez au passage que c'est une très mauvaise idée que d'effectuer directement des modifications dans le contenu de ce répertoire.

$ ls /etc/alternatives/

Pour aller plus loin, il est possible de créer des sous-groupes au sein d'un groupe. Par exemple, pour lier des logiciels à leurs manuels. Ce qui reviendrait à fournir dynamiquement le bon manuel à l'utilisateur en cas d'appel.

Ainsi, nous aurions les couples suivants :

  • usr/bin/vim et /usr/share/man/man1/vim.1.gz
  • /usr/bin/nvi et /usr/share/man/man1/nvi.1.gz
  • /usr/bin/vi et /usr/share/man/man1/vi.1.gz

Pour se faire, on rajoutera l'option --slave lors de la définition de l'alternative. La syntaxe suit celle de l'option --install.

$ update-alternatives --install /bin/éditeur éditeur /usr/bin/vim 9 \
	--slave /usr/share/man/man1/éditeur.1.gz éditeur.1.gz /usr/share/man/man1/vim.1.gz
$ update-alternatives --install /bin/éditeur éditeur /usr/bin/nvi 2 \
	--slave /usr/share/man/man1/éditeur.1.gz éditeur.1.gz /usr/share/man/man1/nvi.1.gz
$ update-alternatives --install /bin/éditeur éditeur /usr/bin/vi 1 \
	--slave /usr/share/man/man1/éditeur.1.gz éditeur.1.gz /usr/share/man/man1/vi.1.gz

Le résultat correspond à notre attente. En changeant d'alternative, on modifie non seulement le logiciel appelé, mais également son manuel. Un vrai bonheur.

$ update-alternatives --display éditeur
éditeur - status is auto.
link currently points to /usr/bin/vim
/usr/bin/vi - priority 1
 slave éditeur.1.gz: /usr/share/man/man1/vi.1.gz
/usr/bin/nvi - priority 2
 slave éditeur.1.gz: /usr/share/man/man1/nvi.1.gz
/usr/bin/vim - priority 9
 slave éditeur.1.gz: /usr/share/man/man1/vim.1.gz
Current `best' version is /usr/bin/vim.

La commande update-alternatives fourni encore d'autres possibilités, mais cela dépasse le cadre de cette simple documentation. Voir donc le manuel pour de plus amples informations: update-alternatives(8)

Références

page 3 de 3 -