ソースコード・リテラシーのススメ

第19回 ソフトウェア・ツールズの活用

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

ソフトウェア・ツールズの使用例

ソフトウェア・ツールズの実例として,上述のX11R7.4への更新の際に生じたパッケージ確認作業を紹介しましょう。

Plamo-4.5ではリリース時期の都合でX11R7.3を採用していますが,9月の下旬にX11R7.4が公開されてしまったので,Plamo-4.5のリリースが終ると,さっそくX11R7.4のパッケージ化を開始しました。7.3の時はパッケージの作成方法から試行錯誤していたのでずいぶん苦労しましたが,経験を積んだおかげで7.4ではそれぞれのパッケージごとのビルドスクリプトもすんなり作成でき,パッケージをビルドした開発環境では大きな問題もなくX11R7.4のXサーバxserver-1.5.1を起動することができました。

しかし,別のマシンでX11R7.3のパッケージを全部削除してから新しく作ったX11R7.4のパッケージを入れてみると,xinitxtermといった重要なソフトウェアが見つからないのでXを起動できません。おかしいなぁ……,と調べてみると,FTPで公開されているX11R7.4以下のディレクトリに含まれているのは7.3からバージョンアップされたものだけで,バージョンアップされていないxinitやxtermなどは含まれていないようです。また,Xサーバのドライバ類では名称が変更されているものもあります(7.3ではIntelの統合チップセット用のドライバはxf86-video-i810だったのが,7.4では新しいビデオチップのサポートも加えてxf86-video-intelに変更された,など)⁠

こうなると,X11R7.4へアップデートするには,単純に7.3のパッケージを全て削除して7.4のパッケージで置き替える,というわけには行かず,7.3から7.4で更新されたパッケージのみ入れ替えて,それ以外は残しておく,といった作業が必要になりそうです。Plamo-4.5のX関連のパッケージは300近くあるため,どれを残してどれを更新するかを一々手でチェックするのは大変な作業でしょう。このような作業にはソフトウェア・ツールズの力を借りるにかぎります。

7.3と7.4でどれくらい差があるかを調べるために,7.3のパッケージと7.4のパッケージの一覧を比較することにしました。まずはPlamo-4.5のDVDイメージを/loopディレクトリにマウントし,plamo/02_x11にあるX11R7.3由来のパッケージの一覧をR73.datというファイルに記録します。

% ls /loop/plamo/02_x11/{app,doc,driver,font,lib,proto,util,xserver}.tgz/*.tgz > R73.dat 

同様に,X11R7.4用に新規作成したパッケージの一覧も用意します。

% ls X11R74/*/*.tgz > R74.dat

この状態では,R73.datもR74.datも,ファイル名の中にパス名が含まれたままになっています。

 (R73.dat)
 /loop/plamo/02_x11/app.tgz/appres-1.0.1-i586-P1.tgz
 /loop/plamo/02_x11/app.tgz/bdftopcf-1.0.1-i586-P1.tgz
 ...

 (R74.dat)
 X11R74/app/appres-1.0.1-i586-P1.tgz
 X11R74/app/bitmap-1.0.3-i586-P1.tgz
 ...

このままでは比較できないのでパッケージ名だけを取り出すことを考えます。Linux/UNIXの場合,⁠/⁠がパスの区切りになるので,⁠/⁠を区切り記号にしてファイル名を分割すればよさそうです。このような作業にはcutコマンドが便利です。

% cut -f6 -d'/' R73.dat > R73-packages.dat
% cut -f3 -d'/' R74.dat > R74-packages.dat

 (R73-packages.dat)
 appres-1.0.1-i586-P1.tgz
 bdftopcf-1.0.1-i586-P1.tgz
 ...

 (R74-packages.dat)
 appres-1.0.1-i586-P1.tgz
 bitmap-1.0.3-i586-P1.tgz
 ...

次に,これら2つのパッケージをcatを使って合併した上でsortし,同じようなパッケージ名がまとまるようにしてみます。

