|
鏡の中の鏡,あるいは文科系コンピュータ屋のとまどい since June 2 2005 |
||||
|
||||
|
UNIX はジョークに満ちている。 UNIX は Multics という,豪華すぎるがゆえに失敗に終ったマルチユーザ・マルチタスキングのオペレーティング・システムの名を捩って命名された。「単細胞」という自虐めいたものかと思う。 ***
もう三十年以上変りない UNIX のログインプロンプトはこうである。 login: isao Password: s0r3h@h1m|tu ... どうして "login: " の先頭は小文字なのに,"Password: " は大文字なのか。システムの入り口からなんかヘンという気持を起こさせる。 一説によると,これは UNIX 開発当初の誤りであるが,いったんリリースしてしまった以上,このプロンプトを期待してプログラムを作ってしまったユーザへの影響を考え,頑なに仕様変更を拒み続けてきたとのこと。 UNIX は伝統を重んじるのだと。 ウソだろ。 ユーザ資産を無視した仕様変更を UNIX ベンダが行ったためしがないなどと誰が言い切れるのか。(ここでナンですが,UNIX は The Open Group の商標です) 政府から遠く離れたカリフォルニアの若者のひねりのきいた暗い知性を感じるのは私だけだろうか。 反体制のにおいがする。 なんとなく。 ソフトウェア技術者の "地" はアンダーグラウンドなのだと思う。 バークレイ発のフリーウェアには,皮肉なしかけがあるんじゃないか,すごいトラップドアがあるんじゃないかと思ってわくわくする。sendmail, bind, tcl, perl, etc., etc...(実際はそんな不埓なプログラムではないが) ***
UNIX 互換フリーソフトウェア・プロジェクト団体 GNU のフリーソフトウェアのライセンスは copyleft と呼ばれる。コピーライトを認めないからコピーレフト。 GNU は「GNU IS NOT UNIX」の略で,その定義のなかにすでに "GNU" が入れ子になっている。GNU は「グヌー」あるいは「グニュー」と読むが,なかにいる GNU は「ニュー」と発音されるウシ君である。 ***
UNIX において,普段は待機しているがあるイベントでムクムクと起き上がって仕事をする常駐プログラムを,「デーモン(daemon)」という。"〜mon" なる命名をよくする。Oracle にも "qmon" という要求待ち行列(キュー)を監視するデーモンがいたり,実世界には M & A の機を窺う "horiemon" などもある。
ギリシア神話のダイモン・守護神に由来するそうだが,一方で悪魔(damon)をも示唆しているに違いない。 ***
親プロセスが後始末をしないで終了した子プロセスを「ゾンビ」という。計算機資源をムダ使いする一因である。 放っておけないね。 おもしろいことに,親プロセスが子プロセスを続けて二回生み(fork)し,一回目の子が死ぬ(終了する)と,二回目の子(つまり一回目に fork( ) されてできた「子」のなかでさらに fork( ) された,すなわち「孫」。「孫」はまた自分のなかで「子」を fork( ) しようとする?...鏡の中の鏡)は,親プロセスのさらなる大親分(init)が親の地位について孫の後始末をするため,ゾンビにならずにすむという。 いったいどういう神話に基づいた仕様なのか。 親が子の面倒を見るのは現実世界と同じだが,死を看取る必要まであるのかは如何。 ***
私が職についてはじめて触れた計算機は数十億円の大型汎用機システムであった。八十年代後半の当時は普通のこと。 システムの標準入力装置はキーボードではなくカードリーダ,標準出力装置はディスプレイではなくラインプリンタであった。一枚のカードに二進数のパターンで孔を空けて一行のブログラム・コードを記述した。パンチ操作を間違えたらまたやり直し。千行のプログラムなら千枚のカードをきちんとした順番でカードリーダにセットしなければならなかった。このときに手が滑ってカードを地べたに散らかしてしまうと,一大事である。だからカードにシーケンス番号を振っておく。カードリーダも,ラインプリンタも,マシンガンのような雄叫びをあげる機械であった。コンピュータというものがハコ,モニター,キーボード,マウスで構成されている,と思い込んでいる人は,最近の便利な世界しか知らない幸福者(つまり素人)である。 ジョブ制御言語(プログラムの実行指示書のようなもの)を一行あたり一枚のカードにパンチし,カードの並びを確認してリーダにセットし,システムに読込ませる...と,プログラムが起動し,オープンリール磁気テープ装置がガガガガガと勢いよく回り出す。 いまだに私には「計算機」というほうがピンとくる。マシン室はオフィースというより工事現場に近い。ここで一点の誤りも許さない計算機の寡黙なリゴリズムと納期への恐怖とに虐げられて,生身のSEは何日も徹夜するはめになる。「電脳」などという魔法お伽噺も,「コンピュータ」というカタカナ語の放つデジタル・ナルシスもありはしない。 いま,大型汎用機用オペレーティング・システム VOS3 最新のバージョンを組込む。 そのために,SOS(スタータ・オペレーティング・システム)つまり一世代前のオペレーティング・システムを組込み,これを使って最新システムを生成するのである... この作業をシステム・ゼネレーションと言う。なんで OS を入れる準備として,わざわざその親 OS を入れなければならないのか。SOS の力を借りて,アセンブラ言語で書いた周辺装置などのユーザ独自の設定情報をアセンブルし,新バージョンの OS とリンケージする(合体させる)のだ。 まるで王位継承の儀式のようなことをやっていた時代があったのだ。(いまも執り行っている計算機ユーザは当然います) ***
大型汎用機でもっぱらアセンブラ言語(計算機言語の世界の古典ギリシア語)でシステムを記述していた時代には,プログラマは OS という専制君主のもとにデモクラティックに振舞わねばならなかった。たくさんのユーザがシステムを共同利用していることを意識して,ある決りを守ったものである。 プログラムの開始時には,OS のタスク切替え(たくさんのユーザへのサービスの切替え)のために,計算機に十数個しかない共用のレジスタ内容(それはよそ様の途中の計算内容)を己のメモリ領域に保存し,かつ特定のレジスタでその番地をポイントした上で,やっと自らの課題解決に向けて飛び立つ,というマナーを守らねばならなかった。そして終了時には,この保存領域からレジスタの値を回復してはじめて OS にさよならを言う。そうすることで OS によって,タスク切替え時点において別のプログラムのためにレジスタが横流しされても,再び自分の番が回ってきた際,今度は別のプログラムが保存しておいてくれた己のレジスタ内容で復元されて,何事もなかったように自分の仕事が再開できるわけである。あたかも共用のレジスタ資源をひとり占めしているかのような自由を手にすることができるのだ。
DEMOCRAT START * STARTING PROGRAMME DEMOCRAT
* * DEFINE REGISTERS MACROS
GR0 EQU 0 * SYSTEM USE
GR1 EQU 1 * PARAMETER LIST ADDRESS
GR2 EQU 2 * WORK
GR3 EQU 3 * WORK
GR4 EQU 4 * WORK
GR5 EQU 5 * WORK
GR6 EQU 6 * WORK
GR7 EQU 7 * WORK
GR8 EQU 8 * WORK
GR9 EQU 9 * WORK
GR10 EQU 10 * BASE REGISTER 1
GR11 EQU 11 * BASE REGISTER 2
GR12 EQU 12 * LOCAL RETURN ADDRESS
GR13 EQU 13 * SAVE AREA POINTER
GR14 EQU 14 * RETURN ADDRESS
GR15 EQU 15 * ENTRY ADDRESS
*
DEMOCRAT CSECT * CONTROL SECTION
USING *,GR15
B SAVEREG
CNOP 0,4
SAVEAREA DC 20F'0' * AREA FOR SAVING REGISTERS
SAVEREG STM GR14,GR12,12(GR13) * SAVE REGISTERS: 14-12
LR GR10,GR15 * SET BASE ADDRESS 1 TO GR10
LR GR11,GR15
AH GR11,*+8 * SET BASE ADDRESS 2 TO GR11
B *+6
DC H'4096'
DROP GR15 * BASE ADDRESS = DEMOCRAT
USING DEMOCRAT,GR10,GR11 * BASE REGISTER = GR10,GR11
LR GR12,GR13
ST GR13,SAVEAREA+4 * SAVE REGISTERS: 13
LA GR13,SAVEAREA * POINT TO SAVE AREA
ST GR13,8(GR12) * SAVE GR13
*
MAIN ・・・・儀式は終り。さあ仕事,仕事・・・・
*
GOODBYE L GR13,4(GR13) * RECOVERY OF REGISTERS: 13,
RETURN (14,12),RC=0 * 14,15,0,1..12 & NORMAL END
*
このサンプル,MAIN 行以外はすべて段取り,後片付けである。ネット上では,大型汎用機 OS 向けのアセンブラ・プログラムコードは死海文書くらいの価値があるのではないか? こうした時候の挨拶,儀式のような定型処理をはじめ,プログラムをいかに効率よく,簡潔に,スタイリッシュに書くかということを当時のプログラマは競い合った。レジスタの扱いやデータ領域の持ち方など,その書法で仲間うちの誰が書いたのかさえ分かるくらいであった。まるで詩文学サークルである。「なんだ汚ねえコード」,「なにを頭っからちんたら探すのか,バイナリサーチをなぜ使わない,バカかおめえ」なんて私も批評されたものである。天から授かった貴重な,貴重な記憶域,限られた実行ステップをギリギリまで削った — 1989 年は X'89' で十分だ,西暦 2000 年には不都合があるだろうけど,その頃にはこんなに貧しくはないすばらしい時代がやってくるはずだ。見た目は二の次でもよいから目的にそぐわない余計な計算は断じてしない,飾り立てずとも計算結果こそがダイヤモンドのように映えるはずであった。昔のプログラムは,数学の回答のような色気のないものが多かった。 CPU 能力が飛躍的に高まるとともに主記憶容量も莫大になり,C/C++ や Java など高級言語で書くのが当たり前となった現在では,これに類した前振り,後始末は言語プロセッサが自動的にやってくれ,誰も気にしなくなった。計算機の大衆化とともに,いまや散文の,いやおしゃべりの時代がやってきた。分かりやすく書くことがプログラマの最も重要な課題である。原稿料を稼ぐため用紙を書き散らすのとまさに同じように,ふんだんにコードを書いて工数をいただく。 オヤジじみているが,次に言いたいのはだいたいお分かりかと思う。現在はプログラミングのマナー,様式感覚などない。同じ計算機を皆で効率よく使う,なんて考えないばかりかウィルスをばら捲いてよそ様の計算機資源まで喰い潰そうとするものもある。それが技術だと思っているフシさえ窺えないこともない。「自動化」のもたらす頽廃か。 ***
こんな計算機パワーの豊かな時代,HTML の作法にはうるさい方々が増えているらしい。「かなづかひ」なんかにうるさい些末な文科系コンピュータ使いに多い。しかるべき規格に則ってどのブラウザでもきちんと表示できるよう心がけなければならない,外観要素の実現はスタイルシートで指示しなければならない,テーブルの多用は表示性能・ソースの可読性の点でやるべきではない,etc.,etc。まさに正論である。私の HTML はお行儀が悪い。誰もご覧にはならないだろうけど。 でもな。「正しい HTML」,「HTML の思想」,「HTML の資格」? 文科系が理科系に嗤われるのが至極当然に思われる。HTML は「手段」でしかないのにそこに「思想」を込めたがるのは,ペットに話しかける以上の何かである。HTML の「作法」? そのようなサイト管理者は,原稿用紙の使い方にばかり固執する物書きのようなものである。 ***
大型汎用機においては,もしプログラムに誤りがあり異常終了(アベンド,ABEND - ABnormal END と言う。Guten な Abend はここでは通用しない)すると,システムはダンプを出力する。いまなら一般にはコアダンプと言うだろう。ジョブ制御言語の指定によっては,プログラムが落ちるといきなりラインプリンタにダンプ内容が出力されはじめる。ちょっとした業務アプリケーションだと 3,000 頁くらいは出る。センターオペレータは「おい,まだ終わんねえのかよー」とプリンタの前でブツブツ。 やっと出た! 重さ 10kg くらいあるダンプリストは直ちにプログラマの手元に届けられる。ダンプリストには機械命令,レジスタ内容,データ領域内容からなるプログラム・バイナリ・コードそのものが十六進数だけでダラダラ書かれている。彼はやおら PSW(プログラム・ステータス・ワード)という,計算機が次に実行しようとしていたアドレスと,16 個のレジスタの出力部分とだけ — だいたい 1/3 頁分 — を確認する。レジスタ内容などから十六進数電卓を叩いてエラーの起きたプログラム部位のアドレスを計算し,ダンプリストのその部分を探し出す。このようにして障害原因が特定される。 なにが言いたいかって? たった一頁分くらいの情報量のために 3,000 頁を印刷させる時代だったわけである。当時思ったものである。情報化技術というものはいつもペーパーレスという概念と結びつくけれども,実際は自動出力されるデータの印字でもって,何ヘクタールもの森林を壊していると。もちろんいまは端末のモニタ上で,シンボリックデバッガを使って,ダンプデータを解析できるんだけど。 ***
大型汎用機の機械命令に NOP 命令というものがある。「何もしない」という命令である。 TeX には \relax というプリミティブがある。「何もしない」という命令である。 最高のデジタル・ジョークか。計算機プログラムにおいても,沈黙は時に雄弁に勝ることがある。 ***
「アセンブラもまたアセンブラで書かれています」— 昔首っ引きで読んだアセンブラのマニュアルの概説にこう書かれていた。鏡の中の鏡。 そのアセンブラもやっぱりアセンブラで書かれているのだ。 ***
昔,UNIX のあるメールソフトをインストールしようと,アーカイブの README(ソフトウェアの最初に読むべき説明書)に目を通した。「うまくインストールされない場合や正しく動作しない場合は,下記アドレスまでメールしてください」とあった。作者はメールが使える環境にある人をこのメールソフト導入の前提としていることになる。ここはアリスの不思議の国かとうれしくなった。 ***
「無限ループ」 この世界には無限があったのか。 ***
「a = a - 1;」 a から 1 を引いても a だ? オレの財布から一万円使っても,もとの財布だといいんだけど。 ***
「本ソフトウェアはオペレーティングシステムからのエラー報告を受けるとまず最初に回線を再度接続しようと試みます。retrytimes 値の再試行ののち,再接続が不可能な場合は,exitfunc に従って後処理を実行しようとします。」 ソフトウェアは生き物か? ***
ソフトウェアのマニュアルは,書いても読まれないもののひとつである。 ***
「再帰的関数呼び出し(recursive call)」 関数が自分のなかで同じ自分を呼出す。呼出された同じ関数はやっぱり同じところで同じ自分を呼出す。その「やっぱり同じところで同じ自分を呼出」された同じ関数はやっぱり同じところで同じ自分を呼び出す...。鏡の中の鏡の例を以下に示す。
/* 二項分布確率計算 Binomial distribution */
/* p値1/6のサイコロを50回振り同じ目がk回出る確率を計算する */
#include <stdio.h>
#include <math.h>
double nCr(double, double);
int main(void)
{
double p = 1.0/6.0, n = 50.0; /* p値1/6のサイコロを50回振る */
double y, k;
printf("** n: %3.0f; p: %5.4f; mu: %5.4f; s^2: %5.4f;\n",
n, p, n * p, n * p * (1.0-p));
for (k = 0; k <= n; k++) {
y = nCr(n, k) * pow(p, k) * pow(1.0-p, n-k);
if ((y >= 0.000000001) || (k >= n) || (k <= 1.0))
printf("%3.0f\t%12.8f\n", k, y);
}
return 0;
}
/* 組合せ計算 */
double nCr(double n, double r)
{
if (r < 1.0)
return 1.0;
else
return n * nCr(n-1, r-1) / r;
}
***
マリアから愛を告白された,下記の優柔不断なコンピュータ・ヨセフ君は,それでも 4,082 年と,12 月と,24 日の後に「僕もだよ」と応えるだろう。32 bit 計算機,だいたいの時間だけど。
#include <stdio.h>
#include <limits.h>
#include <unistd.h>
int main(void)
{
long thinking = LONG_MAX;
printf("Maria :\n\tI love you. Do you love me?\n\n");
printf("Joseph :\n");
while (thinking--) {
printf("\t...\n");
sleep(1);
}
printf("\t!\n\tYes, I love you, too.\n");
return 0;
}
***
プログラミング言語で詩を書く人がいる。私にはまだ,米国人のジョークの一変化球としかとらえられないけれど,これは思うに日本人にはマネできない。成績優秀の理科の君にはわかるかな。ところでこのプログラムを実行しても黙して語らず。M. Proust の『失われた時...』だよ,君。
for (long => time) {$early && $self->went($bed);}
rand time && do {
while ($candle--) {
(time => $eyes->shut()) < (time => print "Falling asleep!")
}
};
Simon Cozens, "Advanced Perl Programming, 2nd Ed.", O'Reilly
***
銀行預金残高を書き換えるコンピュータ犯罪の犯人はすぐ捕まる。 彼はその高度なテクニックを言い触らさずにはおれないからだ。 官庁のホームページを改竄した犯罪グループはなかなか捕まらない。 あまりにレベルが低くて誰にでもできるからだ。 というか愛国無罪か。 ***
最近とあるジョーク集を読んだ。こんなのがあった。 問い:2004年,アルバニア軍のコンピュータ系統が一斉にダウン。どうして? 答え:2000年問題。 身につまされて,あんまり笑えない。 ***
もう十余年前,まだ Windows 3.1 が全盛であったころ,ある検索サービスシステム開発において,サーバに接続して有料サービスを受けるための Windows クライアントソフトウェアを開発した。さらに稼働後は,ユーザサポートの仕事をさせられたことがある。そのころはシステム設計・開発だけでなく,顧客の手に負えない仕事はなんでもしてさしあげなければならなかったのだ。そのサービスのユーザは事務方ばかりで,私はエンドユーザの事務所に出向いて PC の設定までした。況やまだ PC の利用もネットワークも特殊技術に属していたわけで,ISDN-PPP による TCP/IP 連動に関わるユーザ電話サポートはただごとではなかった。 顧客:あのー,プログラムが動かないんだけど。画面がうんともすんとも いわないのよー。 私 :一度電源をお切りになって,これから申し上げる操作をしてみて いだだけますか? 顧客:電源を切った。...で,スイッチ入れたよ。 私 :(しばらく待って)立ち上がりましたか? 顧客:え?...分かった,はい。 私 :プログラムマネージャというボックスに XXXX という OOOO の絵が あります。それをダブルクリックしてみてください。 顧客:まだ砂時計しか出てこないよー。いや,でも,なんで立たないと いけないのかな? 私 :(.......)す,すみません,お立ちになる必要はありません, お座りください。ところでプログラムマネージャは... こんなのもあった。 顧客:検索プログラムが動かないんだけど。 私 :いま画面になにが出ていますか? 顧客:虫眼鏡の絵(検索プログラムのアイコン)が見えるんだけど矢印が そこにいかないんだよ。 私 :マウスを操作しても矢印が動きませんか? 顧客:動く動く。 私 :ではマウスを滑らせて矢印を虫眼鏡の絵に合わせてダブルクリック してみてください。 顧客:それがどうしてもいかないから困っているんじゃないか。 私 :マウスに応じて矢印は動くんですよね。 顧客:動くよ。でも机の端にきてしまってマウスをそれ以上動かせないん だってば。 ***
情報リテラシーを少しなりとも身につけた人なら,ドキュメント整形システム LaTeX の表記を見てことさら違和感を覚えたりしない。ラテフとか,ラテックとか,レイテックとか読むことも知っているはずである。 しかし白状するが,私は最初に "LaTeX" の表記に出逢ったときは UNIX 一流の冗談かと思った。これはラテックス・コンドームの捩りだと。だから私は,あまり計算機のものごとを知らない人には,決して LaTeX については「書かない」ことにしている。 D. クヌース教授著『文芸的プログラミング』の訳者「あとがき」だったと思う。LaTeX のことを「ラテックス」と表記していた。この訳者も私と同じ部類に属する方かもしれない。 ***
Windows も Mac も優れた OS だが,そんなこんなで UNIX はなにか度し難い,ブラックな奥行きを秘めている。実はこれが私の,UNIX を使い続ける本当の理由である。 ユーザがシステムに惹かれるのはなにも品質ばかりではない。Windows はバグだらけとの話はよく聞く。それは夥しいユーザ数の証であって,ジョークのネタとしてもこと欠かないわけだが,ゆえに Windows が好きという人がいればおもしろい。Mac はお洒落という陳腐きわまりない称賛よりよっぽど。ところで私も Mac を使っているけれど,ノーマルな操作で固まること度々であり,可愛いだけで頭の悪い女に抱く苛立ちを,時折り覚える。 ルーマニアの IT ジョークにこんなのがある。 ビル・ゲイツ率いるマイクロソフトが,新しく自動車業界に進出することになった。 しかし,できあがった車は以下のようなものだった。 1. 特に理由がなくても二日に一度は突然動かなくなる。 2. 高速道路ではそれが特に顕著である。 3. こうした場合,最悪のケースとしてはエンジンを総取り替えしなければならない。 4. ユーザは新しい道ができるとそのたびに,新しい車に買い替えなければならない。
早坂隆, 『世界の紛争地ジョーク集』, 中公新書クラレ
その安定性を持ち上げる UNIX の信者がいるけれども,UNIX だってバグは多い。私は FreeBSD を使っているんだけど。(ここでナンですが,FreeBSD は UNIX ではなく UNIX クローンの OS です) ***
|