部報 第 188 号・追い出しコンパ号

目次

[-> TSG Home Page]


特集

〜追い出される方からのメッセージ〜

これからの TSG に望むこと・期待すること


まだまだ二十歳くらいのつもりでいたのだが
(かつての通り名 Joker (博士 3 年 西川 剛志))

 私は特に大きなプロジェクトに参画したわけでもなく、かといってコンパや会合やOB 会合宿の出席率もそれほどよかったわけでもなく、「ただ単に 9 年間いただけ」という 男なので、後輩に対して激励するようなことは、そんなにないんだな。言っても説得力 ないし。敢えて言うなら、みなさん、長いこといましょう。そして根津研の会員になる のです (笑) 。話がそれてきましたが、どんどんそれます。それついでに、昔話をしま す。そもそもがこんなもん年寄りにかかせたら、昔話をするにきまっているのだ。年寄 りが昔話を始めると長いぞ。後悔してきた? もう遅いよ。しかし部報になんか載せる なんて、7 年ぶりくらいかなあ。
 そもそも私はコンピュータなんぞと全く縁のない田舎の百姓のせがれであり、となり の一年上のお兄さんにだまされて小学校のころ PC8001 のマシン語うち込みをやらされた のがせいぜいのコンピュータ体験であった。その後、高校出るまでなんにもなかった。 なにしろ、コンピュータほしいなどと言ったら親にぶっとばされるくらいべらぼうに高 かった時代だもんで。でも、一部の都会のお子様達は、秋葉原などから部品を調達して ワンボードマイコンなどを組んでいらしたようだ。コレは私のそのまた二、三年上の世 代の方たちに多いようだ。やっぱ東京には秋葉原があるから偉い。日本橋はどんなもん なのか知らないけど。それに比べるといまの子供達は幸せ。(以下略)
 それがまあ、どういうわけか当大学に入学して、どっかサークルに入ろうと思ったわ けね。S1-22 組の森君がコンピュータサークルを回るというので、ついていったわけだ。 305 まで来たら、PC8801mk2 (だっけか?) があって、プロフェッショナル麻雀が動いて いた。遊んでいいというから、遊んでいたら、学館が閉まってしまった。コンピュータ がいじれると面白いかなと思って、TSG に入ることにしたのだが、当の森君はどっかの テニスサークルに入ったらしい。その森君とは今も時々中央食堂で会って挨拶するのだ が、どういう身分で大学に残っているのだろう。機械系のはずだが、だれか知りません か。珊瑚で卓を囲んで以来、交流がないのです。その時九連宝塔をツモしたのがいけな かったのでしょうか。ちなみに珊瑚はしばらくしてつぶれたそうなので、若い人たちは 聞いたことすらないのでしょう。
 つい関係ない自慢をしてしまいましたが、昔話に戻りましょう。その後私は BASIC 分 科会に参加したのですが、誰よりも早く来たにもかかわらず、はっと気がつくともう分 科会は終了しているという状況が頻発して、BASIC はそれほど身につきませんでした。 プロ麻のせいです。しかし、上中下学年にはすごい人がうじゃうじゃいて、駒祭の展示 には困らなかった模様です。私は部報の穴埋め原稿など打ち込むようになったので、 QWERTY のタイプだけはできるようになったのですが、コンピュータそのもののスキルは ほぼ上昇しませんでした。まあ、世の中そんなもんです。
 そして時は流れ、 DQII が発売され、いいかげんな生活を送っていた私も本郷に進学し、 駒場には情報棟がたちました。私のころの図学は実験的に MSP でフォートランをやらさ れ、おまけにラインエディタしかなかったもんですが、今の標準環境は、X 端末 8 台に対 して Sparc10 が 1 台の割だそうですね。それももっとよくなるという話ですね。うちの学 科の共用計算機は全体で Sparc10 が 1 台と、Sparc2 が 2 台という環境です。いまの若い人 は (以下略) まあ、船舶には笹川良一シールのスパーク 10 が 20 台もほってあるというか ら (未確認) 、きっとうちの学科が貧乏なだけでしょう。でももう私には関係ないけど。
 また話が 10 光年くらいずれました。きっと CIA かフリーメーソンかはたまた宇宙忍者 バルタン星人の策動にちがいありません。話をもどします。
 時が流れて私が本郷に進学するころ、EPSON の PC286V が安くなりました。当時一年下 の高村君が持っていて、部内最速のマシンとしてレイトレースの計算に威力を発揮して いたのですが、これがすごくうらやましかったものです。私はいろいろ手をつくしてこ の機械を購入しました。しばらくして PC286VE が発売されて悔しかったものですが、こ の後似たような話を耳タコなくらい聞いたためか、最近はこのテの話を聞くと逆にうき うきします。
 さて、いろいろな縁があり、また貧乏にもなったため、無謀にも私はプログラムのバ イトを始めることになりました。冷静に考えると無茶な話です。しばらくすると慣れで なんとか C が使えるようになり、バイト料が出たので、当時としては超速のロジテック の LHD40 を買いました。しばらくすると私はバイト料でさらに RAM-DISK をくっつけてい ました。このサイクルを友人が地獄車と呼んでいたように思います。
 プログラムの現場では、能力の高い人とそうでない人の差が激烈に出てました。でも 一方、天才的な人だとかったるくってやってられないような直しとかやっつけ仕事とか があったりするのも現実だな。私レベルだと、たぶん初年度から家庭教師もしくは塾講 師のキャリアを積んでいたほうが、はるかにもうかったと思います。特に下宿生は、何 がしかの余剰可処分金銭をプールしておかないとつらいので、単位に支障がないかぎり 計画的に稼ぎましょう。私はいろんな意味で反省しています。特に、割のいい家庭教師 はコネでつかむものなので、ひとあたりなどの人格的要素は経済的にも馬鹿にならんと いうことでしょうか。入学当時私はなんもしらんくせに結構生意気なヤツで、原理ねえ ちゃんに口答えして遊んだりするような世間知らずだったので、家庭教師には向かなかっ たでしょうが、長いこと大学にいたおかげですっかり丸くなったので、今なら自信あり ます。でも受験技術は忘れました。ああ、あのころに戻りたい。そして楽に金を稼ぎた い。
 なんでこんなオヤジの説教のような話になるのでしょうか。やはり私も年をとったと いうことでしょうか。三十路という言葉は嫌いなのでコンパの席では言わないように。 でもまだバンコラン少佐と同じ年だ。しかしトシちゃん 25 歳を超してしまったときに は少しショックだった。
 それはともかく。長い大学生活で身にしみた事があるので述べます。「やればなんと かなる事も多いなあ」というごくあたりまえの人生訓です。オヤジ風に言うと、「なせ ばなる。ナセルはアラブの大統領」 (二重誤り的オヤヂギャグ) そんでもって今、「し まった」と思っていたりします。なんでかというと、今ちょっとやってみたい電子工作 があって、概念的にはなんてこたない作業なのだが、素人は知らないようなよい方法や IC が世の中にはごろごろしているはずで、これが駒場時代だったら、そーゆーことに詳 しい人が 305 でごろごろしていたのに、もうみんな就職してしまったから。今の駒場に も、スーパーな人は何人かいると思うのですが、顔がわからん。スーパーでなくていい から、だれかハード、ソフトに詳しい人で、親切な駒場の人いたら、コンパの席で手を 上げて下さい。基本的には個人で細々とやるつもりですが。完全に私利私欲というか、 趣味のプロジェクトなので、気長にかまえています。(ちなみに、比較的素人でも予算 不足の研究室では無茶なレベルの電子工作をやらされることがあります。やりとげた人 はそれなりのスキルを得ているようです。しかし、逃げたりできなかったり高専出身者 と組んであまりの実力差に自己嫌悪になったりするケースもあるようです。最後の場合、 仕事自体は楽です。)
 さて、だんだん何を書いているんだか支離滅裂になってきましたが、よくも悪くも TSG のおかげで私の人生は変りました。多分、この世に TSG がなければ、今ごろはまった く違った人生を送っていたでしょう。思いおこせば、TSG との縁は意外と深いような気 がします。私は小中高と、漫画、娯楽小説ばかりを読みふけるロクでなしな子供だった のですが、たとえば、ゲームセンターあらしや、石原藤夫のコラムに本学の学生が登場 しなければ、そもそもこの大学を受ける気になっていたかどうか (わりとマジ) 。結構 そういう階層の子供達への宣伝になってたのだなあ。TSG は。ああもう大垣行が出てし まう。私はこれから国へ帰ります。(明後日には帰りますが)
 TSG ライフを適当に楽しんでください。それが長続きのコツです。ではまたコンパで 会いましょう。バイバーイ