% cat R73-packages.dat R74-packages.dat | sort | less
 IPAfont-00203-noarch-P3.tgz
 VLGothic-20080610-noarch-P1.tgz
 applewmproto-1.0.3-i586-P1.tgz
 applewmproto-1.0.3-i586-P1.tgz
 ...
 libAppleWM-1.0.0-i586-P1.tgz
 libAppleWM-1.0.0-i586-P1.tgz
 libFS-1.0.0-i586-P1.tgz
 libFS-1.0.1-i586-P1.tgz
 libICE-1.0.4-i586-P1.tgz
 libICE-1.0.4-i586-P1.tgz
 libSM-1.0.3-i586-P1.tgz
 libSM-1.1.0-i586-P1.tgz
 ...

両者をマージして調べてみると,X11R7.4として配布されているソースコードには7.3からバージョンアップしたものだけでなく,そのままのバージョンのものも含まれているようです。だとすると7.4に必要なものはリリースに含まれているべきだと思うのですが,GUIログイン用のディスプレイマネージャ(xdm)なども7.4のリリースには含まれていないので,別途用意しないといけないことも確かです。

ソースコードのモジュール化を進めた結果,メンテナ間の足並みが揃わなくなったことが原因のように思いますが,7.4として公開されているソースコードだけでは動作するシステムにならないので,とりあえずは動いている7.3をベースに,7.4として配布されている同名のパッケージのみを更新し,その他は残しておく,という方針にするのがよさそうです。

そういう条件で更新すべきパッケージを調べるために,パッケージのベース名のみを切り出して,uniqを使って7.3と7.4の双方に含まれるものを抽出しました。

% cat R7[34]-packages.dat | cut -f1 -d'-' | sort | uniq -c | less
      1 IPAfont
      1 VLGothic
      2 applewmproto
      2 appres
      1 bdftopcf
      1 beforelight
      2 bigreqsproto
      2 bitmap
      2 compositeproto
      2 damageproto
      2 dmxproto
      1 editres
 ...

これで頭に2が付いているのは7.3と7.4の双方に含まれているパッケージなので,これらは7.4のパッケージで安全に更新できそうです。一方,それ以外のパッケージは7.3由来か7.4由来かを区別しながら,もう少し詳しく見る必要がありそうです。

最後の部分の処理はgawkを使ってもできそうです。gawk ならば,区切り文字を示すFS変数を⁠-⁠(ハイフン)にして,それぞれのパッケージ名の連想配列に出現数をカウントする,といった処理になるでしょう。

% cat R7[34]-packages.dat | gawk 'BEGIN{FS="-"}{count[$1]++}END{for(i in count)print i, count[i]}' 
xbacklight 1
compositeproto 2
xvidtune 1
xkbcomp 2
xhost 2
xf86_video_r128 1
 ...

これくらいの処理ならばgawkのスクリプトを書くよりも基本コマンドを組み合わせて使う方が楽そうですが,この処理をより汎用的に使えるようにすれば,パッケージ名のダブリをチェックするためのツールに進化しそうです。そのようなツールはPerlやPythonで書いておく方が,メンテナンスや新機能の追加等も容易になるでしょう。

非定型な作業では,実際にやってみないとどういう処理が必要になるかがわからないことがよくあります。今回紹介した例でも,文章にすると一直線に進んでいるように見えますが,実際の作業時はシェルのヒストリー機能を使いながら,処理の手順や方法をあれこれ変えて試しています。小さなコマンドを組み合わせて複雑な処理を実現するソフトウェア・ツールズの考え方は,⁠どういう処理が有効かわからないので,いろいろな方法を試してみる」といった試行錯誤的な作業の際に力を発揮します。たいていの雑作業は,使い捨てのコマンドラインや短いシェルスクリプトで処理できますが,より多機能,高性能なスクリプト言語で書き直す際にも,ソフトウェア・ツールズを使ったプロトタイピングは有効な設計図になります。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたのが,いつの間にかミイラ取りがミイラになってOSSを仕事にするようになってしまいました。最近はスペシャリスト養成を目的とした専門職大学院で教壇に立ったりもしています。

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