ソフトウェア開発、あるいは、エンジニアリング・ワークステーションの分野で、 Unix が、幅広く使われるようになったが、Unix そのものは情報の生成、加工、蓄積、 交換、検索といった、およそ事務作業に必要なツールのほとんどを、 柔軟で統一のとれたシステムとして実現しているのであるから、 あとは、日本語の処理機能があれば、事務処理用としても威力を発揮しそうである。 (1)
およそ、この程度の認識と、当時、 オフィス・コンピュータの夢のなさにうんざりしていたこともあって、 出たばかりの日本語 Unix マシン、東芝の UX-300 とつき合ってみることにした。 今から、、およそ 2 年前の話しである。
そして、試しに、オフィス・コンピュータで動かしていた COBOL のプログラムを 何本か、C 言語に書き換えてみたわけだが、その早いこと早いこと。 ソフトウェア開発の生産性の高さに、 ほとほと感心した。
Unix そのものは、プロ、マニア好みの OS で、 素人向きでないという判断が一般的であるから、 そのまま実務に使うのもどうかと思ったが、 Unix の魅力には抗し難く、 半年たったところで、 強引に切替えてしまった。
ところが驚いたことに、評判がよいのである。 紙と鉛筆で仕事をするより、端末上で処理する方が、 早くて楽だということが理解されるにつれて、 情報の蓄積をディスク上で行うことの重要性が認識され、 自然に紙離れが進み始めた。
中でも圧巻だったのは、コンピュータ嫌いの最右翼として、 コンピュータなどナンセンスと公言してはばからなかった男が、 突然、Unix ユーザに転向して、 仲間をあわてさせたことである。
素人が素人向きでないと言われる OS を喜んで使うというのも、変な話しであるが、 考えてみれば、これは仕事のツールである。 毎日の仕事で使うものである以上、慣れるに従って、 加速度的に能率の良くなるようなツールが、本物であって、 反対に、とっつきやすいが、すぐ頭打ちになるようなものは、 夢がない。
よいツールというのは、本来、単純で、洗練されていて、 慣れるための多少の訓練は、必要とするものである。
この他にも、端末がスクリーン指向になっていないとか、 Unix に対する、いくつかの批判がないわけではない。 しかし、前者については、やはり、仕事のツールなのであるから、 必要最小限の入力で済むような端末に、圧倒的な利点があり、 tty 端末でできることは、tty 端末ですべきであろう。
後者については、もともと。事務処理の場合、 市販のアプリケーション・プログラムがそのまま使えるということは、ほとんどないし、 経営というのは、それだけ多用性に富んだものである。 また、自分独自アプリケーションの蓄積が、 差別化の基本でもあるはずである。
結局、われわれの経験としては、従来、オフィス・コンピュータで処理していた仕事を、 すべて Unix 上にのせ、 事務処理のほとんどを、 一貫して Unix の端末で行うという方向について、 反対すべき根拠は、何もないように思える。
Unix は、極めて居心地のよい、自由で、能率的な OS だといえる。 こと業務用に関する限り、価格を含む、すべての点で、 オフィス・コンピュータやパーソナル・コンピュータの時代は終ったというのが、 われわれの実感である。二度と、元の環境に戻りたくはない。
Unix については、すでに多量に文献が出ている。 (2) ここでは、はじめて Unix に接する方が、 実際に、事務処理に応用する際の、着眼点と、 いくつかのヒントについて、延べてみたいと思う。
Unix の本質は、ひとつひとつのコマンドや、OS の構造にあるのではなく、 それらすべての枠組にあるように思える。 その機能の豊富さにもかかわらず、 全体としては、単純で、統一のとれたシステムになっており、 事務処理システムを考える場合も、この点を、 十分に考えておく必要がある。 Unix 上に、別世界を作ろうとしてはならない。
Unix の、最も驚くべき機能のひとつが、パイプラインである。 まったく、同じコマンドを、パイプラインにも、他の入出力にも、 そのまま使えるように構成できるのがその核心で、これが、 少数の単純なコマンドをパイプラインに組み込むことにより、 現実の多様性に対処するという、 Unix の驚くべき柔軟性を生み出している。
例えば、受注残のデータが chuzan という名前のファイルに入っていて、 最近の 90 日分の受注動向を見たいとすると、
$ tail -90 chuzan | lgraphといった具合になる。 tail コマンドhs、chuzan ファイルの終り 90 行を抜きだし、 lgraph は、90 日分のデータを、 適当なスケールで折れ線グラフに変換する。
実は、lgraph というのは、私が技術データを視覚化するために、 昔作っておいたコマンドである。 必要に応じて、log スケールに変換したり、 目盛値を入れたりしたいというのが、その動機であった。 Unix の既存のコマンドとしては、graph がある。
パイプラインのおかげで、同じグラフ作成コマンドが、技術用、 事務用を問わず、どこででも使えることに注意してほしい。
このように、アプリケーション・プログラムを作る場合は、 パイプラインに組み込むことを前提にしたコマンドの部品化を、 徹底的に、意識しておかなければならない。
そのためには、標準入力(端末のキーボード)からデータを読んで、 標準出力(端末のスクリーン)に書き出すという流れを基本にして、 データの出力を、どうしても必要なものに絞り込み、 プロンプトやエラー・メッセージを必要とする場合は、 それらをデータから分離して、 標準エラー出力に書き出すといった配慮が必要になる。
リダイレクト、すなわち、入出力の切替え機能も、 Unix のすばらしい機能のひとつで、 パイプラインとあいまって、 アプリケーション・プログラムの本数を激減させることになる。
例えば、従来の OS なら、 在庫等の更新プログラムの他に、 万一のシステム・ダウンに備えて、 前月末の残高と、当月分の更新データから、 現状を復旧するためのプログラムを必要とし、 これも、いやな仕事のひとつである。
ところが、Unix のリダイレクト機能を利用すれば、 毎日端末で使っている、通常の更新プログラムを使って、
$ 更新プログラム < 当月のデータ・ファイルとすれば、済んでしまうので、感激する。 また、これができるように、更新プログラムを設計しておかなければならない。
Unix のパイプラインは、フィルタという概念を生み出した。 フィルタは、パイプラインに組み込めるように設計された、汎用コマンドで、 データ変換のための、ブラック・ボックスとして機能する。
Unix のコマンドのほとんどは、フィルタとして使えるように設計されているが、 中でも、
awk, grep, pr, sort, sed, tr, uniq, tail, ..等がよく使われる。
例えば、売掛金の残高が、x という名前のファイルの第 2 フィールドに入っていて、 残高の大きい順にプリントさせたいとすれば、
$ sort -nr +1 x | pr | lprといった具合に使うのが普通で、 見出し等も、pr のオプションで入れることができる。
多分、事務処理の分野で、最も重要なフィルタは、 プログラミング言語 awk であろう。 他のフィルタでできることのほとんどは、awk でもできるので、 きわめて汎用性があり、BASIC より、 はるかにやさしく、少ない記述で、 多くのことができる。
プログラミング言語としての awk には数値計算、文字列処理、 編集といった、一般的なデータ処理機能のほか、 GOTO 文のない近代的な制御機構、文字と数値の区別をしない変数、 さらに、正規表現によるパターン・マッチングといった、 ユニークな機能があり、これが大変な威力を発揮する。
例えば、過去 1 年分の給与支払データから、 総支給額と、平均給与を求める場合を考えてみよう。 毎月の給与支払データは、
kyuyo.01, kyuyo.02, .. kyuyo.12賞与支払データは、
syoyo.06, syoyo.12という名前のファイルに入っていて、それぞれ、 15 番目と 7 番目のフィールドが、総支給額になっているとする。
この問題に、awk を摘要するとしたら、多分、次のようになる。
awk ' FILENAME ~ /kyuyo/ { s += $15 } FILENAME ~ /syoyo/ { s += $7 } END { print s, s / NR } ' kyuto.* syoyo.*
先程の awk の集計プログラムで、給与、あるいは賞与といった、 1 群のファイルの扱いが、きわめて簡単、かつ、スムースに行われていることに、 注意してほしい。 これが、Unix に一貫して取り入れられている、正規表現の威力である。
正規表現というのは、文字パターンの自動認識を容易にするような、 一群のパターン記述法であるが、従来は、 言語設計の裏側で使われる概念としてのみ存在し、 一般ユーザに解放されることはなかったと思う。
しかし、Unix の場合は、ed, sed, awk, grep, sh, lex, .. と一貫して、 正規表現が前面に押し出され、これが文字パターンの取扱に、 新次元を切り開いたわけである。
Unix 上で事務処理を行う場合は、 正規表現の利用を、常に意識していなければならない。
Unix のコマンド・インタプリータ sh には、 コマンドに命を吹き込む、妖精といった風情がある。 例えば、次の例である。 date という、日付を表示するだけの、何の変哲もないコマンドが、 生まれ変わったような働きをする。
awk ' BEGIN { date = "19'"`date +%y%m`"'20" printf "合計残高試算表 (%s)\n", date } ..これは、少し説明するほうがよいかもしれない。 awk のプログラムは、-f オプションを使わない限り、 sh の第 1 アーギュメント(引き数)、すなわち、$1 となるから、 全体を「'」で括って、引用するのが普通です。
しかし、プログラムの一部を、sh の置換対象とすれば、 実行時にプログラムを書き換えることが可能で、 この例ではまず、
`date +%y%m`が date コマンドの実行結果で置換され、その後、 「"」と「'」が外されるため、例えば、 その日の年月が、1985 年 6 月なら、
BEGIN { date = "19850620" printf ""合計残高試算表 (%s)\n", date } ..が実際のプログラムとして、awk に渡されることになる。
sh は Unix の中でも、最も重要なコマンドのひとつで、
パイプライン | | |
リダイレクト | <, >, >>, >&, <& |
変数置換 | $ |
コマンド置換 | `..` |
引用 | ' .. ', ( .. ), \. |
グループ化 | { .. }, ( .. ) |
ヒアドキュメント | << |
内蔵コマンド | test, set, read, .. |
制御構造 | for, if, case, while, .. |
オプション | -e, -x, -v, .. |
等の機能を十分理解し、慣れておくことが必要である。 それまでは、アプリケーション・プログラムなど作ってはならない。
多重処理特有の問題、そして、おそらくは歴史的な事情から、 sh には、一風変わったところがあって、 最初にちょっと戸惑うケースが多いようである。 しかし、しばらくすると慣れてきて、例えば、 次のような手続きを、直接、端末から入れられるようになる。
for i in * do if grep 見積り $i then echo file: $i fi doneこれは、「見積り」という文字列を含むファイルを、 カレント・ディレクトリから探すもので、もし、 カレント・ディレクトリの下に、 さらにディレクトリがあるような場合は、 sh を再帰的に使って、
for i in * do if test -d $i then cd $i x cd .. else if grep 見積り $i then echo file: $i fi fi doneといった具合になる。 この場合、x は、この手続きファイルの名前で、
$ xと起動する。
もともと、再帰性のある Unix のファイル構造に、 sh の再帰手続きが対応していることに注意してほしい。
文字列として、「見積り」以外も、使用するのであれば、 文字パターンも位置パラメータで渡すことにして、
for i in * do if test -d $i then cd $i x $1 cd .. else if grep $1 then echo file: $i fi fi done等として、この場合は、
$ x 文字パターンと起動することになる。 (3)
awk が、データ処理の自動化とすれば、sh は、 アクションの自動化といった感覚となり、 ここに、従来の OS からの決定的な飛躍があるわけだ。
(1) まだ、完全な日本語化ができているわけではない。 もともと、7 bit ASCII の世界に、8 bit カナ文字や、 2 byte の漢字を組み込み、そのうえ、 日本語特有の入力変換を追加しなければならないわけなので、 やはり、大変な仕事となる。
現在、最も日本語化の進んでいると思われる、UX-300, UX-700 の場合でも、 sh のレベルでは、8 bit のカナ文字を扱うことができない。 ところが、カナを扱える sh を自作してみたところ、 ほしいと思うコマンドのほとんどで、 もともとカナが扱えることがわかり、 ほぼ完全な日本語化ができた。 コマンド・インタプリータでさえ、自作できるというのは、 やはり、Unix ならでの話しである。
(2) あらゆる文献の中で、Unix の System V のマニュアルが最高で、 これは AT&T から入手することができる。 特に、sh や awk の解説は、ずば抜けている。
一般書の中では、
Kernighan & Pike,- The Unix Program Environment (Prentice-Hall)が最高で、これ以外は、お勧めする気にならない。 C 言語についても、同じ著者の、「プログラミング言語 C」(共立出版) 1 冊で十分であろう。
また、東芝から、たくさんの資料が出ていて、これは、よくぞ訳したという印象。 残りも、お願いしたいものである。 市販の文献には、ひどいものもあるので、ご自分で確認されるか、 よく知っている人に教えてもらう方がよいと考える。 最近では、雑誌「インフォメーション」のUnix/use/better という連載が、 心に残っている。
(3) find コマンドを使えば、もっと簡単で、
find . -type f -exec grep サポート {} /dev/null \;で済む。ファイル・リストに /dev/null を加えたのは、 grep にファイル名も表示させるため。
Unix では同じ仕事をするのに多くの方法があって、 2 度目以降、さらにうまい方法を思い付くことが多い。
平林 浩一, 1985-09 (雑誌 Computer Report 1985/10)