(チャチャリラチャチャリラチャッチャチャチャ
 チャッチャチャチャッチャチャ、ピャー)

p.s. 追いコンには、プラスの時代から使い続けていた「マックいーすよマン」というヤ ツがくるそうなので、わりと楽しみです。みんなも楽しみにしてね。


修士 2 年 佐久間 健

 えっと、どうも、佐久間です。根津研には、「就職して、給料もらって、最初に根津 研に来た時には、そこに居あわせた人にお寿司を御馳走する」という慣習があります。 4 月末から 5 月あたまの土曜日、でしょうねえ、たぶん。もしかしたら事前に tecc.circle.tsg で予告するかもしんないけど、ま、いきあたりばったりということで。 せっかく存続させた根津研、家賃分くらいはみんなで活用しよーね。


修士 2 年 笹原 英明

  TSG の活動にかかわらなくなった現在では TSG に対して何か申し上げる立場には ありません。基本的には部員一人一人が楽しめるような魅力的なサークルを作ってくだ さい。というのが私のメッセージです。


修士 2 年 原口 東子

  TSG 90 年度祭事取締役の原口です。しかしコンパではほとんど働かなかった気が...。 崎山君、有村君にはご迷惑をおかけしました。
 4 月から NTT に就職します。どんなことをやるかはまだ全くわかりませんが、大学 で専攻した化学はもうやらないかもしれないと思っています。
 あと、就職したら村井姓を名乗ることになります。くやしいので諸君も結婚したら改 姓するように。じゃなくて、村井も原口同様よろしくお引き立てください。
 さて、自己紹介はこれくらいにしてこれからの TSG に望むことですが、部室 (305 も根津研も) の掃除、なんてのは誰かが書くと思うのでここには書かないで置きます (書いてるって ^^;) 。
 駒場生のときは、名前のわからない上の代の人が結構多くて、しかも必ずすでに名前 は聞いてるはずなのでもう聞けなく、萎縮してたりもしてました。それが本郷にあがる と二つ下の人はもうわからなくなってたりして。
 本人の社交性次第かもしれませんが学年の枠をできるだけはずせたらいいと思います。 一部の人だけじゃなくてみんなが。
 とりあえず 4 月の新人獲得はがんばってください。それでは、また...


