玩式草子─ソフトウェアとたわむれる日々

第18回 「温故知新」

この記事を読むのに必要な時間:およそ 5.5 分

この連載でも紹介してきたように,現在,手元ではPlamo Linuxの64ビット化作業を進めています。hot plugやネットワーク回りなど,調整しなければならない部分は多数残っているものの,年末年始の集中作業の結果,とりあえずこの原稿を64ビット版Emacs上で書ける程度には環境が整いました。

先に紹介したように,Core i7などx86-64機能に対応したCPUでは,32ビット用のバイナリを互換モードでそのまま動かすことができるので,32ビット用と64ビット用のバイナリが混在した環境で運用することも可能です。しかし,ディストリビューションの作成といった立場からすると,64ビット版は全て64ビット用のパッケージで揃えなければ格好がつかないので,一部の設定ファイルやスクリプト類を除き,既存のパッケージを全てビルドし直しています。

全パッケージの再ビルドというのは面倒な作業ではあるものの,ライブラリへの依存関係なども全て作り直すことになるので,メンテナンスレベルの更新では手を出しにくい,基盤的なソフトウェアのバージョンアップなどを行うことができます。

Plamoの場合,人手不足を口実に壊れてないものは直さないという立場でやっているので,セキュリティフィックス等の重要な更新が無い限り,⁠枯れた」ソフトウェアのバージョンアップは滞りがちです。今回の全面的な再ビルドは,そのようなソフトウェアの埃を払ういい機会ですが,実際にやってみたら使い慣れているはずのソフトウェアの新機能に戸惑うことがありました。今回はそのような事例を紹介してみましょう。

groffの更新

groffは,UNIX上で開発されたroffと呼ばれる組版ソフトをフリーソフトウェアとして再実装したソフトウェアです。

UNIX/Linux上で動く組版ソフトウェアとしてはDonald Knuth氏が開発したTeXが広く知られていますが,roffはTeXよりも古く,UNIXの開発元であるAT&Tベル研究所で開発された由緒あるソフトウェアです。roffはTeX同様のマークアップ方式の組版ソフトウェアで,1つのソースコードから画面表示用や印刷用などさまざまな形式の出力を得ることができます。

より厳密に言うと,roffの起源は,UNIXを生むきっかけとなったMulticsやMultics以前にMITで使われていたCTSSまで遡れるそうです。

組版ソフトとは言うものの,pLaTeX等と比べると使い勝手はよくないので,最近ではわざわざroffを使って文書を書く人はいないでしょうが,UNIXのマニュアルページ(manページ)は伝統的にroffの書式で書くことになっており,現在のLinuxでもmanページはroff形式で書かれているので,表示するためにはGNU版のroffであるgroffコマンドが必要になります。

Plamo Linuxにもgroffのパッケージはありますが,manページの整形くらいにしか使わないので,Plamo-4.73まではgroff-1.17.2を使い続けていました。一方,groffの開発元であるGNUプロジェクトのサイトを見ると,groffの最新版は1.21になっています。そこでさっそく最新版をビルドして入れ替えてみましたが,日本語のmanページが表示できません。

$ man fd
/usr/bin/groff: can't find `DESC' file
/usr/bin/groff:fatal error: invalid device `nippon'

groffは組版ソフトという特徴上,文字コードの扱いが重要になるため,従来は1バイト文字しか扱えないgroffに日本語を通すようなパッチを当てて使っていたのですが,調べてみると,groff-1.19以降ではgroff自身がUTF-8形式の文字コードを受けつけ,自身で日本語も含めたマルチバイト文字を処理できるようになったため,従来の日本語用パッチは廃止されたようです。

ざっとイジった感じでは,出力先をUTF-8(-Tutf8)に指定すれば日本語も整形してくれるようですが,行の折り返しや1バイト文字とマルチバイト文字の組み合わせの間隔調整などがうまく行かずに,ずいぶん間延びした表示になってしまうようです。

$ cat /usr/share/man/ja_JP.eucJP/man1/fd.1 | groff -DeucJP -Tutf8 | nkf -e
<standard input>:40: warning [p 1, 0.5i]: cannot adjust line
<standard input>:44: warning [p 1, 1.0i]: cannot adjust line
...
<standard input>:673: warning [p 7, 0.3i]: cannot adjust line                                       
fd - ファイル・ディレクトリ管理ツール [ ] [ ] [ [ ]]                                              
[    ]   [   ]   は、   UNIX   汎用のテキスト端末用に考えられた、                                  
ファイルやディレクトリの管理ツールです。 PC/AT 互換機と  PC‐98x1                                  
専用に作られている同名ユーティリティのクローンを目指しています。                                   
実際、機能的には上位互換となっています。                        
....

これらの不具合は将来のバージョンでは解決していくとは思うものの,日本語のmanページがきちんと表示できなくなるとgroffを更新する意味がないので,今回の更新は日本語パッチが用意されている最終バージョンである1.18.1.1にとどめておくことにしました。

謎のESCコード

ところが,groff-1.18.1.1では日本語manページも表示できるものの,表示結果はESCコードが多数混じった見苦しいものになってしまいます図1)⁠

図1 ESCが混じった日本語manページ

図1 ESCが混じった日本語manページ

安定環境のマシンにログインして,同じmanページをgroff-1.17.2で見ると正しく表示されます。

おかしいなぁ……,と思って両者の違いを見るために,それぞれの出力結果をファイルに書き出してEmacsで読み込んでみると,groff-1.17.2図2の下側のターミナル)では強調文字が^Hを使って表現されている(たとえば「名^H^H名称^H^H称」⁠のに対して,groff-1.18.1図2の上側のターミナル)では強調文字がESCシーケンスを使って表現されている(たとえば「^[[1m名称^[[0m」⁠ようです。

図2 groff-1.17.2と1.18.1.1の出力の比較

図2 groff-1.17.2と1.18.1.1の出力の比較

「^H」「コントロールH」と読み,キーボードのCtrlキーとHキーを同時に押した際に発生するコードです。Ctrlキーとアルファベットキーを同時に押した際に発生するコードは「コントロールコード」と呼ばれ,元々はタイプライタの印字位置を制御するために使われていました。たとえば「^H」「一文字後退」という意味を持ち,⁠A^HA」「一度Aを打ってから,一文字後退して,再度Aを打つ」という意味で,Aを2度打ちすることで印字を濃くし,その文字を強調することに使われます。⁠コントロールコード」には他にも「^I」でタブ,⁠^J」で改行,⁠^G」でベル,等の機能が定義されています。

強調や背景色などの文字飾りをESCシーケンスを使って実現するのはコンソールでは常套手段ですが,lessはそれらのESCシーケンスを文字飾りとは認識せず,ESCシーケンスをそのまま出力してしまうようです。一方,moreだとESCシーケンスを文字飾りとして表示するので,PAGER='more'とすればmanページは読めるようになりますが,スクロールバックや検索といったlessの便利な機能に欠けるmoreでは何かと不便です。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

コメントの記入