1976年に大学の入学式で聞いた総長の式辞にあった話です。元ネタはどこかにあるのかもしれません。曰く「自分が一番好きなことを一生の仕事にしてはいけない。仕事となれば、気が乗らない時、疲れている時、他にやりたいことがある時、どんな時でもそれをやらなければならない。そうすると、どんなに好きなことでもいつかは嫌いになってしまう。自分が一番好きなことが嫌いになってしまってはつまらない人生である。だから、一番好きなことは趣味として楽しみ、2番目に好きなことを仕事にしなさい」とのこと。
この教えを守ってプログラミングを本職にしなかったということもあるのですが、もう一つ大きかったのが就活を始めた頃に広く流布していた「プログラマーは35歳で壊れる」という都市伝説です。「職業プログラマーは35歳でプログラミングができなくなるだけではなく、精神に変調を来してまともな社会生活も送れなくなる」という今から思えばとんでもない風説がまことしやかに語られていました。そんなこんなでプログラミングを趣味ないしは余技として今まで嗜んできたのですが、お陰様で今も楽しくプログラミングをしています。
駄待ち狐は定年後再雇用で65歳まで働きましたが、今はもう完全にリタイアして年金生活者です。その会社人生については定年退職時の講演資料にまとめてあります。退職記念講演会を開くほど偉くはなれなかったのですが、退職慰労パーティーの席で話をさせて貰いました。講演資料にもありますが、会社人生の前半は光エレクトロニクスの技術者をやっていました(論文・特許リスト)。「2番目に好きなこと」として光通信用半導体デバイスの開発を選択したのです。今のインターネット隆盛の一翼を担っているのは光ファイバ通信なので、この選択は正しかったと思います。間違えたのは会社の選択でした。
会社人生の後半は、会社の都合に加えて家庭の事情もあり、知財戦略と技術戦略を担当しました。戦略担当と言えば聞こえはいいですが、技術者としては裏方です。そんな業務の中でも余技としてのプログラミングは楽しませていただきました。また、趣味としても1996年にプライベートなホームページを作り始め、2019年まで加筆を続けました。正確に言うと文章を作成していたのは配偶者で、HTMLに落すところからが担当でした。開設当初からJavaアプレットを使って色々な細工を施していたのですが、どのブラウザでもアプレットが使えなくなってしまったので2024年に仕掛けだけを更新しました。
駄待ち狐が最初のプログラムをFORTRANで書いたのは1978年で、1から10までの足し算をするという練習問題でした("Hello, world!"が定番になるのはC言語以降)。大学3年の夏休みに補講としてFORTRAN演習があり、プログラミングデビューとしてはかなりの遅咲きです。ただ、子供の頃からコンピュータには興味があって、テレビアニメの鉄腕アトムでお茶の水博士が巨大なコンピュータから繰出される長い穿孔紙テープを手に「大変じゃ、この彗星は3日後に地球に衝突するぞ!」と叫ぶシーンは鮮明に記憶しています。
最初のプログラミングで使ったのはIBMのミニコンというものだったと思うのですが、詳細は分かりません。翌年には、大学に教育用として日立のメインフレームHITAC(ハイタック)が導入されました。このHITACは大勢の学生が端末から同時に操作するタイムシェアリングシステムでした。一方、研究用には大型計算機センターに富士通のFACOMが鎮座していて、こちらはパンチカード入力、ラインプリンタ出力のバッチ処理でした。年間リース料が数億円だと聞きました。HITACとFACOMはIBMが開発したメインフレームと互換性のあるIBM互換機です。
これ以降に利用したハードウエアとプログラミング言語を以下の一覧表にまとめてあります。横軸の最上段はOSで、その下の括弧書きは駄待ち狐が最初に使用した年です。2段目には使用したハードウエアを記載しています。一方、縦軸の左端はプログラミング言語で、こちらの括弧書きはその言語が開発された年です。縦軸の2列目は言語の用途ですが、これは駄待ち狐が利用した目的で、その言語の一般的な用途という意味ではありません。横軸と縦軸の交点に書いてあるのはプログラミング環境で、濃いピンクが最初に使ったもの、薄いピンクはそれ以降に使ったもの、白地のところはそのOSでその言語は使っていないという意味です。
画像を新しいタブで開くと高解像度で見ることができます。横軸についてもう少し補足します。IBM互換の右にある「Desktop 機種毎」ですが、1970年代後半にデスクトップコンピュータと呼ばれたものは機種毎に異なるアーキテクチャを採用していました。Hewlett-Packardを例に取ると、プログラム電卓として始まったHP9800シリーズは計測器を制御することが主たる目的のコンピュータに発展しました。2段目のハードウエアで言うとHP9816とHP98561がこれに相当します。オシロスコープで有名なTektronixも同様のデスクトップコンピュータを発売しており、駄待ち狐が最初にBASICプログラムを作成したのはTektronixデスクトップでした。
そこから右にあるDOS/Windows、UNIX/Linux、MacOSについては特に説明する必要もないと思います。歴史的に言えばUNIXはDOSよりも古いですが、駄待ち狐が使った順番で言うとDOSが先になります。ただし、MS-DOSパソコンは一太郎(日本語ワープロ)、WordStar(英文ワープロ)、Lotus 1-2-3(表計算ソフト)を使うためのプラットフォームで、バッチファイル以外のプログラミングをしたことはありません。ハードウエアに関しては、Let's noteは7台(代?)使っています。また、下線を引いたものは現役で動いており、Power Mac G4もClassic Mac OSにしか対応しないアプリを使うために動態保存してあります。
上記のプログラミング環境で駄待ち狐が作成したプログラムの代表例を以下の年表に示します。縦軸は先程の一覧表と同じですが、横軸は西暦年です。プログラムの主題を付記した緑の丸印が使用したプログラミング言語の欄に打ってありますが、横軸上の位置は作成年になっています。蛍光緑でハイライトされた丸印は本サイトで個別に紹介するプログラムに関係するものです。垂直の破線は上下のプログラムが連携して動作することを意味しており、斜めの破線は左上のプログラムを右下のプログラムに移植したことを示しています。
画像を新しいタブで開くと高解像度で見ることができます。年表の左端にある「演習」は既に述べた通り1から10までの足し算です。その右にある「HPT等利得」と「Hall測定フィッティング」は修士論文の「InGaAsP/InP光増幅素子に関する研究 」で作成しました。HPT (heterojunction phototransistor)とはトランジスタ構造の受光素子(フォトトランジスタ)で、エミッタのバンドギャップEgがベースのEgより大きいヘテロ接合になっているものです。フォトトランジスタは入力された光信号に対して電気信号を出力しますが、受光した光子1個に対して1個以上の電子が電流として出力され、その増倍率が光利得です。
光利得の計算式は結構複雑なのですが、1つの長い数式を計算すれば答が出ます。この計算だけならプログラム電卓で十分なのですが、「等利得」というのは数式の中に出てくる2つの変数を共に変化させて、光利得が同じになる組を求めようというものです。最終的にはその2つの変数を横軸・縦軸とするグラフ上に、光利得が同じになる点をプロットして等高線のような等利得線を描きます。この最終のグラフは手書きしましたが、等利得となる2変数の組を算出するプログラムを作成しました。もう一つの「Hall測定フィッティング」については修士論文の「3.3.4 計算機解析」で説明しています。
さらにその右の「垂直共振器モード解析」は「III. 複素関数による垂直共振器モード解析」で説明します。最後の「カラーフィルタ透過率」は知財戦略担当としてイメージセンサの開発を支援していた時に作成しました。イメージセンサのカラーフィルタには顔料を使うのですが、これを誘電体多層膜に置換える開発が進められていました。このプロジェクトを特許面でサポートするというのが駄待ち狐のミッションだったのですが、自らも米国特許を出願しました。そのFIG. 7を計算するために作成したプログラムになります。「垂直共振器モード解析」の核心は多層膜の反射率計算で、これを敷衍して「カラーフィルタ透過率」を計算しました。
年表左端の「心筋収縮フィッティング」というのは大層なネーミングですが、修士1回生の研修で作成したものです。修士1回生は所属以外の研究室の手伝いをして見聞を広めるという制度があり、出向いた先の助教授が医学部と組んで心筋の動作解析に取組んでいました。駄待ち狐に課せられた課題は、心臓の鼓動に伴う心筋の拡大・縮小の時系列データがあるので、心筋上の対応する点を自動で結ぶというものでした。ただ、データは非常に粗い格子上の点として近似されており、拡大時に隣合っていた2つの点が収縮時には1つになってしまうというようなことで、プログラムは完成しましたがイマイチな結果でした。
その右にある「パルスステージ HP-IB制御」と「オートプローバ HP-IB制御」はBASICでメカを制御しています。非常に初歩的ながら、後のロボット制御に通じるところがあります。どちらもHPデスクトップ、HP-IB、HP-BASICという道具立てです。HP-IBはHewlett-Packardがコンピュータと計測器を接続するためのインタフェース仕様として開発したもので、後に正式な規格として認証されてGP-IBになります。HP-BASICはHP-IBを介して計測器を制御するためのコマンド群を追加したBASICですが、計測器だけではなくGP-IBに対応するメカも制御できました。
パルスステージはステップモータを使って台座を精密に移動させる機構で、GP-IBで制御可能なパルスステージもありました。駄待ち狐はこの頃「光並列メモリ」というデバイスを発明して、国際学会や論文で発表していました。光並列メモリには光入力でオンになり、オン状態では自らも発光する光スイッチが集積されています。論文のFig. 7で②の左隣にSELFOCレンズがありますが、これを移動させるためにパルスステージを使いました。SELFOCレンズを動かすとそこから出射されるレーザ光の位置も移動するので、光スイッチを次々に点灯することができます。但しこれはデモ用で、本来想定している使い方ではメカによる書込みはしません。
一方、オートプローバというのは半導体ウエハをチップに分割する前に電気特性を測定する自動検査装置で、駄待ち狐が光ファイバ通信用の受光素子3品種 を開発していた時に使用しました。前述の光並列メモリはかなり浮世離れしたデバイスですが、この受光素子は量産を目指した実用的なもので自動検査も必須でした。ウエハはチップに分割した後にパッケージに入れ、外部と電気接続するためのボンディングをするのですが、ウエハ状態で測定するためには検査針を立てます。実際にはウエハが載ったステージを上昇させて検査針に接触した状態で測定を行い、下降させてから次のチップ区画にステージを送るということを繰返します。プログラミングで一番苦労したのは、円形のウエハ上でチップ区画を網羅するようにステージを送るという部分です。通常のデバイスであればステージを上昇させた時に2つの検査針の間に導通がないとウエハの外に出たと判断します。しかし、受光素子は2つの検査針の間に流れる電流が小さいほど良品であるという厄介な代物で、導通がないことでは端部を検出できません。このため円形のウエハの上端から下端に進むに従って増減する横並びのチップ数を計算式で出し、それに合せてステージ送りをするようにしました。
さらに面倒なのが割れたウエハもあるということです。普通の半導体(シリコン)であればウエハは割れた時点で不良品として除外されるのですが、光ファイバ通信用の受光素子は割れやすいInP(インジウムりん)ウエハを使っており、割れたら除外にしていると最終工程にたどり着くウエハは激減してしまいます。そこで2分の1ないし4分の1サイズであれば不定形に割れたウエハもチップの段数を入力することで自動計測できるようにしました。残念ながらこのプログラムは今やどこにも残っていません。もっと残念なことに、会社の経営判断でこの受光素子の量産は中止になってしまいました。
駄待ち狐はFORTRAN演習の翌年、1979年に計算機ソフトウエアという講義を受けました。講義の冒頭に先生が「FORTRANやALGOLはold-fashioned。PL/1、LISP、APLもあるが、PASCALはエレガントなのでこの講義ではPASCALを使う」と宣言されました(ただ、駄待ち狐がPASCALのプログラムを書いたのは演習レポートくらいだったと思います)。この時には既にCも開発されていたはずですが、何の言及もありませんでした。確かにPASCALは一世を風靡してHPデスクトップでも使えるようになったりしましたが、1980年代も後半になると「これからはUNIXとCだ」という雰囲気になっていました。
会社に入って10年近く経った1990年頃、駄待ち狐もUNIXとCの勉強をしようと思い立ちました。少し話が脇道にそれますが、InPを使った光デバイスの開発は少人数でやっていたので、基本設計、マスク設計、製造プロセス、評価を全て一人でこなさないといけません(シリコン半導体であれば百人以上のメンバーによる分業制)。マスクというのは製造プロセスでウエハ上にパターンを焼付けていくために使うもので、いわばデバイスの建築設計図面です。入社当時は方眼紙に手書きでしたが、すぐにワークステーション(WS)によるCADになりました。WSはシリコン部隊の管理下にあるものを肩身の狭い思いをして借ります。
そのWSがUNIXマシンに切替るということでCAD担当(WSを管理するだけで設計はしないのに10人くらいはいる)が大騒ぎしていました。CADを使うだけならOSのことは何も知らなくても問題ないのですが、ちょっとしたことでWSはすぐにダウンしてしまい、その度にCAD担当に声をかけると嫌な顔をされます。そこで、UNIXの勉強をとなった訳ですが、CAD用のWSをそれ以外の目的に使うことはできません。仕方がないので、UNIXとCの教科書を1冊ずつ買って、大阪から東京に出張する新幹線の車中で読みました。当時は片道3時間かかったのですが、往復の6時間で1冊を読了して2往復でおおよそのことは頭に入りました。
使えるWSがないという状況が変ったのは1993年、当時所属していた光半導体研究所(70~80名規模)でSunのWSを導入することになったのです。導入の第1の目的はメールサーバとしての利用ですが、使いたい所員は自由に使えました。積極的に使い始めたのは数名ですが、コンソールを占有する訳にもいかないのでMS-DOSパソコンからTelnetとFTPでアクセスしました。時を同じくして敷設された同軸ケーブルによるイーサネットLANを介してです。正にネット社会の黎明期ですが、イーサのケーブル(外被色からイエローケーブルと呼ばれた)はGP-IBケーブルと同様に今から思えば驚くほどの太さでした。
そのような状況下でまず何をプログラミングしたかというと、日本語文字コードの変換です。メールはJISコード、UNIX WSはEUC、MS-DOSパソコンはシフトJIS(SJIS)という状況だったので、WSからパソコンにFTPでメールをダウンロードしても、文字化けして読めません。日本語文字コードの複雑な事情はUNIXの教科書で勉強していたので、まずは教科書に載っているコード表だけを頼りに、自力でCによるコード変換プログラムを作成しました。それが年表左端の「メール日本語コード変換」であり、以下に示すものです。これは駄待ち狐が作成したプログラムの中でデジタルデータとして残っている最古のものです。
コードの表示にはPrism.jsを使用しています。最初に作ったプログラムのままなので、{...}のレイアウトが今風とは違います。"{"と"}"はPASCALの"begin"と"end"の簡略記法と考えられるので、それぞれを単独の行にする書き方もありました。この当時も今風の書き方が第一推奨でしたが、単独の行にするのもアリだとされていました。また、コメントが何も入っていませんが、2バイト文字をub (upper byte)とlb (lower byte)に分けて処理しています。最初の関数jis2nisでは一旦JISコードを隙間のない連番であるnis (number in series)に変換し、次の関数nis2dosでnisをSJIS(プログラムではdosと表記)に変換しています。SJISには欠番があるので、そこをifブロックで処理しています。
3番目のjis2dosで上記2つの関数を連結しています。なぜこんな七面倒くさいことをしているかというと、EUCへの変換や逆変換もあるので、統一的に扱えるようにnisを導入したという訳です。最後のmain関数ではASCII文字と2バイト文字の切替えを示すエスケープシーケンスを処理しています。SJISとEUCではASCII文字と2バイト文字がコードだけで識別可能なのですが、JISコードでは同じコードが兼用されているためにエスケープシーケンスが必要になります。SJISの欠番とJISのエスケープシーケンスが分からずに何時間も悩まされたのを覚えています。
このように苦労して作成したプログラムなのですが、UNIXに詳しい人から「nkfというパッケージがあるよ」と教えられました。入力ファイルの文字コードを自動判別して、指定した文字コードにして出力してくれるというスグレものです。最初からnkfがあることを知っていれば「メール日本語コード変換」を作る必要もなかったのですが、日本語文字コードについて造詣を深めることができたという点では無意味ではなかったと思います。ただ、今やネット上では全てがUTF-8で、Windows上であれUbuntu上であれエディタでコード変換は自由自在という時代になったので、やはり無駄な努力だったのかもしれません。
年表で次にある「CGI日本語コード変換」も日本語文字コードの変換です。1996年にプライベートなホームページを開設したことは既に述べましたが、その中の「お便りありがとう!」というコーナーで感想やメッセージを募集していました。テキストボックスに記入した内容をフォームのpostで送ってもらうのですが、日本語はURLエンコードされています。これをSJISに変換するというプログラムで、特殊文字の例外処理を除けば%mnを0xmnに変換するだけです。残念なことに、アクセス制限なしで自由に記入できるフォームがあるとロボットで訳の分からない書込みをする人が出てきたので、2007年に投稿フォームは廃止しました。