修士 2 年 山根 徹也

  1. ちょっとは部室を綺麗にしましょう。
    1. 当然ですね (笑).
    2. T さんにも美観が備わっていることに気づきましょう (大笑). 意外ですね (嘘?)
    3. ゴミ当番はね、誰担当ってものではなくて、捨てようと思ったケド「こりゃか なり無理があるわぁ」と感じた一番最初のヒトがするべきだとおもうな。時間が無くて も、捨てるの自分だし。
    4. 食べかけの食糧などをほうっておくのは、もっとやめなさい。コワイょぉ (泣. 過去のことであることを祈る).
    5. その他、場が狭いのですから、ちょっとは整美のカケラくらい...ね.
  2. 女子部員が入りやすそうなところにしましょう。
     何故かというと、T さんがフラッと立ち寄った日に女子部員さんがいると、かなり 嬉しいからです (^.^)v.
     と、それはさておいて、昔々その昔は女子大との交流さえ盛んだったと、現在某 社で相も変わらず可愛く (^^;) 研究者しておられる R.M. 先輩も話しておられたような 記憶があります。今でも小島サンなど熱心な方々は来られるようですから、最悪の心配 は当面しなくてすみそうですが、でも、向上心は忘れないようにね (笑).
  3. T さんを覚えといておくんなまし。
     T さんは T 芝にいってしまいます (T さんの T は、TR*N の T でも T*shiba の T でも T$G の T でもないのであしからず) が、たまにフラッと出現します。するでしょ う。しなくなったら体力の限界 (笑). そのときに、いちいち自己紹介するの、T さん かなり恥ずかしい (謎) ので、いっそのこと、コンパか何かの回で、早々に覚えておいちゃっ て下さい。「何期で何年に何やってた本名何の T さんだ」とか覚えなくていいです。 ただ、行動パターンは覚えておいて下さい(大笑)。
     また、予測不能な挙動と赤ん坊と一番シンクロできる程度の常識しか持ち合わせて いないことも、知っておくとよいでしょう (上文とやや矛盾). あ、そうそう、「先輩」 でなくて「T さん」で構いません。だって、先輩じゃぁ、誰のことだかわかんないんだ もん (笑).
  4. 貴重品管理は厳重に。
     T さんが最初に TSG 部室に入った日は、しみみサンに「盗られちゃったよぉ」と言 われた日でした。経緯も後処理もキチンと全容を把握している訳ではないので、部報の どっかでも見て下さい。
     というわけで、一時期盗難回避が意識されましたが...いましてますか?
  5. IS
     IS はとてもよいところなので、みなさん進振のときに目指して下さい。但し、かな り修羅場のキツイ学科ですし、絶対に他にもっっといい学科があるハズですから、本命 はそちらになさるとよろしいでしょう (笑).
  6. コンテストにどんどん出場して下さい。
     今迄は、先方より送られてきた通知を起に参加を決定していたようですが、これか らはもう一歩進んで、例え通知がこなくても、内容や会場や参加記念品やその他が気に 入ったら、積極的に参加提案をして下さい。出来れば、「年度内 n 回出場」とかいっ た目標を掲げると、いいでしょう。
     なお、TSG の名でコミケ等には出ないでね (笑. だれもやらないってば).


 

C++ 言語 クラス入門

by NAO

第 6 章 構造体のメンバ変数の隠蔽化

 BASIC から、C 言語あるいは Pascal に入門した人なら、誰でも「変数の使 える範囲と使えない範囲」があることに驚いたことでしょう。そしてそれに慣れないの で使う変数をすべて外部変数にしたことはありませんか ?
 慣れてしまえば、逆に外部変数が気持ち悪く感じてしまいます。なぜなら、プログラ ムのどこからでも参照できるということは、意図しないところでその変数の値を破壊し てしまうかもしれないし、こまごまとした変数がたくさん必要になっても、すべて異な る名前にしなければならないなどのデメリットがあるからです。とくに、この前者の危 険性を避けるために、変数を参照できる範囲を非常に限定しようとする主義を、データ 隠蔽と呼びます。秘密主義のわけですが、これはプライバシー保護のようなものでけっ して怪しいものではありません。もう少し具体的な話をすれば、ある変数はある関数内 でしか参照できないようにするということです。
 この主義を、構造体のメンバ変数に広げるところから、C++ が始まるといっても良 いのではと思います。つまり、構造体のメンバ変数の参照は、ある特定の関数を通じて しかできないようにするのです。その特定の関数とは、その構造体からある種の特権を 与えられた関数で、その特権を与える方法には、その関数をその構造体のメンバにして しまう方法があります。また、メンバ変数が構造体の外から参照できないことを明示す るには、そのメンバ変数の定義の前に private: と置きます。外部から参照できることに するメンバ関数の定義の前にはそのことを明示する public: を置きます。実例をみましょ う。


struct Complex{                  //複素数を扱う構造体の定義
  private:                       //私的メンバの定義
    double real;
    double imag;
  public:                         //公的メンバの定義
    //私的メンバに外から値を代入する関数
    void SetComplex(double r,double i){
        real = r ;
        imag = i ;
    }
    //私的メンバの値を外へ返す関数
    double GetReal(void){
        return(real);
    }
    double GetImag(void){
        return(imag);
    }
};

//使用例
void main(void){
    Complex z1 , z2 ;
    double r , i ;
       
    z1.SetComplex( 1.0 , 2.0 );
    z2.SetComplex( 0.5 , 4.0 );
    r = z1.GetReal() ;
    i = z2.GetImag() ;
}
 これは複素数を扱う構造体の定義の、ごく基本的なものです。メンバ変数 realimag は、構造体の外部から直接アクセスすることはできません。つまり z.real = 1.0 はで きません。一方、メンバ関数 SetComplex() GetReal() GetImag() は、外部からアクセ スできます。そして、これらの関数から realimag はアクセスできます。なぜなら、 その関数は構造体の内部の関数で、 real, imag は内部からならアクセスできるからです。 メンバ関数内でのメンバ変数のアクセスの仕方に注目してください。メンバ変数の前に いつも必ずあった「構造体名.」がありません。これは、その関数がその構造体のメン バであることから、もはやいちいちメンバの前にその団体名である構造体名を付ける必 要はないと考えれば明らかです。またメンバ関数の呼び出しは、メンバ変数のときと全 く同じで     

構造体変数名 . メンバ関数名 ()

とします。この使用例では z1, z2 という Complex 型構造体を宣言して関数 z1.SetComplex() を使って z1 に値を代入し、関数 z2.SetComplex() を使って z2 に値を代 入して、z1 の実部を z1.GetReal() によって得、z2 の虚部を z2.GetImag() を使って得てい ます。今のこの説明で何かしつこさを感じましたか ? 今までなら例えば

「関数 SetComplex() を用いて z1 に値を代入する」
と表現していた所ですがここでは
「関数 z1.SetComplex() を用いて z1 に値を代入する」

と表現しています。この違いは

「変数 (=オブジェクト) は関数の下にある」
という考え方から
「関数はオブジェクトの下にある」

という考え方への大転換なのです。これこそがオブジェクト指向の原点なのです。以後 のいろいろな例からその考え方が分かってくることでしょう。


第 7 章 構造体からクラスへ

 前章で、構造体の働きが C 言語よりずいぶん拡張されましたが、C++ でよく言われ ているクラスというものは、実はこの拡張された構造体と大差ありません。簡単なクラ スの実例を見て構造体との違いを考えてみましょう。


class Student{
    char name[20];
    int Japanese;
    int Math;
    int English;
    int Science;
    int sum;
  public:
     void SetData(char* na , int ja , int ma , int en ,int sc){
         strcpy(name,na);
         Japanese=ja;
         Math=ma;
         English=en;
         Science=sc;
     }
     void CalcSum(void){
         sum = Japanese + Math + English + Science ;
     }
     void PrintData(void){
         printf("名前:%20s\n",name);
         printf("国語:%3d\n",Japanese);
         printf("数学:%3d\n",Math);
         printf("英語:%3d\n",English);
         printf("理科:%3d\n",Science);
         printf("------------\n");
         printf("合計:%3d\n",sum);
     }
};

//使用例
        
int main(void){
    Student Nao;
            
    Nao.SetData("Naoki",100,100,100,100);
    Nao.CalcSum();
    Nao.PrintData();
                
    return(0);
}
 これは、生徒の名前と 4 科目の成績を記憶して合計点を含めて表示するクラスです。 構造体とあまり違いが無いことが解りますね。クラスと構造体とのわずかな違いは実に 些細で、構造体のメンバの private / publicの指定が無いときは public になり、クラスメ ンバのそれは指定が無いときは private になるということです。つまり

struct Address{      class Address{
    char name[10];       char name[10];
    char ID[10];         char ID[10];
};                   };
struct の方のメンバは外部からアクセスできますが、class の方のそれはできませんと いうことです。本当にただこれだけなのです。今後は専らクラスを使っていきますがそ れは構造体と本質的には同じです。


第 8 章 コンストラクター

 変数の宣言と同時に値を代入することができました。すなわち初期化ですね。例えば

    int i = 0;
    char name[20]="Chomoranma kun";
 クラスには初期化を自動的にしてくれる関数があります。それがコンストラクターです。
 コンストラクターは、クラスが宣言されたと同時に働く関数で、その名前をクラスの 名前と同じにすることによって作られます。その関数のなかに初期化のときにさせたい 命令を書いておきます。例えば、次の例は先の例と同じことをするクラスですが、ずい ぶん使いやすくなっています。

class Student{
    char name[20];
    int Math;
    int English;
    int sum;
  public:
    Student(char* na , int ma , int en ){
        strcpy(name,na);
        Math=ma;
        English=en;
        sum = Math + English ;
    }
    void PrintData(void){
        printf("名前:%20s\n",name);
        printf("数学:%3d\n",Math);
        printf("英語:%3d\n",English);
        printf("------------\n");
        printf("合計:%3d\n",sum);
    }
};
        
//使用例
        
int main(void){
    Student Nao("Naoki",100,100);
           
    Nao.PrintData();
                
    return(0);
}
 main 関数内の Student Nao("Naoki",100,100);Student 型クラスとして Nao が宣言 され同時に ("Naoki",100,100) のデータがコンストラクター
    Student(char* na , int ma , int en )
に送られこの関数によってクラスのメンバに値がセットされます。
 コンストラクターには戻り値がありません。なので、その型宣言のときにも戻り値の 指定をしません。
 これによって変数に値を代入するのを忘れるというミスがずいぶん減ります。ポイン ターを扱うような場合は NULL ポインターを指してしまうようなミスが無くなるので とってもありがたいですね。ただしこの student クラスの場合、初期化をしないことが 出来なくなっています。つまり
    Student Chomo;
とかするとコンストラクターに渡すデータの型が違うというコンパイルエラーになります。 そこでコンストラクターにデフォルト代入が出来るようにします。
     Student(char* na ="", int ma =50, int en =50)
こうすることによってクラスオブジェクト Chomo"", 50 ,50 の値で初期化され、Nao"Naoki",100,100 で初期化されます。


第 9 章 次回の予定

 今回はこの辺で終わりにします。次回からより実際的なクラスの設計と運用に入りま す。まだクラスの便利さや面白さが理解できていない方も次回で必ず満足してくださる よう書くつもりです。具体的には、ベクトルクラスの設計と、演算子の多重定義による ベクトル計算と、それを用いたローレンツアトラクターのシミュレーションを計画して います。

 さてさて、しどろもどろな解説で皆さんかなり気持ち悪くなってしまったのではない でしょうか。次回もこの調子でいくつもりですがよろしくお願いします。ところで次回 はいつになるのだろう。もしかして 4 月のサークルオリ号ですか。ううむ、このときは、 やっぱりもうすこしまともな文章で書かなくてはだめかな。修業しなくては。

 追い出しコンパのある日は、前期合格者の比較的駒場の近い人たちが入学手続きをし によろこびいさんで駒場にやってくる日です。理系の人なら初めての駒場でしょう。きっ と道に迷ってふらふらしているはずです。TSG の勧誘にはもってこいです (自分でも 謎) 。とにかくビラ配り手伝ってね。サークルオリではたくさんの新入生が来てくれる ようにみんな頑張ろうね。

 あっそうだ。このコンパは追い出しコンパだったんだっけ。なにか言わなくては。

      ご卒業される先輩方、おめでとうございます。
      これからのさらなるご活躍を期待しています。

TSG 95 年度部長 渡辺 尚貴


JUNK HDD 奮戦記

by 小島 司

 この度、JUNK HD を繋げて頂く事に成功しました (自分で接続したのではありません ^^;)。お手伝い頂いた方々への感謝を込めまして、その過程をご報告しようと思います。

(i) 事の起こり

 そもそもの始まりは、駒場での研究室の引っ越しにありました。去年の暮れの事です。 新しく出来た 16 号館にいくつかの研究室が移り、大量の廃棄物が野球場の隣に積み上 げられました。見ると、フロッピードライブやディスプレイがごろごろしています。ソ フトボールの授業を終えた私は、汚れてもいい格好をしていたのを幸い、同じクラスの K_O_ 君と一緒にその山をひっくり返し始めました。裁断機にも掛けられていないレポー トの束や、お酒の空瓶に混じって、OASYS や、木枠のラジオの様な 2、30 年前の電圧 計、9801/E などが捨てられていました。
 20x30x40cm^3 位の、薄汚れた金属製の箱が目に留まりました。K_O_ 君によると、660M の HDD ではないかとの事です。"これがあれば、DAYTONA が入れられる !" と、私は、喜々 として、そのHDDを305に持ち帰ったのでした(*1)。私は当時、HDD の性能なんてど れも似た様なものだと信じて疑いませんでした。^^;

(*1) やはり捨てられていた台車に、ディスプレイやコンピュータの類を満載して押 して行くのは、なかなかに恥ずかしかったです。

(ii) 変換ボード入手

 メーカーに電話したところ、件の HDD は、ESDI 規格のものだと判明しました。"当時 は 150 万円位したのですけれどねぇ・・。" という、担当の方の言葉に、"一体、何時 の HDD なのだろう" と一抹の不安を覚えながらも、沢田さんに ESDI SCSI 変換ボード を一緒に探しに行ってもらいました。どう見ても、ものを接続出来る場所が一ケ所しか ないのに、"ESDI 変換ボードらしきもの" として、売られている不思議なボードに出会っ たりもしましたが、万世橋の近くで、250M ESDI HDと組み合わされた ESDI 変換ボード を買う事が出来ました。その商品が "SCSI HD" と称されていたのは、果たして妥当なの かどうか、疑問が残るところではありますが。

(iii) 305にて

 寺川さんの資料から、見付けた変換ボードは特定機種の HD にしか使えない事が分かり ました。秋葉原の方々を見て回ったのですが、それ以外に変換ボードは見つからなかっ たので、拾った HD は諦めて、ケースと電源だけを利用する事にしました。
 ボードも HD も富士通製であった為か、TOWNS では使える事がすぐ安田君によって確認 されました。沢田さんにボードのディップスィッチをいろいろ変えてみて貰ったり (*2)、 富士通から資料を送ってもらったりもしたのですが、EPSON 機にはなかなか繋り ませんでした。私が持っているのは 98 なので、PC 互換機で使えない分にはどうにもなり ません。ケーキパーティーで、"どなたか ESDI HD を SCSI で使う方法、ご存じないです か ?" と私が叫んでいたのをご記憶の方もいらっしゃるかと思います。
 結局、私の家の SCSI I/F BOARD を 305 の EPSON 機に差し、ASPI55.SYS, SFDISK を使っ て、認識させる事に成功しました。その時は、寺川さんと八重樫さんが手伝ってくれま した。128M しか認識されなかった事と、アクセスするとフライパンで豆でも混ぜる様な 音がするのが気になりましたが、私は 10kg のドライブを抱いて家に帰りました。

(*2) その途中、HD の音量を大・中・小に調節 (?) する謎のスィッチを発見。^^;

(iv) SCSI HDD

 一方で、私が "ジャンクのHDが使えない(;_;)" とわめいているのを見兼ねて、佐久 間さんが "638M" もある "SCSI HD" を下さる事になりました。何でも、"静かな動かない奴と、 うるさくて動く奴" とをお持ちで、 "動く奴" の方を頂けるのだそうです。私は、佐久 間さんの研究室にケースごとHDを持ち込み、ESDI HD, SCSI HD 共にケースにきれいに組 み込んだ上でケーブルとターミネータを秋葉原で探して頂きました。挙げ句の果てには 15kg にもなった HDD をバス停まで運んで頂いて、大喜びで帰途につきました。秋葉原行 には、岡田さんも一緒に行って下さいました。

(v)さて、家にて

 勿論、私の目的はこれらの HD を家の Bp で使う事にあります。両 HD 共、動作確認済みで したので、大船にのったつもりでこの原稿を書く事も引き受けてしまいました。ところ が、"あれ ? れ ?" ESDI HDD だけ、家ではフォーマット出来ないのです。
 取り敢えず、SCSI HD は無事、唸り声を上げながら私に "後 22kbite で G" の環境を提 供してくれています。電話を掛けて来た友達に "掃除機かけながら電話してるの?" と 言われたり、"この音、何 ?" "HD" "HD に何してるの ?" "え、普通に使ってるだけ・・。" などという会話が交わされたりもするのですが、私は幸せです。
 という訳で、一応のハッピーエンド (?) でこの記事を終わらせたいと思います。
 初心者がうっかりジャンクにはまってしまった失敗談と御失笑を頂ければ、という思 いもありましたが、何よりも、お世話になった方々に感謝したい気持ちで筆を執りまし た。本当にどうも有難うございました。この場をお借りして、お礼申し上げさせて頂き ます。


ごみ .LZH

by TEA

 ファイルを圧縮するプログラムには、MS-DOS 用としては、LHA、PKZIP、ZIP、GZIP、 ARJ、ZOO などがあります。他にもたくさんありますが、これらは圧縮アルゴリズムとい うか、符号化のしかたがほとんど同じになっています。今日は、これらのプログラムの 似てるところや違うところについてちょこっと書こうと思います。
 なお、あらかじめ C マガジンの LHA のところを読んでおいてください。(^^;

 LHA は、バージョン 2.55 まではパトリシアというデータ構造を使っているそうです。 しかし、現在開発中のバージョン (2.6x) では使われていません。なぜなら、

  1. 辞書のサイズを 8K から 32K にしたので、複雑なデータ構造だとメモリが足りない。 単純なリストでも、64K バイト必要なので、それ以上メモリを使うのはきつい。
  2. 要素の挿入、削除が遅い。
  3. パトリシアを使って圧縮をするアルゴリズムは、XEROX が特許をとっている。:-)

などの理由があるからです。よって、文字 3 バイトでハッシュ表を引き、そのあとはた だのリストになっています。この方法だと要素の挿入や削除が簡単なのですが、そのか わり、探索するときに二分探索のようなことができないので、どれだけ時間がかかるか わからないし、ファイルによってはものすごく時間がかかることがあります。同じ文字 が何文字も並んでいるような場合です。
 LHA 2.6x ではこのようなファイルで遅くならないように、リストがある程度以上長い ときにはハッシュの値を計算する位置をずらして、リストが短いところを探索するよう にしています。ZIP や GZIP では、リストの先頭の何個かしか見なかったり、ある程度の 長さの一致文字列が見つかったら探索する回数を減らすようにしたりしています。 PKZIP は、よくはわかりませんが、探索する回数を制限したり、同じ文字が並んでいる ところをハッシュ表に登録しなかったりするようです (自信無し)。このように、ただ のリストにしている場合は、圧縮率を落としてスピードを上げることが簡単にできます。 ぼくに向いてますね (笑)。

 次は、符号化のしかたですが、ZIP、GZIP は PKZIP とまったく同じようです。そして、 LHA より複雑になっているので、その分圧縮率がいいようです。また、ARJ は、unarj.c というプログラムのソースを見ると、LHA とほとんど同じだということがわかります。 ちなみに、ZOO は LHA と全く同じだそうです。ZOO で圧縮したファイルは、LHA 2.13 で圧 縮したものより常に 2 バイト大きいそうです。:-)

 では、みんなが作りたいと思っている、高速に LZH の圧縮をするプログラムについて ですが、LHA の倍以上のスピードになるのはあきらかです。なぜなら、PKZIP は LHA の倍 くらいのスピードなので、LHA はそれより符号が簡単なので、PKZIP より遅くなることは ないからです。TSG では、作ろうと思っている人は 4 人ほどいるようです。ぼくも早 く作りたいなあと思っていますが、気力がありません。(^^;
 みんなで競争してつくろうよ。:-)


斜めの直線を引きたいのだっ!!

by 河越芋太郎

■はじめに

 埼玉と言えば川越、川越と言えばイモである。川越周辺のイモの歴史について語ると き、南永井 (所沢) の吉田弥右衛門を忘れるわけにはいかない。
 寛延 4 年 (1718 年)、吉田弥右衛門は、上総の椎津村 (現在の千葉県市原市) に 人をやり、サツマイモの種芋を購入すると同時に、栽培方法を学ばせた。そして、武蔵 野台地 (川越もこの一部) でイモの栽培を始めたのである。サツマイモは寒気に弱い。 上総のように温暖な地方ならばいざ知らず、武蔵野台地のような冬の寒さの厳しい地方 でのサツマイモの栽培は、相当困難であったに違いない。なお、このあたりの経緯は、 「所沢市史近世史料 II (昭和 58 年刊) に収録された古文書「吉田家文書」に詳しい。

 ……をっと、失礼。本日私が参上したのは、イモの話をするためではなかった。さっ そく本題に入ることとしよう。

■スキャン変換

 高速なグラフィック表示を目指す志高き者であれば、描画ルーチンにコンパイラ付属 のライブラリや BIOS のような軟弱なものを使用することはあるまい。アセンブラを 使って、がりがりコーディングするのが正義である。
 ところで、コンピューターの画像は、格子点に配置されたドットの集合によって表現 される。したがって、点、直線、円などの図形を表示しようとする場合、真の図形をそ のまま表示することはできず、真の図形を近傍のドットで近似することが必要になる。 このような操作をスキャン変換という。
 画面に直線を表示するとは、すなわち直線をスキャン変換するということにほかなら ない。スキャンのアルゴリズムの善し悪しが、直線を表示する速度を大きく左右するこ とは、明らかであろう。

■イモよりおいしいブレゼンハムの直線スキャンアルゴリズム

 TownsMENU や MS-Windowns などで使われているウィンドウなどの図形は、ほとんどが水 平な直線、及び垂直な直線で構成されている。このような直線の表示は、スキャン変換 などとムズカシゲな言葉をもちださずとも簡単である。
 しかし、少し凝ったグラフィックスをやろうとすれば、斜めの直線をさけて通るわけ にはいかない。この斜めの線分は、イモとは関係ないが、なかなかの食わせものである。  斜めの直線をスキャン変換する場合、真先に思いつくのは、直線の式を利用すること であろう。今や高崎山のサルでも知っていることであるが、直線は

Y=M*X+b

のような一次式で表される。X を直線の左端から右端まで一つずつ増加させ、対応する Y の値を求めて整数に変換すれば、確かに直線を描くことはできる。
 余談であるが、高崎山のサルも、やはりイモを嗜好するのであろうか ? もしそうな ら、たいへん喜ばしいことである。
 それはともかく、このアルゴリズムには、重大な欠点がある。それは、Y の値を計算 するために、繰り返し繰り返し繰り返し繰り返し繰り返し乗算を実行しなくてはならな いことである。乗算命令の実行には多大な時間を要し、ソフトウェアの実行速度を大き く低下させる要因となる。高速性を要求されないプログラムであればこのアルゴリズム でも構わないのだが、フライトシミュレーターのようにリアルタイム性を要求される場 合は、現実的な方法とはいえない。

 乗算を一切使わずに、加減算とシフト命令だけでスキャン変換を行うことができれば、 描画速度の大幅な向上が期待できる。だが、そんな都合のいいアルゴリズムがはたして あるのだろうか ? ある。それが『ブレゼンハムの直線スキャンアルゴリズム』である。 高速にグラフィックをやりたいと願うものにとって、ブレゼンハムの直線スキャンアル ゴリズムは、もう感謝感激イモヨダレというくらいのシロモノである。そこで、このブ レゼンハムの直線スキャンアルゴリズムとはいったいいかなるものなのか、解説してゆ くこととしよう。

 なお、説明の都合上、以下では傾き M0 以上 1 以下で、原点を始点とする (b=0) 直線のみを考える。
 原点を通らない直線は、平行移動して考えればよい。傾きが 1 を越える直線は、各 X 座標において描画される点の数が一定ではないため扱いにいが、XY を逆にして考え れば済む。傾きが負の場合には、上下反転させることで、やはり傾きが 0 以上 1 以下の 直線に帰着させることができる。
 また、Y 軸の向きは、通常の数学の問題を考えるときと同様に、上向きとする。

■ブレゼンハムの直線スキャンアルゴリズムと決定変数

 X を順次インクリメントしながら、点をプロットしてゆく方法を考えよう。
 いま考えている直線の傾きは 0 以上 1 以下であるから、各 X の値について必ず対応す る点がただ一通りに定まる。ここで問題となるのは、Y の値である。ブレゼンハムの直 線スキャンアルゴリズムは、「ある点をプロットしたとき、次の点の Y 座標はどうなる のか ?」を教えてくれる。

 直線の傾きは 0 以上 1 以下であるから、Y 座標は

 そのまま

または

 1 増える

2 通りに限られる。この、「2 通りに限られる」という点に注目していただきたい。 直線を描くという漠然とした問題が、二者択一の単純な問題に帰着されたのである。ど ちらの操作を取るべきかは、真の直線とスキャン変換されるドットとの距離で決まる。 当然、真の直線により近いドットを選択しなくてはならない。
 よいイモができるかどうかの鍵を握っているのは苗の植え方であるが、正しい操作を 選択するための鍵を握っているのは決定変数と呼ばれるものであり、通常文字 d で表さ れる。決定変数 d の正体は一体何なのか ? 答えを言ってしまえば

d=((真の Y の値 - 一つ前に打ったドットの Y 座標との差)-(一つ前に打ったドットの上にあるドットの Y 座標と差 - 真の Y の値)

である。直観的には、

d=(真の Y の値と、一つ前に打ったドットの Y 座標との差)-(真の Y の値と、一つ前に打ったドットの上にあるドットの Y 座標と差)

と思っていただいて構わない (厳密には少し違うが)。
 d>0 のときは上のドットの方が近いため Y1 増え、d<0 のときは下ドットの方 が近いため Y はそのままである。このことは、容易に理解されよう。なお、d=0 のと きは、便宜的に前者に該当するとする。
 問題は、この d の値をどう求めるかである。d を求める方法がわかれば、ブレゼンハ ムの直線スキャンアルゴリズムは、もう制覇したも同然である。

■決定変数 d の計算

 直線の出発点の位置は、もともとイモの個数などと同様に整数で表現されるから、ス キャン変換をするまでもない。
 1 つ目の点を打つところから、我らがヒーロー決定変数 d の登場である。
 直線の傾き M0 以上 1 以下であるから、Y の値は X=1 のとき 0 以上 1 未満である。 したがって Y=M であり

d=(Y-0)-(1-Y)=2*M-1

となる。d が正または 0 のときは Y1 つ増やし、 負のときは Y はそのままとする。X はもちろん 1 増やす。 こうして得られた (X, Y)2 つめの点をプロットする。